Google Drive の 過去問データ(PDF) を Cloudflare R2 へ移行・Blogger リンク差し替え

「Google Drive 配信からCloudflare R2 配信 へ完全移行」という記事を書いたのだが、各試験の問題文と解答(PDF)をGoogle Drive 上に置き、BloggerからPDF へリンクを貼っていたことを忘れていた。

・このデータについても今回Cloudflare R2 に移行した。

・記事のリンクも Drive URL から R2 URL へ差し替えた。

以前のデータと合わせて全部で2Gbyte程度をCloudflare R2 に移行することができた。

背景・方針

  • PDF は大量(1 アプリあたり 4〜139 本、合計 1000 本超)。
  • R2 は既存バケットを流用。試験画像と混ざらないよう各アプリ配下に pdf/ サブフォルダを切る
  • 今後 Drive は使わない。追加 PDF は最初から R2 へ直接アップする運用に切り替え。
  • R2 上のファイル名は Drive のファイル ID をそのまま採用

つまずきポイント

  • 公開ページから本文が取れるか:固定ページの本文は <div class='entry-content' id='in-target'> に入っており、curl で取得・抽出できた。これにより記事 HTML を手でコピーする手間が消えた(入力側の自動化)。
  • 小さい PDF の誤検知:数 KB〜十数 KB のファイルを警告 HTML と疑ったが、file で確認すると 2 ページの解答 PDF など正規のものだった。サイズだけで判断しない。
  • Drive に実体がないリンク:9 本が 404(元から切れていたリンク)。set -e で停止していたため、404 をスキップして続行するようパッチ。

手順の全体像

  1. 目次ページから「フォルダ名 ↔ 記事 URL」の対応表(apps.tsv)を用意。
  2. 各記事を curl で取得 → 本文 in-target を抽出 → Drive ID を列挙。
  3. rclone backend copyid で Drive から実体 PDF をダウンロード(ID 名で保存)。
  4. rclone copyr2:zehtaapps-images/<APP>/pdf/ へアップロード。
  5. 本文中の Drive URL を R2 URL に置換し、本文だけの HTML を html_out/<APP>.html に出力。
  6. pbcopy でコピーして各記事の HTML ビューに貼り戻し(手作業)。

今後の運用

追加 PDF(1 回あたり 2 本程度)は Drive を経由せず R2 へ直接アップ。記事には R2 URL を直接書く。

結果

  • 53 アプリ全ての PDF を R2 へ移行完了。
  • 全記事の Drive リンクを R2 URL へ差し替え、リンク切れゼロを確認。
  • 元から実体のなかった Drive リンク 9 本は記事修正で解消。