LoginSignup
6
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-12-23

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

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

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

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的に不思議という:thinking:
あとはちょこっとAPIに関するところも追記しました。

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0