Slackでなりすましコマンドをつくってみる 〜なりすましせずにはいられない〜

# はじめに
- [Slack Commands](https://api.slack.com/slash-commands) でチーム内のだれかになりすますことをしてみたいとおもいます
- 私が所属している会社では私が半年くらい前にはじめました
- ひょんなことから知ることになった[Elixir](https://elixir-lang.org/)([Phoenix Framework](https://phoenixframework.org/))を使いましたが、プログラミング言語はなにでもいいはずです
    - 実際最初に書いたのは、[SINATRA](http://sinatrarb.com/)を利用させていただきました

# 仕組み

![spoof.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/92f1dbf9-1501-f07d-64ec-0b7585b94bdd.png)

1. `/spoof @username hello world`とSlackに投稿されたら用意したサーバに通知がくるようにしておきます([Slack Slash Commands](https://api.slack.com/slash-commands)を使います)
2. 自分のサーバにまで情報が渡ってくればあとは煮るなり焼くなり好きなようにできます
3. まず[users.list API](https://api.slack.com/methods/users.list/test)でアイコン情報を取得します
4. 情報はそろいましたので、
**カスタムインテグレーション**のほうのIncoming Webhookで、なりすまし投稿をします

# 作品
- [Spoof](https://github.torifuku-kaiou.tokyo/)
- ポイントは[lib/spoof_web/controllers/spoof_controller.ex](https://github.com/TORIFUKUKaiou/Spoof/blob/master/lib/spoof_web/controllers/spoof_controller.ex)

# 使用例
0. torifukuさん、kaiouさん、ponyさんのSlackがありました。
1. ponyさんとkaiouさんが投稿しました。画面はponyさんのSlackです。
<img width="955" alt="スクリーンショット 2019-07-13 22.45.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/68148eb0-3d46-738e-0d97-f2273c34a817.png">

2. ponyさんは、torifukuさんになりすまして投稿しようとslackコマンドを打ち込みました。
<img width="955" alt="スクリーンショット 2019-07-13 22.45.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/9d791bab-cab6-bae0-bd9b-3063eed04e69.png">

3. ponyさんはコマンドを実行したところ、無事なりすますことができました。
<img width="955" alt="スクリーンショット 2019-07-13 22.45.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/4886ecde-56d6-5085-1e7f-129df778895d.png">

4. torifukuさんは自分が投稿した覚えの無い内容が表示されているので困惑しました。
<img width="955" alt="スクリーンショット 2019-07-13 22.46.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/c350453c-6b00-d9e8-892d-86eb5eb45bb7.png">

- 偽物は右肩に`アプリ`と表示されるので、それで本物と偽物を見破ってください
- ステータスアイコンに`アプリ`という絵文字を使う人がでてくると混乱をきわめます

# 各種設定のヒントなど
## users.list APIのためのトークン
```
https://api.slack.com/apps
|> Create an App
|> Input: App Name and Development Slack Workspace
|> Create App
|> Basic Information
|> Add features and functionality
|> Permissions
|> Select: Access your workspace’s profile information
|> Reinstall App
|> OAuth Access Token
|> Copy

export SLACK_YOUR_WORKSPACE_TOKEN="xoxp-..."
```

## **カスタムインテグレーション**のほうのIncoming Webhook
```
https://<your-domain>.slack.com/apps/manage
|> 検索
|> Serach: Incoming Webhook
|> インストール
|> 設定を追加
|> Incoming Web インテグレーションの追加
|> Copy Webhook URL

export SLACK_YOUR_DOMAIN_WEBHOOK_URL="https://hooks.slack.com/services/.../..."
```
- **カスタムインテグレーション**のほうがポイントです
- [Incoming Webhooks](https://api.slack.com/incoming-webhooks)こっちだとユーザー名やチャネル、アイコンなんかを自由に指定できないようです(たぶん)
<img width="634" alt="スクリーンショット 2019-07-13 22.36.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/c1481d6b-b59d-4790-76e4-7ff15fff9f4e.png">
- **カスタムインテグレーション**は非推奨っぽいのもポイントのひとつです
<img width="1054" alt="スクリーンショット 2019-07-13 22.38.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/38d9b28a-f4a6-d59c-2b61-04501703027f.png">

## Slash commandsの設定
```
https://api.slack.com/apps
|> Basic Information
|> Slash Commands
|> Create New Command
|> Command: /spoof
|> Request URL: https://<your-domain>/api/v1/spoof
|> Short Description: spoof
|> Usage Hint: @username message
|> Save
|> reinstall your app
|> Reinstall App
```
- これの前にhttpsなサーバを用意してください
- 私は[TIME4 VPS](https://www.time4vps.com/)を使いました



# 最後に
- 私は一人楽しんでいるのですが、社内の反応はいまいちでして、禁止令がでました
- 人形劇と揶揄されることもあります
- 私一人だけのチャネルがありましてかろうじてそこでひっそりと息をしています
- 唯一役にたった瞬間があるとすれば、ミーティングの際に、Slackに発言者の言葉をなりすましコマンドでSlackに書き込んで議事録？　っぽくした事例くらいです
- しかし、私のタイピングが**音が大きい**わりには致命的に**遅くて**長続きしませんでした
- **カスタムインテグレーション**はどうも削除されるっぽいような警告が表示されているので強制退場かもしれません
- もしおもしろさを感じていただける方がいらっしゃいましたら、お得意の言語/フレームワークをお使いいただいて、ぜひ導入してください
- やるなら**いま**しかありません
- 勝者がルールを変える
- ルールを変えたものが勝者