Mt.Log

編入、編入後の勉強

RubyをつかってTwitterの翻訳Botを作ってみる

はじめに

TwitterBotに興味があったので調べてみました。
それでRailsにも使いたいなという感じでRubyでやりました。

どんなBotを作ろうかというもんでまあ前使った翻訳Botでも使って英語→日本語への翻訳をするBotでもあればおもしろいなってことでやってみました。

Twitter Developersからキーを取得

まず、下記サイトからAPIキーを取得します。
apps.twitter.com
Twitterアカウントを持っていない人は作ってからの取得になります。
BotからのTweetはこのアカウントからのTweetになるのでメインでアカウントを持っていてもBot用に作ったほうが良いかと思います。

・Create New Appから新規Appの作成
・各プロパティを埋める(WebsiteとCallbackはなんでもいいけどなんでもいい人は下のローカルでも書いとけばおk)
Website : http://127.0.0.1:3000
Callback URI's : http://127.0.0.1:3000/auth/twitter
・Keys and Access TokensからAccess Tokenを取得しメモっておく

これでTwitter APIを使う準備ができました。

みんなの自動翻訳APIからキーを取得

続いて、翻訳APIです。
今回は、みんなの自動翻訳TexTraというものを使用します。商用では使用できませんが、簡単に使用できるのでお手軽です。
みんなの自動翻訳@TexTra®
ここのサイトから英語→日本語のキーを取得します。

Gemをインストールする

必要なGemをインストールします。

gem 'twitter'
gem 'oauth'
gem 'json'

使うGemは3つです。Twitter用にTwitterと翻訳APIの認証用にoauthとレスポンスのパース用にjsonをインストールします。

$ bundle install

ここからコードを書いていきます。

Configを書く

キーとトークンをconfig.rbを作成して書いていきます。

config.rb

require 'twitter'
require 'oauth'

config = {
    consumer_key: "TwitterのAPIキー",
    consumer_secret: "Twitterのシークレットキー",
    access_token: "Twitterのアクセストークン",
    access_token_secret: "Twitterのシークレットトークン",
}

@restClient = Twitter::REST::Client.new(config)
@streamingClient=Twitter::Streaming::Client.new(config)

translate_key="翻訳APIのAPIキー"
translate_secret="翻訳APIのシークレットキー"
url="https://mt-auto-minhon-mlt.ucri.jgn-x.jp/api/mt/generalN_en_ja/"
name="翻訳APIのユーザー名"

consumer = OAuth::Consumer.new(translate_key, translate_secret)
endpoint = OAuth::AccessToken.new(consumer)

これでそれぞれのキー、トークンを書いて、各APIで使用するインスタンスを作成しました。

本文を書く

さて、本文を書きます。

translate.rb

require 'twitter'
require 'oauth'
require 'json'
require './config'

#タイムゾーンの指定
ENV['TZ']='JST-9'
#今回は説明のためにmtryoさんとする
username="送信したいユーザー名(@抜きで書いてます)"

#mtryoさんのTweetを見張る
@streamingClient.user do |tweet|
    #もしmtryoさんの「Translate:」を含むTweetを見つけたら
    if tweet.class==Twitter::Tweet && tweet.text.include?("Translate:") && !tweet.in_reply_to_status_id
        puts "Found tweet: #{tweet}"
        #Tweetの本文を翻訳APIにかける
        response = endpoint.post(url,{key: consumer_key, type: 'json', name: name, text: tweet.text})
        #レスポンスをパースする
        result = JSON.parse(response.body)
        #username宛にリプライする。
        @restClient.update("@#{username} #{result['resultset']['result']['text']}", in_reply_to_status_id: tweet.id)
    end
end

今回は「Translate:」を含むTweetをしたときに翻訳してリプライすることにしました。
include?の部分を変えればキーワードは変更できます。

実行する

最後に実行すれば終わりです。

$ ruby translate.rb

お疲れ様でーす!

参考サイト

NICT の自動翻訳 API を Rails で使う
Twitterボット(Twitter Bot)の作り方(Ruby編) - サーバ設定不要のPaizaCloud上でTwitterボットをRubyで作る - paiza開発日誌