night and sundial

じゃわじゃわ日記 -the 5th defection-

過去ログの画像を補完する

 ついったーを追い出されて、自分にとって大事な過去ログであるTwilogも失ったが、ついったーを凍結される直前に運よくダウンロードしていたアーカイブを加工してはてなブログにインポートし、自分の過去ログを維持した、というのが前回(2023年5月)までのあらすじ。

jawa-jawa.hatenadiary.jp

 だが、テキストだけで、画像は無い状態だった。というか、画像のことはほとんど忘れ去っていて、もう返ってこないものだと思い込んでいた。──しかし、今年10月になって、アーカイブの中の「tweets_media」フォルダに自分の画像がある、という話を目にして、はっ、と探してみたところ、ファイルがあることがわかった。なんと1年半近くも気づいていなかったのだ。画像のファイル名は、ツイート1件ごとのID(id_str)とひもづけられるようになっていた。

 また、ついったーに関連しては、2011年以前に「twitpic」にアップロードして、「twitpic」のサービス終了とともに表示されなくなった画像、というのもあった。これも、ふと思い立って調べてみたら、URLはまだ通って、ファイルが残されていることを知った。これはちょっと驚いた。全部ダウンロードしておいた。自分でも忘れ去っていたような画像が、10年以上ぶりに帰ってきた。

*

 あるとなったら、それらを過去ログに載せたい。対象のファイルは、全部で804件あることがわかった*1

 数が多すぎる。また、過去ログ自体をはてなブログにしていることから、画像の置き場所は、自然と、はてなフォトライフになる*2。アップロードするだけなら簡単なのだが、はてなフォトライフは、画像をアップロードすると元のファイル名が残らなくなってしまうので、ツイートとのひもづけが難しくなる。──つまり、「対象の画像ファイルをはてなフォトライフにアップロードし、その画像ファイル名(ツイート1件ずつのIDと関連付けられている)とはてなフォトライフのファイル名(URL)を関連付けること」が課題だった。人手ではなく何らかの機械的な仕掛けが必要になる。*3

 このため、既存の「俺のついったー」でも使っている仕組みを応用して、Google Apps Script(GAS)で、下記の仕掛けを作った。非常に回りくどい処理だが、GASで動く「はてなフォトライフ連携ツール」である。

●ストレージ(Googleドライブ)
 自分のGoogleドライブの特定のフォルダに、処理対象のファイルを全部置いておく。
●テーブル1(Googleスプレッドシート)
 対象のファイル名の一覧を保有する。
●テーブル2(Googleスプレッドシート)
 はてなフォトライフのRSSフィードを受信して展開する。最新50件の画像タイトルとURLが取得できる。
●処理1(Google Apps Script)
 定周期で起動。
 テーブル1から、実行1回につき1件ずつを処理対象として、ファイル名からGoogleドライブのファイルIDを取得し、Gmailでメールを送信してファイルをはてなフォトライフに連携する。その際、画像のタイトルを一意に決めておき、テーブル1に登録する。送信し終わったメールは不要なのでゴミ箱に移動する。
●処理2(Google Apps Script)
 定周期で起動。
 最新のはてなフォトライフのRSSフィードをテーブル2に取得する。テーブル1の画像タイトルと、テーブル2の画像タイトルを突合して、テーブル2からはてなフォトライフのURLを取得し、テーブル1に登録する。

 処理1を、トリガを設定して、一定の間隔で自動実行させていく。はてなフォトライフへのアップロードを「ちぎっては投げ」方式にすることで、自分の作れる範囲の実現方式に寄せてみたことになる。──10月26日の0時台から始めて、最初は5分間隔で実行していたが、翌朝には止まってしまった。GASによるメールの送信は無料ユーザには100件/日の上限があってそれを超えると実行に失敗することを知り、15分間隔で実行することにして、その日の夕方から再開した*4。15分間隔の場合、アップロードできるのは96件/日になる*5。全部で8日かかる工程になるが、時間がかかる分にはとくにかまわない(なにせ、1年半も忘れていたのだから)。また、処理2は、はてなフォトライフのRSSフィードには最新50件分だけが載る、という制約があるので、処理1の実行が50件を超えないような間隔で動かせばよい。

 そうやって、はてなフォトライフへのアップロードとファイル名(URL)の取得・関連付けの処理は、8日間工程で、11/2に完了した。自分が書いたプログラムが、適切に設計すれば、放置していても昼も夜も自動で一定の動きをしてくれる、というのは気分がよい*6。これで第一段階は達成。

*

 次のステップとして、はてなブログの記事に画像を追加していくことになる。はてなフォトライフのファイル名(URL)が取得できているので、はてな記法の文字列を作って、記事の適切な場所に差し込んでいくのだが、ためしに手作業で120件ほどやってみて、こんなことを手でやれるか、と音を上げた。残りの作業は、手順を分けて一部をツール化した。──もともと、Twitterのログからはてなブログを作るためにMovableType形式のテキストファイルを作っていたので、このテキストファイルを元ファイルとして、下記の手順を踏んだ。

(1) 元ファイルを、1日ごとのファイルに分割。(Excel VBA)*7
(2) (1)で分割したファイルから、画像を張り付ける対象の日付のファイルを選び出す。*8
(3) (2)のファイル中のツイートIDの文字列付近を、ひもづく画像ファイルの記述を付加するように加工。その際、GAS処理で取得したはてなフォトライフの画像ファイル名(URL)を使用。(Excel VBA)*9
(4) (3)の加工後のファイルを結合して、1つのインポート用ファイルを作成。
(5) はてなブログ側は、対象の日付の記事をいったん削除。*10
(6) (4)で作成したインポート用ファイルを、はてなブログにインポート。

*

 以上の手順を踏んで、自分のついったー過去ログに自分の画像を補完することができた。思い立ってから完成まで2週間かかったけど、GASを組んで大量件数のデータをさばいたり、またVBAでファイルを加工したりして、面白かった。

jawa-jawa-tw.hatenablog.jp

*1:ついったーのアーカイブの中の「tweets_media」フォルダ自体には5,000件以上の画像や動画ファイルがあったが、これは、自分がリツイートした他人のツイートに関連した画像・動画も含まれていて、それはさすがに自分の過去ログに上げるわけにはいかないので、省いた。

*2:外部に置いて参照させることも考えたが、自分の場合は適当な置き場所がなかった。

*3:はてなフォトライフにもAPIがあるが、OAuth認証が求められ、自分が取り組むにはハードルが高い。

*4:GASの1日のメール送信可能残数(MailApp.getRemainingDailyQuota())のカウントダウンは、1回の実行で2減っていたり、逆に減っていなかったりして、わりと曖昧である。また、減っていった残数が100に戻るタイミングもまた謎で、どうやら日本時間の16時台の任意のタイミングで戻っているようだ(これは米国西海岸時間の0時が関係しているのではないかと勘繰っている)。

*5:なお、はてなフォトライフのアップロードの上限という制約もあるにはあるが、300MB/月であり、月初にはゼロクリアされるので、今回の処理には影響なかった。

*6:1回だけタイムアウトエラーが出ていたが、処理完了後だったので問題なかった。

*7:出力はUTF-8(BOMなし)。はてなブログへのインポート自体はBOMありのファイルでも問題ないが、あとでファイルを結合することを考慮してBOMなしにした。

*8:一部は手作業で処理してしまったため、この時点で対象は464日分だった。

*9:Excel VBAで、キーワード指定して特定フォルダのファイル(UTF-8)を一括置換するツールを作った。出力もUTF-8(BOMなし)。これ、まさに仕事でそういうの作ろうと思っていたのを思い出して…。

*10:結局、手作業としてはこの作業が一番大変だった。1時間くらいかかった。