Chatwork - メッセージの送信
にメンテナンス済み
APIトークンの扱いに注意
API トークンをソースコードに直接書くと、Git や共有ファイルから漏えいする恐れがあります。以下の例では環境変数
CHATWORK_API_TOKEN から読み込む形にしています。実運用では、組織のルールに従って安全な保存場所を選んでください。
ソースコード
' 送信先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
解説
API トークンは、Chatwork のサービス連携画面で発行します。上記の例では、発行したトークンを環境変数 CHATWORK_API_TOKEN に設定してから実行します。
後は、上記のファンクションを以下のように呼び出すだけで取得できます。
Call SendMessage("00000", "このメッセージはExcelから送信されました")
“00000”の部分が送信先のグループチャットになります。グループチャットの取得については、以下の記事を参考にしてください。今回使った Api ファンクションを使えば、2 行足すだけで実装することができます。
Chatwork - ユーザー一覧の取得
VBAからChatwork APIのcontactsエンドポイントを呼び出し、コンタクト一覧を取得する方法を解説します。APIトークンの安全な読み込み、HTTPステータス確認、JSONの整形方法も紹介します。
送信後に取得できる HTTP ヘッダー情報などは、以下を参考にしてください。
Chatwork API ドキュメント - チャットにメッセージを投稿する
グループチャット名からメッセージを送信する
もしこの VBA プログラムを Excel 利用者向けに使用する場合、メッセージの送信のために、ルーム ID を指定しないといけないのは不親切です。
予めコンタクト一覧をリスト化しておくのもいいですが、リアルタイムに取得する場合のため、グループチャット名を指定してメッセージを送信できるファンクションもご紹介しておきます。
※上述した、コンタクト一覧を取得する記事内で紹介しているファンクション及び、JsonConverter を使うことを前提としています
Public Sub SendFromName(ByRef name As String, ByRef message As String)
Dim records As Object
Set records = JsonConverter.ParseJson(GetContacts)
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
#VBA