<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>橋本商会 &#187; WWW::Mechanize</title>
	<atom:link href="http://shokai.org/blog/archives/tag/wwwmechanize/feed" rel="self" type="application/rss+xml" />
	<link>http://shokai.org/blog</link>
	<description>なんか作ったりした記録を忘れないうちに書くblog</description>
	<lastBuildDate>Sun, 20 May 2012 10:50:20 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com/" />
			<item>
		<title>モバイルSuicaの履歴をtwitterに流したかった</title>
		<link>http://shokai.org/blog/archives/5072</link>
		<comments>http://shokai.org/blog/archives/5072#comments</comments>
		<pubDate>Tue, 23 Feb 2010 08:38:03 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[mobilesuica]]></category>
		<category><![CDATA[nokogiri]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[WWW::Mechanize]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=5072</guid>
		<description><![CDATA[xtunnelのためにスクレイピングの勉強をしていて、Mechanize+hpricotからMechanize+nokogiriの組み合わせに乗り換えようと色々と使ってみている中でできた物のひとつ。 昔しゃお先生がやって [...]]]></description>
			<content:encoded><![CDATA[<p>
xtunnelのためにスクレイピングの勉強をしていて、Mechanize+hpricotからMechanize+nokogiriの組み合わせに乗り換えようと色々と使ってみている中でできた物のひとつ。<br />
昔しゃお先生がやっていたのを俺もやりたくて3ヶ月ぐらい前に作ったけど、mobilesuica.comのおサイフケータイ使用履歴は1日一度早朝に更新される仕様に変更されたらしくボツになった。<br />
<br />
<br />
結局idやcssなどの手がかりが無くて手動で要素を取り出す事になり、nokogiriはHTMLタグを除去するのにしか使わなかった<br />
MobileSuica.rb<br />
<pre class="prettyprint">
#!/usr/bin/env&nbsp;ruby<br />
#&nbsp;-*-&nbsp;coding:&nbsp;utf-8&nbsp;-*-<br />
require&nbsp;'rubygems'<br />
require&nbsp;'nokogiri'<br />
require&nbsp;'mechanize'<br />
require&nbsp;'kconv'<br />
<br />
module&nbsp;MobileSuica<br />
&nbsp;&nbsp;def&nbsp;MobileSuica.get(user,pass)<br />
&nbsp;&nbsp;&nbsp;&nbsp;agent&nbsp;=&nbsp;WWW::Mechanize.new<br />
&nbsp;&nbsp;&nbsp;&nbsp;agent.user_agent_alias&nbsp;=&nbsp;'Windows&nbsp;IE&nbsp;7'<br />
&nbsp;&nbsp;&nbsp;&nbsp;page&nbsp;=&nbsp;agent.get('http://www.mobilesuica.com/iq/ir/SuicaDisp.aspx?returnId=SFRCMMEPC03')<br />
&nbsp;&nbsp;&nbsp;&nbsp;login_form&nbsp;=&nbsp;page.forms_with(:name&nbsp;=&gt;&nbsp;'form1').first<br />
&nbsp;&nbsp;&nbsp;&nbsp;login_form.fields_with(:name&nbsp;=&gt;&nbsp;'MailAddress').first.value&nbsp;=&nbsp;user<br />
&nbsp;&nbsp;&nbsp;&nbsp;login_form.fields_with(:name&nbsp;=&gt;&nbsp;'Password').first.value&nbsp;=&nbsp;pass<br />
&nbsp;&nbsp;&nbsp;&nbsp;page&nbsp;=&nbsp;login_form.click_button<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;page.body.toutf8.split(/&lt;tr&gt;/).delete_if{|tr|<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;!(tr&nbsp;=~&nbsp;/&amp;yen;/m)<br />
&nbsp;&nbsp;&nbsp;&nbsp;}.map{|tr|<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tr.gsub(/\n/,"").split(/\r/)[0..5].map{|line|&nbsp;#&nbsp;月日,種別,利用場所,種別,利用場所,残額<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Nokogiri(line).inner_text.chomp.strip.gsub(/[\t　]/,"")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;end<br />
end<br />
</pre>
<br />
<br />
mobilesuicaのユーザ名、パスワードで履歴を2次元配列として取り出せる。<br />
<pre class="prettyprint">
require 'MobileSuica'<br />
MobileSuica.get("user", "pass")<br />
</pre>
月日、種別、利用場所、種別、利用場所、残額の順になる<br />
<pre>
01/30<br />
入<br />
川崎<br />
出<br />
横浜<br />
5,110<br />
01/30<br />
入<br />
相鉄横浜<br />
窓出<br />
川崎<br />
5,320<br />
</pre>
<br />
<br />
<br />
履歴のうち最新の駅名をtwitterに投稿する。-dつけて起動するとdaemonになる<br />
tweet-mobilesuica.rb<br />
<pre class="prettyprint">
#!/usr/bin/env&nbsp;ruby<br />
#&nbsp;-*-&nbsp;coding:&nbsp;utf-8&nbsp;-*-<br />
require&nbsp;'rubygems'<br />
require&nbsp;'webrick'<br />
require&nbsp;'twitter'<br />
require&nbsp;'MobileSuica'<br />
<br />
def&nbsp;start(conf)<br />
&nbsp;&nbsp;loop&nbsp;do<br />
&nbsp;&nbsp;&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;=&nbsp;MobileSuica.get(conf["suica_user"],&nbsp;conf["suica_pass"]).first<br />
&nbsp;&nbsp;&nbsp;&nbsp;rescue<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;=&nbsp;nil<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;first&nbsp;!=&nbsp;nil<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last&nbsp;=&nbsp;first&nbsp;if&nbsp;!last<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;first&nbsp;!=&nbsp;last&nbsp;#&nbsp;1回前に取得した履歴と比較<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;first<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;'-'*10<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;first[1]&nbsp;==&nbsp;'入'&nbsp;&amp;&amp;&nbsp;first[3]&nbsp;==&nbsp;'出'&nbsp;#&nbsp;降車履歴の時<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message&nbsp;=&nbsp;first[4].chomp.strip+"なう&nbsp;(suica)"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;!(message&nbsp;=~&nbsp;/#{conf["ngwords"]}/)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;conf["nopost"]&nbsp;!=&nbsp;true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpAuth&nbsp;=&nbsp;Twitter::HTTPAuth.new(conf["twitter_user"],&nbsp;conf["twitter_pass"])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tw&nbsp;=&nbsp;Twitter::Base.new(httpAuth)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tw.update(message)&nbsp;#&nbsp;twitter&nbsp;post<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;message<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last&nbsp;=&nbsp;first<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;sleep&nbsp;60*60*1.5&nbsp;#&nbsp;1時間半待つ<br />
&nbsp;&nbsp;end<br />
end<br />
<br />
conf&nbsp;=&nbsp;YAML::load&nbsp;open&nbsp;File.dirname(__FILE__)+'/config.yaml'<br />
if&nbsp;ARGV[0]&nbsp;==&nbsp;'-d'<br />
&nbsp;&nbsp;WEBrick::Daemon.start&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;start(conf)<br />
&nbsp;&nbsp;}<br />
else<br />
&nbsp;&nbsp;start(conf)<br />
end<br />
</pre>
<br />
<br />
設定ファイル。自宅の駅名などはngwordsに入れておく<br />
config.yaml<br />
<pre class="prettyprint">
#&nbsp;config.yaml<br />
#&nbsp;mobilesuica.com&nbsp;user/pass<br />
suica_user&nbsp;:&nbsp;'username@docomo.ne.jp'<br />
suica_pass&nbsp;:&nbsp;'12345678'<br />
<br />
#&nbsp;twitter&nbsp;user/pass<br />
twitter_user&nbsp;:&nbsp;'shokai'<br />
twitter_pass&nbsp;:&nbsp;'password'<br />
<br />
#&nbsp;postしない駅名を正規表現で<br />
ngwords&nbsp;:&nbsp;"(東京|横浜)"<br />
<br />
#&nbsp;for&nbsp;debug<br />
#nopost&nbsp;:&nbsp;"true"<br />
</pre>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/5072/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MT3.2からWordPress2.6に移行した時の不具合をWWW::Mechanizeで修正</title>
		<link>http://shokai.org/blog/archives/3424</link>
		<comments>http://shokai.org/blog/archives/3424#comments</comments>
		<pubDate>Fri, 19 Dec 2008 02:26:57 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[WWW::Mechanize]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=3424</guid>
		<description><![CDATA[今年の春にSFCで動かしていたMovableType3.2が調子悪くなって、さくらに置いたWordPressに移行したわけだけど（さくらレンタルサーバ+wordpressにしてみた） その時に過去ページのいくつかが見えな [...]]]></description>
			<content:encoded><![CDATA[<p>
今年の春にSFCで動かしていたMovableType3.2が調子悪くなって、さくらに置いたWordPressに移行したわけだけど（<a href="http://shokai.org/blog/archives/1513">さくらレンタルサーバ+wordpressにしてみた</a>）<br />
その時に過去ページのいくつかが見えなくなる不具合があった。んで今朝からそれを解消するスクリプトを動かしている。今1000件目あたり。昼過ぎには完了するはず。<br />
<br />
どういう不具合かというと、wordpressにログインしていない人がアクセスしたページは404ステータスになる。apacheが吐く404ではなくwordpressが吐く404で、「エラー 404 &#8211; 見つかりませんでした」と出る。ログインしていると普通に記事を見る事が出来る。<br />
このせいで、俺は見れているのにURLを送ると「記事がないですよ」とみんなに言われて、原因を特定するのに時間がかかった。<br />
<br />
そしてその修正方法だが、単に個別記事編集画面で「保存」を押すだけでその記事は復活した。なぜだかわからない。<br />
さくらのコントロールパネルからMySQLのテーブルを見ても、どのテーブルが悪さしているのかよく分からなかったのでRubyのWWW::Mechanizeを使って全ページ「保存」ボタンを押しなおす事にした。<br />
<br />
WWW::Mechanizeはログインフォームにパスワードを入れたり、UserAgentを偽装してwebページにアクセスしたりできる非常に有用なモジュール。Perlでは使った事あったけどRubyでは今回が初。<br />
<br />
参考<br />
<ul>
	<li><a href="http://mono.kmc.gr.jp/~yhara/rubyscraping/?Mechanize">Ruby Scraping &#8211; Mechanize</a></li>
	<li><a href="http://mono.kmc.gr.jp/~yhara/d/?date=20070205">Greenbear Diary &#8211; RubyでHTMLとWebを操作するためのライブラリ、HpricotとWWW::Mechanize , HikiReload</a></li>
	<li><a href="http://d.hatena.ne.jp/kitamomonga/20081215/ruby_mechanize_faq_for_v_0_9">RubyのMechanizeのよくある質問 &#8211; きたももんががきたん。</a></li>
</ul>
<br />
<br />
<br />
必要なものをインストール<br />
</p>
<blockquote><p>sudo gem install mechanize hpricot</p></blockquote>
<p>
<br />
<br />
普通にwp-login.phpからログインしてdashboardへ行き、cookieを持った状態で各記事個別ページへ移動して保存ボタンを押していく。記事個別ページが連番で助かった。あと自分のサーバをいじめたくないのでsleepは長めにしてある<br />
<br />
shokai-blogfix.rb として保存<br />
</p>
<blockquote><p>
#!/usr/bin/env&nbsp;ruby<br />
require&nbsp;&#8217;rubygems&#8217;<br />
require&nbsp;&#8217;kconv&#8217;<br />
require&nbsp;&#8217;mechanize&#8217;<br />
require&nbsp;&#8217;pp&#8217;<br />
user&nbsp;=&nbsp;&#8221;username&#8221;<br />
pass&nbsp;=&nbsp;&#8221;password&#8221;<br />
<br />
puts&nbsp;&#8217;start&#8217;<br />
<br />
agent&nbsp;=&nbsp;WWW::Mechanize.new<br />
page&nbsp;=&nbsp;agent.get(&#8220;http://shokai.org/blog/wp-login.php&#8221;)<br />
login_form&nbsp;=&nbsp;page.forms_with(&#8220;loginform&#8221;).first<br />
login_form.log&nbsp;=&nbsp;user<br />
login_form.pwd&nbsp;=&nbsp;pass<br />
dashboard&nbsp;=&nbsp;agent.submit(login_form)<br />
<br />
puts&nbsp;&#8221;login:&nbsp;&#8221;&nbsp;+&nbsp;dashboard.title<br />
<br />
#&nbsp;各ページ処理<br />
for&nbsp;i&nbsp;in&nbsp;1..1558<br />
&nbsp;&nbsp;sleep&nbsp;10<br />
&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;page&nbsp;=&nbsp;agent.get(&#8220;http://shokai.org/blog/wp-admin/post.php?action=edit&#038;post=#{i}&#8221;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;post_form&nbsp;=&nbsp;page.forms_with(&#8220;post&#8221;).first<br />
&nbsp;&nbsp;&nbsp;&nbsp;page&nbsp;=&nbsp;agent.submit(post_form)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;i.to_s+&#8221;success!&#8221;&nbsp;if&nbsp;page.body&nbsp;=~&nbsp;/投稿が更新されました/<br />
&nbsp;&nbsp;rescue<br />
&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;i.to_s+&#8221;error&#8221;<br />
&nbsp;&nbsp;end<br />
end<br />
<br />
puts&nbsp;&#8217;&#8211;finished&#8211;&#8217;<br />
</p></blockquote>
<p>
パスワードなどは適宜変更。<br />
URLもハードコーディングしている。1回しか使わないスクリプトだし</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/3424/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

