VBAでData APIにアクセスする

Movable TypeのData APIは、さまざまなプログラム言語からアクセスすることができます。
その一例として、ExcelのVBA(Visual Basic for Applications)でアクセスしてみました。

JSONLibの準備

Data APIでは、JSON形式でデータをやり取りします。
しかし、ExcelのVBAには、標準ではJSONを扱う機能がありません。

そこで、「JSONLib」というライブラリを使います。
JSONLibの入手および組み込み方法は、cybozu.com developer networkの「第2回 Excelとkintoneを連携させよう」の記事をご参照ください。

記事を作成する

例として、記事を作成するプログラムを作ってみたところ、以下のようになりました。
Data APIのプロトコルに沿って、HTTP通信を順に行っています。
先頭の方のConst文にある「ユーザー名」「パスワード」「your-host」「path-to-mt」「記事作成先のブログのID」を、ご自分の環境に合わせて書き換えれば、動作を試すことができます。

Const USERNAME = "ユーザー名"
Const PASSWORD = "パスワード"
Const CLIENTID = "sample"
Const BASE = "http://your-host/path-to-mt/mt-data-api.cgi/"
Const SITE_ID = 記事作成先のブログのID

Sub main()
    Dim url As String, params As String, accessToken As String
    Dim json As Object
    
    ' XMLHttpとjsonlibの初期化
    Dim xmlhttp As Object
    Set xmlhttp = CreateObject("msxml2.xmlhttp")
    Dim jsonlib As New jsonlib
    
    ' 認証
    url = BASE & "v1/authentication"
    params = "username=" & USERNAME & "&password=" & PASSWORD & "&clientId=" & CLIENTID
    xmlhttp.Open "POST", url, False
    xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    xmlhttp.send params
    Set json = jsonlib.parse(xmlhttp.responseText)
    If xmlhttp.Status <> 200 Then
        MsgBox "認証失敗:" & xmlhttp.Status & " " & json("error")("message")
        Exit Sub
    End If
    
    ' アクセストークンを取得
    accessToken = json("accessToken")
    
    ' 記事を作成
    Dim entry As Object
    Set entry = CreateObject("Scripting.Dictionary")
    entry("title") = "test"
    entry("body") = "あいうえお"
    url = BASE & "v2/sites/" & SITE_ID & "/entries"
    xmlhttp.Open "POST", url, False
    xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    xmlhttp.setRequestHeader "X-MT-Authorization", "MTAuth accessToken=" & accessToken
    xmlhttp.send "entry=" & jsonlib.toString(entry)
    Set json = jsonlib.parse(xmlhttp.responseText)
    If xmlhttp.Status <> 200 Then
        MsgBox "記事作成失敗:" & xmlhttp.Status & " " & json("error")("message")
        Exit Sub
    End If
    MsgBox "記事作成終了"
End Sub