前回までのあらすじ
- Web ページのタイトルに「Re: 」をつける iOS ショートカット - @kyanny's blog
- Web ページのタイトルに「Re: 」をつける iOS ショートカット v2 - @kyanny's blog
数ヶ月前から文字化けするようになって使い物にならなくなっていた。Render の起動も遅く、だいぶ待たされた挙句文字化けだとガッカリ感が強い。
ようやく重い腰を上げて手直しした。まず最近知って気になっていた DigitalOcean Functions でバックエンドを書き直す。これは数行の Python スクリプトでできた。DigitalOcean Functions は標準で requests と bs4 (BeautifulSoup) が使えるようだ。FaaS/Serverless なので起動時間というものがなく、一瞬でレスポンスが返ってくる。素晴らしい。DigitalOcean Functions の開発体験の良さは別途書きたい。
import requests from bs4 import BeautifulSoup import base64 def main(args): url = args.get("url") html = requests.get(url) soup = BeautifulSoup(html.content, "html.parser") title = soup.find("title") # tag content = title.contents[0] # navigatablestring content_str = str(content) # str content_byte = content_str.encode() # byte b64_byte = base64.b64encode(content_byte) # b64 byte b64_str = b64_byte.decode() # b64 string print(b64_str) return {"body": b64_str}
$ curl -H "Content-Type: application/json" https://faas-sgp1-18bc02ac.doserverless.co/api/v1/web/fn-b98202aa-332e-4a65-9114-b474678f866d/default/gettitle -d '{"url":"https://studysapuri.jp/"}' 44CQ5YWs5byP44CR44K544K/44OH44Kj44K144OX44Oq772c5aSn5Lq644Gu6Iux6Kqe44KC44CB5Y+X6aiT5YuJ5by344KC44CC $ echo 44CQ5YWs5byP44CR44K544K/44OH44Kj44K144OX44Oq772c5aSn5Lq644Gu6Iux6Kqe44KC44CB5Y+X6aiT5YuJ5by344KC44CC | base64 -d 【公式】スタディサプリ|大人の英語も、受験勉強も。
次に iOS ショートカットのほうを直した。こちらは新しいバックエンドでも文字化けは解消せず。デバッグ手段に乏しいので苦労した、挙句に結局原因はわからずじまいだが、マルチバイト文字列を含むレスポンスだと文字化けするらしい。化け方から見るに UTF-8 を ASCII-8BIT として無理やり解釈している系っぽい気がするが、バックエンドはちゃんと UTF-8 文字列を返しているし Content-Type レスポンスヘッダも charset=UTF-8 がついている。ここはこれ以上手の施しようがないので、じゃあレスポンス自体はマルチバイト文字列を含まないようにしようと、バックエンド側では Base64 エンコードした文字列を返し、iOS ショートカット側で Base64 デコードしたところうまくいった。
https://www.icloud.com/shortcuts/8434da7402b04b1ebe34b3e68a66be22
これでまた Re: でニュースやブログやポッドキャストの感想を書きやすくなった。プログラミングやテクノロジーの話をせずニュースに反応してばかりなのはろくでもないおっさんらしいので控えた方がいいのかもしれないが。