読者です 読者をやめる 読者になる 読者になる

twitterのpost数表示させるプログラム#2

 前のやつをかなり見直して書き直してみた。

 前の物との違いとしては1日のpost数が0だと失敗してた問題をどうにかなおした。前のがやっつけすぎましたね...。

#!/usr/bin/ruby
require "date"
require "parsedate"
require "uri"
require "net/http"

user = "User"

def make_date(t)
  tmp = ParseDate.parsedate(t)
  tmp[3] = 0 unless tmp[3]
  tmp[4] = 0 unless tmp[4]
  tmp[5] = 0 unless tmp[5]
  tmp[6] = "JST" unless tmp[6]
  begin
    return DateTime.new(*tmp)
  rescue
    return nil
  end
end

time_start = make_date(ARGV[0]) ? make_date(ARGV[0]) : make_date(Time.now.strftime("%Y/%m/%d"))
time_end = ARGV[1] ? make_date(ARGV[1]) : time_start.next

end_flug = false
list =[]
num = 1

loop do
  puts num / 10 if num % 10 == 0
  htm =  Net::HTTP.get(URI.parse("http://twitter.com/#{user}?page=#{num}"))
  reg = htm.scan(/<li[^>]*>.*?<span[^>]*class="entry-content"[^>]*>(.*?)<\/span>.*?<span[^>]*title="([^"]+)"[^>]*>.*?<\/span>.*?<\/li>/m)
  
  #1ページで取得できた数が20以外だと通知しておく
  puts "data count #{reg.length}! numbr = #{num}" unless reg.length == 20

  #1ページで一つも取得できなかったらエラーにする
  if reg.length == 0
    puts "error!"
    break
  end

  reg.each do |dat|
    date = DateTime.parse(dat[1]).new_offset("JST")
    flug_s =  DateTime.parse(date.to_s) - DateTime.parse(time_start.to_s) > 0
    flug_e =  DateTime.parse(time_end.to_s) - DateTime.parse(date.to_s) > 0
    if flug_s && flug_e
      list << dat[0]
    end

    unless flug_s
      end_flug = true
      break
    end
  end

  break if end_flug
  num += 1
end

puts list.uniq! ? list : list
puts "#{list.length} posts from #{time_start.strftime('%Y/%m/%d %H:%M:%S')} to #{time_end.strftime('%Y/%m/%d %H:%M:%S')}"

 次の課題は引数に"yesterday"とかしたときに昨日のpost数を取得するようにしたいな。


 ということでやっつけ書き込みでした。(ソースコードはみ出るの治らないかな?かといってテキトーに改行入れるとエラーになるし...)