Hatena::Grouprubyist

今日も元気にrubyist

2008-12-16

[]2009年Apple StoreLucky Bag(福袋)の入荷有無を判定するスクリプト 22:52 2009年Apple StoreのLucky Bag(福袋)の入荷有無を判定するスクリプト - 今日も元気にrubyist を含むブックマーク はてなブックマーク - 2009年Apple StoreのLucky Bag(福袋)の入荷有無を判定するスクリプト - 今日も元気にrubyist 2009年Apple StoreのLucky Bag(福袋)の入荷有無を判定するスクリプト - 今日も元気にrubyist のブックマークコメント

require 'mechanize'
require 'kconv'

url = 'http://store.apple.com/jp/browse/home/specialdeals/luckybag'

agent = WWW::Mechanize.new
page = agent.get(url)

while /在庫切れ/ =~ page.body.tosjis
  puts Time.now.to_s + " 在庫切れです"
  sleep 60
  agent = WWW::Mechanize.new
  page = agent.get(url)
end

puts "入荷しました!"

exit

ちなみにこのスクリプトには致命的な欠陥があり、このままコピペしても正しく判定がされないようになっている。どこが間違いかは親切なブックマーカーが指摘してくれるかもしれない。

プログラミング初心者のid:takerunba氏もボットを作ったらしいが、ちょっとプログラムの知識があればPCの前に張り付いてブラウザの更新ボタン連打せずともAppleの福袋を買えたりするわけだ。元々のIT知識レベルにもよるが、はてな記法を使ってはてダをかけるくらい(世間から見ると)レベルが高い人となら、こんなプログラムは小説1冊読み終わるくらいの時間で書けると思う。

名称未設定名称未設定2008/12/19 12:15何処がどう駄目なのか解りません><
教えて下さい><

teracoteraco2008/12/19 12:29× while /在庫切れ/ =~ page.body.tosjis
○ while /<span class="customer_commit_display">在庫切れ<\/span>/ =~ page.body.tosjis

です。Apple福袋のページには在庫表示の箇所以外に「在庫切れ」という文字列が常に含まれているので、修正前のスクリプトではいつまでたっても「在庫切れ」判定となります。

ちなみにApple福袋は購入可能になってから30秒~40秒で即在庫切れらしいので、このスクリプトを動かしてメールでアラートを投げたとしても間に合わないかもしれません。そういう意味では、在庫復活する時間帯を予測して(ランダムではないらしい)その間F5連打するのが確実かもしれません。スクリプトで検知して見に行ったら売れきれは切ないので。

名称未設定名称未設定2008/12/19 12:55返信有り難うです
やっぱり其処が違ってたんですね
「tosjis」が怪しいと思って(ストアのソースに無かったので)外したり
「>在庫切れ<」って入れてみたり色々やってました

> 30秒~40秒で即在庫切れ
かなり厳しい戦いですね
在庫が有った時にパッと音を出せないのかな?と思って検索を掛けたらhttp://www12.atwiki.jp/0141029/pages/304.html内に
print "\x07"
と言うのが有りました
原理は解りませんが試してみたら見事に音が鳴ったので私はこれでやってみようと思います
1日中PCに張り付いて居なければいけないのが難点ですが(笑)

名称未設定名称未設定2008/12/20 00:2035分のは検出出来ませんでしたね。。。
残念です。。。が、カートに入れるボタンの見えるページが載っていたのは収穫です
ボタンの見えるページを基に構文とキーワードを換えてみました
どうでしょうか?採点お願いします><

until /1月2日にお届け/ =~ page.body.tosjis
puts Time.now.to_s + " 在庫切れです"
sleep 60
agent = WWW::Mechanize.new
page = agent.get(url)
end

teracoteraco2008/12/20 11:23おお、「1月2日にお届け」って文字列なんですね。いいんじゃないでしょうか。
ちなみに僕はこのスクリプトを作って満足しただけで、実際に福袋争奪戦には参加してません。。。Apple製品もiPodも持ってないので…。

名称未設定名称未設定2008/12/20 21:01今日の分は見事に反応無しで終わってしまいました。。。ガッカリ
別の方法を考えなければ買えそうに無いですね
プログラムを組むのは難しいです

2008-09-09

[]mechanizeでBASIC認証 22:53 mechanizeでBASIC認証 - 今日も元気にrubyist を含むブックマーク はてなブックマーク - mechanizeでBASIC認証 - 今日も元気にrubyist mechanizeでBASIC認証 - 今日も元気にrubyist のブックマークコメント

# 2008/09/09 自宅ルータのIP取得スクリプト

require 'mechanize'
require 'kconv'

# 0.初期設定
agent = WWW::Mechanize.new
agent.auth('user','password')

# 1.アクセス
page = agent.get('http://192.168.1.1/Status.htm')
puts page.body.tosjis

うちのルータのIPを自動取得したかったがあいにくBASIC認証付き。

そんなときでもmechanizeなら簡単にアクセスできます。

2008-09-08

[]某投票サイトに自動で投票するスクリプト 16:12 某投票サイトに自動で投票するスクリプト - 今日も元気にrubyist を含むブックマーク はてなブックマーク - 某投票サイトに自動で投票するスクリプト - 今日も元気にrubyist 某投票サイトに自動で投票するスクリプト - 今日も元気にrubyist のブックマークコメント

mechanizeでラジオボタンを操作してみた。

# 2008/09/08 自動投票スクリプト

require 'mechanize'
require 'kconv'

# 0.初期設定
group = '[フォーム名]'
agent = WWW::Mechanize.new
f = open("C:/log.txt", "w") 

# 1.アクセス
page = agent.get('[URL]')

# 2.投票

form = page.forms[0]
form.radiobuttons.name('g_id')[4].check

# 3.念のため投票後のページを取得
mypage = agent.submit(form, form.buttons.first)
f.write(mypage.body.tosjis)

一部箇所は伏字にしておりますw

フォームに文字を書き込む例はたくさんあったけど、チェックボックスやラジオボタンに投票するのはあまりなかったので探すのにちょい苦労した。

Ruby: Mechanize GUIDE.txt 日本語訳 | Idea, Design, Engineering, Architecture, etc

はてなダイアリー

フォームには6つのラジオボタンがあり、その5番目にチェックを入れて投票ボタンを押すスクリプト。簡単っすね。

[][]exerbでmachanizeが動かない。 16:15 exerbでmachanizeが動かない。 - 今日も元気にrubyist を含むブックマーク はてなブックマーク - exerbでmachanizeが動かない。 - 今日も元気にrubyist exerbでmachanizeが動かない。 - 今日も元気にrubyist のブックマークコメント

404 Not Found

exerbというrubyスクリプトをexe化できる神のようなソフト(?)があるのだが、どうやらmechanizeを使っているスクリプトはちゃんと動かないみたい。まぁ拡張ライブラリが正常に動作しないことがあるって書いてあるから仕方ないんだけどちょと残念。

AgathaAgatha2011/05/05 06:11AFACIT you've covered all the bases with this answer!

qyfaqhwziqyfaqhwzi2011/05/05 22:49uJGyQy <a href="http://cwhoeajaqksy.com/">cwhoeajaqksy</a>

cadkbccadkbc2011/05/06 22:07mKZvet , [url=http://xtggqlepunwl.com/]xtggqlepunwl[/url], [link=http://xdrspdimvlsn.com/]xdrspdimvlsn[/link], http://nibybztnuqyq.com/

eymksheymksh2011/05/07 12:33SvbDvr <a href="http://qzsdxstlwqdb.com/">qzsdxstlwqdb</a>

2008-09-05

[]bloombergからWTI原油の価格を取得するスクリプト 16:12 bloombergからWTI原油の価格を取得するスクリプト - 今日も元気にrubyist を含むブックマーク はてなブックマーク - bloombergからWTI原油の価格を取得するスクリプト - 今日も元気にrubyist bloombergからWTI原油の価格を取得するスクリプト - 今日も元気にrubyist のブックマークコメント


# 2008/09/04 bloombergのいろいろな指数を取得するスクリプト

require 'mechanize'
require 'kconv'

# 0.初期設定
agent = WWW::Mechanize.new

def write(arr)
  f = open("C:/share/03_scr/bloomberg/bloomberg.txt", "a") 
  f.write(arr.join("\t"))
  f.write("\n")
  f.close
end

# 1.bloombergにアクセス
page = agent.get('http://www.bloomberg.com/markets/commodities/energyprices.html')
#page = agent.get('http://www.bloomberg.com/markets/asia_index.html')

arr = []
# 1.span classで回す
(page/"span").each do |text|
  # 2.tbl_txtクラスかつ最後の一文字が英文字かどうか←(前日と価格が変わらなかったときの対策)
  if text.to_html =~ /<span class="tbl_txt">.*/ && text.inner_text =~ /^.*\w$/
    # 1.今まで溜まっている単語列が5個かどうか?
    if arr.size < 5
      # 1.4個以下なら不正な行としてその行を削除
      arr = []
      arr << text.inner_text
    elsif arr.size == 5
      # 2.5個なら結果出力
      write(arr)
      arr = []
      arr << text.inner_text
    else
      # 3.6個以上なら6番目以降の要素を削って出力
      arr = arr.slice(0..4)
      write(arr)
      arr = []
    end
  else
    # 3.それ以外のクラスなら配列に代入
    arr << text.inner_text
  end
end

Webアクセスまでは楽勝だけど、その後の文字整形(成型?)が大変。

ちゃんとタグ分けされてないのでまずspanクラスを全部取り出す。

その中で指数クラスが所属するtbl_txtクラスをキーにして整形。

ただしその他の要素にも同じタグが使われてるので

指数,価格,前日比,前日比(%),データと5つの要素が揃ったときのみ

ファイルに書き出すようにした。

まぁめんどくさいといっても30分くらいで出来上がったのだが、

力技なので充実感とか知的好奇心が満たされたって感じはないなぁ。

あ、bloombergのサイトは全部同じ形式なので

アドレス変えれば日経平均やダウ平均も取得できると思います。

2008-08-06

[]auの料金明細を取得するスクリプト 16:10 auの料金明細を取得するスクリプト - 今日も元気にrubyist を含むブックマーク はてなブックマーク - auの料金明細を取得するスクリプト - 今日も元気にrubyist auの料金明細を取得するスクリプト - 今日も元気にrubyist のブックマークコメント

rubyスクリプトを書いてなかったわけではないが投稿は久しぶり。

毎月auの料金明細を手動で確認するのが面倒なのでスクリプトを書いてみた。


# 2008/08/06 auの料金明細を取得するスクリプト

require 'mechanize'
require 'kconv'

# 0.初期設定
username = 'ユーザー名'
password = 'パスワード'
agent = WWW::Mechanize.new

# 1.MYPAGEにログイン
page = agent.get('https://ryokin.au.kddi.com/au-ryokin1/SNK1100')
form = page.forms[0]
form.fields.find {|f| f.name == 'K1100AA'}.value = username
form.fields.find {|f| f.name == 'K1100AB'}.value = password
mypage = agent.submit(form, form.buttons.first)
# puts mypage.body.tosjis

# 2.請求内訳を取得
# 2番目のフォーム(2か月分の請求内訳)にフォーカス
form = mypage.forms[1]
seikyu = agent.submit(form, form.buttons.first)
# tdタグのうち"tsize9"というクラスを検索
(seikyu/"td.tsize9").each do |text|
  puts text
  # puts text.xpath
end

実はこれまだ未完成で、上記スクリプトを実行すると不要な情報がいくらか出てくる。

ので、絞り込まないといけないのだけど、適切なID/クラス名が割り振られてないから

こちらで文字列判断して分岐作らないといけないんです。au終わってる。

文字列部分は契約しているプランによって違うので

このスクリプトの利用者がそれぞれ作りこむ必要がある。

そんなに難しいものじゃないと思うので、このまま投稿します。

MikelMikel2011/09/07 22:29Created the greatest artiecls, you have.

fixstcndiszfixstcndisz2011/09/08 17:05Gaat0R <a href="http://cqhpmiaermwv.com/">cqhpmiaermwv</a>

jqfqzoolpsjqfqzoolps2011/09/08 21:0896pZof , [url=http://wmjtnltmsvzq.com/]wmjtnltmsvzq[/url], [link=http://ynqxeurwdoeu.com/]ynqxeurwdoeu[/link], http://busoelvnpxrp.com/

ghvpgvzepkghvpgvzepk2011/09/09 17:34q9Mr8D <a href="http://oprigqmxmlfs.com/">oprigqmxmlfs</a>

jjxosnjjxosn2011/09/10 23:01I6UMhj , [url=http://lgpxfydcogwr.com/]lgpxfydcogwr[/url], [link=http://snujjwvgtfgp.com/]snujjwvgtfgp[/link], http://xlhxurxczbtb.com/

AustinAustin2013/01/14 03:50Hey hey hey, take a gaendr at what' you've done

xxqkvvpxxqkvvp2013/01/14 22:17ZW981a <a href="http://zebxnlstfwbb.com/">zebxnlstfwbb</a>

wwyiwcejkpwwyiwcejkp2013/01/14 22:176u3xr2 <a href="http://fdnfbryarsjr.com/">fdnfbryarsjr</a>

oedzzboedzzb2013/01/16 17:43nSSTzo , [url=http://juqhgadwcdwn.com/]juqhgadwcdwn[/url], [link=http://dobpuwnrmjrc.com/]dobpuwnrmjrc[/link], http://aieldappdvgl.com/

oedzzboedzzb2013/01/16 17:43nSSTzo , [url=http://juqhgadwcdwn.com/]juqhgadwcdwn[/url], [link=http://dobpuwnrmjrc.com/]dobpuwnrmjrc[/link], http://aieldappdvgl.com/