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

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

ただいまの
回答率

87.49%

EXCEL VBAからWordPressのRESTAPIを使用して投稿したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,527

score 16

前提・実現したいこと

EXCEL VBAのVBAを使用してWordPressのRESTAPIにアクセスして、更新をしたいと思います。

認証まではできたのですが、
JSONリクエストを送信しているのですが、エラーコードを見ている限り、
「コンテンツがない」
と言われうまく送信できません

発生している問題・エラーメッセージ

{"code":"empty_content","message":"\u672c\u6587\u3001\u30bf\u30a4\u30c8\u30eb\u3001\u629c\u7c8b\u304c\u7a7a\u6b04\u3067\u3059\u3002","data":{"status":400}}

{"code":"empty_content","message":"本文、タイトル、抜粋が空欄です。","data":{"status":400}}

該当のソースコード

Sub HTTPリクエスト()


  URL = "https://********.jp/wp-json/wp/v2/posts/"
  UserName = "*****"
  pass = "*****"

  Status = "draft"

   method = "POST"

   Title = "test"
   Content = "texttext"

'JSON作成

    Dim JsonObject As Object
    Set JsonObject = New Dictionary

    Dim Header As String
    Header = UserName + ":" + pass
    Header = "Basic " & EncodeToBase64(Header)


    JsonObject.Add "method", method

    JsonObject.Add "body", New Dictionary
        JsonObject("body").Add "title", Title
        JsonObject("body").Add "content", Content
        JsonObject("body").Add "status", Status

    JsonObject.Add "muteHttpExceptions", True

 ' イミディエイトウィンドウで確認(デバック用)
Debug.Print JsonConverter.ConvertToJson(JsonObject, Whitespace:=2)




Dim objHTTP As Object
Set objHTTP = CreateObject("msxml2.xmlhttp")

    objHTTP.Open "POST", URL, False
    objHTTP.setRequestHeader "Authorization", Header
    objHTTP.setRequestHeader "Content-Type", "text/plain"
    objHTTP.send JsonConverter.ConvertToJson(JsonObject)


Debug.Print objHTTP.responseText
' レスポンスコード(正常)
If objHTTP.Status = 200 Then
    MsgBox "正常に終了しました"
End If


End Sub

Public Function EncodeToBase64(ByRef text As String) As String

    ' オブジェクトの準備
    Dim node As Object
    Set node = CreateObject("Msxml2.DOMDocument.3.0").createElement("base64")

    ' エンコード
    node.DataType = "bin.base64"
    node.nodeTypedValue = ConvertToBinary(text)

    ' 関数で取り除けない改行を削除して返却
    EncodeToBase64 = Replace(node.text, vbLf, "")
End Function

' *==============================================================
' * 文字列をバイナリデータに変換します
' *
' * @param text 変換する値
' * @return バイナリデータ
' *==============================================================
Public Function ConvertToBinary(ByRef text As String)

    ' オブジェクトの準備
    Dim BinaryStream As Object
    Set BinaryStream = CreateObject("ADODB.Stream")

    ' Streamの設定
    With BinaryStream
        .Type = 2
        .Charset = "us-ascii"
        .Open
        .WriteText text
        .Position = 0
        .Type = 1
        .Position = 0
    End With

    ConvertToBinary = BinaryStream.Read
End Function

送信しているJson (JsonObject の中身)

{
  "method": "POST",
  "body": {
    "title": "test",
    "content": "texttext",
    "status": "draft"
  },
  "muteHttpExceptions": true
}

試したこと

元は
GASから更新しておりこちらを参考にEXCELで作成しました
https://teratail.com/questions/211650

補足情報(FW/ツールのバージョンなど)

参考にしました。
WordPressRESTAPI認証

https://ja.wp-api.org/guide/authentication/
EXCEL(VBA)から、JSONデータをHTTP送信してみよう。
https://doruby.jp/users/ookouchi/entries/201708-EXCEL-VBA-JSON-API-MSXML2-XMLHTTP
【参照設定不要】Base64フォーマットにエンコードする
https://localbias.work/796

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • CHERRY

    2020/09/03 08:28

    JSON データの構造の問題と思いますが、送信している組み立て済みのJSON データを質問に追記することは可能でしょうか?

    キャンセル

  • so_chan

    2020/09/03 10:45

    ありがとうございます。追記させていただきました。

    キャンセル

  • kuma_kuma_

    2020/09/22 05:39

    WordPressでREST APIを利用して自動投稿を行う
    https://ichiro-kun.com/post/1088/
    こちらの情報ですが

    objHTTP.setRequestHeader "Content-Type", "application/json"
    で試してみて下さい。

    あと気になったのが"us-ascii"の指定
    WordPressは"utf-8"だと思いますが、もし日本語が文字化けするようでしたら変更してみて下さい。

    キャンセル

  • so_chan

    2020/09/23 10:07

    ご指摘の修正とJsonの形式が誤っていたので修正したら無事に投稿できました!ありがとうございます!

    キャンセル

回答 1

check解決した方法

0

送信するJsonを作成するときのコードを修正

    JsonObject.Add "method", method
    JsonObject.Add "title", Title
    JsonObject.Add "content", Content
    JsonObject.Add "status", Status

ヘッダーを修正

修正前

    objHTTP.setRequestHeader "Content-Type", "text/plain"


修正後

    objHTTP.setRequestHeader "Content-Type", "application/json"

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る