SlackからTwitterに投稿するBotをHubotとRubyで作った

# はじめに

さいきんTwitterをはじめたんですが、どこでもTwitterやりたいなーって思って作りました。

##　仕様
 - アンダースコアでホームツイート、メンションツイート、自分のツイートをそれぞれ取得
 - それ以外はメッセージとしてツイートします。ついでに、ツイートの取得もします

![success.gif](https://qiita-image-store.s3.amazonaws.com/0/83334/c4dd3084-5e3b-5606-bd91-a30f2c4bdacd.gif)

# Slackのボットをつくる

## Hubotに必要なモジュール
まず、こちらをインストールします

|モジュール名|説明|
|----------|---|
|hubot|Hubot本体<br>hubotコマンドが使用できるようになる|
|hubot-slack|HubotのSlack用アダプタ<br>HubotをSlackに対応させるために使用する|
|yo|ひな形生成ツール|
|generator-hubot|yoでHubotプロジェクトの<br>ひな形を生成するために使用する|
|coffee-script|CoffeeScript。<br>HubotのスクリプトはCoffeeScriptで記述する|

インストールするコマンド

```bash
npm install -g hubot coffee-script yo generator-hubot
```

## ボットのセットアップ

```bash
# bot用のディレクトリを作る。今回はpost_twitter
mkdir -p post_twitter

# yoコマンドでbotの名前、アダプター（今回はslack）を指定して初期化する
cd post_twitter
yo hubot --owner="メアド@gmail.com" --name="post_twitter" --adapter=slack
npm install hubot-slack --save
```

## ボットのスクリプトを編集

`post_twitter/scripts/example.coffee`
こちらのファイルをエディタで開き、次のコードで上書きしてください

```coffeescript
# システムコマンドを実行するための設定
child_process = require 'child_process'
module.exports = (robot) ->
  bot_name = 'post_twitter'
  robot.hear ///#{bot_name}.*///i, (res) ->
    shift_num = bot_name.length + 1
    msg = res.message.text[shift_num..(140+shift_num)]
    return if msg.match(///.*because.*///i)
    console.log("----\n#{res.message.user.name}\n#{msg}\n----")
    child_process.exec "ruby ./scripts/post.rb '#{msg}'", (error, stdout, stderr) ->
      return res.emote "stderr: \n#{stderr}" if stderr
      return res.emote "error:  \n#{error}"  if error
      return res.emote "output: \n#{stdout}" if stdout
```

## ボットの動作を確認する

このコマンドで実行します。

```bash
HUBOT_SLACK_TOKEN=XXXX ./bin/hubot --adapter slack
```

XXXXの部分はSlackで「Custom App Integration」からhubotアプリを作成すると取得できます

<img width="1171" alt="スクリーンショット 2016-09-20 15.38.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/108235/5a1895b8-37a4-16e8-d7d5-faf741d93bf5.png">

XXXXの部分はこちらの***HUBOT_SLACK_TOKEN***です↓

<img width="1063" alt="スクリーンショット 2016-09-20 15.37.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/108235/35703549-71cd-df0c-b51e-4f8256d8adad.png">


ここまでで、Hubotの準備は完了です。
つぎはTwitterAPIクライアントを使って、ツイートとデータを取得します

# TwitterAPIクライアントをつくる

## Gemのインストール
TwitterクライアントのGemをインストールします

```sh
gem install twitter
```

## Rubyコードの記述
`post_twitter/scripts/post.rb`

こちらに次のコードを記述します。

```rb
require 'twitter'
class Slack2Twitter
  def initialize(consumer_key:, consumer_secret:, access_token:, access_token_secret:, twitter_user_id:)
    @client = Twitter::REST::Client.new do |config|
      config.consumer_key        = consumer_key
      config.consumer_secret     = consumer_secret
      config.access_token        = access_token
      config.access_token_secret = access_token_secret
    end
    @twitter_user_id             = twitter_user_id
  end

  def send_tweet(args = nil)
    return unless args
    msg = args.join(' ')
    return if msg[0] == '_'
    puts "-"*50 + "\n送信\n" + "-"*50 + "\n"
    if @client.update(msg)
      puts "完了\n  #{msg}"
    else
      puts "失敗\n  #{msg}"
    end
  end

  def recieve_activity(activity_name)
    case activity_name
    when :user_timeline
      @client.send(activity_name, @twitter_user_id).map { |m| "#{m.text}" }[0,4]
    when :mentions_timeline, :home_timeline
      @client.send(activity_name).map { |m| "#{m.user.name} => #{m.text}" }[0,4]
    end
  rescue Twitter::Error::TooManyRequests => e
    puts 'リクエスト多すぎて一時的にbanされてるから１５分待ってね'
    puts e
  end

  def show_activity(activity_name)
    puts "-"*50 + "\n#{activity_name}\n" + "-"*50 + "\n"
    puts recieve_activity(activity_name)
  end
end

# ここで上記のSlack2Twitterのインスタンスを作り、データ取得とツイートします。
slack2twitter = Slack2Twitter.new(consumer_key:        ENV['YOUR_CONSUMER_KEY'],
                                  consumer_secret:     ENV['YOUR_CONSUMER_SECRET'],
                                  access_token:        ENV['YOUR_ACCESS_TOKEN'],
                                  access_token_secret: ENV['YOUR_ACCESS_SECRET'],
                                  twitter_user_id:     ENV['YOUR_TWITTER_USER_ID'])

[:home_timeline, :mentions_timeline, :user_timeline].each do |activity_name|
  slack2twitter.show_activity(activity_name)
end

slack2twitter.send_tweet(ARGV)
```

次に、こちらにTwitterでサインインして、
[Twitter Application Management](https://apps.twitter.com/)

以下のキーを取得します。
こちららは無料で取得できます。

|必要なキー|定数名|
|---|---|
| コンシュマーキー         | YOUR_CONSUMER_KEY |
| コンシュマーキーシークレット | YOUR_CONSUMER_SECRET |
| アクセストークン         | YOUR_ACCESS_TOKEN |
| アクセストークンシークレット | YOUR_ACCESS_SECRET|

この*Key and Access Tokens*のタブのところにあります。
Access Levelは **Read and write**にしてください

<img width="711" alt="スクリーンショット 2016-09-20 14.59.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/83334/48fe2e08-eaf7-7f4e-28b2-cdd77c3d1dd8.png">
<img width="908" alt="スクリーンショット 2016-09-20 14.59.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/83334/0acf79cc-c6ac-907a-accc-f03bc0ad5c97.png">

４つのキーを取得したら、上記の定数のところを直接編集するか、つぎのようにシステム変数にしてください

`~/.bashrc`

```bash
export YOUR_CONSUMER_KEY='XXXX'
export YOUR_CONSUMER_SECRET='XXXX'
export YOUR_ACCESS_TOKEN='XXXX'
export YOUR_ACCESS_SECRET='XXXX'
```

# 実行

## 起動
ふたたび、コンソールでこちらを実行します

```bash
HUBOT_SLACK_TOKEN=XXXX ./bin/hubot --adapter slack
```

## 動作確認
![success.gif](https://qiita-image-store.s3.amazonaws.com/0/83334/c4dd3084-5e3b-5606-bd91-a30f2c4bdacd.gif)

ちゃんと動いてますね！
これをベースにいろいろできそうです。

リポジトリはこちら
https://github.com/s1160054/Slack2Twitter

# 参考
https://github.com/sferik/twitter