Pythonを用いたポケモンbot作成の書き置き

1.はじめに

こんにちは、さとみです。
今回は初めてdiscordbotを作ったので、記録として経緯だとかアルゴリズムだとかを残そうと思います。本当はソースコードを公開したり、botを実際に使っていただきたいところですが、まだローカル環境での運用になってしまっているので、今回はなしでよろしくおねがいします。
ちなみに今回は初心者や一切やってない人向けの記事ではないので、文章はわかりにくいと思います。拙い文章ですがお許しください。
まだまだ初心者ですので、お手柔らかにお願いします。

2.開発経緯

発端がこれです

画像1

とり。のサムネイルや編集を手伝っているのですが、最近はもっぱらサムネイルくらいしか作っておらず、編集や素材作成は本人がやるようになりました。(異常なほど覚えが早いです)
その中で、解説動画を上げる際に使う画像

画像2

を作るときにいちいち素材を持ってこなければ行けなかったり、基本情報を調べたりと非常にめんどくさいことをしています。
ダウンロードの画像の指定などは僕がしていて、集めるのと作るのはとり。がしていたわけですが、お互いに腰が重かったりしていました。なので、まあ自動化しとこうかなという感じで作り始めました。

3.筆者のスペック

・情報系の大学生(ネットワーク系で主要言語はC)
・プログラミングの経験ほぼなし
・知識はなくはない
・時間は無限にある

4.開発環境

エディタ:sublimetext3
言語:Python3.8.6(最新版3.9.xではdiscord.pyがインストールできなかったため3.8.xとしました)
OS:windows10(運用はLinux系を想定)
その他は適宜説明に必要になり次第書きます。

5.開発中の思考

開発の流れ的には「文章で出力するように作成→それをもとに画像を作成するようにする→それをbotに落とし込む」という感じで考え、はじめました。
当初はデータベースを作る気が一切なく、検索APIを使うことで補おうと考えていました。実際の流れを起こすと

1.キーワードを受け付ける
2.検索APIに投げ、一番上のサイトを読み込む(検索APIに投げる段階で恐らく一番上にポケモン徹底攻略が出るであろうワードにしています。)
3.そのサイトのHTMLソースを読み込む
4.そこからゴニョゴニョして必要情報を抜き取る
5.整えて出力

という感じです。
一応これで動くところまで持っていくことができました。ですが、この方法では以下のような問題がありました。

・何故か"フシギソウ"のみバグる
・検索APIに1日に使用できる回数制限がある。
・動作が遅い

下の2つは許容していました。回数制限に関しては、完成してしまえば1日に達することはないだろうし、動作が遅いことについてはまあしょうがないくらいに捉えていましたが、一番上の問題に頭を悩ませました。
どう改変しても治らず、急遽作ったプログラムすべてを捨て書き直すことに決めました。
上2つに関しては「検索APIを使わない」ことで解決するのはわかっていたので、別の手段を考えました。そこで上がったものが「Googleスプレッドシートを使ったデータベース」の使用でした。
検索APIを使う場合はHTMLの海から何度もデータを探し出さなければいけない都合上、どうしても動作が遅くなってしまいました。ですがデータベースを作ってしまえば、番地指定で一瞬で呼び出すことができます。調べたところ実装も難しくなさそうだったので即切り替えました。
データベースに組み込む内容は以下のとおりです。

・名前
・図鑑番号
・タグ
・種族値

タグというのはセレビィネットで絞り込む際に使うもので、ほぼ図鑑番号です。
すべての情報をデータベースに組み込んでしまうと、とてつもないほど時間がかかってしまうので、URLを直接指定することでHTMLを取得し、残りの情報を抜き出すこととしました。(ポケモン徹底攻略では”固定文字列/n図鑑番号”という形でURLが設定されているので、図鑑番号がわかっていれば、一発で目的のページに飛ぶことができます。)
これを踏まえた上で開発に戻りました。
結果的には成功しましたが、速度は思ったよりも改善されませんでした。
ただ、安定性は増しましたし、速度の改善はデータベースの大型化以外なさそうだったので諦めて開発を進めました。
この段階での動画はここから見れます。

次に画像化を行うシステムを作りました。
これに関してはリサイズと位置調整の繰り返しなので、特に難しいことはありませんでした。そもそも、僕が作っていた作成用のテンプレートがあったので、その数値をもとに調節しただけです。
基本的にはURLから画像をダウンロード→リサイズをしてベースに貼り付け→できたものを書き出す→すべての素材を削除
の流れになっています。
この段階での動画はここから見れます。

次にbotへの組み込みを行いました。
正直1年前くらいにrubyで作ったことがあるような気もするんですが、一切覚えていないので、HelloWorldからはじめました。
ここではそもそもdiscordbotの仕組みを理解するのにまあまあ時間がかかりました。その後はなんとか実装まで持っていくことができました。
この段階での動画はここから見れます。

これにて本編の画像生成プログラムは完成となりました。
このあとに色々機能を付け足しましたが、機会があればまた書きたいと思います。

6.総括

今回PythonもDiscordBotの知識も0の僕でも作り上げることができたのは、インターネットで知識を共有してくださっている方のおかげでした。
「この機能ってこれとこれ組み合わせればなんとかなるかも」っみたいな思考で作っていたので、最適解とは言えないと思いますが、パズルをやっているようで開発は楽しかったです。(寝食を忘れてやっていました)
この記事でプログラミングの助けになることはまずありませんが、DMいただければできる限り助けになります。

7.終わりに

ここまで読んでいただきありがとうございました。
できるだけ早くBotを公開できるようにしたいと考えているので、そのときはぜひ使ってあげてください。一般用途でも使いやすい機能を追加してありますので!!!

なにか感想,質問,相談ございましたら、Twitter(@satomi1224_poke)までお願いします。




この記事が気に入ったらサポートをしてみませんか?