typetalkでPHPを使った時報botを作る。

こんにちは、エンジニア見習いのarnabonです。
Qiita初投稿になります。宜しくお願いします。

#お題：typetalkでPHPを使った時報botを作る。

事の発端は以下の通り。
私が働く会社は全員リモートワークなので、普段のコミュニケーションはtypetalkで行っています。毎朝11時にハングアウトで朝礼をすることになっていますが、その朝礼をみんなして忘れます。またハングアウトの部屋を作るのに手間取ってしまい、なんだかんだで11:30を過ぎることも珍しくありませんでした。

そこである日良いことに気づきました。
**「第三者（bot）に教えて貰えばいいじゃない。或る日の平日にbotを動かすように設定して社内を驚かそう。」と。**

いうことで時報botの開発が始まりました。

##もくじ
0.開発環境と事前準備
1.完成イメージ
2.botアカウントを作ろう
3.実装しよう
4.完成そして社内の反応
5.まとめ

##0.開発環境と事前準備
今回はtypetalkと自社の実験用のサーバを使って開発します。
開発環境は以下の通り。
CentOS　6.8x
PHP 5.6x

また、Googleカレンダーに30年くらい先の予定を入れて、ハングアウトを生成し、そのURLをメモしておいてください。

##1.完成イメージ
完成イメージはこんな感じです。

10:55になるとメッセージとハングアウトのURLが表示されます。
![first.png](https://qiita-image-store.s3.amazonaws.com/0/152423/90c2cfb7-09e7-57a7-b5db-a94fac7bc0ae.png)


そして11:00になると朝礼開始のメッセージが表示されます。
![スクリーンショット 2016-12-19 11.40.24.png](https://qiita-image-store.s3.amazonaws.com/0/152423/56d8c9bb-7405-2633-9c1e-a08f0b107214.png)

ハングアウトを使っているとなぜかログインできない、音が聞こえずやむなく再起動などのトラブルがあります。そこで朝礼開始5分前にURLを通知し、調整時間としました。不要な場合は一つで十分かと思います。

##2.botを作ろう

botを用意します。これがないと始まりません。
まず、typetalkを起動し、時報botを動かしたいトピックから「トピックの編集」を選びます。
![develop.png](https://qiita-image-store.s3.amazonaws.com/0/152423/9bf5fa3b-6e3a-2f6c-59fe-490257090844.png)

ボットを選択後、「ボットの追加」をクリックします。
次に画面が切り替わるので、IDと名前を決め、APIは上から二番目にチェックを入れます。
![スクリーンショット 2016-12-20 10.02.53.png](https://qiita-image-store.s3.amazonaws.com/0/152423/f450a608-5913-e57e-c4c2-c68a3dfb5ac3.png)


ここまで出来たら「作成」をクリックします。すると下の方にTypetalk Token、メッセージの取得と投稿のURL、メッセージの投稿コマンドサンプルが作成されます。ここまででbotの設定は完了。


今回の朝礼botの仕組みは次の通りです。

![スクリーンショット 2016-12-20 14.33.51.png](https://qiita-image-store.s3.amazonaws.com/0/152423/7097ff24-0f1e-0a5e-939a-e5067f975684.png)


①平日午前10:55になる。
②設定したcronがalarm_first.phpを実行。
③typetalkの朝礼用トピックに「@here 10:55になりました! あと5分で朝礼のお時間です!　ハングアウトのURL」と表示。
④午前11:00にcronがalarm_second.phpを実行。同様に「@here 11:00になりました！朝礼のお時間です！」と表示。

サイトにアクセスするときは通常URLを入力し、戻ってきた情報ブラウザを通して見ています。
しかし今回のbotの場合、URLを叩く人がいません。そこでその役割をcurlに担ってもらいます。


試しにコマンドラインからメッセージの投稿コマンドサンプルを叩いてみます。
このコマンドは編集画面でbotを作成した際に一番下に出てくるので、そのまま持ってきて叩いてみてください。

```
$curl -d 'message=Hello, Typetalk!' 'https://typetalk.in/api/v1/topics/******(対象のトピックID)?typetalkToken=ボットのトークン'
```

これもcurlで送っているので、うまくいくと画像のようにtypetalkにメッセージが飛びます。



![スクリーンショット 2016-12-19 14.06.43.png](https://qiita-image-store.s3.amazonaws.com/0/152423/754744c1-145a-42ee-6467-170a84f685a3.png)


##3.実装しよう

１から書くのは私にはとても難しかったので、上司のサンプルコードを参考にして書きました。

```alarm_first.php

<?php
//10:55に朝礼まであと5分をお知らせするbotです。

     $strURL = "https://typetalk.in/api/v1/topics/＊＊＊＊＊＊(対象トピックのID)";
     $strToken = "編集画面で作ったボットのトークン"；
     $arrheader = array(
          "Content-Type: application/json",
          "X-Typetalk-Token: {$strToken}"
     );

//動かないときの対策として
     ini_set( "display_errors", true );

//typetalkに送信する言葉
     $arrPost = array(
          "message" => "@here 10:55になりました!\n朝礼まであと5分です!\nハングアウトのURL"
     );

//typetalkのAPIにJSONデータ出力　curlにやってもらう
     $objCurl = curl_init( $strURL );

     curl_setopt( $objCurl, CURLOPT_SSL_VERIFYHOST,          2 );
     curl_setopt( $objCurl, CURLOPT_SSL_VERIFYPEER,          false );
     curl_setopt( $objCurl, CURLOPT_FAILONERROR,               true );

     curl_setopt( $objCurl, CURLOPT_RETURNTRANSFER,          1 );

     curl_setopt( $objCurl, CURLOPT_HTTPHEADER,                    $arrheader );

     curl_setopt( $objCurl, CURLOPT_POST,                                   true );
     curl_setopt( $objCurl, CURLOPT_POSTFIELDS,                    json_encode( $arrPost ) );

     $strRet          = curl_exec( $objCurl );
     $objError     = curl_error( $objCurl );
     $objRet          = json_decode( $strRet );
?>
```


```alarm_second.php
<?php
//11:00の朝礼をお知らせするbotです。
     $strURL = "https://typetalk.in/api/v1/topics/＊＊＊＊＊＊(対象トピックのID)";
     $strToken = "編集画面で作ったボットのトークン";
     $arrheader = array(
          "Content-Type: application/json",
          "X-Typetalk-Token: {$strToken}"
     );

//動かないとき用の対策
     ini_set( "display_errors", true );

//typetalkに送信する言葉
     $arrPost = array(
          "message" => "@here\n11:00なりました! 朝礼のお時間です!"
     );

//typetalkのAPIにJSONデータ出力　curlにやってもらう
     $objCurl = curl_init( $strURL );

     curl_setopt( $objCurl, CURLOPT_SSL_VERIFYHOST,          2 );
     curl_setopt( $objCurl, CURLOPT_SSL_VERIFYPEER,          false );
     curl_setopt( $objCurl, CURLOPT_FAILONERROR,               true );

     curl_setopt( $objCurl, CURLOPT_RETURNTRANSFER,          1 );

     curl_setopt( $objCurl, CURLOPT_HTTPHEADER,                    $arrheader );

     curl_setopt( $objCurl, CURLOPT_POST,                                   true );
     curl_setopt( $objCurl, CURLOPT_POSTFIELDS,                    json_encode( $arrPost ) );

     $strRet          = curl_exec( $objCurl );
     $objError     = curl_error( $objCurl );
     $objRet          = json_decode( $strRet );
?>
```

最後にcronの設定です。
alarm_first.phpは平日の10:55に、alarm_second.phpは平日の11:00に起動するように設定します。
コマンドラインから、crontab -eで編集画面を開き、以下を入力します。
以下の/some/where/you/put/alarm_first.phpはご自身のファイルの絶対パスに置き換えてください。

```
55 10 * * 1-5 /usr/bin/php /some/where/you/put/alarm_first.php
00 11 * * 1-5 /usr/bin/php /some/where/you/put/alarm_second.php
```

##4.完成、そして社内の反応
12月16日（金）10:30に完成。
実験のため自分だけが見れる独り言用のトピックで起動させてましたので、新しく朝礼用のトピックにbotを作成し、topicidとトークンを変更しました。

![kansei.png](https://qiita-image-store.s3.amazonaws.com/0/152423/1262a280-9021-1dd2-b096-e30f4dd40d27.png)

みなさん喜んでいただけました。嬉しい。:hugging:

##5.まとめ

普段の作業をプログラムを書くことでちょっと便利にすることができる。困っていた人たちに喜んでもらえる。エンジニアとしてのあり方を再確認できたと思います。

ちなみに、はじめのところで以下のようなことを書きました。
・Googleカレンダーに30年くらい先の予定を入れて、ハングアウトを生成し、そのURLをメモしておいてください。

この方法を教えてくださった上司と話し合ったときにこんな会話がありました。
![saigo.png](https://qiita-image-store.s3.amazonaws.com/0/152423/c396a08d-a762-d370-ddd2-90e8298c1615.png)

まだまだ始まったばかりで、上司がサンプルで書いてくださったコードをカチカチ書き写していますが、振り返るころにはちゃんとしたエンジニアに慣れてますように・・・。
未来の自分に期待しつつ、今回はこちらで終わりにしようと思います。
ありがとうございました！