<?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; mobilesuica</title>
	<atom:link href="http://shokai.org/blog/archives/tag/mobilesuica/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>
	</channel>
</rss>

