Webからの情報取得の自動化
昔と違って最近は使用量やら請求額やらいろいろなデータがWeb上で見られるようになったので、便利になった。けど、ほとんどのものは自分から見に行く必要があるため、じきに面倒になって見に行かなくなってしまう。
ということで、どうせならPush通知させたい! と思った。
Mechanize
最初は全部自前でParser書いて所望の情報を取得しようと思っていたけど、Cookieの処理等々面倒で挫けかけていた。ところが、調べてみたら便利なシロモノを発見。
どうやら、RubygemsにあるMechanizeを使えば、その辺りを気にせずに作れるらしい。
gem install mechanizeでさくさくとインストールして使ってみた。
参考:
以下、軽く使ってみたところで気づいた嬉しい点と要注意点。
嬉しい点
- Cookieの処理を気にしなくてもいい
- Formの処理がとっても楽
要注意点
- frameを使ったサイトでどちらかのframe内のFormを触る場合などは、まずはそのframeの取得が必要
- Javascriptの処理までは自動的に処理してくれないので、FormにJavascriptが絡んでいる場合などはソースを解析してJavascriptで処理されている部分の模擬が必要
- TLSv1のみ対応のサイトの場合、追加でオプションが必要(後述)
ハマったポイント
Javascriptによる自動転送
某サイトが、リンクをクリック → OTP取得用?のページを表示 → Javascriptで自動的に転送 → メインのページを表示という手順を踏んでいて、ブラウザで表示した際には間のページの存在に気づかず、次のページをMechanizeで表示させようとしてもエラーページに飛ばされるばかりだった。 一歩一歩調べたところ間のページの存在に気づいたため、Javascriptで処理している箇所をMechanizeに行わせるようにした。
TLSv1のみ対応のサイト
某クレジットカード会社のhttpsなログインページを取得しようとしたところ、SSL_connect SYSCALL returned=5 errno=0 state=unknown state (OpenSSL::SSL::SSLError)というエラーが出て取得が失敗した。 どうやらTLSv1にのみ対応なサイトにそのまま取得しようとしたことによるエラーの可能性が高そうだったため、下記のようにTLSv1でhttpsの接続を行うように指定したところ、問題なく接続できるようになった。
agent.ssl_version = 'TLSv1'参考:
- RubyでHTTPS通信に失敗したのでcURLで対処した | あべさん日記
- Ruby - MechanizeでTLSv1を使用して暗号化通信するサーバー上のページにアクセスできない問題の対処法 - Qiita [キータ]
作ってみたもの
以前Nokogiriを使って下記のものをcronで定期的に取得して携帯のメールアドレスに送信するようにしていた。- 天気予報
- 近隣の鉄道の運行状況
- IIJmioの利用状況
- クレジットカードの請求額
いくつかハマりポイントはあったものの、必要な情報のPush通知っぽいことがだいぶできるようになってきた。
0 件のコメント:
コメントを投稿