動機

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]

ref. nilab/otegaru-tweet: Otegaru Tweet is a script for easily posting tweet by command line. This is use Ruby.

tags: ruby twitter webapi

Posted by NI-Lab. (@nilab)