root/lang/ruby/flagtter/flagtter.rb @ 34281

Revision 34281, 2.3 kB (checked in by fd0, 4 years ago)

gakukino を検索対象から削除

  • Property svn:executable set to *
Line 
1#!/usr/local/bin/ruby -Ku
2# -*- coding: utf-8 -*-
3
4require 'net/http'
5require 'rexml/document'
6require 'time'
7require 'timeout'
8require 'yaml'
9
10LOG_FILE    = ENV["HOME"] + "/var/log/flagtter.log"
11CONFIG_FILE = ENV["HOME"] + "/.flagtterrc"
12
13config = YAML.load_file(CONFIG_FILE)
14USERNAME = config["username"]
15PASSWORD = config["password"]
16
17Net::HTTP.version_1_2
18
19log = File.open(LOG_FILE, "a")
20result = ""
21
22# 検索結果の RSS を入手
23begin
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  }
30rescue
31  # RSS が入手できなかったら終了
32  log.close
33  exit(0)
34rescue TimeoutError
35  # RSS が入手できなかったら終了
36  log.close
37  exit(0)
38end
39
40# RSS から文字列を抽出 → 投稿
41rexml = REXML::Document.new(result)
42rexml.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
79log.flush
80log.close
Note: See TracBrowser for help on using the browser.