Blogger API 一括削除におけるページネーション漏れと分類失敗の解決記

#085

Blogger API 一括削除の作業を進める中で、APIのコール制限と分類フィルターのバグにより、全データを失いかけたトラブルを解決した運用の記録です。社長からの「思い切ったスキーマ再定義」という指示を遂行する中で、私が実際に直面し、解決したデバッグのプロセスを共有します。

問題の発生状況

社長から「初期段階だから、消すべき記事は思い切って整理して」との指示が下りました。これに伴い、SaaS比較、レビュー、ニュース、ポルトガル語の翻訳版(PT fanout)、文字化け、テスト投稿などの「フェイクEEAT記事」を整理し、純粋な「ノウハウや運用の記録」だけを残すことに決定しました。資本主義社会において、社長の指示はすなわちコードの実行基準。私が運用している自動化モジュールを即座に稼働させました。しかし、自作したウェブアプリのエンドポイントである /api/posts/list?status=LIVE&limit=50 で問い合わせたところ、130件中50件しか返ってこず、インベントリの全体像を把握できない問題が発生しました。

エラーの症状

初期の分類結果が「50/50 KEEP(すべて維持)」となってしまいました。削除すべきSaaSマーケティング系の記事がまったくフィルタリングされず、すべて「KEEP」状態のまま残るという奇妙な現象です。正確な原因はさらに調査が必要ですが、現時点で判明している原因は、実際に削除対象となるSaaS記事が2〜3ページ目に集中していたこと、そしてBloggerの自動ラベル生成による文字化けのせいで、既存のPowerShellスタイルの単純な分類関数が「vs/comparison/best/alternatives」などのパターンを正しくマッチングできなかったためです。

環境

本番環境はPython 3.12をベースとし、Blogger v3 API(googleapiclient.discovery.build)を使用しています。認証は auth.pybuild_blogger_service を通じて行い、対象のブログIDは config.jsonblogger_blog_id を参照しています。

Blogger API 一括削除で試して失敗したアプローチ

1つ目は、ウェブアプリのエンドポイントに対する単一のfetchです。しかし、limit=50 の制限(キャップ)に阻まれ、50件目以降の記事がまったく取得できずに漏れてしまいました。

2つ目は、第1次フェーズでの単純なパターン分類(classify)の適用です。SaaSマーケティングパターンにおける複数形(例: 'Tools')や、表記の揺れた比較キーワードをキャッチできず、大量のフェイク記事がフィルターをすり抜けてしまいました。本文の解析を行わず、タイトルとラベルだけで分類しようとしたのが敗因でした。

最終的な解決策

そこで、私は以下の解決策を選択しました。

context window (4K tokens)
<sys> you are helpful assistant <user> debug PowerShell encoding error <ctx> previous mojibake fix attempts <output> suggested utf-8-sig <follow> verify with json load

1. Blogger APIの直接ページネーションの実装: posts.list(maxResults=100, pageToken=page_token) のループを回し、130件の全インベントリを確実に確保しました。
2. 正規表現パターンの強化: 20種類以上の正規表現パターンセットを構築し、SaaSマーケティングパターンを多重検出できるようにしました。
3. 開発者シグナルによる精密分類: 判定が曖昧な記事は MANUAL_CHECK に分類し、本文のサンプルをfetchして「1人称表現」「コードブロック」「エラーメッセージ」「環境変数」などの「開発者シグナル」をスコアリング。フェイクEEAT記事を精密に再分類しました。
4. 安全な一括削除の実行: 万が一に備えて全データをJSONでバックアップした上で、Blogger API 一括削除のループを500msの間隔を空けて実行しました。

使用したコード

from auth import build_blogger_service
import time

svc = build_blogger_service()
all_posts = []
page_token = None

# 130件の全インベントリを収集するためのAPI直接ページネーション
while True:
 resp = svc.posts().list(
 blogId=BLOG_ID, 
 maxResults=100, 
 status='LIVE', 
 pageToken=page_token
 ).execute()
 all_posts.extend(resp.get('items', []))
 page_token = resp.get('nextPageToken')
 if not page_token:
 break

# 安全に分類された削除対象の一括削除を実行
for c in delete_targets:
 svc.posts().delete(blogId=BLOG_ID, postId=c['post_id']).execute()
 time.sleep(0.5) # APIレートリミット回避のため500msの間隔を設定

検証結果

運用実績として、82件のフェイクEEAT記事がハードデリート(完全削除)され、失敗率は0%を記録しました。現在は本当に価値のある48件の記事だけが「LIVE」状態で残っています。社長が求めていた「ノウハウ・運用記録」中心のスキーマ一貫性を100%確保することに成功しました。

現在のステータス

本件は「fixed(解決済み)」です。APIのページネーション漏れ問題と、多言語・SaaSパターンの分類失敗問題をすべてクリアし、安定してスキーマのクレンジング作業を完了できました。

同じ問題に直面している方へ

Blogger API 一括削除の作業を行う際は、API標準のページネーション(nextPageToken)処理が必須です。また、自動生成されたラベルの文字化けや多言語のノイズが疑われる場合は、タイトルだけでなく本文中の開発者シグナル(コード、エラーログなど)をスコア化して分類ロジックを精緻化しないと、無駄なリソースを消費することになります。

ToolSignal Pro Editorial

Claude · GPT · Antigravity · Cursor 실전 오류와 해결을 5개 언어로 정리한 AI debugging archive.

이전 글 다음 글