仮想サーファーの波乗り

仮想化エンジニアの日常

プログラミング・ブロックチェーン・VR/AR・作業効率化・中国事情などに関してよく書きます。

仮想通貨情報お知らせTwitterBotを1週間運用してみた結果

今回は、仮想通貨情報を知らせてくれるTwitterBotを開発してから運用して1週間が経ったので、その開発から運用までを振り返っておこうと思います。

そもそも開発にいたったきっかけは「仮想通貨の値上がり/値下がり情報をいちいちチャートで確認するのめんどくさいし、Twitterはよく見るからTwitter上で確認できたら便利かもなぁ...!」と思ったこと。そんな思いから仮想通貨情報お知らせBotを開発してみて運用もしてみてハマったことや気づいたことなどをまとめていきます。


運用1週間での結果

運用を1週間してみて、フォロワー数380まで成長しました!!
(記事を書いているのが5/19時点なので、今の数値とはずれていると思います。)

f:id:virtual-surfer:20180519110500p:plain

要望に対してのリプライを除くと、ツイートは全て自動化しているので何もしなくてもこれだけフォロワーが増えるのは嬉しいですね。(実際にはこちらからフォローして自分のアカウントを知ってもらうことはしていますが、1度フォローしてフォローバックが3日以内になければその後1年間はフォローしないようなデータベース設計にしているので、そんなにウザい体験を生むこともないかなと...)

フォローしてくださった皆さん、ありがとうございます。これからも機能改善して価値あるツイートをしてくれるBotに成長させていきます( ̄^ ̄)ゞ


企画 ~ 開発 ~ 一旦リリースまでの流れ

それでは、Botの開発を思いついてから企画をし、システムの設計を考えて、開発して実際に動くようになるまでの手順をまとめていきます。

思いつき→企画

アイデアの段階では、開発できるだけの要件になっていないので、まずはBotを開発する目的、誰に見て欲しいのかを決め、システムの要件を決めていきました。

Botの目的

普段している仮想通貨の情報収集を、Botのつぶやきを確認すればOKにしたい。

Botのターゲット(どんな人にフォローされるか)

・仮想通貨の情報を定期的に収集している。
・Twitterを日常的に情報収集に使っている。
・ICOには手を出していなくて、取引所で買うことしかしていない。

Botの収集・提供する情報

・①値上がり/値下がりが大きい(=売買による利益が期待できる)コインのTOP9をツイートする。
②仮想通貨に関してのニュース/考察をしている記事をリツイートする。


システムの設計

ざっくりBotの目的と機能が決まったら、システムとしてどのように実現するのかを設計していきます。今回は、迅速に実装するために使ったことのある技術を中心に、以下のようなシステム構成にすることに。

f:id:virtual-surfer:20180519111726p:plain

仮想通貨情報の収集にはCoinGecko APIを活用し、仮想通貨記事の収集にはPythonライブラリのfeedParserを使いました。そして、取得したデータを加工して、Twitter APIでTwitterにツイートします。

これら全体の処理を担うアプリケーションを動かすサーバーは、Herokuを選定しました。HerokuのScheduler機能によって、定期的に処理を呼び出してAPI経由で取得したデータをもとにランキングデータをツイートしたりします。


実装→リリース

「まずはアカウントを誰でも見れる形にして出してみて、その反応をもとに機能を改善していこう」という方針だったので、システム設計が終わった瞬間に開発開始。この時土曜日の22時くらいだったので、開発が終わるまでに一晩(22時~5時)で没頭してPythonのコードを書き続けて⇆動作確認をしてを繰り返して、機能が実装し切れたところでHerokuにデプロイ。

週末の趣味の開発だと、仕事とは違って時間を区切られることなく一気に書き続けられて超はかどりました。

ツイートが定期的にされていることを確認できたので、これで何もしなくても自動でツイートし続けてくれるので、一安心して睡眠につくことができました。


リリース後の機能改善

リリースしてみてフォロワーが増えていくにつれて、ツイートを見られることも増え、機能のフィードバックをもらえるようになりました。

Twitter Botのいいところはこんな風に簡単に要望をもらえるところですね。↑ の要望をもとに、それまでのように「CoinGeckoの扱っている3600種類以上の全ての仮想通貨の上昇率/下落率のランキング」ではなくて、「出来高のあるコイン ≒ 取引所で簡単に買えるコインのランキング」が求められていて、もっというと「利益を見込めるコイン情報を知りたい」のかな?と思い、ランキングの内部のロジックを「取引所で買えるコインの上昇/下落ランキング」に変えることに。

CoinGekco APIで取得できるデータの関係で、この機能改善をするためにはデータベースで「仮想通貨がどの取引所で買えるのか?」というデータを持っておいた方がいいと判断し、データベースを組み込むことに。システム設計としては以下のようになりました。

f:id:virtual-surfer:20180519112919p:plain

そもそもデータを持たせるのにMySQLは最適なのか?KVSとか使った方がいいのでは?そもそもcsxファイルで持たせておくだけでもいいのでは?などデータの持たせ方に関して悩みました。しかし、今回は大規模データになる見込みも現状ないこと、仕様追加をする際にはその時にまた考えようということで扱いに慣れていて迅速に機能改善を実現できるMySQLでのデータ保持、SQLAlchemyでのデータやり取りをする設計としました。(←これHerokuの無料枠でMySQLを使うのが辛すぎたので、失敗だったかもとちょっと後悔...。後述します。)

MySQLにデータを持たせることにしたので、テーブル構成、カラムのデータ型などを設計し、LocalでMySQLのテーブルを作って動かしてみる⇆SQLAlchemy書いてデータ取得/更新処理してみる...を繰り返して、要件を満たせるものになった段階でHerokuのMySQLにもテーブルを作成しました。

データの持たせ方の仕様設計とそのデータをSQLAlchemyでオブジェクトにマッピングしてデータ取得・登録・更新する処理を書くのが2度目とかだったので意外に苦戦。業務後に帰宅してから開発を進めるスタイルで、2日かかった気がします...。


ともあれ、該当のコインだけでランキングをする機能の実装完了!

...動かしてみると、結果がおかしい...。

原因を調べてみると「a」~「c」で始まるコインしか登録されておらず、それらのコインの中でのランキングになってしまっていました。これに関しては、Herokuの無料枠でMySQLを動かす時にはクエリの発行上限があるらしく、その上限を知らずにバンバンクエリを発行するコードを書いていたので途中で処理がエラーで死んでaからcまでのコインしか登録できていない状況になっていました。

1226, "User 'xxx' has exceeded the 'max_questions' resource (current value: 3600)"

↑このエラーコードが出ていました。

そもそも3600種類以上のコインのidを指定して1つずつAPIを叩いて、そこで取得したデータを1回ずつMySQLにコミットする(つまり、連続的に3600回MySQLにクエリを発行→コミットする)処理を書いていたのがイケてなさすぎたと気づき、Pythonで登録するデータをリストで持っておき、データがリストにある程度詰まり切った段階でMySQLに一括登録するという処理に変えました。

こういうところからデータベースとアプリケーションの役割分担について学んでいくことができるんだなあ。と教訓になりました。

今この記事を書いている裏側で、再度データを更新している最中です。


1週間運用してみての気づきと学び

1週間Botを運用してみての気づきと教訓をまとめておきます。


Bot開発はエンジニアの個人開発にとって良いのでは?

Botの開発は、APIアクセスの方法、APIの一般的な設計の理解、データベースの設計、アプリケーションの書き方、エラー解決能力の向上、アプリケーションのビルドとデプロイの方法など、いろいろなことを学べるので、初心者がプログラミングの学習をする上でいい経験になるかと思いました。

また、多くの個人開発Webアプリケーションは作ってみてもすぐに利用者が増えず、フィードバックももらえないため、その開発が良いものだったのかどうかを振り返ることが難しいですが、Botだとフォロワー数の増減とフォロワーからの提言(リプライや引用リツイートなど)から、提供する情報の価値があったのか測ることができ、より詳細な分析もTwitterで標準で提供されているアナリティクスで分析できるので、求められている機能のフィードバックを得られ、個人開発に向いていると思いました。個人で開発したWebアプリケーションに最初から分析ツール入れるとかめんどくさくてやってられないし。

とはいえ、フロントエンドの実装をすることはないので、フロントエンドの実装をしたい場合には向いていないですね。あくまでサーバーサイドの実装力向上が見込めます。


最初の設計は迅速にすべきだけど使うAPIやツールの仕様は調べるべし

今回、Herokuのデータベース上限を知らなかったので、結果的に機能要件を実現できていない状態でのツイートBotを動かすことになってしまいました。Herokuのデータベースを使うことを検討する際に、何か制約はあるのかなど調べておくべきでしたね。反省。


個人開発は目的とターゲットを絞るべし

どのアプリケーション開発にも言えることだと思いますが、広く公開するアプリケーションを開発するということは、誰かに使ってもらいたいわけですよね。その時にどんな人にどんな風に使ってもらいたいのか?を決めていないと、誰も使ってくれないもの(= 広く公開する必要のなかったもの)となってしまいます。

今回のTwitter Bot開発の前に、「特定の単語でのつぶやきを自動でリツイートし続ける」という誰が使ってくれるのか分からない機能を実装したBotをリリースしたのですが、1ヶ月経ってもフォロワー数が70人程度しかいません...。また、目的がないので一度開発してしまうと保守することはなく、結果的に最初の仕様設計の手抜きに辛さを感じて設計の大事さに気づくことも、保守性の高い実装を学ぶこともなく終わってしまいます。

保守・成長させていくことを見込んで開発することが大事だなと気づかされました。


自分が欲しいものを作るべし

個人アプリケーションを開発するときは、何はともあれ自分の欲しいものを作るのが一番だなと思いました。今回の仮想通貨情報をツイートしてくれるTwitter Botは、自分の普段している情報収集効率を上げるためのツールとして開発を始めました。自分が使いやすいものにするにはどうすればいいかな?と考えることで、より本質的な問題に気づくことができるし、自分にとって便利なものを追求していくと、自分と同じような境遇の他人にとっても便利なものになると思いました。

自分が欲しいものだと作っていて楽しいですしね。


以上、仮想通貨情報お知らせTwitterBotを1週間運用してみた結果の振り返りでした。

Botは仮想通貨情報を知るツールとしてこれからも成長させていくつもりなので、何か要望などあればご意見いただけると嬉しいです〜(。-_-。)

twitter.com


では!