«前の日記(2009-08-21) 最新 次の日記(2009-08-23)» 編集

会長@腹部日記


2009-08-22 [長年日記]

_ その日分のつぶやきをtDiaryに自動POST

とりあえず2日間の実験の結果、うまく動いています

ソースは

もう少しきれいにしたいところです。

css関連の記述と、実態参照の変換にrubygems、パスワードの管理あたりが適当なところです。。 orz

 require 'cgi'
 require 'date'
 require 'time'
 require 'kconv'
 require 'timeout'
 require 'open-uri'
 require 'net/http'
 require 'rexml/document'
 require 'rubygems'
 require 'htmlentities'
 require 'pit'
 
 def usage
   <<-TEXT.gsub(/\A {2}/, '')
   #{File::basename __FILE__}: update tDiary using today tweet from twitter.com.
   usage: ruby #{File::basename __FILE__} [usr] <proxy>
   TEXT
 end
 
 @twitter_statuses = [%Q|{{today_tweets <<EOS|]
 @twitter2mail     = []
 @tweet_count      = 0
 @yesterday        = DateTime.now - 1
 @retry            = 5
 
 begin
   # usage
   raise usage if ARGV.size < 1
   
   # argument
   @twitter_username = ARGV[0].to_s
   option = {}
   option[:proxy] = ARGV[1].to_s if ARGV[1] && !ARGV[1].to_s.nil?
   
   xml = nil
   # parse & collect tweet of yesterday
   doc = nil
   until ( !doc.nil? || @retry == 0 )
     # open twitter user_timeline
     timeout( 10 ) do
       begin
         xml = open( "http://twitter.com/statuses/user_timeline/#{@twitter_username}.xml?count=200", option){|f| f.read}
       rescue Exception => e
         sleep 10
       end
     end
     next unless xml 
     begin
       doc = REXML::Document.new( xml ).root
     rescue Exception => e
       doc = nil
       $stderr.puts $!
       $stderr.puts $@.join("\n")
       @retry -= 1
       puts "retry #{@retry} times...."
     end
   end
   html_entities = HTMLEntities.new
   if doc then
     doc.elements.each( 'status' ) do |e|
       status_id  = e.elements['id'].text
       tweet_time = Time.parse( e.elements['created_at'].text ).localtime
       if @yesterday.strftime("%Y%m%d") == tweet_time.strftime("%Y%m%d")
         strftime     = tweet_time.strftime("%H:%M")
         tweet_entity = html_entities.decode(e.elements['text'].text.gsub("\n", ' ')) # HikiDoc not require new line.
         @twitter_statuses << "#{status_id}>@<#{strftime}>@<#{tweet_entity}"
         @twitter2mail     << "#{strftime} #{tweet_entity}"
         @tweet_count += 1
       end
     end
   end
   @twitter_statuses << 'EOS}}'
   exit if @tweet_count <= 0
   
   # modify body of tdiary
   # title of section
   @body = "![daily_twitter] Today tweets : #{@tweet_count.to_s}times"  << @twitter_statuses.join("\n")
   
   # HTTP Parameter
   data = "title=#{CGI::escape ''}"
   data << "&body=#{CGI::escape @body}"
   data << "&append=true"
   data << "&makerss_update=false"
   data << %Q|&year=#{@yesterday.year}&month=#{@yesterday.month}&day=#{@yesterday.day}|
   
   # tdiary Basic auth
   host = 'www115.sakura.ne.jp'
   port = 80
   config = Pit::get('tdiary')
   user = config[:username]
   pass = config[:password]
   cgi  = %Q|/~harabu/diary/update.cgi?edit=true%3Byear=#{@yesterday.year}%3Bmonth=#{@yesterday.month}%3Bday=#{@yesterday.day}|
   
   # Post tDiary
   Net::HTTP.start( host, port ) do |http|
     
     auth = ["#{user}:#{pass}"].pack( 'm' ).strip
     # get post form
     res, = http.get( cgi, 
     { 'Authorization' => "Basic #{auth}",
       'Referer' => "http://#{host}#{cgi}" })
     # append CSRF key to Parameter
     if %r|<input type="hidden" name="csrf_protection_key" value="([^"]+)">| =~ res.body then
        data << "&csrf_protection_key=#{CGI::escape( CGI::unescapeHTML( $1 ) )}"
     end
     # post twitter data
     res, = http.post( cgi, data,
     { 'Authorization' => "Basic #{auth}",
       'Referer' => "http://#{host}#{cgi}" })
     puts res 
   end
   puts
   puts "<==result==>"
   print @twitter2mail.join("\n").tojis
   
 rescue
   $stderr.puts $!
   $stderr.puts $@.join("\n")
   exit 1
 end

_ twitter.com in 2009/08/22

  • @iphonefan そうなんですか?? RT @iphonefan: 妹もiPhoneを購入して、晴れてSMS/MMSのプッシュを体感出来そう。(笑)自分の購入したアプリって、プレゼントすることも出来るんですねー。 [twicco.jp @yugosa ]23:24
  • 新型インフルエンザ = 新フル そう略すのね。http://monjiro.net/dic/rank/29/127940/022:57
  • これは、子連れでは堪能できない RT @RyoutaK: 関あじ、関さば、うまー22:51
  • @inarin ぜひ、結果をつぶやいてください!20:30
  • 次男と一緒にお昼寝15:17
  • 北陸地方は丸亀製麺出店ラッシュ。お年寄りも来店するから意外と長持ちするかもしれません13:26
  • そんなの子供に見せられない RT @mysterytrick らめええRT @yasumi13: アイマイまいんの最終回は、まいんちゃんに初潮がきて お赤飯をつくります12:49
  • 日焼けしてサンダルの後が残っているので、足の甲だけ日光に晒してサンダル跡を消してみる12:46
  • 実家で子供達をプールに入れるお仕事中iPhoneのバッテリーが持たないので初代touchからpost12:39
  • @yuuitiro 子供が食べてるパンの中には、アンコじゃなくてクリームでした11:54
  • 家の前の道路に鷹がいてびっくり。11:09
  • 今夜のおかずははこれ http://cookpad.com/recipe/278155 と、これ http://cookpad.com/recipe/259116 失敗は許されない・・・11:05
  • 「パパくさいー」by 長男 orz11:03
  • 富山市内のパン屋さん「ベル」へ。アンコのパンが食べたいけど、通らない希望。09:32
  • AppStore値下げの季節なのか、Photogene\115, GoodReader\115。財布のひもがゆるんできたので、Twitterrfic有料版を購入するか。。。09:01
  • [tDiary] その日分のつぶやきをtDiaryに自動POST http://bit.ly/DutVf08:59
  • RT @inarin: 九頭竜線と聞くとるろ剣を読みたくなる08:53
  • @RyoutaK ロールケーキとかは湯布院でしたっけ08:46
  • OCNからやっとAppStoreに安定してつながるようになった。08:34
  • 寝てちたら、次男に「ぱぱおっきー」と頭を持ち上げられて起床06:18