
photo credit: bernard kerr via photopin (license)
みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
チャットワークでおみくじチャットを作っています。
前回、基本的な機能としてはほぼほぼ完成をしました。

Google Apps ScriptとチャットワークAPIでスクリプトを特定のグループチャットに仕込みます。
そのチャットで「おみくじ」と入力すると、「 “大吉”,”中吉”,”小吉”,”吉”,”半吉”,”末吉”,”凶”」の中から自動でいずれかがメッセージとして返って来ます。

今回は、チャットワークのメッセージ記法を使って、この自動で返ってくるメッセージにToや返信をつける方法についてお伝えします。
では行ってみましょう!
前回のおさらい
前回作成したスクリプトはこちらです。
//おみくじチャット
function getOmikuji(){
/* メッセージを取得 */
var params = {
headers : {"X-ChatWorkToken" : 'APIトークン'},
method : "get"
};
var roomID = XXXXXXXX; //ルームID
var url = "https://api.chatwork.com/v2/rooms/" + roomID + "/messages?force=0"; //指定のグループチャットからメッセージを取得
var strRespons = UrlFetchApp.fetch(url, params); //チャットワークAPIエンドポイントからレスポンスを取得
var json = JSON.parse(strRespons.getContentText()); //文字列をJSON形式として解析しJSONオブジェクトとして返す
/* リクエスト用パラメータ・URLの準備 */
params.method="post"; //リクエストメソッドをpostに設定
var payload = {
body : ""
};
params.payload=payload; //リクエストペイロードのbodyを一旦セット
url = "https://api.chatwork.com/v2/rooms/" + roomID + "/messages"; //指定のグループチャットにメッセージを送る
/* json内に「おみくじ」メッセージがあればチャットワークに送信 */
for each(var obj in json){
if(obj.body === "おみくじ"){
params.payload.body = "[info]おみくじの結果:" + generateOmikuji() + "[/info]"; //チャットワークに送るテキスト
UrlFetchApp.fetch(url, params); //チャットワークAPIエンドポイントにリクエスト
}
}
}
//乱数でおみくじの結果を生成
function generateOmikuji(){
var results=["大吉","中吉","小吉","吉","半吉","末吉","凶"];
return results[Math.floor(Math.random()*results.length)];
}
前半の4~13行目でチャットワークの該当のグループチャットから未取得のメッセージを配列jsonに格納します。
15行目以降がおみくじの結果を生成して、チャットワークにメッセージを送信する部分です。
for each文で配列json内に格納されたすべてのメッセージについて、そのbodyつまり本文を確認し「おみくじ」と一致した場合に、おみくじを引きます。
function generateOmikuji()はおみくじの結果を生成する関数ですね。
今回は、28行目を修正して、チャットワークへ送る文字列にToや返信を付与していきたいと思います。
チャットワークのメッセージ記法
チャットワークでは角括弧のタグを用いることで様々な表記をすることができるメッセージ記法を利用することができます。
- [info]~[/info]:挟まれた範囲を四角で囲う
- [qt]:引用マーク
- [hr]:直線を引く
ちなみに改行をする場合は「\n」を使います。
今回はおみくじの結果を返すときにToや返信をつけたいと思いますので、その方法について解説をします。
メッセージにToをつける
チャットワークではToをつけて連絡することにより、特定の相手に話しかけることができます。
メッセージ記法としてTo機能を使う場合は
とします。Tは大文字なので注意下さいね。
配列jsonに格納されたメッセージは
[
{
"message_id": 5,
"account": {
"account_id": 123,
"name": "Bob",
"avatar_image_url": "https://example.com/ico_avatar.png"
},
"body": "Hello Chatwork!",
"send_time": 1384242850,
"update_time": 0
}
]
という構造となっています。”account_id”を持っていますのでこれを使えばOKです。
チャットワークへの送る文字列を
params.payload.body = "[To:" + obj.account.account_id + "][info]おみくじの結果:" + generateOmikuji() + "[/info]"; //チャットワークに送るテキスト
とすれば良さそうですね。
実行してみますと

いちおうできましたが「To」マークとアイコンだけで、なんだか寂しいですね。しかも凶…
To機能のタグは、名前まで返してくれないので
としてあげるのが親切そうです。
params.payload.body = "[To:" + obj.account.account_id + "]" + obj.account.name + "さん[info]おみくじの結果:" + generateOmikuji() + "[/info]"; //チャットワークに送るテキスト
として、実行をしますと

これでいつものToの表示になりました。
しかし、また凶…不吉な。
返信でメッセージをする
次に返信をしてみましょう。
返信でメッセージを送ると「RE」というマークがつき、特定のメッセージへの返信になります。
ちなみに、この「RE」マークですが、クリックすると元のメッセージに移動できるので便利です。
メッセージ記法として返信機能を使う場合は
とします。To機能よりもだいぶ複雑になりましたね。
“account_id”,”message_id”は配列jsonに含まれていますし、ルームIDはもともと知っていますので、要素としては揃っています。
またToと同様に名前を入れたほうが親切なので
としましょう。
スクリプトはちょっと長くなりましたが
params.payload.body = "[rp aid=" + obj.account.account_id + " to=" + roomID + "-" + obj.message_id + "] " + obj.account.name + "さん[info]おみくじの結果:" + generateOmikuji() + "[/info]"; //チャットワークに送るテキスト
とします。
実行してみますと

バッチリですね。しかも大吉…やった!
…て、なんかもてあそばれていますね。
まとめ
チャットワークのメッセージ記法を使って、おみくじの結果をToにしたり返信にしたりしてみました。
これでだいぶおみくじチャットもサマになってきましたね。
しかし、いかんせんコードが読みづらい…
次回は、チャットワークのメッセージを取り出す、メッセージを送るといった汎用的な機能を関数化してコードをスッキリさせていきたいと思っています。
どうぞお楽しみに!

