自動化目指して書いてみた
更新です。
今回の話題はこれ↓
「はてなブログで自動投稿を目指す」
はい。
私、このブログの他にこういうブログもやっております。
これは私の持ち株の日々の値動きを淡々と記録するだけのブログなので(たまに別の記事も書いてましたが)、こんなものに需要はないと思います。
ですが、私にとっては意味のある(興味がある)データを毎日自動でサンプリングして記録するシステム(botっていうんですかね。)をいつか作りたいな、と思ってはじめました。
一年前は手動で毎日のように更新していたんですよ。
ただ、今年に入ってさっぱり更新しなくなっちゃったんですよね。
やっぱり、毎日手で数字を書き換えるだけの作業なんて長続きしませんよ。
ということで、最近スクレイピングのスクリプトも書きましたし、この勢いを使って長年の目標だったはてなブログの自動投稿スクリプトを作ってみました。
今回の目標:「画像付きの記事を生成して、はてなブログに投稿するまでを自動化する」
スクリプト作成にあたってクリアすべき課題はこんなところでした↓
- txtとcsvファイルから情報(株価など)を取得
- 取得した情報を使って画像(日足チャート)を生成
- はてなフォトライフに画像を投稿 & 投稿した画像のIDを取得
- 投稿した画像のIDを使って画像付きの記事を生成
- 生成した記事をはてなブログに投稿
- 平日19時に自動投稿する設定
ちなみに、これは画像生成以外はpythonで作りました。
(画像生成はgnuplotです。)
txtとcsvファイルから情報を取得
このステップでの課題はこんな感じ↓
意外と苦労しました。。
ファイルの読み込みと処理なんて余裕でしょ、と思っていたのですが、pythonでこの手のファイルを扱う作法がよくわからなくて(前回はその場しのぎでawkを使いましたので。。)2日間くらいもがきました。
ネットで調べるとpandasを使えばいいよ、ということでしたが、私には難しすぎました。。
で、結局のところ、for文とreadlinesを使った(おそらく野暮ったいけど、私にとってはわかりやすい)スクリプトで乗り切りました。
今回やってみて、pythonで行列データを扱うのはわりときつい、という印象を受けました。
取得した情報を使って画像(日足チャート)を生成
これは、前回作って今も動かしているgnuplotのスクリプトに追記してブログ用のチャートを生成できるようにしました。
なぜかここでも2、3時間詰まるというまさかの事態に 苦笑
ブログ用の画像はjpegで作ったのですが、背景色の設定がうまく行かず、苦しみました。
一回作ってるって言っても、基本的にネットに転がっているのをコピペで作っているので、どこでどんな設定をしているかなんてロクに頭に入ってないんですよね。。
はてなフォトライフに画像を投稿 & 投稿した画像のIDを取得
「先に画像を投稿 → 後から記事を作る」という手順を編み出すまでに、少し時間を使いました。
はてなブログに記事を自動投稿するソースコードは何件かヒットしたのですが、画像付きとなると意外と見つからなくて、「どうしたものか」と悩みました。
はてなフォトライフAtomAPI - Hatena Developer Center
この記事を読んで、画像を投稿した時に受け取るレスポンスから投稿した画像のIDを抜き出せることに気づきました。
画像のIDさえ取得できれば、はてな記法でフォトライフ上の画像をブログ記事に貼り付けることができます。(今回は、レスポンスで返してくる画像のURLの末尾をos.path.basenameで抜き取ってIDを取得しました。)
ただ、実際に画像を投稿する段階になってまたもどん詰まりました。
これを抜けるのに2、3時間(いや、もっとかも)かかりました。。。
base64ってなんですか?って感じですから、まぁ当然といえば当然ですが。。
結局、画像ファイル(filename)を
import base64
bs64 = base64.encodestring(open(filename, 'rb').read()).decode('utf8')
これに投げることで解決しました。
次に、リクエスト送信で詰まる。
吐き出されたエラーメッセージに「システム管理者に問い合わせろ」的な文が出てきたので半分あきらめかけました。
散々調べて見つけたものは、リクエスト文の中のこれ↓
<content mode="base64" type="image/jpeg">/9j/2wCEAAQDAwQDAw.../9n/AA==</content>
本来はtype="image/jpeg"とすべきところをtype="image/jpg"としてしまっていたんです。
これを直したら通りました。
投稿した画像のIDを使って画像付きの記事を生成
ここも合計で5、6時間は詰まったと思います 笑
txtファイルの情報を抜き出すところとセットでやっていたのですが、リストの扱いに苦労しました。
最初はおぼえたてのformat関数を使っておしゃれ(?)にキメようと考えましたが、わけがわからないエラーから抜け出せなくなったので、for文を使って一行ずつ株価情報を追加していく愚直な方法に切り替えました。(といっても伝わらないと思いますが。笑)
このステップは、次の記事の投稿作業が完了してからも苦労させられました。
今回の記事のフォーマットでは、
銘柄名 株数 買値 現在値
という行が銘柄の数だけ並ぶんですけど、やっぱり各項目の文字は右揃えか左揃えできれいに揃えたいじゃないですか。
だから、頑張ってターミナル上でスペースの調整をして、文字がきれいに並ぶようにしたんですけど、はてなの記事にするとガッタガタになっちゃうんですよね。
どうも全角文字と半角スペースの幅の比率がターミナルと全然違うみたいで、これには困り果てました。
で、悩んだ末にMarkdown記法のテーブルを使うことにしました。
なんだ、これ使えば楽チンじゃん。
これで解決かと思いきや、本文の改行が上手くいかないことが判明。
これも、どハマりしました。
で、たどり着いた答えがこれ↓
body = """(一行目)
<br />
(二行目)"""
この「<br />」を使って改行を指示してあげるとうまく行きました。
私はコマンドの意味を理解していませんので、「改行のおまじない」としてこれからも大事に持っておきたいと思います。
生成した記事をはてなブログに投稿
これは、何件か先例がありましたのでわりとスムーズにクリアしました。
一番参考にしたのはこの記事
熟読しました。いやー、勉強になりました。
上の記事とこれ(↓)があれば、やり方はなんとか理解できます。(とは言え、時間はかかりましたが。)
はてなブログAtomPub - Hatena Developer Center
平日19時に自動投稿する設定
昨日の夜にようやくスクリプトが完成して、cronにセットし、今日を迎えましたが、うまく動かないというお約束どおりの展開。
あれこれ調べて、これを抜けるのにも結局3時間かかってしまいました。。
どうやら、スクリプト内の一箇所だけ、相対パスを入れてしまっていたようで、そいつが引っかかっていたみたいです。
今回も、ひっかけ問題にことごとく引っかかってしまいました。 苦笑
明日こそ、うまく動くはず!