読者です 読者をやめる 読者になる 読者になる

栗’s diary

Python勉強中。トレードに役立つようなTwitter bot開発中。

現在のbot機能

python Twitter bot

我がbot

twitter.com

基本、平日に活動します。

現在の機能は、

  • 1時間に一回、ドル円と日経平均先物を呟く。(日経平均先物は残念ながら10分遅れ。時間帯によってSGXとCMEを使い分け。リアルタイムで日経平均先物の情報を取得できる無料サイトがあれば教えてね。)
  • 6:50にCMEのFF金利先物から利上げ確率を計算して呟く。答え合わせはCountdown to FOMC - CME Groupで。計算方法についてはそのうち記事で紹介する予定。
  • TDnetの開示情報を場中30分単位で若干のフィルターをかけて呟く。来週からは5分単位に切り替えていく所存。

現在取り組んでいるのは、指定した企業サイトからPR情報が更新されたら即呟く事。これが出来れば、当初目論んでいたツイッターbotのための技術は取得できたことになるのだが。

ツイッターbot作成の道(その3):細かいcron

python Twitter bot

※本記事は別ブログで書いた内容を多少の加筆修正の上、転載したものです。

 

マーケット情報を呟く定期botを作るのが目標なので土日は静かにしていたい。
具体的には月曜の7時から土曜の7時までの間1時間おきにツイートしたい。

cronでそこら辺の指定ないのかなって探してみたけど見つからず。
公式のレファレンスには、

every 5 minutes from 10:00 to 14:00 (10時から14時までの間5分おきに)
every monday 09:00 (毎週月曜9時に)
2nd,third mon,wed,thu of march 17:00 (3月の第2第3の月曜水曜木曜に)

とかならあるけど、直接参考になるものはなかった。

試行錯誤していくつかの組み合わせパターンを試してみたけど、すべてエラー。
こういうニーズってあんまりないのだろうか。

cronをいくつも書いちゃうという荒業もあろうが、
今回はpython側でdatetimeモジュールを使って曜日や時間を調べて分岐させるという方法を取りました。
(でもこれだと無駄にURL叩いちゃうことになるんだよな。)

「月曜の7時から土曜の7時までの間1時間おきに」をcronでシンプルに書く方法があれば教えてくださいませ。

Google App Engineによるアプリ(ツイッターbot)制作まとめ

python Twitter bot

※本記事は別ブログで書いた内容を多少の加筆修正の上、転載したものです。

 

前回の記事で、鉄は熱いうちに打てを学びました。

今までGoogle App Engine(GAE)って使ってましたが、現在はGoogle Cloud Platformのサービスの一つって位置づけなんですかね。

gihyo.jp

それはともかくGAEを使ってツイッターbotを作る流れをまとめると

(最初のみ)
Google Cloud Platformにアカウント登録
Google App EngineSDK(GAE Launcher含む)をインストール

Google Cloud Platform上にアプリケーション作成(箱)
・GAE Launcherでアプリケーション(例えば、ツイッターbot)作成
・ローカルホストでテスト、テスト、テスト
・GAE Launcher上のアプリケーションをGoogle Cloud PlatformにDeploy
・アプリケーションのURLは http://[your-app-id].appspot.com/
(アプリケーションの名前がURLに使われるので名前には色々制限がある。)

てな感じでしょうか。
あれ、だいぶ短くなった...。

 

Google Cloud Platformに関する参考記事

Creating a Guestbook Application  |  Python  |  Google Cloud Platform

Google App Engine - Python Tutorial を和訳してみた - Qiita

App Engine の料金  |  App Engine  |  Google Cloud Platform

 

Google App Engine Launcherに関する参考記事

開発サーバとして便利なGoogle App Engine Launcher - ねずみとりんご

Google App Engine Documentation  |  App Engine  |  Google Cloud Platform

Google App Engine Launcherへアプリケーションの登録 | 無料レンタルサーバ(格安・有料)情報のレンサバ.com

ツイッターbot作成の道(その2)

python Twitter bot

 ※本記事は別ブログで書いてた内容を多少の加筆修正の上、転載したものです。

ameblo.jp

どうも。前回、Tweepyを使ったツイートに失敗したものです。

  • Tweepyを使わずにGAETweet

fujit33.hatenablog.com私と全く同じ苦労してる人がいて共感した。
で、この人の解決法を真似ることにした。
Tweepyを使わずに呟く!

この記事も参考にしながら。

offsidenow.phpapps.jp

AppEngine-OAuth-Libraryってのをダウンロードしてリネイムして、Tweepy代わりに使うわけですな。
ディレクトリ構造はうまく真似できかなかったが、とりあえずツイートに成功。
(後で理解したことには、空でもいいから「__init__.py」のファイルをフォルダ内に一緒に置かなければいけないってこと。)

 定期botの完成もまもなくかと思った。
しかし、加工して日本語をツイートしようとするとエラー。
「SyntaxError: (unicode error) 'utf8' codec can't decode byte 0x82 in position 0: invalid start byte」
辛い。

 

勉強し始めた頃に、Pythonでは日本語の扱いが少々厄介って聞いたし、実際そうだったし。
(Python3系だと改善されてるって噂だけど。)
でも今までは自分用に使ってただけだし、Jupyter Notebookでプログラミングする分には気にならなくなってたので目を背けていた。

ここらで諦めて、少しだけ調べてみた。動いてくれと願いつつ。

hikm.hatenablog.com

d.hatena.ne.jp

文字列(str型)とユニコード文字列(unicode型)は別物。ふむふむ。
Encode/Decodeが何から何への変換を指しているか。ふむふむ。
自分自身が利用している環境について知っておくべきこと。はい、すみません。
その他の記事とかも一通り読んで、色々なパターンを試してみたけど、やっぱり何かしらのエラーが出続けた。
日本語を諦めかけようとしたその時、それは見つかった。

okwave.jp

そのファイル、シフトJISで保存してませんか?


テキストエディタ秀丸使ってるけど、それがシフトJISで保存してるんかね。(よくわかってない。)
とりあえず冒頭部分にある「coding: UTF-8」を「coding: shift_jis」 に書き替える!
アップデート、更新。


・・・・・・

成功!!!

ありがとうOKWAVE
ありがとうkmeeさん!
ついでにありがとうkenta7859さん。

 

  • Cronでスケジュールを指定

GAEを通してやっとまともにツイートできるようになり、いよいよ定期的に呟くように設定。
cron.yamlというファイルで指定してやればいいとの事。簡単、簡単。

remotestance.com

細かい指定方法については公式の方で。

cron.yaml Reference  |  Python  |  Google Cloud Platform

作業完了。後は指定した時間に呟いてくれるはず。
あれ、時間が来ても呟いてくれない...。
現在時刻を取って来たらグリニッジ標準時だったからそのせいかも。
でも、timezoneは指定したけど...。
まあもう少し待ってみるか。
そして次の日になっても呟かないのであった。

 

  • Deploy

次の日、飲みながら調べた。

前に読んだこの記事の最後にあるデプロイという言葉を。

qiita.comそう言えば、前回紹介したこの記事にも。

開発サーバとして便利なGoogle App Engine Launcher - ねずみとりんご

 なるほど。いままでの作業は全部ローカルホストでやってただけで、
アプリケーションとして、これをGoogleにアップしないといけなかったのか。
そこでcronが働いてくれるわけか。

サク飲みを切り上げ、帰宅。
「Deploy」ポチッ。エラー...。┐(´д`)┌ヤレヤレ

探せば似たような経験をした人がいるネット社会。

d.hatena.ne.jpでも、これでも問題は解決しない。

色々、調べて分かったこと。
アプリをアップするGAEの方にも同じ名前でアプリを作っとかないといけないって事。
GAELauncherでDeployして勝手に出来上がるわけじゃないんだね。

Google App Engine Launcherへアプリケーションの登録 | 無料レンタルサーバ(格安・有料)情報のレンサバ.com

[Diary] GAE/pyとbulkloader - fukuitの日記

GAEアプリケーションを作ろう!(1/6):GAEで始めよう! JSP/サーブレット入門

GAE(Google App Engine)に登録してみるてすと。 - うみたんのアトリエ

操作画面とか少し変わったと思うんだ。
[Create Application]ボタンの代わりに何かのメッセージがあったような記憶が。
ボタンがあるならそこから。

とりあえず https://appengine.google.com/ にアクセス。
「Before getting started, you want to learn more about developing and deploying applications.」もっと学習してから来いと。

Creating a Guestbook Application  |  Python  |  Google Cloud Platform

あっ、こんな所にマニュアルが...これを最初に読むべきだったのではないか疑惑。

Google App Engine FAQ  |  App Engine  |  Google Cloud Platform

FAQの1項目目 -「How do I sign into my Google App Engine account?」
you can log into your App Engine account by visiting the Google Cloud Platform ここからいけるっぽい。

ちなみにマニュアルの和訳版もありました。対応が取れてないのは新旧の問題でしょうか。

qiita.com

必要なのかなと思って無料トライアルもポチってしまった。なくてもいけるっぽいのに。

cloud.google.comクレジットカードの登録がいる...。

というわけで、GAE(いまはGoogle Cloud Platformに統合されてる?)にも同名アプリケーションを作成した後に再びDeploy。
うん、成功。

 時間のずれはこの後スタッフ(私)がちゃんと修正しました。
ちょっと自分の体験をもとに時系列に並べちゃったり、書きながら新しいことがわかってきたので、特にGAEに関しては重複させながらまとめ記事を作ろうかな。予定は未定。(続く)