TypeScriptで記述してるので適宜読み替えが必要。
Webhookを作成する
まずAPIが使用できるように設定する。フリーアカウントの場合は特にやることはない?
http://developer.chatwork.com/ja/index.html
チャットワーク右上のアカウント名 → API設定 → WebhookよりWebhookを作成する。
あるいは以下のURLからWebhookへ
https://www.chatwork.com/service/packages/chatwork/subpackages/api/token.php

Webhook名 は識別用の名前。なんでもいい。
Webhook URLはイベント発生時にPostされるURL。
アカウントイベントの場合は自分に対するメンションをトリガにWebhook URL にhookされる。
ルームイベントの場合は該当ルームに書き込みがある度にhookされる。ルームイベントを拾って同じルームにPostするような作りにすると自動Postされたメッセージをhookして無限ループに入る可能性があるので注意すること。というか一回やらかした。
ルームIDはchatwarkのURL https://www.chatwork.com/#!ridXXXXXXXX のXXXXXXXXのこと
実装サンプル
Webhook URLをhttps::/[hostname]/api/chatwork
のようにした場合
1 2 3 | router.post( "api/chatwork" , (req, res, { }) => { // 処理 }) |
またjsonでPostされるので受け取れるように設定しておく必要がある。
1 | app.use(bodyParser.json()) |
色々手を加えていて以下のようにしていた時はbodyに正しく値が入ってこなかった(多分やらないと思うが一応)
1 | app.use(bodyParser.json({ type: 'application/*+json' })) |
req.body.webhook_event.body にメッセージが入ってくるようになる。
これを利用していろいろやって見る。
以下はチャットワークへポストしたときに文章中の
<bot call>
に反応してメッセージをおうむ返しするような処理にしている。
上にも書いたが"<bot call>"を消し忘れると無限ループする。しかも結構早い速度でメッセージが投稿され続ける。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | import * as request from "request" router.post( "api/chatwork" , (req, res, { }) => { if (req.body.webhook_event.body.indexOf( "<bot call>" ) !== -1) { let msg: string = req.body.webhook_event.body msg = msg.replace(/<bot call>/g, "" ) // msg = msg.replace(/\n/g, " ") // 以下はチャットワークへの投稿処理 // チャットワークのトークン const TOKEN = "xxxxxxxxxxxxxxxxxxxxxx" // ルームID const roomId = "XXXXXXXX" const options = { url: `https: //api.chatwork.com/v2/rooms/${roomId}/messages`, headers: { "X-ChatWorkToken" : TOKEN, }, form: { body: msg }, json: true , } // setTimeoutがないとうまく動作しなかった気がする setTimeout(() => { request.post(options, (error: string, response, body: string) => { if (!error && response.statusCode === 200) { console.log(body) } else { console.log( "error: " + response.statusCode) } }) }, 10) } res.sendStatus(200) }) |
ドキュメントにはステータスコード200を返せとあるが返さなくても一応動く。
またエラーが起きたとしても再送されない(出来ない)
これでボットの基本機能は完成。
参考
Webhookについての公式ドキュメント
http://developer.chatwork.com/ja/webhook.html
署名処理
http://creators-note.chatwork.com/entry/2017/11/22/165516