ApressのDeal of the Day用のbotを作ってみた

最近、オライリーや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を参考にして、ほぼ同じものとした。

ツイートするデータをどこから持ってくるか

今回はスクレイピングを使いたかったため、後者の方法を採用。
なお、PythonGoogle 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

yamlファイルの扱いは?

pyファイルと同じ階層に置いて、PyYAMLで読込をすれば問題なく動作。
app.yamlにstatic指定などは必要なし。

新料金体系への対策

以下にまとまっていたため、「Application SettingsのPerformance」「Cron Jobsを減らしてTask Queueで代用する」などを参考にしてセッティング。
Google App Engineの新料金体系対策 - Tari Lari Run

アイコンをどうするか

パブリックドメインRSSの画像を探し、上記のものを利用することにした。

python-twitterのエラー

同じ内容をツイートしようとすると、「Status is a duplicate.」のエラーが発生するので、その場合はすでにツイートしたとみなして、リトライしないようにした。
ただし、12時間くらいたつと、同じ内容でもツイートされていることに気づいた(あとで修正予定)。

botのツイートタイミング

14:00頃にDeal of the Dayの商品が入れ替わっていたが、エラーで停止することを考えて、一時間ごとに動くようにした。