半自動イベントポータルブログ「コレイコーひろしま」ができるまで。今回はjsonを使って外部からブログ投稿を試みて、うまくいかなかったり、克服した話。
Webhook by ZapierでWordpressに投稿
ZapierにWordpressを直接接続して記事を投稿することもできるんだけど、ChatGPTが色々な設定をするならWebhookで投稿した方がいいですよ、というのでよくわからないまま使い始めた。正直わからないことだらけでジャングルの中を彷徨っているようだった。ここで何か聞いたことあるけどよくわかってなかった「json」が初登場。読み方はジェイソンでいいんですかね…。とにかく言われるがままに準備をする。
事前準備
- JWT認証プラグイン「JWT Authentication for WP-API」をインストール、有効化する。
- wp-config.phpにシークレットキー(適当な文字列)を埋め込む
define('JWT_AUTH_SECRET_KEY', 'シークレットキー');
これでエンドポイントと呼ばれるURLからブログの情報をGETしたり、記事をPOSTしたりするのに必要なJWT認証トークンなるものが得られるようになった。ところが何度試しても記事が投稿できない。404エラーがでる。これは記事を投稿する権限がないというエラーらしい。
・エンドポイントのURLが正しいか確認して下さい
・JWTプラグインの設定を確認して下さい
・JWTトークンのユーザーに投稿権限があるか確認して下さい
・サーバーでAPI制限されてないか見直して下さい
もう何度も何度も見直したっつーの。これが解決できないまま1週間ぐらい経ってしまう。JWT認証の問題ならとBasic認証も試してみたがダメ。しかしGETリクエストは通る。POSTリクエストだけ通らない。少しずつ何が問題なのかが切り分けられてきたが、しかし解決には至らない。
CGI版のPHPはJWTリクエストのヘッダーが消える?
ChatGPTから離れてGoogleで似たような事例がないか調べてみたら、こんな記事がみつかった。
エックスサーバーでJWT認証やBasic認証を使用する際に、特にPHPがCGI版(FastCGIを含む)で動作している場合、JWT認証が通らない問題は確かに存在する可能性があります。特に、AuthorizationヘッダーがFastCGIによって削除されることが、GETリクエストは正常に動作するがPOSTリクエストが失敗する理由の一つと考えられます。これを解決するために、.htaccessファイルに以下のコードを追加し、Authorizationヘッダーを正しく処理できるように設定します。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
</IfModule>
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
エックスサーバーでは、PHPの高速化にFastCGIやキャッシュモジュールが標準で有効になっています。
サーバーパネルからキャッシュをリフレッシュしてみてください。
確かにサーバーパネルの「高速化」という項目からサーバーキャッシュを削除することができた。これで遂に!遂にテスト投稿することができた!
エックスサーバーでJWT認証でAPIを使ってブログ投稿するまとめ
- JWTリクエストのヘッダーが消えるので.htaccessに呪文の追加が必要
- 呪文を追加したらサーバーパネルからサーバーキャッシュを削除する
- JWTトークンをPOSTリクエストで得る
- エンドポイントのURLはhttps://XXX.com/wp-json/jwt-auth/v1/token
- bodyにこう書いて送信する
{
"username": "your_username",
"password": "your_password"
}
- そうするとJWTトークンが返ってくる
{
"token": "your_jwt_token",
"user_email": "your_email",
"user_nicename": "your_username",
"user_display_name": "Your Display Name"
}
- 次にテスト記事をPOSTリクエストで送る
- エンドポイントのURLはhttps://XXX.com/wp-json/wp/v2/posts
- bodyは試しにこんな感じ
{
"title": "テスト記事のタイトル",
"content": "これはテスト記事のコンテンツです。",
"status": "publish"
}
- headerにはこの2行を書いて送信。私は最後JWTトークンの前に「Bearer 」と書くのを忘れてた。
Authorization: Bearer your_jwt_token
Content-Type: application/json
Zapierでの入力例
Zapierの場合はbodyのコードを書くのではなく、左のボックスに項目、右のボックスに内容を書くようになっていて、その内容部分に前のZapから得られたデータを入れていくことで記事をつくることができる。content(記事本文)は見出しや記事の構成などHTMLを含んだ内容にする必要があるため、一旦Wordpress上のビジュアルエディターで完成版の記事をつくったあと、右上の「…」からコードエディターに切り替えて、そのコードをコピペすることで、記事の枠組みの中にデータを流し込むことができる。
Dataに何を書いていいかわからなくても大丈夫。ChatGPTが全部教えてくれる。
JWT認証でWordpressに記事を投稿するときの、bodyの書き方を教えて。投稿したい項目は以下のとおり。
・記事タイトル
・記事本文
・投稿日時を指定
・下書きで投稿
・カテゴリ
・タグ
・アイキャッチ画像
各項目の説明
title
: 記事のタイトル。content
: 記事本文。status
: 投稿のステータス("publish"
や"draft"
を指定可能)。ここでは「下書き」で投稿するので"draft"
を指定。date
: 投稿日時を指定。フォーマットはYYYY-MM-DDTHH:MM:SS
です。例として「2024年10月1日10:00」に設定。categories
: カテゴリIDの配列。指定したカテゴリID(例:123
)に記事を分類。tags
: タグIDの配列。複数のタグを指定可能(例:456
と789
)。featured_media
: アイキャッチ画像のID。事前に画像をメディアライブラリにアップロードして、画像のIDを指定します。
注意点
- カテゴリやタグは事前にWordPressに存在するIDを指定する必要があります。存在しない場合は、投稿の前にカテゴリやタグを作成してIDを取得してください。
- アイキャッチ画像(
featured_media
)も同様に、投稿前に画像をメディアライブラリにアップロードし、そのIDを指定します。
注意点に基づいてカテゴリIDやタグIDを取得するPythonは別途ChatGPTに書いてもらった。ChatGPTで解決できない問題にぶち当たったとき、自分で解決しなきゃいけなくなったときが本当にキツい。気付けばChatGPT無しには生きられない、依存体質になってしまったことに不安を感じるのであった。続く。
<自動化ツールでブログを作成シリーズ>
- 自動化ツールを使うためにはサーバー設定の見直しが必要
- 没になったアイデアたち
- ChatGPTがプラグインの提案とPHPコードを書いてくれた
- 全くわからないPythonコードを書いてもらう
- jsonを使ってZapierからブログ投稿
- Cocoonのphp構造を理解してカスタムテンプレートをつくる
- Googleフォームに入力したらWordPressに自動投稿してくれるZapierフローのまとめ
- ZapierでSNSへ定期的に自動投稿
- 週末に土日から来週のイベントをまとめてSNSに投稿するZapierフローのまとめ
- ZapierからACFフィールドへの投稿
- ChatGPTと一緒にブログを作って感じたこと
コメント