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
のようにした場合
router.post("api/chatwork", (req, res, { }) => { // 処理 })でメッセージを受け取れるようになる。
またjsonでPostされるので受け取れるように設定しておく必要がある。
app.use(bodyParser.json())
色々手を加えていて以下のようにしていた時はbodyに正しく値が入ってこなかった(多分やらないと思うが一応)
app.use(bodyParser.json({ type: 'application/*+json' }))
req.body.webhook_event.body にメッセージが入ってくるようになる。
これを利用していろいろやって見る。
以下はチャットワークへポストしたときに文章中の
<bot call>
に反応してメッセージをおうむ返しするような処理にしている。
上にも書いたが"<bot call>"を消し忘れると無限ループする。しかも結構早い速度でメッセージが投稿され続ける。
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