はじめに
さいきんTwitterをはじめたんですが、どこでもTwitterやりたいなーって思って作りました。
## 仕様
- アンダースコアでホームツイート、メンションツイート、自分のツイートをそれぞれ取得
- それ以外はメッセージとしてツイートします。ついでに、ツイートの取得もします
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アプリを作成すると取得できます
XXXXの部分はこちらのHUBOT_SLACK_TOKENです↓
ここまでで、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にしてください
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
動作確認
ちゃんと動いてますね!
これをベースにいろいろできそうです。
リポジトリはこちら
https://github.com/s1160054/Slack2Twitter
参考