いいかげん日記

思いついたことをただひたすら書き殴るいいかげんな日記です。

自動化目指して書いてみた

更新です。

 

今回の話題はこれ↓

はてなブログで自動投稿を目指す」

 

はい。

私、このブログの他にこういうブログもやっております。

theta-proto.hatenadiary.com

これは私の持ち株の日々の値動きを淡々と記録するだけのブログなので(たまに別の記事も書いてましたが)、こんなものに需要はないと思います。

ですが、私にとっては意味のある(興味がある)データを毎日自動でサンプリングして記録するシステム(botっていうんですかね。)をいつか作りたいな、と思ってはじめました。

 

一年前は手動で毎日のように更新していたんですよ。

 

ただ、今年に入ってさっぱり更新しなくなっちゃったんですよね。

やっぱり、毎日手で数字を書き換えるだけの作業なんて長続きしませんよ。

 

ということで、最近スクレイピングスクリプトも書きましたし、この勢いを使って長年の目標だったはてなブログの自動投稿スクリプトを作ってみました。

 

今回の目標:「画像付きの記事を生成して、はてなブログに投稿するまでを自動化する」

 

スクリプト作成にあたってクリアすべき課題はこんなところでした↓

  • txtとcsvファイルから情報(株価など)を取得
  • 取得した情報を使って画像(日足チャート)を生成
  • はてなフォトライフに画像を投稿 & 投稿した画像のIDを取得
  • 投稿した画像のIDを使って画像付きの記事を生成
  • 生成した記事をはてなブログに投稿
  • 平日19時に自動投稿する設定

 

ちなみに、これは画像生成以外はpythonで作りました。

(画像生成はgnuplotです。)

 

txtとcsvファイルから情報を取得

このステップでの課題はこんな感じ↓

  • txtファイルから銘柄コードを抽出
  • csvファイルからコードに対応する銘柄名を取得
  • txtファイルの各銘柄のその日の株価(始値、高値、安値、終値)を取得
  • 合計損益額を計算

 

意外と苦労しました。。

ファイルの読み込みと処理なんて余裕でしょ、と思っていたのですが、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時間(いや、もっとかも)かかりました。。。

 

まず、jpegエンコードで詰まる。

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 = """(一行目)

&lt;br /&gt;

(二行目)"""

 この「&lt;br /&gt;」を使って改行を指示してあげるとうまく行きました。

私はコマンドの意味を理解していませんので、「改行のおまじない」としてこれからも大事に持っておきたいと思います。

 

生成した記事をはてなブログに投稿

これは、何件か先例がありましたのでわりとスムーズにクリアしました。

一番参考にしたのはこの記事

tadaken3.hatenablog.jp

熟読しました。いやー、勉強になりました。

 

上の記事とこれ(↓)があれば、やり方はなんとか理解できます。(とは言え、時間はかかりましたが。)

はてなブログAtomPub - Hatena Developer Center

 

平日19時に自動投稿する設定

昨日の夜にようやくスクリプトが完成して、cronにセットし、今日を迎えましたが、うまく動かないというお約束どおりの展開。

あれこれ調べて、これを抜けるのにも結局3時間かかってしまいました。。

 

どうやら、スクリプト内の一箇所だけ、相対パスを入れてしまっていたようで、そいつが引っかかっていたみたいです。

 

cabbalog.blogspot.jp

 

今回も、ひっかけ問題にことごとく引っかかってしまいました。 苦笑

 

明日こそ、うまく動くはず!