VBAでマストドンにトゥート!


VBAからマストドンにトゥートしてみよう!(全く需要なし)

やり方は簡単です。
まずソースコードを書く前に参照設定からMicrosoft XML, 6.0にチェックを付けます。

ではソースコードを書いていきます。

toot関数
Private Sub toot(status As String)
    Const ACCESS_TOKEN As String = "accessToken"
    Dim paramStr As String: paramStr = "&status=" & status
    Dim req As XMLHTTP60: Set req = New XMLHTTP60

    With req
        .Open "POST", "https://friends.nico/api/v1/statuses"
        .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        .setRequestHeader "Authorization", "Bearer " & ACCESS_TOKEN
        .send paramStr
    End With

    Set req = Nothing
End Sub

これだけです。
paramStrに、status(必須)等のパラメータを追記できます。
たとえば、デバッグ用にvisibilityを判定する関数を作って、それを追加なんてことも可能ですね。
詳しくはMastodonのドキュメント statusesForm Data Parametersを確認してください。
ちなみに、REQUIREDと赤字で書いてあるパラメータは、その名の通り必須のため、送信する時はどれか必ずパラメータに入れなければなりません。
今回はstatuses(トゥート文字)を送る想定なので、パラメータ的には成立しています。
OPTIONALは、必ずしもパラメータに入れる必要はありません。
VBAのデフォルト引数で書くOptionalとほぼ意味は同じでしょう。

参考サイト

最後に

これ、全く需要ないと思います(なんで書いた)

追記① 2018/12/25

レスポンスチェックを書いていなかったので一応記載します。
(正直VBAならトゥートされてればどうでもいい)

.send paramStrの下に以下を記載します。

追記①
Do While .readyState < 4
    DoEvents
Loop
If .responseText Like "*error*" Then _
    MsgBox "エラー", vbOKOnly + vbCritical, "トゥート"

JScripttypeinfoにはExistsはないんですかね?使い方がわからない…
解説としましては、.readyStateが4になったら返事が帰ってきます。
その後、.responseTextにレスポンスされたJSonが格納されていますので、
errorがあるかどうかをチェックします。(本当はパースした後ExistsでBooleanを返す関数を作りたかった)

追記② 2020/5/16

単純に.statusを確認するだけでよかったみたいです。
追記①でもチェックはできますが、忘れてください。

追記②
Do While .readyState < 4
    DoEvents
Loop
If .status = 200 Then
    MsgBox "トゥートしました。", vbOKOnly + vbInformation, "トゥート!"
Else
    MsgBox "失敗しました。" & vbCrLf & "エラーコード:" & .status, vbOKOnly + vbCritical, "トゥート!"
End If

リクエスト結果が、200(成功)かどうかをチェックし、それ以外はエラーとしてみました。

追記③ 2020/10/21

アクセストークンをURLからヘッダーに入れるよう変更しました。(上記toot関数修正済み)

変更前
Dim paramStr As String: paramStr = "&access_token=" & ACCESS_TOKEN & "&status=" & status
                                 ~中略~
With req
    .Open "POST", "https://friends.nico/api/v1/statuses"
    .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    .send (paramStr)
変更後
Dim paramStr As String: paramStr = "&status=" & status
                                 ~中略~
With req
    .Open "POST", "https://friends.nico/api/v1/statuses"
    .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    .setRequestHeader "Authorization", "Bearer " & ACCESS_TOKEN
    .send (paramStr)

セキュリティ的にまずいとのことなので、.setRequestHeader に入れるよう修正しました。
そもそもなんでパラメータにアクセストークンを記載してもトゥートできるのが、API的に不思議という
あとはちょこっとAPIに関するところも追記しました。