[PHP]初心者でも簡単に作れるSlackBot~TechJack~

# slack Bot を作った話

slack bot を作った話をしようと思う。
作ったやつは、こんなの↓↓

## TechJack
![techJack.jpg](https://qiita-image-store.s3.amazonaws.com/0/115634/4700d142-6c91-919f-3aca-071596d5c218.jpeg)



内容は、
会社の `#tech` というチャンネルで、9時から18時までの発言者が僕の所属するチームの人（基盤ユニット）だけだった場合、
上の画像付きでBot がメッセージを投稿するというもの。
まだまだ改善の余地は大きいと思うが、とりあえずやってみた。

botは、raspberry pi においてあり、
cron を使って18時に実行することを念頭に置いてコードを書いた。

また、下記出現する `"取得したAPI キー"` は、
`https://api.slack.com/web` の `Generate Test Tokens` より取得した。

コードはこんな感じ

```php
<?php
// 9時間前を計算する関数
// 18時にクーロンを回すので、朝9時からのデータが取れる。
function returnThisMorning()
{
    date_default_timezone_set('Asia/Tokyo');
    $now = time();
    $thisMorning = $now - (9 * 60 * 60);
    return urlencode($thisMorning);
}

$slackApiKey = "取得したAPI キー";
$thisMorning = returnThisMorning();

// チャンネルの履歴を取得
// チャンネル名ではなくチャンネルIDを登録する必要がある。
// oldest には、thisMorning のタイムスタンプを代入
$url = "https://slack.com/api/channels.history?token=${slackApiKey}&channel="チャンネルID"&oldest=${thisMorning}";

// $url を叩いて、結果をJsonDecode する。
// 第二引数を true にすることで、配列にdecodeされる。
// 参考: http://d.hatena.ne.jp/kasahi/20070806/1186419785
$results = json_decode(file_get_contents($url), true);

// うちのチームメンバーのID
$users = [
    "一人目",
    "二人目",
    "三人目",
    "四人目",
    "五人目",
    "六人目",
];

// techJack を初期化
$techJack = true;
// ここが結構ダサい。配列をぐるぐる回して、がんばって、メンバーを探している。
foreach ($results["messages"] as $key => $result) {
    // echo strtotime($result["ts"]);
    $user = $result["user"];
    if (!is_null($user)) {
        // 他のユーザーが混ざってたら $techJack を false にする
        if (!in_array($user, $users)) {
            $techJack = false;
        }
    }
}

// ここもださい！画像ファイルの貼付方法がわからなかったから、画像のURL を貼ってる。
$textTechJack = "TECH JACK ~ Tech Room Was Completely Jacked By 基盤ユニット :star: ~https://cdn-ak.f.st-hatena.com/images/fotolife/a/adiboy/20160901/20160901131203.jpg";
$textTechJack = urlencode($textTechJack);
if ($techJack) {
    $techJack = "https://slack.com/api/chat.postMessage?token=${slackApiKey}&channel="チャンネルID"&text=${textTechJack}&username=TechJack";
    file_get_contents($techJack);
}

```

## 今回使ったslack APIメソッドとその使い方

###　特定のチャンネルの履歴を取得するためのAPI
```
https://slack.com/api/channels.history?token="取得したAPIキー"&channel="チャンネルID"&oldest=${thisMorning}
```


`チャンネルID` と書いているところに最初はチャンネル名を書いていてうまく動かなかったので、気をつけて欲しい。
また、`oldest` には、いつからの情報が欲しいかを書く（タイムスタンプ）。


### 特定のチャンネルにメッセージを投稿するためのAPI
```
"https://slack.com/api/chat.postMessage?token="取得したAPIキー"&channel="チャンネルID"&text=${textTechJack}&username=techJack
```
`chat.postMessage` は、特定のチャンネルにメッセージをポストするためのAPI
画像の送り方がわからなかったので、画像のリンクを貼ったらうまく動いた。(もちろん、いい方法ではない。)

### チャンネルID を取得するためのAPI
```
https://slack.com/api/channels.list?token="取得したAPIキー"
```
ちなみに、こちらが`チャンネルID` を取得するのに使ったAPIだ。
ブラウザでURL を叩いて、`command + F` で検索した。
数が多くなると大変なので、スクリプトを組んだほうが良いと思う。

### ユーザーID を取得するためのAPI
```
https://slack.com/api/users.list?token="取得したAPIキー"
```
をブラウザで叩いて、ユーザー情報も取得した。
今回は手動で取得したが、数が多くなってくると、こちらもスクリプトを組んだほうがいいと思う。

ちなみに、API で使えるメソッドは、`https://api.slack.com/methods`に書いてある。
興味があれば、調べてみてください。

## 感想
Tech チャンネルが活発で、全然Botが活躍する機会がないのが玉に瑕。
まあでも、忘れた頃にTechJack してくれるのではないかと思っている。
最終目標は、Go 言語でSlack Botを運用することなので、
徐々にグレードアップしていきます！お楽しみに！

## 秘話(社内向け)
`#bot-test` というチャンネルで実験しています。
頑張ってる感が出てると思います。