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

昨日のmechanizeの問題が解決できたよー

Ruby

id:elimさんからコメントを頂いた通りpostじゃなくってgetになってたのが原因でした。はてなグループのキーワード編集画面のところはディフォルトでpostになってるのに、なんねgetが適用されるんだ?!とか混乱してたら、Twitterのほうで@mrknさんと@32nmさんに助けてもらいました。感謝!!

で、formのclickってどうするんだーとか探してたんですが、formオブジェクトのmethod変数を変更すれば行けるようになりました。こんな感じ。

edit_form.method = 'POST'

http://d.hatena.ne.jp/kitamomonga/20080327/ruby_www_mechanize_formの変数のところを参考にしました。どうでもいいけど、ここのmechanizeの充実度は異常。
これでTsukuba.Rの資料が長くなっても安心して作成できるようになりました。やったね!!

あと、どうでもいいはてなグループのキーワードを編集するためのRubyスクリプトをまた置いておく。

#! /usr/bin/ruby
# -*- coding: utf-8 -*-
require 'rubygems'
require 'mechanize'
require 'logger'
require 'optparse'
require 'pp'

class HatenaGroupKeyword
  attr_accessor :agent
  attr_accessor :log
  attr_accessor :name
  attr_accessor :password
  attr_accessor :group
  attr_accessor :cookies
  def initialize
    @agent = WWW::Mechanize.new
    @log = Logger.new(STDOUT)
    @log.level = Logger::DEBUG
  end
  def login(cookie)
    @log.debug("started login.")
    if (!File.exist?(cookie)) || (Time.now - Time::local(*ParseDate::parsedate(@agent.cookie_jar.load(cookie)['hatena.ne.jp']['b'].expires.to_s))  > 0)
      login_page  = @agent.get('https://www.hatena.ne.jp/login')
      login_form  = login_page.forms.first
      login_form["name"] = @name
      login_form["password"] = @password
      @agent.submit(login_form)
      @agent.cookie_jar.save_as(cookie)
      @log.debug("finished login.")
    elsif
      @agent.cookie_jar.load(cookie)
      @log.debug("skipped login.")
    end
  end
  def edit(file)
    f = open(file,"r")
    text = f.read
    f.close
    file = File::split(file)[-1].split(".")
    #Tsukuba.R.txtみたいなやつの対処
    file.pop
    keyword = file.join(".")
    url = 'http://' + self.group + '.g.hatena.ne.jp/keyword/' + URI.encode(keyword) + '?mode=edit'
    puts url
    edit = @agent.get(url)
    edit_form  = edit.forms[0]
    edit_form["body"] = text
    edit_form.method = 'POST'
    @agent.submit(edit_form)
  end
  def delete(file)
    puts file
    file = File::split(file)[-1].split(".")
    file.pop
    keyword = file.join(".")
    puts keyword
    url = 'http://' + self.group + '.g.hatena.ne.jp/keyword/' + URI.encode(keyword) + '?mode=edit'
    puts url
    edit = @agent.get(url)
    puts edit.forms.length
    edit_form  = edit.forms[1]
    @agent.submit(edit_form)
  end
end

if ARGV.length == 0
  puts "引数が必要です。"
  #複数の検索語に対応しようと思ったけど、とりあえずタグ検索すればどうにかなるので放置
  exit
end

delete = FALSE
edit = FALSE

opt = OptionParser.new
opt.on('-e') {|v| edit = v }
opt.on('-d') {|v| delete = v }
opt.parse!(ARGV)

config = YAML.load_file("/Users/yasuhisa/ruby/hatena.yaml")

hg = HatenaGroupKeyword.new
hg.name = config['name']
hg.password = config['password']
hg.group = config['group']
hg.cookies = config['cookies']

hg.login(cookie="/Users/yasuhisa/bin/cookie.yaml")

if edit == TRUE
  hg.edit(ARGV[0]) 
elsif delete == TRUE
  hg.delete(ARGV[0])
end