最近、オライリーやApressのWebサイトで Deal of the Day があることを知り、欲しい本が掲載されている場合は、ついつい手が出てしまう。
さらに、オライリーやApressでは、Deal of the Dayの内容をRSS配信してくれているため、余計に手を出しやすい。
ただ、Apressの場合、Web版のGoogleリーダーで購読したところ、日付が飛んで配信されることも多いため、少々不便。
そこで、ApressのTwitterBotを作成し、Deal of the Dayの情報を取れるようにしてみた。
■Bot情報
Apress以外のDeal of the Dayもツイートするボットへと修正 (2012/11/8)
■環境
■実装時に困ったことと対応
ApressのBotは他にいないか?
「@apressdotd」というのがいたが、2011/4/9以降にツイートされておらず、停止?
ただ、ツイートの内容についてはこのbotを参考にして、ほぼ同じものとした。
ツイートするデータをどこから持ってくるか
今回はスクレイピングを使いたかったため、後者の方法を採用。
なお、PythonでGoogle Feed API を使う場合、以下のサイトを参考になりそう。
E71:PythonでGoogle AJAX Feed API を使ってみる - HiiHahWIKI - making some notes for... -
lxmlでのスクレイピング
以下のサイトを参考にしました。lxml.etree.fromstringとほとんど変わらない感じですね。
PyYAMLは使えるか?
「import pyyaml」で問題なく使える。app.yamlへの記載も不要。
Third-party Python Libraries in Python 2.5 - Google App Engine — Google Developers
新料金体系への対策
以下にまとまっていたため、「Application SettingsのPerformance」「Cron Jobsを減らしてTask Queueで代用する」などを参考にしてセッティング。
Google App Engineの新料金体系対策 - Tari Lari Run
cron・task関連の公式ドキュメント
python-twitterのエラー
同じ内容をツイートしようとすると、「Status is a duplicate.」のエラーが発生するので、その場合はすでにツイートしたとみなして、リトライしないようにした。
ただし、12時間くらいたつと、同じ内容でもツイートされていることに気づいた(あとで修正予定)。
botのツイートタイミング
14:00頃にDeal of the Dayの商品が入れ替わっていたが、エラーで停止することを考えて、一時間ごとに動くようにした。