アメブロのRSSを活用してWordPressへ自動投稿するLambdaスクリプトを作った
はじめに
ブログやコンテンツ運営において、「複数のプラットフォームに同じ記事を投稿したい」というニーズは意外と多くあります。私自身も、Amebaブログ(アメブロ)で定期的に記事を投稿しているのですが、その内容をWordPressにも展開したいという場面がありました。
最初は手作業でコピペしていましたが、記事数が増えるにつれ手間もミスも増えていく一方。特に画像の貼り直しや投稿日時の整合性など、地味に面倒な工程が多く、「これはもう、自動化するしかないな」と思ったのが始まりです。
せっかくなら技術的にもチャレンジングな構成にしたかったので、AWS Lambdaを使い、アメブロのRSSを定期取得 → 画像をWordPressにアップロード → 本文の画像URLを差し替えて投稿、という仕組みを構築してみました。
本記事では、この自動連携スクリプトの概要や設計方針、実装のポイントをまとめていきます。
同じようなニーズを持つ方や、AWSやWordPressを活用して何か自動化したい方の参考になれば嬉しいです。
やりたかったことの概要
今回作成した仕組みの目的は、Amebaブログで投稿された記事を、自動的にWordPressにも投稿することです。単にタイトルと本文をコピーするだけでなく、記事内の画像も含めて正しく移植し、カテゴリやタグの情報も可能な限り反映させるようにしました。
加えて、一度投稿した記事が重複して再投稿されないような工夫や、新しい記事だけを対象に処理する差分取得の仕組みも取り入れています。これにより、Lambdaを定期実行するだけで、「新しく投稿されたアメブロ記事」が「WordPressに自動で投稿される」流れが完成します。
また、柔軟性を持たせるために、環境変数やLambdaイベント引数を使って以下のような制御ができるようにしました:
- 投稿ステータス(公開 or 下書き)
- 処理件数の上限
- 差分取り込み or 期間指定での取り込み
- 画像のスキップやカテゴリのマッピングの有無
つまり、「使う側の運用スタイルに合わせて柔軟に動作する仕組み」を目指して設計した、というのがこのスクリプトの全体像です。
実装の全体フロー
この仕組みは、AWS Lambda 上で動作する1つのスクリプトによって実現されています。Lambda を定期的にトリガーすることで、アメブロの RSS フィードを取得し、必要な情報を抽出・加工して WordPress に投稿する、という一連の流れを自動化しています。
以下が処理の大まかな流れです:
- 環境変数・イベントパラメータの読み込み
投稿ステータスや処理モード(live/range)、取り込み上限、画像アップロードの有無などを制御。 - アメブロの RSS 取得・パース
RSS からcontent:encoded
またはdescription
を抽出し、本文HTMLと画像情報を取り出す。 - 差分・対象記事の選定
SSM パラメータストアから最終取り込み日時を参照し、差分取得。または期間指定(range)にも対応。 - 画像の処理とアップロード
記事内の<img>
タグを検出し、Referer・User-Agent を工夫して画像をダウンロード。WordPress にwp.uploadFile
でアップロードし、本文内の画像URLを置き換える。 - カテゴリ・タグの付与処理
RSS 内のカテゴリ情報を WordPress のタームとして登録・割り当て。重複や制御文字はサニタイズ。 - WordPress に投稿(XML-RPC)
wp.newPost
による投稿処理。一度失敗してもpost_name
を変えてリトライすることで衝突を回避。 - 状態の更新(冪等性の確保)
SSM に最終取り込み日時や処理済みリンクを記録し、次回以降の取り込みで重複を防止。
技術的にはシンプルなステップの組み合わせですが、柔軟性と安全性を両立するための設計上の工夫をいくつか取り入れています。次のセクションでは、その実装の詳細ポイントをさらに掘り下げていきます。
実装の詳細ポイント
このスクリプトでは、Lambdaという制約のある実行環境の中で、柔軟かつ安全に記事をWordPressへ投稿するための細かな工夫をいくつも盛り込んでいます。以下に、特に工夫したポイントをピックアップして紹介します。
1. 差分管理と冪等性の工夫
pubDate
を ISO 形式に変換し、文字列比較で新着記事を判定。- 通常モード(live)では、前回の最終取り込み日時を SSM に保存し、それ以降の記事だけを処理。
- 範囲モード(range)では、すでに取り込んだリンクの集合を SSM に保存して重複を回避。
- 記事は古い順に投稿することで、WordPress 側での並び順が自然になるように配慮。
2. 画像の取得と差し替え処理
- 記事本文内の
<img>
タグをパースし、src
属性のURLを取得。 - Ameblo 側のダウンロードブロックを避けるため、Referer ヘッダーや Chrome風の User-Agent を指定。
- 画像の拡張子がない場合は、Content-Type を見て補完 or
.jpg
を強制付与。 - 取得した画像を
wp.uploadFile
で WordPress にアップロードし、新しい URL に差し替え。
3. タグ・カテゴリの処理
- RSSの最初のカテゴリを WordPress のカテゴリとしてマッピング(オプションで制御可能)。
- 全カテゴリをタグとしても登録。ターム名は以下の処理を実施:
- 制御文字・絵文字(4バイト文字)をHTMLエスケープ
- 前後の空白を除去
- 重複・空文字を排除
- 必要に応じて
getTerms
/newTerm
を使って WordPress に存在確認 or 新規作成
4. 投稿処理とエラー対応
wp.newPost
で投稿する際、slugが重複して失敗した場合は、post_name
にタイムスタンプを付けて再試行。- 投稿結果や画像処理中に発生したエラーは、すべて
errors
配列にまとめて返却し、処理は継続。 - Lambdaのエラー伝播を防ぎ、CloudWatchログから問題を追跡しやすいように構造化された戻り値を設計。
全体として、「壊れにくく・繰り返し安全に動作する」ように設計しています。特に、画像処理とターム管理は地味ながらも重要なポイントで、これを疎かにするとWordPress側で表示崩れやメタ情報の欠落が起きてしまいます。
実装してみてわかったこと・今後の改善ポイント
今回の自動連携スクリプトを構築してみて、実際に動く仕組みができたという達成感と同時に、いくつかの課題や改善点も見えてきました。ここでは、運用面や技術面で気づいたことをまとめておきます。
1. XML-RPCの扱いにくさ
- WordPressの標準APIであるXML-RPCを使いましたが、レスポンスが分かりづらく、エラーハンドリングが難しいと感じました。
- 特に
wp.newPost
やwp.uploadFile
でエラーが発生しても、原因特定に手間がかかることがあり、REST APIへの移行も視野に入れてよいと感じています。
2. 差分管理の注意点
pubDate
ベースでの差分検出はシンプルで効率的ですが、タイムゾーンや記事の更新タイミングによって取りこぼしが発生する可能性もあります。- ISO文字列として比較する実装には問題はないものの、タイムゾーンの統一や記事更新時の挙動には引き続き注意が必要です。
3. 画像取得の安定性
- User-AgentやRefererの設定によっては、Ameba側でブロックされるケースも考えられるため、今後はリトライ処理や軽量化の実装も必要になってきそうです。
- 現状は1枚ずつ順次ダウンロードしているため、Lambdaの実行時間制限やAPI制限に注意が必要です。
4. 記事の再実行・冪等性の設計
live
モードでの処理は比較的安全に再実行できる設計ですが、range
モードの場合、SSM_SEEN_KEYを設定しないと重複投稿の可能性があるため、意図的に設定を強く推奨する必要があると感じました。- 処理済みの状態を外部に持つことは、冪等性確保に有効だと再認識しました。
5. 今後の改善ポイント
- WordPress REST APIへの切り替え(認証や通信の柔軟性向上)
- CloudWatchへのログ出力強化(構造化ログ、アラート対応)
- エラーごとのリトライ設計(特に画像アップロードや投稿失敗時)
- UI付きの設定インターフェース(SSMや環境変数管理の簡易化)
実装してみたことで、「動くコードを書く」だけでなく、「継続的に運用できる設計にする」ことの大切さをあらためて実感しました。
まとめ
今回は、AmebaブログのRSSを活用してWordPressに自動投稿するLambdaスクリプトを開発した事例について紹介しました。
定期的に複数のプラットフォームで記事を発信していると、**「同じ内容をどう効率よく再利用するか」**が課題になります。手作業では手間も多く、属人的になりがちなこのプロセスを、AWS Lambda・RSS・XML-RPC・SSM などを組み合わせて自動化することで、大幅に省力化できました。
今回の実装では、単に記事を移すだけでなく、
- 差分管理と冪等性
- 画像の正確な取得と置き換え
- タグ・カテゴリの再構成
- 柔軟な設定切り替え
といった、実運用に耐える仕組みを意識して作り込みました。もちろん、XML-RPCの扱いづらさやログ不足など、改善点もいくつか見つかりましたが、それも含めて貴重な経験になりました。
同じように「AmebaからWordPressへの連携を自動化したい」「RSSを活用して外部サービスと繋げたい」といったニーズがある方のヒントになれば嬉しいです!