<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'files.mastodon-japan.net'. (_ssl.c:992)>
おや・・・ DNS 的な何かかなと思ってマシンを再起動してみたら、エラーが HTTP Error 403: Forbidden に変わった。
wget や curl では持ってこれているみたいだけど・・・
"certificate is not valid" ってあるから証明書かな
Webブラウザから files.mastodon-japan.net にアクセスしても特に証明書に問題ないみたい。
自分の書いた Python のプログラムがエラー情報をあんまり出力してくれていないので、そのへんを修正してもうちょっと調査してみるかな。
「traceback は システムトレースを取得するための標準ライブラリです」
Python のエラー出力 - Qiita https://qiita.com/puchi2121/items/3983a75c8c0a6e958fbd
traceback.print_exc(limit=None, file=None, chain=True) というお手軽メソッドがあった。
「print_exception(sys.exception(), limit, file, chain) の省略表現です」
traceback --- スタックトレースの表示または取得 — Python 3.11.4 ドキュメント https://docs.python.org/ja/3/library/traceback.html#traceback.print_exc
画像のIPアドレスを whois してみると Cloudflare なので、Python からのアクセスを Cloudflare が HTTP Error 403 Forbidden にしているような気がする。
画像のURLは Mastodon API から取得している。
MediaAttachment - Mastodon documentation https://docs.joinmastodon.org/entities/MediaAttachment/
Python から直接 files.mastodon-japan.net にアクセスしているのがいけないのかな・・・
PythonでCloudflareの大半のスクレイピング検知を回避する方法|VoidPro https://note.com/voidpro/n/nb9bab01b85b9
なんだか良くない解決策しか出てこなさそう・・・
Mastodon に投稿した画像について、Python の urllib.request を使って Cloudflare からダウンロードしようとすると、HTTP Error 403 Forbidden になってしまう。
curl で Cloudflare からダウンロードするのはエラーにならない。
試しに urllib.request のユーザーエージェント文字列を curl のものに置き換えてみたらダウンロードできるようになった。
# こんな感じ
headers = {'User-Agent' : 'curl/7.88.1'}
req = urllib.request.Request(url, None, headers)
with urllib.request.urlopen(req) as file:
Cloudflare は user-agent だけ見て 403 Forbidden にしているんだろうか・・・
自分が Mastodon に投稿した画像を無事に取り込むことができている(∩´∀`)∩
nilog: 無いログは振れない。 http://www.nilab.info/nilog/