質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MicroCMS

MicroCMSとは、APIベースのヘッドレスCMSです。日本製のため、デフォルトで日本語に対応しており、サポートも豊富。管理画面でも作成したコンテンツなどが見やすくシンプルで、APIの管理がしやすい点も特徴です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1045閲覧

PHPでmicroCMSにPOSTしようとすると拒否される

yubi0908

総合スコア1

MicroCMS

MicroCMSとは、APIベースのヘッドレスCMSです。日本製のため、デフォルトで日本語に対応しており、サポートも豊富。管理画面でも作成したコンテンツなどが見やすくシンプルで、APIの管理がしやすい点も特徴です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2023/03/12 06:27

編集2023/03/13 02:44

実現したいこと

Wordpressの記事データをmicroCMSへ移行するために、下記の記事を参考に移行しようとしています。
https://zenn.dev/kandai/articles/f6a034d166e4c977a78e

echo $data['id'] . ':' . $html . "\n";

しかし、参考記事の終盤に記載されている上記を実行すると

000(記事ID):{"message":"POST is forbidden."}

と、記事の数だけ返ってきてしまいました。

PHPはおろか、APIを叩くことにも慣れていませんので、どのようなエラーなのかいまいちイメージが出来ていないのですが、
こちらはPOSTを拒否されているということなのでしょうか...?
だとすると、デフォルト権限でPOSTを許可としているのに何故拒否されているのでしょうか?

やってみたこと

・microCMSのAPIスキーマなどの設定は参考記事の内容と全く同じように設定しました。
・しかし、取得したAPI KEYを記述する所の「X-WRITE-API-KEY」は、「X-MICROCMS-API-KEY」に変更しています(X-MICROCMS-API-KEYに統一されたようです)
・microCMS管理画面からデフォルト権限のGET、POSTにチェックがついているかどうかの再確認
・↑念の為、個別権限も同じように設定しました
・var_dumpで記事のデータが$dataの配列の通りに取得されているかどうかの確認(されていました)
・xmlのサイズを小さくして実行 参考
・一度に何度も実行してしまったので、時間を5時間ほど置いてから再度実行
microCMSのプランは無料プランです。

不足情報などございましたらご指摘いただけますと幸いです。
よろしくお願いします。

追記

実際のコードはこちらです。

php

1<?php 2 3// 読みこむXML 4$xml = "./blog.xml"; 5$imgBasePath = 'https://images.microcms-assets.io/bar/'; 6$xmlData = simplexml_load_file($xml, 'SimpleXMLElement', LIBXML_NOCDATA); 7 8$url = 'エンドポイント'; 9$headers = array( 10 'Content-Type: application/json', 11 'X-MICROCMS-API-KEY: XXXXXXXXXX' 12); 13 14foreach ($xmlData->channel->item as $entry) { 15 16 // カテゴリの設定 17 $cateArray = []; 18 $categories = json_decode(json_encode($entry->category), true); 19 20 foreach ($categories as $category) { 21 if (is_array($category)) continue; 22 23 switch($category) { 24 case 'event': 25 $cateArray[] = 'event'; 26 break; 27 case 'notice': 28 $cateArray[] = 'notice'; 29 break; 30 case 'blog': 31 $cateArray[] = 'blog'; 32 break; 33 } 34 } 35 36 // コンテンツ取得 37 $contents = trim(strval($entry->children('content', true)->encoded)); 38 39 preg_match_all('/src="https:\/\/hoge\.com\/wp-content\/uploads\/(.*)(png|jpg|jpeg|gif)/i', $contents, $matches); 40 41 // 置き換え用の配列を作成 42 $pattern = []; 43 $replace = []; 44 foreach ($matches[0] as $key => $match) { 45 $pattern[] = '/' . preg_replace('/\//', '\/', $match) . '/'; 46 $pathArray = explode('/', $match); 47 $paths = array_reverse($pathArray); 48 $replace[] = 'src="' . $imgBasePath . "{$paths[2]}_{$paths[1]}_{$paths[0]}"; 49 } 50 51 // 置き換え実行 52 $html_content = preg_replace($pattern, $replace, $contents); 53 54 // 送信用のデータ作成 55 $data = [ 56 'id' => '000' . strval($entry->children('wp', true)->post_id), 57 'title' => trim(strval($entry->title)), 58 'category' => array_unique($cateArray), 59 'html_contents' => $html_content, 60 'is_html' => true, 61 'is_migration' => true 62 ]; 63 64 // curlでPOSTする 65 $ch = curl_init(); 66 curl_setopt($ch, CURLOPT_URL, $url); 67 curl_setopt($ch, CURLOPT_POST, TRUE); 68 curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 69 curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); 70 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 71 $html = curl_exec($ch); 72 73 // curlでエラー 74 if(curl_errno($ch)){ 75 $CURLERR .= 'curl_errno:' . curl_errno($ch) . "\n"; 76 $CURLERR .= 'curl_error:' . curl_error($ch) . "\n"; 77 $CURLERR .= '▼curl_getinfo' . "\n"; 78 foreach(curl_getinfo($ch) as $key => $val){ 79 $CURLERR .= '■' . $key . ':' . $val . "\n"; 80 } 81 echo nl2br($CURLERR); 82 } 83 84 curl_close($ch); 85 86 87 echo $data['id'] . ':' . $html . "\n";

■管理画面での設定
APIキー管理ページから設定できる「デフォルト権限」と「対象API」では、GET・POSTにチェックがついている状態です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yubi0908

2023/03/13 02:33

ありがとうございます。確かにSDKの利用で書かれていますね。 先程SDKでのPOSTの仕方を調べていたところ、↓こちらのページにたどり着きました https://document.microcms.io/manual/api-preview 記事の内容の通りにAPIプレビューの初期値「GET」となっているプルダウンを開いてみると そもそもPOSTの項目がありませんでした。 ですので、やはりアクセス権の設定がうまくいっていないのでしょうか... 具体的な設定などにつきましてこの後に追記いたします。
guest

回答1

0

自己解決

APIの型をオブジェクト形式で作っていたので、リスト形式にして作り直したらPOST出来ました...
無事記事の移行が成功しました。
APIについてあまり理解ができていなかったのですが、今回の件で色々調べてみて、理解が深まりました。

ただ、カテゴリの移行がうまくいかなかったのと記事の作成日時の移行のことを忘れていたためもう少し粘ります...
ありがとうございました。

投稿2023/03/13 05:56

yubi0908

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問