如何从泄漏检查输出中仅选择成功的值?

如何从泄漏检查输出中仅选择成功的值?

我有这些来自泄漏检查的结果。如何正确排除“错误”结果并仍然使用 bash 包含电子邮件

[email protected]
{"success":false,"error":"Not found"}
 
[email protected]
{"success":false,"error":"Not found"}
 
[email protected]
{"success":false,"error":"Not found"}
 
[email protected]
{"success":true,"found":1,"passwords":1,"sources":[{"name":"LinkedIn.com","date":"2012-05"}]}
 
[email protected]
{"success":true,"found":1,"passwords":1,"sources":[{"name":"LinkedIn.com","date":"2011-05"}]} 

这是由以下bash脚本生成的:

#!/bin/bash
 
for i in $(cat $emails):
do echo $i; curl -s "https://leakcheck.io/api/public?key=<api-key>&check=$i"; echo; sleep 0.5; echo;
done

答案1

不再输出地址并查询API,而是仅在调用成功时才输出API调用的地址和结果:

#!/bin/bash

while IFS= read -r addr; do
    reply=(
        curl --silent \
            --url-query key='<api-key>' \
            --url-query check="$addr" \
            'https://leakcheck.io/api/public'
    )

    if jq -e '.success' <<<"$reply"; then
        printf 'Address "%s":\n%s\n' "$addr" "$reply"
    fi
done <"$emails"

这将从 指示的文件中一一读取地址,$emails并用每个地址查询 API。如果返回的 JSON 文档包含具有非 false 和非 null 值的顶级键success,则会打印来自 API 的地址和回复。成功测试是使用 完成的jq -e,它退出时的值取决于表达式中最后一次计算的值jq.success在本例中)。

请注意,此代码未经测试,因为我无法访问 API 端点。


jq调用也可以写为

jq -e -n --argjson reply "$reply" '$reply.success'

...这将允许我们运行脚本,/bin/sh而不是bash因为我们不再依赖非标准的<<<“here-string”重定向。

如果您要进一步处理数据,您可能需要将地址合并到 JSON 中(有点奇怪的是,该地址尚未成为 API 回复的一部分)。处理 JSON 比处理文本和结构化 JSON 对象的混合更容易、更安全。

#!/bin/sh

while IFS= read -r addr; do
    reply=(
        curl --silent \
            --url-query key='<api-key>' \
            --url-query check="$addr" \
            'https://leakcheck.io/api/public'
    )

    jq -n \
        --arg addr "$addr" \
        --argjson reply "$reply" \
        '$reply | select(.success) | .address = $addr'
done <"$emails"

由于我们现在不必使用 shell 来输出地址,因此我们不再需要该if语句。相反,select()如果成功,我们会从回复中获取条目,并将地址添加到带有 key 的对象中address。这意味着不成功的回复将不会有任何输出。

脚本最后一个变体的输出示例如下:

{
  "success": true,
  "found": 1,
  "passwords": 1,
  "sources": [
    {
      "name": "LinkedIn.com",
      "date": "2012-05"
    }
  ],
  "address": "[email protected]"
}
{
  "success": true,
  "found": 1,
  "passwords": 1,
  "sources": [
    {
      "name": "LinkedIn.com",
      "date": "2011-05"
    }
  ],
  "address": "[email protected]"
}

如果您不希望打印漂亮的 JSON 作为输出,请使用jq它的选项:-c

{"success":true,"found":1,"passwords":1,"sources":[{"name":"LinkedIn.com","date":"2012-05"}],"address":"[email protected]"}
{"success":true,"found":1,"passwords":1,"sources":[{"name":"LinkedIn.com","date":"2011-05"}],"address":"[email protected]"}

答案2

也许grep "true"这会显示所有包含 true 的行。理论上,您也可以简单地将其添加到您的 bash 脚本中。

相关内容