Subscribed unsubscribe Subscribe Subscribe

さらに続き

mixi Ruby/Tk ruby Mechanize

昨日のコードは冷静に見るといろいろひどいなw
今日は投稿機能を追加しました。テスト投稿しまくってすみません>マイミクのみなさん


投稿するとき文字コードEUC-JPにします。
UTF-8だとはじかれる、のではなく白紙投稿になります。(はじいたほうがよくね?)


そろそろブログに貼るのがきつい長さになってきた。

#!/usr/bin/ruby
# -*- coding: utf-8 -*-
require 'rubygems'
require 'tk'
require 'mechanize'
require 'kconv'

class Mixi
  @agent

#ログイン
  def initialize(email, password)
    @agent = WWW::Mechanize.new
    response = @agent.post("http://mixi.jp/login.pl", 
                           {'next_url' => '/home.pl', 
                             'email' => email,
                             'password' => password})
  end

#最新の取得
  def recent_echo
    nicknamelist = []
    echolist = []

    @agent.get("http://mixi.jp/recent_echo.pl")
    @agent.page.search('div/div/div/div/table/tr/td/div.echo_nickname').each{|nickname|
      nicknamelist.push nickname.inner_text
    }
    @agent.page.search('div/div/div/div/table/tr/td/div.echo_body').each{|echo|
      echolist.push echo.inner_text
    }

    [nicknamelist, echolist]
  end

#投稿に(たぶん)必要なpost_keyなるものを取得
  def post_key
    @agent.get("http://mixi.jp/recent_echo.pl")
    @agent.page.search('div/div/div/div/div/form/ul/li/input[3]/@value')
  end

#必要なのかしらないけど、デフォルトのメッセージ「今何してる?」的なやつ
  def default_value
    @agent.get("http://mixi.jp/recent_echo.pl")
    @agent.page.search('div/div/div/div/div/form/ul/li/input[4]/@value')
  end

#投稿機能
#日本語はEUC-JPで書き込みます。UTF-8とかだと白紙投稿になってしまいます。
#ちなみにmixiのソースはEUC-JP
  def post_echo(entry)
    @agent.get("http://mixi.jp/recent_echo.pl")
    response = @agent.post("http://mixi.jp/add_echo.pl", 
                           {'body' => entry.toeuc,
                             'post_key' => self.post_key,
                             'default_value' => self.default_value,
                             'redirect' => 'recent_echo'
                             })
    response
  end

end

#こっからはGUI
mixi = Mixi.new('xxxxxxxxxx@xxxxxxxxxxx', 'xxxxxxxxxxxxx')
nicknamelist, echolist = mixi.recent_echo

#フレーム作る。(必要なかったかも。。。)
flame_top = TkFrame.new
flame_bottom = TkFrame.new
flame_top.pack(:side => :top)
flame_bottom.pack(:side => :top, :fill => :x)

#最新を表示するテキストエリア
text = TkText.new(flame_top, :height => 35).pack
(0..24).each{|i| text.insert 'end', nicknamelist[i].to_s + ": " + echolist[i].to_s + "\n"}

#投稿の入力欄
entry = TkEntry.new(flame_bottom).pack(:fill => :x)

#リロードボタン
TkButton.new(flame_bottom){ 
  text "reload"
  command { 
    text.delete '1.0', 'end'
    nicknamelist, echolist = mixi.recent_echo
    (0..24).each{|i| text.insert 'end', nicknamelist[i].to_s + ": " + echolist[i].to_s + "\n"}
  }
  pack(:side => :right)
}

#投稿ボタン
TkButton.new(flame_bottom){ 
  text "post"
  command {
    if !(entry.value == "")
        mixi.post_echo entry.value
    end
    entry.value = ""
    text.delete '1.0', 'end'
    nicknamelist, echolist = mixi.recent_echo
    (0..24).each{|i| text.insert 'end', nicknamelist[i].to_s + ": " + echolist[i].to_s + "\n"}
  }

  pack(:side => :right)
}

Tk.mainloop