Hatena::Grouprubyist

今日も元気にrubyist

2009-03-25[open-uri][hpricot]日本語URLを含む「こえ部」のタグページを解析する。 このエントリーを含むブックマーク このエントリーのブックマークコメント

こえ部(http://koebu.com)で投稿数が2以上のお題を抽出したいと考えた。

最初はこんな感じでやろうとしたが…

require 'mechanize'

url = 'http://koebu.com/topic/tag/男声向け'

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

「指定したお題が見つかりません」と言われる。どうやら

url = 'http://koebu.com/topic/tag/男声向け'

が上手く認識できてないみたいで以下のようにURLエンコードしてもダメ。

url = 'http://koebu.com/topic/tag/%E7%94%B7%E5%A3%B0%E5%90%91%E3%81%91'

よってopen-urlを使った。(原因を問い詰めないのが俺流)

require 'open-uri'
require 'hpricot'

maxpagenum = 3
limitpost = 2

1.upto(maxpagenum) do |num|
  doc = Hpricot(open("http://koebu.com/topic/tag/%E7%94%B7%E5%A3%B0%E5%90%91%E3%81%91&page=" + num.to_s))
  (doc/%Q[li.unitTi]).each do |elem|
    if elem.inner_text.slice(%r[\((\d+)\)$], 1).to_i >= limitpost
      title = elem.to_html.slice(%r[<a href=".*?">(.*)</a>], 1)
      title = elem.inner_text
      url = "http://koebu.com/" + elem.to_html.slice(%r[<a href="(.*?)" title="], 1)
      puts title
      puts url
    end
  end
end

これでよし。

RockyRocky2011/09/08 10:38There's nothing like the relief of fiindng what you're looking for.

ijkspnvvycwijkspnvvycw2011/09/09 00:02EAaAa2 <a href="http://thqghzsyfbgg.com/">thqghzsyfbgg</a>

qplmxmnngywqplmxmnngyw2011/09/10 19:12S71y64 <a href="http://vnddcgvcupnd.com/">vnddcgvcupnd</a>

oxbmmbezytnoxbmmbezytn2011/09/12 19:174gYY9T , [url=http://ftmtkfhclunb.com/]ftmtkfhclunb[/url], [link=http://qlupfanwdbjo.com/]qlupfanwdbjo[/link], http://rwlymyurqzsw.com/

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-10

[]rubyFTP 22:19 rubyでFTP - 今日も元気にrubyist を含むブックマーク はてなブックマーク - rubyでFTP - 今日も元気にrubyist rubyでFTP - 今日も元気にrubyist のブックマークコメント

require 'net/ftp'

ftp = Net::FTP.new
ftp.connect('[FTPサーバ名]')
ftp.login('[ユーザー名]', '[パスワード]')
ftp.binary = true
ftp.chdir('[アップロード先のパス]')
ftp.put('[アップロードするファイルのローカルパス+ファイル名]', '[アップロード先のファイル名]')
ftp.quit

net/ftp - バリケンのRuby日記 - Rubyist

ありがとうございました。

アップロードするファイルをフルパスで書かなかったのでちょっと詰まったの内緒。


ところで、net/ftpってあまり良くないって聞いたことあったけど…。気のせいかな。

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

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

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

_ - きたももんががきたん。

フォームには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>