APIトークンの扱いに注意
API トークンをソースコードに直接書くと、Git や共有ファイルから漏えいする恐れがあります。以下の例では環境変数
CHATWORK_API_TOKEN から読み込む形にしています。実運用では、組織のルールに従って安全な保存場所を選んでください。
VBA から Chatwork API の POST /rooms/{room_id}/messages を呼び出して、Excel からチャットへメッセージを送信する方法を紹介します。日次の集計結果や処理完了の通知を自動化したいときに便利です。
前提
- Windows 版 Excel の VBA で動作します(
MSXML2.XMLHTTPとEncodeURL関数を使用します。EncodeURLは Excel 2013 以降が必要です) - Chatwork の API トークンを発行済みであること
ソースコード
' 送信先URI
Private Const END_POINT As String = "https://api.chatwork.com/v2/"
Private Function GetChatworkApiToken() As String
GetChatworkApiToken = Environ$("CHATWORK_API_TOKEN")
If Len(GetChatworkApiToken) = 0 Then
Err.Raise vbObjectError + 1000, , "環境変数 CHATWORK_API_TOKEN が設定されていません。"
End If
End Function
Public Function Api( _
ByVal method As String, _
ByVal url As String, _
Optional ByVal param As String = "") As String
Dim httpRequest As Object
Set httpRequest = CreateObject("MSXML2.XMLHTTP")
With httpRequest
Call .Open(method, END_POINT & url, False)
If method = "POST" Or method = "PUT" Then
Call .setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
End If
Call .setRequestHeader("X-ChatWorkToken", GetChatworkApiToken())
Call .send(param)
If .Status < 200 Or .Status >= 300 Then
Err.Raise vbObjectError + 1001, , "Chatwork API Error: " & .Status & " - " & .responseText
End If
Api = .responseText
End With
End Function
Public Function SendMessage(ByVal roomId As String, ByVal message As String) As String
Dim url As String, param As String
url = "rooms/" & roomId & "/messages"
param = "body=" & Application.WorksheetFunction.EncodeURL(message)
SendMessage = Api("POST", url, param)
End Function
解説
上記のファンクションを以下のように呼び出すと、メッセージが送信されます。
Call SendMessage("00000", "このメッセージはExcelから送信されました")
“00000”の部分が送信先のルーム ID です。グループチャットの場合は、チャットを開いたときの URL 末尾(#!rid に続く数字)で確認できます。個別チャットのルーム ID は、以下の記事のコンタクト一覧から取得できます。コンタクト一覧の取得も、同じ Api ファンクションで実現できます。
VBAからChatwork APIのcontactsエンドポイントを呼び出し、コンタクト一覧を取得する方法を解説します。APIトークンの安全な読み込み、HTTPステータス確認、JSONの整形方法も紹介します。
送信に成功すると、投稿したメッセージの ID(message_id)が JSON で返ります。詳細は以下を参考にしてください。
Chatwork API ドキュメント - チャットにメッセージを投稿する
チャット名からメッセージを送信する
Excel 利用者向けのツールでは、利用者にルーム ID を入力してもらうのは負担になります。チャット名を指定して送信できるようにしておくと、使い勝手が良くなります。
グループチャットを含む参加中のチャット一覧は、GET /rooms で取得できます(room_id・name・type などが返ります)。
※コンタクト一覧の記事で紹介している JsonConverter をインポート済みであることが前提です
Public Sub SendFromName(ByRef name As String, ByRef message As String)
Dim records As Object
Set records = JsonConverter.ParseJson(Api("GET", "rooms"))
Dim record As Object
For Each record In records
If name = record("name") Then
Call SendMessage(record("room_id"), message)
Exit For
End If
Next
End Sub
同名のチャットが複数ある場合は最初に見つかったものへ送信されます。送信先を確実に特定したい場合は、ルーム ID を直接指定してください。なお、Chatwork API には短時間あたりの利用回数制限があります(429 エラーが返ります)。ループで大量に送信する場合は、公式ドキュメントで最新の制限を確認してください。