栗’s diary

Python勉強中。トレードに役立つようなTwitter bot開発中。暗号通貨の自動売買もやってみたい。

ツイッターbot作成方法まとめ(バージョン1)

GoogleSpreadSheetをデータベースとして使えるようになった今、当初目指していたツイートbotバージョン1が完成した。すなわち、定期的に情報をツイートする、サイト情報が更新されたらツイートするという二つの機能を実装できるようになった。
今回はバージョン1完成を記念し、これまでの日記風ブログをまとめる形で、ツイートbot作成方法の流れをおさらいしてみようと思う。

1.Pythonを使える環境を整える

私がPythonを導入して1年近く経っていたので、当ブログではその詳細には触れなかったが、「anaconda」をインストールしPython環境を 整え、「jupyter」で編集している。足りないmoduleがあれば「pip install」もしくは「conda install」と唱えれば大体うまくいく(はず)。使用環境を整えたい人がいれば、その辺のキーワードでググってみるといいのではないだろうか。参考までに最近見かけたPython導入記事を置いておく。改めて見ると長いな...。

データサイエンティストを目指す人のpython環境構築 2016 - Qiita

2.Twitter APIの取得

まずは、手動クリックで呟いてみる事から。

ツイッターbot作成の道(その1) - 栗’s diary

3.Google App Engine(GAE)を導入する

(定期的に)自動でツイートするにはサーバーを利用する必要がある。そこで私が利用したのが、グーグルのGoogle App Engine。下記記事にその時の体験を書いているが、いま読み返すと見にくいなぁ...まあ日記ですから。ローカルで上手くいくものがサーバー上だとエラーになる現象には本当手を焼いた。

ツイッターbot作成の道(その1) - 栗’s diary

ツイッターbot作成の道(その2) - 栗’s diary

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

私の場合、無料でも使える有償アカウントが結局必要になった。

ツイッターbot作成の道(その7):GAE有償アカウント、そして完成へ - 栗’s diary

4.ログを残す方法をマスターする

サイトが更新されたら呟く。それって結局頻繁にそのサイトを訪れて前回から変更があれば呟くという定期botの応用形なんですよね。その際に前回情報を残しておく必要があるわけで。GAEの中のファイルは外から更新できない仕様のようなのでどこか外部に。Googleはサンプルとしてデータストアの使用を挙げていますし、今後どこかでそれは使う予定ですが、とりあえずGoogleSpreadSheetを使ってみましたよと。

ツイッターbot作成の道(その6): GoogleSpreadSheet - 栗’s diary

 

あっさり書くとこんな感じでしょうかね。

今後はWebスクレイピングの技術を高め、pdfの解析、zipファイルの中のエクセルファイルの解析(日銀め...)など出来るようになりたいと思います。

また監視サイトを増やしていった場合に起こるであろう遅延との闘いにも備えないといけません。

慣れて来たらGoogleSpreadSheetからデータストアへの移行もするでしょう。たぶんそっちの方が処理が早いはずだから。

その先は、テキストマイニングとか機械学習とかディープラーニングとかよくわかってませんが、読み込んだデータから市場に与える影響度なんか出せたら格好いいなと思ってます。

短い間、ご愛読ありがとうございました。栗先生の次回作にご期待ください。

ツイッターbot作成の道(その7):GAE有償アカウント、そして完成へ

ツイッターbotも完成だなと、まとめブログを書こうと過去記事を振り返っているとある事に気づきました。

https://appengine.google.com/に行ったらエラーログを見れるという事に...。

そこで吐き出されていたエラー

The Socket API will be enabled for this application once billing has been enabled in the admin console.

あっ、無料じゃSocket API使えないのか...。

今までは60日間無料トライアルを使ってましたが6月26日で切れました。それまで上手くいっていたGoogleSpreadSheetとデータのやり取りが出来なくなってエラーを吐くという事に。くっ、GoogleSpreadSheetマスターしたのに使えないのか...と徒労感を一瞬味わいましたが、有償アカウントに切り替えて無料で使うことが出来るとの事。さっそく設定して無事に難を乗り切りました。たぶん。(後から請求来ないよな、ドキドキ。)

APP ENGINEの料金

有償アカウントへのアップグレード  |  Free Trial  |  Google Cloud Platform

Quotas  |  App Engine  |  Google Cloud Platform

予算の設定などは Google Cloud Platform から。

ついにツイッターbotバージョン1完成しました。

まだ、zipファイル開いてExcelの中身読み込むなんて高等テクニック使えないのでとりあえずこれで勘弁。

ツイッターbot作成の道(その6): GoogleSpreadSheet

ツイッターbotを作る技術として、最後に残るは更新されるや否や呟く。

そのためには、更新されたかどうかを判定するために過去の情報をストックしとかないといけないわけです。

第4回ではjsonファイルに保存しようとして見事に失敗したわけですが(ツイッターbot作成の道(その4) - 栗’s diary)、アプリ外に保存場所を確保しないといけません。

 GAE経由でデータを残す方法としてちょっとググった所、GQLデータストアってのがありました。

GAEのデータストアを使ってみました - 主にプログラムを勉強するブログ

DataStore « python練習帳

これら記事によると、GQLってのはSQLを使い慣れた人用、じゃない人はデータストアらしいです。

これらの技術は、後々使うかもしれません。ただ、使い慣れたもので容易にデータを確認したいと思った栗氏。またYahoo! Financeから金融関係の情報を引っ張ってこられるので使いこなしておきたいとも思った栗氏。

データの保存場所にGoogleSpreadSheetを使ってみる事にしました。

初期設定方法はPython3でGoogle SpreadsheetをDBのように利用するを参考に。思った以上に面倒。

Google側のAPIを有効にしたりKeyを取得したり。

スプレッドシート側で共有設定したり。

正直、何やってるかよくわからないまま言われるがままに設定したらとりあえず初期設定完了。(説明がなかった部分として、サービスアカウントは「App Engine default service account」で。メールアドレスもなかったのでJSONファイルをテキストエディタで開いてゲット。)

ソースコードはこんな感じに。

import gspread
from oauth2client.service_account import ServiceAccountCredentials

scope = ['https://spreadsheets.google.com/feeds']
credentials = ServiceAccountCredentials.from_json_keyfile_name('[ダウンロードしたJSONへのパス]', scope)
gc = gspread.authorize(credentials)
doc_id = '[スプレッドシートのURLからコピーした文字列]'
gfile   = gc.open_by_key(doc_id)
wsheet  = gfile.worksheet(シート名)
records = wsheet.get_all_records()

指定シートのデータを無事に取得できました。
credentialsを取得する方法はUsing OAuth2 for Authorization — gspread 0.3.0 documentationを参考にして、.from_json_keyfile_nameを利用。
両サイトにある「from oauth2client.client import SignedJwtAssertionCredentials」は古いようで、python - ImportError: cannot import name SignedJwtAssertionCredentials - Stack Overflowの回答欄を参考に「from oauth2client.service_account import ServiceAccountCredentials」を使用。

具体的にデータをやり取りする方法は以下のサイトが参考になりました。

[Python] Google SpreadSheetをAPI経由で読み書きする - YoheiM .NET

gspread API Reference — gspread 0.3.0 documentation

 

GAE上でやる場合には、ImportError: No module named gspread から始まって色々なmoduleがないって言われるので都度追加してあげる。ラスボスとして前回記事のようなエラーに遭うかもしれないのでご注意を。

ツイッターbot作成の道(その5):Libraries

前回、アプリ内にデータを保存するためにjsonファイルの使用を試みた栗氏。GAEの仕様として書き込み不可である事を後で知ってショックを受けたわけですが、仕方なくデータベースの使用を考えます。

詳細はまた別の機会に書きますが、とりあえずGoogleスプレッドシートを使ってみる事にしました。どうにかこうにか通常のプログラミングではデータのやり取りに成功。次はローカルでのテスト。その時、また奴が現れたのです。

「ImportError: cannot import name RAND_egd」

ツイッターbot作成の道(その1) - 栗’s diaryで「Tweepy(失敗)」という所でも出てきた難攻不落の敵。(ググるコメントアウトなどで上手くいくよという記述が見られるが、なぜかそれが通用しない。コメントアウトしてコードとしてはないはずなのに、エラーと注意される。わけわからん。)

どうやらtweepyもgspread(Google スプレッドシートを扱うのに便利なモジュール)も結局、requestsモジュールを使う際にエラーになってる模様。

前回は避けて通ったが、今はこいつをやっつけないと将来使うかもしれないいくつかの便利なモジュールも使えないだろう事に気付いてしまっていた。

Using Built-in Libraries in Python 2.7  |  Python  |  Google Cloud Platform

You can add a third-party library to your app in one of two ways: requesting the library or installing the library.

GAEで標準では使えないモジュールを使えるようにする方法は二つあって、一つはapp.yaml内にlibraryとして登録する。ただし、これはGoogleが許可したものであってかなり限定されている。もう一つは、アプリフォルダにそのモジュールを機能させるために必要なファイルも一緒に入れてアップロードするという方法。この場合もCで拡張してるものは無理。

 The library must be implemented as pure Python code with no C extensions.

 この条件によれば、requestsはアップロードする形で導入できるはず。なのに出来ないのは何か解決策があるはず...。

 結果から述べると「ImportError: cannot import name RAND_egd」はやっつけられませんでした。つまりローカルではエラー。ただし、無視してDeploy(アップロード)しアプリとしては上手くいく方法を発見できました。requestsに特化した解決方法ですが。

stackoverflow.com

you must replace the following line in your requests/models.py file :

「ChunkedEncodingError」ってのはDeployしたアプリを実行した場合に発生するエラーでそれでググってみました。かなり強引な解決方法だな...。Python2系に限定しているからこう言うエラーが発生するんですかね、知らんけど。

とりあえず、GAE上でGoogleスプレッドシートとのデータのやり取りに成功しました。ローカル環境でテスト出来ないのが不便ですが。

「ImportError: cannot import name RAND_egd」の抜本的対策をご存知の方はご教授を(>人<;)