漏れ点検の結果、この結果が出ました。 「間違った」結果を正しく除外して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"
その後、表示されたファイルからアドレスを1つずつ読み、$emails
各アドレスにAPIを照会します。返された JSON ドキュメントに false ではなく、NULL 以外の値を持つ最上位キーが含まれている場合、success
API のアドレスと応答が印刷されます。成功したテストは、式でjq -e
最後に評価された値に依存する値で終了することを使用して実行されますjq
(.success
この場合)。
API エンドポイントへのアクセス権がないため、このコードはテストされていません。
呼び出しjq
は次のように書くこともできます。
jq -e -n --argjson reply "$reply" '$reply.success'
...非標準の「here-string」リダイレクトに依存しないため、/bin/sh
代わりにスクリプトを実行できます。bash
<<<
データをさらに処理するには、アドレスを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"
これで、アドレスを出力するためにシェルを使用する必要がなくなり、このif
文は不要になりました。代わりにselect()
成功すると、応答から項目を取得し、キーを使用してオブジェクトにアドレスを追加します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スクリプトに追加することもできます。