id:elimさんからコメントを頂いた通りpostじゃなくってgetになってたのが原因でした。はてなグループのキーワード編集画面のところはディフォルトでpostになってるのに、なんねgetが適用されるんだ?!とか混乱してたら、Twitterのほうで@mrknさんと@32nmさんに助けてもらいました。感謝!!
- まんぞくさん, Ph.D on Twitter: "@syou6162 click したらいいお http://d.hatena.ne.jp/iizukaw/20080208/p1"
- まんぞくさん, Ph.D on Twitter: "@syou6162 agent の submit じゃなくて form の submit を使えば良いみたいだよ http://tinyurl.com/5oryc5"
- Mitsuteru Nakao on Twitter: "@syou6162 action の値が空だとうまく居ないことがあります。POST"
で、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