動機
Python で Twitter API をコールして、ツイートをするような bot を開発しようとしたけどうまくいかなかったので、 ツイート処理だけ Ruby で書いて他から簡単に使えるようなものが欲しかった。
仕組み
- Twitter の OAuth 認証に必要なキーを JSON ファイルに書いておく
- ツイートしたい内容を JSON ファイルに書いておく
- 2つの JSON ファイルを引数に指定して Ruby スクリプトを実行すると、Twitter にツイートを投稿できる
つまり、他のプログラムからツイートしたい内容をJSONファイルに書き出しておいてから、 この Ruby スクリプトを実行することで、ツイートすることができる。
ソースコード
ソースコード一式はこちら
⇒ nilab/otegaru-tweet: Otegaru Tweet is a script for easily posting tweet by command line. This is use Ruby.
解説は以下。
必要なライブラリは Gemfile に記述する
Twitter API を手軽に扱える便利なライブラリを使用する。
⇒ twitter | RubyGems.org | your community gem host
使うライブラリを Gemfile に書く。
$ cat Gemfile
source 'https://rubygems.org'
gem 'twitter'
Gemfile に記述したライブラリは bundler コマンドでインストールできる。
bundler コマンドの使い方を忘れてしまうので、シェルスクリプトに書いておく。 --path オプションで、ライブラリをインストールするパスを指定可能。
$ cat setup.sh
#!/bin/sh
bundle install --path .
スクリプト本体のソースコード otegaru-tweet.rb
$ cat otegaru-tweet.rb
# usage:
# otegaru-tweet.rb --auth auth.json --status status.json
require 'optparse'
require 'json'
require 'twitter'
class Tweet
def status_update(auth, status)
client = Twitter::REST::Client.new(auth)
client.update(status[:status], status)
end
def get_option(argv)
result = {}
opt = OptionParser.new()
opt.on('--auth FILE_PATH') {|v| result[:auth] = v}
opt.on('--status FILE_PATH') {|v| result[:status] = v}
opt.parse(argv)
return result
end
def get_json_file(path)
data = open(path) do |io|
json = io.read()
JSON.parse(json, symbolize_names: true)
end
return data
end
def tweet()
opt = get_option(ARGV)
auth = get_json_file(opt[:auth])
status = get_json_file(opt[:status])
status_update(auth, status)
end
end
Tweet.new().tweet()
OAuth 認証情報 JSON ファイル
Twitrer API の OAuth 認証に必要な情報を JSON ファイルに記述する。
$ cat auth.json
{
"consumer_key": "YOUR CONSUMER KEY",
"consumer_secret": "YOUR CONSUMER SECRET",
"access_token": "YOUR ACCESS TOKEN",
"access_token_secret": "YOUR ACCESS TOKEN SECRET"
}
ツイート情報 JSON ファイル
ツイートしたい情報を JSON ファイルに記述する。緯度経度は lat, long を指定してツイートできるところまで確認済み。
パラメータは POST statuses/update | Twitter Developers を参照。
$ cat status.json
{
"status": "hello, twitter, ニホンゴOK?",
"lat": 35.0001,
"long": 135.0001
}
Ruby スクリプトを実行する
--auth オプションで OAuth 認証情報 JSON ファイルを指定。
--status オプションでツイート情報 JSON ファイルを指定。
今回はライブラリを bundler で導入しているので、bundler exec で Ruby スクリプトを実行する。
Ruby スクリプトを実行する方法は忘れがちなので、シェルスクリプトに記述しておく。
$ cat doit.sh
#!/bin/sh
bundler exec ruby ./foo/bar/otegaru-tweet.rb --auth auth.json --status status.json
これを実行することで、Twitter にツイートを投稿できる。
このスクリプトの欠点
- JSON ファイルをつくってどこかに置かなくてはいけない
- ツイートに失敗したときのエラーを取得できていない
今回の環境
Debian jessie + Ruby 2.1.5
$ uname -mrsv
Linux 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-2+deb8u3 (2016-07-02) x86_64
$ cat /etc/debian_version
8.5
$ ruby -v
ruby 2.1.5p273 (2014-11-13) [x86_64-linux-gnu]
tags: ruby twitter webapi
Posted by NI-Lab. (@nilab)