このツイートはなぜかハイチ語として認識されている。キチェ語と認識されることは期待してないけれど、精度を高めるか翻訳機能を下手に盛り込まないほうがいいと思う。
Category Archives: Kotz’i’jに恋して
Kotz’i’jに恋して23: Twitterbotによる画像の投稿
TwitterbotのKotz’i’jはマヤの象形文字を中心とした画像も定期的に投稿する様にしている。現在は0~19までの数字と幾つかの象形文字をリストからランダムに選んで投稿しているけど、写真とかも加えていこうかな。
プログラムは何も難しいことは行う必要はない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
imageList = [] open('dictionaries/imageList.txt', 'r') do |f| f.each do |line| imageList << line end end random = rand(33) tweet = imageList[random] puts "the number is: " + random.to_s + " and the tweet is: " + tweet ENV["TZ"]="America/Guatemala" t = Time.now strTime = t.strftime("[Chanim pa Ixim Ulew %H: %M: %S]") file = "./images/" + random.to_s + ".jpg" client.update_with_media(tweet + " " + strTime, open(file)) |
画像数が30以上あるため、ファイル名をリストとして別に保存してそれを読み込む形とした。これで大分コードがスッキリした。
Kotz’i’jに恋して22: 天気予報の取得
TwitterbotのKotz’i’jに定期的に天気予報のツイートをする機能を加えた。
色々やり方はあるけれど、今回は単純に現在時刻とKotz’i’jの出身地であるケツァルテナンゴ市カンテル市の天気予報へのリンクを貼り付けるだけ。なので新たなgemは必要無い。
1 2 3 4 |
ENV["TZ"]="America/Guatemala" t = Time.now strTime = t.strftime("[Chanim pa Q'antel %H: %M: %S]") client.update(strTime + " " + 'http://www.accuweather.com/es/gt/cantel/185913/weather-forecast/185913#') |
これだけ。こんな風にツイートが出来る様になった。これをHerokuで一日3,4回ツイートする設定にした。
Kotz’i’jに恋して21: Kotz’i’j、キチェ語の先生になる
ツイッター・ボット、Kotz’i’jのリプライ機能を少し強化。これです。
スペイン語でCómo se dice と単語を入力し、その単語がリストにあるものと一致した場合、キチェ語に訳すというもの。簡単な辞書の様なものだ。
こんな感じで書いた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
min_id = "" File.open('dictionaries/latest_loaded_id.txt', 'r') do |latest_loaded_id| min_id = latest_loaded_id.read end max_id = client.home_timeline.first.id File.open('dictionaries/latest_loaded_id.txt', 'w') do |f| f.puts(max_id) end @vocList = [] open('dictionaries/vocList.txt') do |f| f.each do |line| a, b = line.split(/\t/) @vocList << [a, b] end end client.home_timeline(since_id: min_id, count: 200).each do |tweet| if (tweet.full_text.include?("jelik_kotzij")) && (tweet.user.name != "Kotz'i'j") reply = "" if (tweet.full_text.include?("utz awach")) reply = "Utz maltyox! E le at?" elsif (tweet.full_text.include?("mo se dice")) @vocList.each do |word| if tweet.full_text.include?(word[0]) reply = word[1] break end end if(reply == "") reply = "No lo sé todavía..." end else originalTweet = tweet.full_text.gsub("@jelik_kotzij", "") originalTweet = originalTweet.delete("!?") reply = "Jas " + originalTweet + "?" end client.update('@'+tweet.user.screen_name + " " + reply, {:in_reply_to_status_id => tweet.id}) end end |
一度返信したツイートに再度返信しないために、前回読み込み以降のツイートのみを読み込む様にするなどそれなりの工夫をした。
ポイントは
1 |
max_id = client.home_timeline.first.id |
で今回の最新ツイートIDを取得し、
1 2 3 |
File.open('dictionaries/latest_loaded_id.txt', 'w') do |f| f.puts(max_id) end |
で保存。
これを次回min_idとして読み込み
1 |
client.home_timeline(since_id: min_id, count: 200).each do |tweet| |
前回読み込んだ以降のツイートのみを読み込む。こんな風にリプライしてくれる。
だんだん進化してきた。次回は天気予報を定期的にロードする機能を取り入れたいなぁ。
Kotz’i’jに恋して20: Herokuにデプロイ
Herokuで前回までに作成したTwitter Botを動かすこととした。ツイートへの自動リプライなんかをする時にずっと自分のPCを稼働させている訳にもいかないし。
Herokuに登録して、CLIのダウンロードやSinatraのダウンロードを済ませて準備を整えた後(Gitも必要だけどこれは既に環境が整っていた)、実行。
まずはHerokuのレポジトリにgit コミットする。
1 |
git add -A |
1 |
git commit -m "initial commit" |
その後、既にコミットしたファイルに修正が入った場合は改めてコミット。
1 |
$git commit -am "any comments" |
でHerokuにプッシュする。
1 |
git push heroku master |
幾つかコードを書いたけど例えばこれを実行するとする。
tweets.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
require 'rubygems' require 'twitter' require 'sinatra' client = Twitter::REST::Client.new do |config| config.consumer_key = "KEY" config.consumer_secret = "KEY" config.access_token = "KEY" config.access_token_secret = "KEY" end @text = [ "Utz", "Maltyox", "Nim laj maltyox", "In al Kotz'i'j", "In aj Q'antel", "Sib'alaj je'lik le nutinamit", "K'o le nitz wab'ix", "Pa le wachoch, e k'o nutat nunan nume's", "Jas kub'ij ri ak'u'x?", "Ub'i' Na' le wachi'l.", "In k'o sib'alaj wachi'l.", "Al Na' k'o pa qatijob'al chanim." ] ENV["TZ"]="America/Guatemala" t = Time.now strTime = t.strftime("[Chanim pa Ixim Ulew %H: %M: %S]") tweet = @text[rand(@text.length)] client.update(tweet + " " + strTime) #tweet |
こうやって
1 |
heroku run "ruby tweets.rb" |
選択肢の中からランダムに選んだツイートにグアテマラの現在時刻を追加することとした。というのも同じ文章を連続で投稿してしまうと反映されないことがあるから。
これで実行できた。
実行結果はこんな感じ。
インドネシア語と認識されたのはちょっと気になるけどそれだけキチェ語は世界的にはマイナーということなんだろうと思う。Chanimとは今、英語のnowの意味でIxim Ulew(トウモロコシの土地はグアテマラの意味)。つまり、現在のグアテマラの時間はということをツイートしている。
これをHeroku上で定期的に実行する設定にした。