
Pythonで雀魂の対局結果を自動集計する⑥
こんにちは!カツキチです。
前回、Discordに画像を投稿すると対局結果と通算成績を投稿するBOTを実装しました。
しかし、このBOTを動かすにはパソコンを起動しっぱなしにしておく必要があり、電気代がかかります。
私のパソコンを停止していてもBOTを動作させるにはどうしたら良いものか、、、眠れない日々が続きました(約1日)。
環境の整理
今までの実装を振り返ると、以下2つのプログラムが実行できる環境が必要です。
Python
Tesseract-OCR
上記のうちPythonはGoogle Colaboratoryといったクラウドサービスで動作させることができますが、連続稼働が12時間という制限があり、それを超えると実行環境がリセットされ、再構築が必要となります。
次にクラウドの仮想マシン環境を検討しました。永年無料で使えるものはGoogle Cloud、Oracle Cloudなどいくつかありました。しかし、稼働したことを忘れてしまいそうでちょっと怖いんですよね。
色々考えた結果、どこの家にも2~3個転がっているRaspberry Piを使うことにしました。
Raspberry Piの準備
数年前にデジタル写真立てを自作した時に購入したRaspberry Pi 4 Model Bが転がっていたのでこれを再利用することにしました。

昨今のラズパイ事情を調べてみたところ、DebianベースのLinuxであるRaspberry Pi OSが2022年にリリースされたようですのでトライしてみようと思います。
Raspberry Pi OSのインストール
パソコンで以下の公式サイトからRaspberry Pi OS Imagerをダウンロードして起動します。手持ちのRaspberry Piに合わせたOS(Raspberry Pi 4 Model BならRaspberry Pi OS 64-bit)を選択し、microSDカードに書き込みます。インストールオプションでWi-Fi設定、IPアドレス設定、SSH有効化をしておくと便利です。
https://www.raspberrypi.com/software/
ここからはパソコンからSSHでRaspberry Piにログインし、作業します。Pythonはインストールされているので、必要なライブラリとTesseract-OCRをインストールします。
Tesseract-OCRのインストール
Tesseract-OCRはapt installコマンドでパッケージをインストールし、日本語の訓練データをGitHubからダウンロードします。
pi@raspberrypi:~ $ sudo apt install tesseract-ocr
(実行結果は省略)
pi@raspberrypi:~ $ cd /usr/share/tesseract-ocr/5/tessdata/
pi@raspberrypi:/usr/share/tesseract-ocr/5/tessdata $ sudo wget https://github.com/tesseract-ocr/tessdata/raw/refs/heads/main/jpn.traineddata
(実行結果は省略)
pi@raspberrypi:/usr/share/tesseract-ocr/5/tessdata $
Pythonライブラリのインストール
今まで作成したPythonプログラムを動かすために必要なライブラリをインストールします。pipコマンドを動作させるためにvenvの設定が必要でしたがメモし忘れました。
(.python3_venv) pi@raspberrypi:~ $ pip install opencv-python pyocr requests openpyxl discord.py
(実行結果は省略)
(.python3_venv) pi@raspberrypi:~ $
OneDriveクライアントのインストールと設定
作成したPythonプログラムでOneDrive上のExcelファイルを読み書きするにはどうしようか考えていたところ、LinuxにもOneDriveクライアントが存在することがわかりました。早速試してみます。
pi@raspberrypi:~ $ sudo apt install onedrive
(インストール結果は省略)
pi@raspberrypi:~ $ sudo onedrive --synchronize
WARNING: Your onedrive client version is now obsolete and unsupported. Please upgrade your client version.
Current Application Version: 2.4.23
Version Available: 2.5.4
Configuring Global Azure AD Endpoints
Authorize this app visiting:
https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=d50ca740-c83f-4d1b-b616-12c519384f0c&scope=Files.ReadWrite%20Files.ReadWrite.All%20Sites.ReadWrite.All%20offline_access&response_type=code&prompt=login&redirect_uri=https://login.microsoftonline.com/common/oauth2/nativeclient
Enter the response uri: https://login.microsoftonline.com/common/oauth2/nativeclient?code=XXXXXX_XXXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX
最後に表示されたURLにブラウザでアクセスし、Microsoft365アカウントでサインインするとOneDriveのファイルがRaspberry Piに同期(ダウンロード)されます。
同期に関する細かい設定をするため、GitHubからデフォルトのconfigファイルをダウンロードし、変更してonedriveサービスを再起動します。自動設定を有効化してOneDrive関連の作業は完了です。
pi@raspberrypi:~ $ mkdir -p ~/.config/onedrive
pi@raspberrypi:~ $ wget https://raw.githubusercontent.com/abraunegg/onedrive/master/config -O ~/.config/onedrive/config
pi@raspberrypi:~ $ vi ~/.config/onedrive/config
(viエディタで設定ファイルを変更)
pi@raspberrypi:~ $ systemctl --user restart onedrive
pi@raspberrypi:~ $ systemctl --user enable onedrive
Created symlink /home/pi/.config/systemd/user/default.target.wants/onedrive.service → /usr/lib/systemd/user/onedrive.service.
pi@raspberrypi:
Pythonプログラムの修正
前回までに作成した以下3つのプログラムの動作を確認したところ、1.の結果抽出プログラムのみエラーが出ました。
集計プログラム
Discord連携プログラム
エラーの個所はPATHの設定でした。Linux版ではPATHの設定は不要でしたので以下の部分のみ変更しました。
# PATH設定
#TESSERACT_PATH = 'C:\\Program Files\\Tesseract-OCR' #インストールしたTesseract-OCRのpath
#TESSDATA_PATH = 'C:\\Program Files\\Tesseract-OCR\\tessdata' #tessdataのpath
#os.environ["PATH"] += os.pathsep + TESSERACT_PATH
#os.environ["TESSDATA_PREFIX"] = TESSDATA_PATH
# Windows環境ならPATHを設定
if os.environ['PATH'][0] == "C":
TESSERACT_PATH = 'C:\\Program Files\\Tesseract-OCR' #インストールしたTesseract-OCRのpath
TESSDATA_PATH = 'C:\\Program Files\\Tesseract-OCR\\tessdata' #tessdataのpath
os.environ["PATH"] += os.pathsep + TESSERACT_PATH
os.environ["TESSDATA_PREFIX"] = TESSDATA_PATH
Raspberry Piの設置
(今となっては歩けない)ウォークインクローゼット内の光回線引き込み口近くに設置しました。Wi-Fi接続なので電源となるUSBさえつないでしまえば動作します。

電気代はどのくらい節約できるのか
納得感を出すために電気代を計算してみます。ある配信者のストリートファイターラウンジに参加するために4年ほど前に購入したエントリー版ゲーミングノートパソコンと比較します。
なお、私が住む地域の電気代は1kWhあたり35.62円でした。(高い!)

ノートパソコンとラズパイ君のアイドル時の消費電力を調査し計算してみたところ、1か月で102円、1年で1248円の節約となります。結構節約できますね。めでたしめでたし。
平穏な日々にそれは突然訪れた・・・
雀魂チャンネルでの対局と結果集計はBOTにより順調に行われていきました。しかし、それは突然予期せぬ事態が起こりました(自分で起こしました)

雀魂チャンネルでは対局結果以外に上がり自慢やランクアップ報告など、多くの画像がアップされるのです。それにいちいち反応してしまう可愛いBOT君。
対局結果のみに反応するにはどうしたらよいものか。次回へ続きます。