LoginSignup
8
8

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-09-21

はじめに

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

 仕様

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

success.gif

Slackのボットをつくる

Hubotに必要なモジュール

まず、こちらをインストールします

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

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

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

ボットのセットアップ

# 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
こちらのファイルをエディタで開き、次のコードで上書きしてください

# システムコマンドを実行するための設定
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

ボットの動作を確認する

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

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

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

スクリーンショット 2016-09-20 15.38.17.png

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

スクリーンショット 2016-09-20 15.37.12.png

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

TwitterAPIクライアントをつくる

Gemのインストール

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

gem install twitter

Rubyコードの記述

post_twitter/scripts/post.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されてるから15分待ってね'
    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

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

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

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

スクリーンショット 2016-09-20 14.59.48.png
スクリーンショット 2016-09-20 14.59.57.png

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

~/.bashrc

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

実行

起動

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

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

動作確認

success.gif

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

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

参考

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8