我有这些来自泄漏检查的结果。如何正确排除“错误”结果并仍然使用 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 脚本中。