ChatGPTにURLにアクセスしたレスポンスに特定ワードが含まれているかを判定するシェルスクリプトを書いてもらった

普段はEclipseを使ってJavaを書いていますが、たまにシェルスクリプトを書こうとすると、毎回どんなオプションがあったかGoogle検索しているので、ChatGPTにシェルスクリプトを書いてもらいました。

前提

今回使用したのは ChatGPT 3.5です。

指示

特定のURLにアクセスしてレスポンスボディーに”hoge”という文字が含まれているかを判定するシェルスクリプトを書いてください。

回答

以下は、curlコマンドを使用して指定されたURLにアクセスし、レスポンスボディに”hoge”という文字列が含まれているかどうかを判定するシェルスクリプトの例です。

#!/bin/bash

url="http://example.com"
response=$(curl -s $url)
if echo "$response" | grep -q "hoge"; then
  echo "The response body contains 'hoge'"
else
  echo "The response body does not contain 'hoge'"
fi

このスクリプトでは、変数urlに判定対象のURLを設定し、curlコマンドでそのURLにアクセスし、レスポンスボディを取得します。取得したレスポンスボディは$response変数に格納されます。そして、echoコマンドとgrepコマンドを組み合わせて、$response変数の中に”hoge”という文字列が含まれているかどうかを判定し、結果を出力します。-qオプションは、grepコマンドの出力を抑制して、真偽値だけを返すようにします。


いい感じだったので、wget版も聞いてみます。

指示

ありがとうございます。curlの代わりにwgetを使ってください。またhttpsでアクセスした際にSSL証明書は無視するようにしてください。

回答

以下は、wgetコマンドを使用して指定されたURLにアクセスし、レスポンスボディに”hoge”という文字列が含まれているかどうかを判定するシェルスクリプトの例です。また、httpsでアクセスした際にSSL証明書を無視するように設定しています。

#!/bin/bash

url="http://example.com"
response=$(wget --no-check-certificate -qO- $url)
if echo "$response" | grep -q "hoge"; then
  echo "The response body contains 'hoge'"
else
  echo "The response body does not contain 'hoge'"
fi

このスクリプトでは、wgetコマンドの–no-check-certificateオプションを指定して、httpsでアクセスした際にSSL証明書を無視するように設定しています。また、-qO-オプションを指定することで、wgetコマンドの出力を抑制し、取得したレスポンスボディを標準出力に出力するようにしています。そして、echoコマンドとgrepコマンドを組み合わせて、レスポンスボディの中に”hoge”という文字列が含まれているかどうかを判定し、結果を出力します。-qオプションは、grepコマンドの出力を抑制して、真偽値だけを返すようにします。


今度はオプションをつけてみます。

指示

ありがとうございます。curl版の方でリトライ3回、タイムアウト10秒のオプションをつけてください。

回答

以下は、curlコマンドを使用して指定されたURLにアクセスし、レスポンスボディに”hoge”という文字列が含まれているかどうかを判定するシェルスクリプトの例です。また、リトライ3回、タイムアウト10秒のオプションを付けています。

#!/bin/bash

url="http://example.com"
response=$(curl --retry 3 --connect-timeout 10 -s $url)
if echo "$response" | grep -q "hoge"; then
  echo "The response body contains 'hoge'"
else
  echo "The response body does not contain 'hoge'"
fi

このスクリプトでは、curlコマンドの–retryオプションを指定して、リトライ回数を3回に設定し、–connect-timeoutオプションを指定して、タイムアウト時間を10秒に設定しています。そして、curlコマンドで指定されたURLにアクセスし、レスポンスボディを取得します。取得したレスポンスボディは$response変数に格納されます。そして、echoコマンドとgrepコマンドを組み合わせて、レスポンスボディの中に”hoge”という文字列が含まれているかどうかを判定し、結果を出力します。-qオプションは、grepコマンドの出力を抑制して、真偽値だけを返すようにします。


タイムアウトとリトライはそのオプションを知っているので指示が出せます。 それではそもそもどんなオプションをつければいいのかを聞いてみます。

指示

ありがとうございます。その他に実用レベルに高めるためのオプションがあればそれもつけてください。

回答

シェルスクリプトに追加することで、curlコマンドをより実用的なものにするオプションの例をいくつか紹介します。

リダイレクトに従うオプション curlコマンドでは、デフォルトでリダイレクトには従いません。リダイレクトに従うには、-Lオプションを使用します。これにより、リダイレクト先のレスポンスボディも取得できます。

curl -L http://example.com

リクエストメソッドを指定するオプション curlコマンドでは、デフォルトでGETメソッドが使用されます。他のメソッドを使用するには、-Xオプションを使用して指定します。

curl -X POST http://example.com

ヘッダーを指定するオプション curlコマンドでは、-Hオプションを使用してヘッダーを指定できます。例えば、Content-Typeヘッダーをapplication/jsonに設定するには、次のようにします。

curl -H "Content-Type: application/json" http://example.com

リクエストボディを指定するオプション curlコマンドでは、-dオプションを使用してリクエストボディを指定できます。例えば、JSON形式のリクエストボディを指定するには、次のようにします。

curl -H "Content-Type: application/json" -d '{"key":"value"}' http://example.com

ユーザーエージェントを指定するオプション curlコマンドでは、-Aオプションを使用してユーザーエージェントを指定できます。例えば、Mozilla/5.0というユーザーエージェントを指定するには、次のようにします。

curl -A "Mozilla/5.0" http://example.com

これらのオプションを組み合わせることで、より実用的なcurlコマンドを作成できます。

指示

これらのオプションを全部含めた最終形を教えて下さい。

回答

以下が、前回までの内容に加え、すべてのオプションを含めたcurlコマンドの最終形です。

curl -L -X GET -H "Content-Type: application/json" -A "Mozilla/5.0" -m 10 --retry 3 --insecure http://example.com | grep -q "hoge"

このコマンドは、リダイレクトに従い、GETメソッドを使用し、Content-Typeヘッダーをapplication/jsonに設定し、User-AgentをMozilla/5.0に設定します。また、10秒間タイムアウトし、リトライ回数を3回、SSL証明書の検証を無効にし、サイトのレスポンスボディ内に”hoge”という文字列が含まれているかどうかを判定します。


ついに最後はワンライナーになってしまいました。

普段あまり書いてない言語で、慣れていればおそらくサクッと書けるだろうプログラムの書き方を調べるのに便利ですね。