忘れぬ先の鶏頭

躁の時のネサフまとめです。不定期

ぱいそん で でぃすこーど の ぼっと を たてた

加筆修正しました

記事をマークダウンにするのと、再度構築するときになんかつまずいたので加筆・修正しました。
はてな記法の記事を直接マークダウンにできなかったので新しいページにしました。

概要

タイトルの通りです。

手順はubuntuの18.04(xubuntu)にPython3.10環境を作って、pipでdiscord.pyをインスコ、コードを書いて動かすだけです。でも全部わからなかったので5時間くらいかかった気がする。とりあえずやったこと全部書こうと思う。そこから!?ってなると思うけど独学ならそこからだよ。

2回目の構築の世界線ではlubuntuの22.04、pythonのバージョンは3.11.3になってます。

発端

原神をスマホに入れてないので、いい感じに樹脂とか通知してくれるもの欲しいな~って思ったのが発端。勉強になるしdiscordのbotで実装するかと思って調べ始めた。実装はjavascript派とpython派がいるっぽいけど、discord.pyというものを昔見かけたのでpythonでやってみることにした。

環境

その昔、人にもらったノートパソコン。BL350EW6WっていうIntel(R) Atom(TM) CPU N570の載ったネットブック。もともとwin7が入ってたけど、勉強用にずいぶん前にubuntuを入れた。デュアルブートになってる。メモリはもともと1GBだったけど2GBに交換した。これも結構苦労したけど特に書かないことにする。とりあえずパワーシェルからsshubuntuに接続して状況を確認。こっから先はubuntuのプロンプトを転記してるよ。
結局この端末はlubuntu単体でサーバーっぽく動いてるよ。
再構築の時はsshサーバーがなかったのでそれのインストール、公開鍵の受け渡しやらでごちゃごちゃした。

sudo apt update
sudo apt install openssh-server
sftp -P ぽーとばんごう ゆーざ@どめいん

初回

$ uname -a
Linux ホスト名 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:14 UTC 2023 i686 i686 i686 GNU/Linux
$ python --version
Python 2.7.17
$ python3 --version
Python 3.6.9
$pip --version
Command 'pip' not found, but can be installed with:
sudo apt install python-pip

なるほど、python2系とpython3系が入ってて、pipはPATHの通るとこにはないのね。 そんな感じの認識。

再構築

$ uname -a
Linux ホスト名 6.2.0-32-generic #32~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 18 10:40:13 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
$ python
コマンド 'python' が見つかりません。もしかして:
  command 'python3' from deb python3
  command 'python' from deb python-is-python3
$ python3 --version
Python 3.10.12
$ pip
コマンド 'pip' が見つかりません。次の方法でインストールできます:
sudo apt install python3-pip
$ pip3
コマンド 'pip3' が見つかりません。次の方法でインストールできます:
sudo apt install python3-pip
$ pip3.10
コマンド 'pip3.10' が見つかりません。次の方法でインストールできます:
sudo apt install python3-pip

再構築したら2系のpythonなかったわ。あとpipもないっぽかった。

pythonの環境構築

再構築時にもぜんぜん教訓が生きていないことがわかる。

初回

pythonはバージョンが大事、と聞いたのでdiscord.pyが動くバージョンを調べる。
とりあえず公式を見る。よぐわがんにゃい。
https://discordpy.readthedocs.io/ja/latest/index.html

なんかgithubにたどり着いた。「Python 3.8 以降のバージョンが必須です」とのこと。惜しい~!それじゃpythonの新しそうなやつを入れるか、と思って適当にググる
https://github.com/Rapptz/discord.py/blob/master/README.ja.rst

ヒットしたこのサイトを参考にしました。apt使おうとしたらrepoの設定をしてもreleaseファイルがないからインストールできないよ!とのこと。その辺の解決をするのが面倒だったのでビルドすることにした。一回やってみたかったんだよね~。
参考先のサイトのこの手順ほぼそのまんま実施しました。urlを3.10.9にしたくらいかな。
https://codechacha.com/ja/python-install-python-3-10/

$ wget https://www.python.org/ftp/python/3.10.3/Python-3.10.3.tgz
$ tar -xf Python-3.10.*.tgz
$ cd Python-3.10.*/
./configure --enable-optimizations
$ make -j $(nproc)
$ sudo make altinstall

やってることは、配布サイトからソースをDLしてtarで解凍。解凍してできたフォルダに移動してconfigureっていうスクリプトを実施。makeしてaltinstall。-j $(nproc)ってなんじゃい!って思ったら$(nproc)にはCPUのコア数が格納されてるらしく、jオプションでmakeすることで速くなるらしい。へ~。

ところでconfigureとmakeとmake altinstallってなんじゃい!って思ったら下記サイトが親切でした。
https://qiita.com/chihiro/items/f270744d7e09c58a50a5

configureでmakefileを作って、makeでビルド、make installでバイナリを配置、という感じっぽい。altinstallは元のコマンドに影響が出ないようにする…らしい。へ~。この通りビルドして、結構時間経ってビルド終了!
ビルド終わったので状況を整理、環境確認ヨシ!pipは新しめのpythonなら一緒に入るらしい、と聞いていたけどちゃんと入ってるね。

$ python --version
Python 2.7.17
$ python3 --version
Python 3.6.9

$ python3.10 --version

Python 3.10.9

pip3.10 --version
pip 23.1.2 from /ほ~むでぃれくとり/.local/lib/python3.10/site-packages/pip (python 3.10)

再構築時

前回の反省を踏まえておらず、大量にライブラリが欠損したままビルドしたのでリビルドしてます。これはリビルドするのに必要だったインストールやらなんやらをまとめたものです。
今回はコマンドもいくつか無くて、下記パッケージのインストールとmakeコマンドのインストール。まさかgcc入ってないとは思わんかった。
よく見るとtarのオプションが違うな。vは処理するファイルをべらっと出力するんだよな確か。
あれ、pipのバージョン低くない?

sudo apt install gcc
sudo apt install pkg-config
sudo apt install make
sudo apt install build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev curl libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
$ wget https://www.python.org/ftp/python/3.10.3/Python-3.11.3.tgz
$ tar -xzvf Python-3.11.3.tgz
./configure --enable-optimizations
$ make -j $(nproc)
$ sudo make altinstall
$ python3 --version
Python 3.10.12
$ python3.11 --version
Python 3.11.3
$ pip3.10
コマンド 'pip3.10' が見つかりません。次の方法でインストールできます:
sudo apt install python3-pip
$ pip3.11 --version
pip 22.3.1 from /usr/local/lib/python3.11/site-packages/pip (python 3.11)

コーディング

んじゃコーディングすっべ。Pythonインタープリタっぽいアレなので、適当に書いて下のように実行。稼働確認ヨシ!ついでにpipでdiscord.pyもヨシ!

$ cat hello.py
print('Hello World')
$ python3.10 hello.py
Hello World
$python3.10 -m pip install -U discord.py

それでさっきのgithubのページのbotの例のとこに載ってるコードを書いて動かしてみる。 https://github.com/Rapptz/discord.py/blob/master/README.ja.rst

import discord

class MyClient(discord.Client):
    async def on_ready(self):
        print('Logged on as', self.user)

    async def on_message(self, message):
        # don't respond to ourselves
        if message.author == self.user:
            return

        if message.content == 'ping':
            await message.channel.send('pong')

intents = discord.Intents.default()
intents.message_content = True
client = MyClient(intents=intents)
client.run('token')

あ、botのアカウント取得忘れてた…。 上のコードのtokenのとこはbotのアカウントを作ってtokenを発行する必要がある。そのへんはdiscordのウェブフックを触ったことがあるのでなんとなく分かるぞ。 discord.pyのbotアカウント作成ページを参考にtokenを取得。 https://discordpy.readthedocs.io/ja/latest/discord.html

それで適当な.pyファイルにさっきのコードをvimでベタ書きして動かしてみる…けど怒られる。え~。
出てきたエラーは
ModuleNotFoundError: No module named '_ctypes'
とのこと。なんやねん。とりあえずググる
どうもライブラリが足りないままビルドすると、ビルドの途中で必要な生成物がスキップされるらしく、ライブラリを持ってきて再度ビルドしようね!とのこと。ビルドしなおしはダルい。

ググったところとりあえずこれがないらしいので入れる。

sudo apt-get install libffi-dev  

ビルドのときDLしてきたtar.gz以外削除、再度ビルドのコマンドを叩く。
ビルドが終わったところでさっきのやつを実行、今度こそ稼働確認ヨシ!
これにてようやくボットが立ちましたとさ。

わかったこと

ボットって結局何?ってずっと思ってたけど、要はdiscord本体のサーバと通信して、もらった値を加工してdiscord本体鯖に返すサーバー、という感じっぽい。だからVPSとかGASとかの話がでてくるわけですね。
discord.pyって何?ってのも思ってたけど、そのdiscord本体鯖と自前のbot鯖との通信とかをいい感じに調整してくれるラッパーってところなんでしょうか。バイナリとかライブラリとか、実体はよぐわがんにゃいけど…。
それと、chatGPT(3.5)に「5分後に通知するbotを作って」とか聞いたらちゃんと動くものをよこしてきたので、マジですごいなと思いました。あとはやりたいことのためのコーディングの勉強をするだけだね!いやそれが一番大変なんじゃが…
そんなところで、眠くなってきたのでおしまい!

追記

再構築のきっかけは、64GBのSSDをゲットしたので、このパソコンについてた120GBのSSDと入れ替えようと思い立ったことでした。適当にlubuntuを入れてたのでパーティションにうまく触れず、クローンもできなかったのでクリーンインストールすることになったわけです。
にしてもいろんなコマンドやライブラリがないもんですね。ちょっと手間取りました。この記事書いといてよかった。