| 1 | #!/usr/local/bin/ruby -Ku |
|---|
| 2 | # -*- coding: utf-8 -*- |
|---|
| 3 | |
|---|
| 4 | require 'net/http' |
|---|
| 5 | require 'rexml/document' |
|---|
| 6 | require 'time' |
|---|
| 7 | require 'timeout' |
|---|
| 8 | require 'yaml' |
|---|
| 9 | |
|---|
| 10 | LOG_FILE = ENV["HOME"] + "/var/log/flagtter.log" |
|---|
| 11 | CONFIG_FILE = ENV["HOME"] + "/.flagtterrc" |
|---|
| 12 | |
|---|
| 13 | config = YAML.load_file(CONFIG_FILE) |
|---|
| 14 | USERNAME = config["username"] |
|---|
| 15 | PASSWORD = config["password"] |
|---|
| 16 | |
|---|
| 17 | Net::HTTP.version_1_2 |
|---|
| 18 | |
|---|
| 19 | log = File.open(LOG_FILE, "a") |
|---|
| 20 | result = "" |
|---|
| 21 | |
|---|
| 22 | # 検索結果の RSS を入手 |
|---|
| 23 | begin |
|---|
| 24 | timeout(60) { |
|---|
| 25 | http = Net::HTTP.new("pcod.no-ip.org"); |
|---|
| 26 | response = http.get("/yats/search?query=俺+たら+んだ+-user:flagtter,linux_cafe,akiba_twit,sairo_bot,gakukino&lang=ja&rss&fast", |
|---|
| 27 | {'User-Agent' => "Ruby/#{RUBY_VERSION}"}); |
|---|
| 28 | result = response.body; |
|---|
| 29 | } |
|---|
| 30 | rescue |
|---|
| 31 | # RSS が入手できなかったら終了 |
|---|
| 32 | log.close |
|---|
| 33 | exit(0) |
|---|
| 34 | rescue TimeoutError |
|---|
| 35 | # RSS が入手できなかったら終了 |
|---|
| 36 | log.close |
|---|
| 37 | exit(0) |
|---|
| 38 | end |
|---|
| 39 | |
|---|
| 40 | # RSS から文字列を抽出 → 投稿 |
|---|
| 41 | rexml = REXML::Document.new(result) |
|---|
| 42 | rexml.elements.each("//feed/entry") { |item| |
|---|
| 43 | name = item.elements["title"].text |
|---|
| 44 | time = Time.parse(item.elements["updated"].text.gsub(/T/, " ").gsub(/Z/, "")) |
|---|
| 45 | if ((log.mtime - 9 * 60 * 60) < time) |
|---|
| 46 | text = item.elements["summary"].text |
|---|
| 47 | if (regex = text.match(/俺.*たら.*んだ/)) |
|---|
| 48 | text = regex.to_a[0]; |
|---|
| 49 | status = "『#{text}』とつぶやいた @ #{name} にフラグがセットされました。" |
|---|
| 50 | # 投稿 |
|---|
| 51 | begin |
|---|
| 52 | timeout(120) { |
|---|
| 53 | request1 = Net::HTTP::Post.new('/statuses/update.json') |
|---|
| 54 | request1.basic_auth(USERNAME, PASSWORD) |
|---|
| 55 | request1.body = "status=" + status |
|---|
| 56 | Net::HTTP.start("twitter.com", 80) { |http| |
|---|
| 57 | response1 = http.request(request1) |
|---|
| 58 | } |
|---|
| 59 | # 発言者をフォロー |
|---|
| 60 | # 投稿に成功した場合だけフォローするようにする |
|---|
| 61 | request2 = |
|---|
| 62 | Net::HTTP::Post.new("/friendships/create/#{name}.json") |
|---|
| 63 | request2.basic_auth(USERNAME, PASSWORD) |
|---|
| 64 | Net::HTTP.start("twitter.com", 80) { |http| |
|---|
| 65 | response2 = http.request(request2) |
|---|
| 66 | } |
|---|
| 67 | } |
|---|
| 68 | rescue |
|---|
| 69 | # ignore |
|---|
| 70 | rescue Timeout::Error |
|---|
| 71 | # ignore |
|---|
| 72 | end |
|---|
| 73 | log.puts "#{time} - #{status}" # 失敗してもログには追記 |
|---|
| 74 | end |
|---|
| 75 | break # 1 回につき 1 投稿のみ |
|---|
| 76 | end |
|---|
| 77 | } |
|---|
| 78 | |
|---|
| 79 | log.flush |
|---|
| 80 | log.close |
|---|