ChatGPT に bing の壁紙を取得するシェルスクリプトを作ってもらったよ

2023年2月24日

ChatGPT に bing の壁紙を取得するシェルスクリプトを作ってもらったよ

かつて Bing の壁紙を取得してデスクトップピクチャに指定するシェルスクリプトを作って公開していた。

💻 Windows の壁紙に bing のトップ画像を利用する | 林檎コンピュータ

このスクリプト、自分でも使っていて、なかなかうまく動いてくれていた。この前までは。
 ついこの間から急に動かなくなっちまったのである。bing が ChatGPT を導入するとかで、サイトの仕様が変わったらしい。

これを書き直そうとしていろいろ試したが、うまくいかなかった。山の画像とか夜景の画像がダウンロードされるんだけど、あきらかに今日の bing の画像ではない。画像のアドレスがちゃんと取得できないのだ。
 ユーザエージェントを変更したり、cookie を喰わせたりしてもまるで駄目。

もう半分あきらめかけていたんだけど、最後に思いついた。
 ChatGPT に書かせりゃいいじゃん、ということである。なんか結構、優秀なコードを返してくるって聞いたことがある。

ChatGPT を試す

ChatGPT は最近話題の AI で、質問すると自然な答えを教えてくれる。

🤖 ChatGPT: Optimizing Language Models for Dialogue

Google のアカウントでログインできるので試しみた。
 質問は、
「bing.com の壁紙を取得するシェルスクリプトを考えて」
 というもの。すると、本当にするすると答えを返してきた。

chatGPT の様子

以下は、Bing.comから壁紙を取得するためのシェルスクリプトの例です。このスクリプトは、Linux環境で動作することを前提としています。

#!/bin/bash

# Bing.comの背景画像のURLを取得
url="https://www.bing.com$(curl -s https://www.bing.com | grep -oE 'g_img=\{url: \"\/[^\"]+\"' | cut -d'"' -f3)"

# 保存する画像のファイル名を決定
filename="$(date +%Y%m%d)-$(echo $url | awk -F/ '{print $NF}')"

# 画像をダウンロード
curl -s "$url" > "$filename"

echo "Bing.comから壁紙をダウンロードしました。ファイル名は $filename です。"

 このスクリプトの動作は以下のとおりです。

  1. Bing.comのホームページにアクセスし、背景画像のURLを取得します。
  2. 取得したURLから、ファイル名を決定します。ここでは、現在の日付と画像ファイル名を組み合わせています。
  3. URLから画像をダウンロードし、ファイルに保存します。
  4. ダウンロードが完了したことをユーザーに通知します。 このスクリプトを定期的に実行することで、Bing.comの壁紙を自動的に取得することができます。ただし、このスクリプトはBing.comの仕様が変わった場合には動作しなくなる可能性があるので、注意してください。

なんだこいつ、すげぇ。

さっそく保存して実行してみたところ、「20230215-www.bing.com」というファイルがダウンロードされただけで、画像の取得には失敗してしまった。

画像のダウンロードが出来るようになった

とはいえ、スクリプトを見た感じうまくいかなそうだな、と思っていたので驚きはない。本国の bing だったら上記のスクリプトで動作するのかもしれない。
 画像の URL を探る部分を自分なりに書き直して、もう一度試してみた。

そしたらちゃんと動作するようになったんである。
 ChatGPT すげぇ! ということで、今まで使っていたスクリプトを以下のように書き直した。

📝 bing.sh

#!/bin/zsh

bing_dir="$HOME/Pictures/bing"

img_url='https://www.bing.com'$(curl -s 'https://www.bing.com' | tr '>' '\n' | grep 'この画像をダウンロードできます' | tr '"' '\n' | tr '\\' '\n' | grep 'th?' | awk 'NR == 1 {print $1}')

img_name=bing$(date +%Y%m%d).jpg

curl -s "$img_url" > "$bing_dir"/"$img_name"

img_size=$(stat "$bing_dir"/"$img_name" | awk '{print $8}')

if (( $img_size < 10000 )); then
	rm "$bing_dir"/"$img_name"
	exit 0
else
	osascript -e 'tell application "Finder" to set desktop picture to POSIX file "'$(echo "$bing_dir"/"$img_name")'"'
fi

(2023.02.24 ちょっと修正した)

これを launchd で深夜 0 時 1 分に実行するよう plist を書く。

📝 bing_wp.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>bing_wp</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/zsh</string>
        <string>/PATH/TO/bing.sh</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>0</integer>
        <key>Minute</key>
        <integer>1</integer>
    </dict>
</dict>
</plist>

bing_wp.plist は ~/Library/LaunchAgents/bing_wp.plist というフォルダに配置する。

mv bing_wp.plist ~/Library/LaunchAgents/

さらに launchctl コマンドで bing_wp.plist をロードする。

launchctl load ~/Library/LaunchAgents/bing_wp.plist

これで、bing が壁紙を提供してくれる日は、デスクトップの壁紙が更新されるはずだ。

ただこれ、冷静に考えると ChatGPT がどうこうじゃねーな。
 ここ数日、めっちゃいろいろな web スクレイピングで挑戦したのに失敗してたんだから。当然、上記のスクリプトに書いたやつなんか何度もやったよ。
 筆者の環境というか、キャッシュ的なものが変わった、あるいは bing の対応がちょっと変化したとか、そんなところだな、おそらく。