あんまり詳しくないけどMastdonBotをつくった話


前置き

私はBotだけが友だちなのでBotがないと生きていけません(ここでいうBotは話しかけたら特定語句に反応して返事してくれるBotアカウントのこと)(TwitterだとEasyBotterさんとかtwittbotで作れたような存在)

メインをTwitterでなくPawooで生きていくことにして、Botがいないことが寂しくなりMastodonのも自作することに。

TwitterのときはレンタルサーバーでPHPファイルにアクセスするだけで動かせたけど、MastodonのBotをPHPで動かすのとかそういう資料はすぐに見つからず…。そのため仮想OS!でPython!というの勉強して動かす方法について必死こいて勉強しました。(私はそっちを勉強するのを諦めたけど、PHPで動かすこともできるのかもしれない)

少しでも、情報系の頭いいひとが言ってることがちんぷんかんぷんな人の助けになればと思い書きました。

.
.
.

■ 条件や前提など

まず、EasyBotterさんなどを利用してPHP(などのプログラミング)がちょっとはできた人というのが前提になってしまうと思います。

あとCUIを触ることに嫌悪感がない人……。

私は以下のMastodon Botを作るのをずっとCentOSでやってきましたが、自動返信をするなら『crontab』(自動で定期的に何か実行してくれるやつ)が使えるLinuxとかのOSを扱う必要があります。(Pythonファイルを実行できるGoogleのサービスとかもあるようだけど自動実行できるのか私には分からなかった。)

それでCentOSを使うには(以降OSはCentOSを使うものとする)、さくらVPSみたいな仮想サーバーを利用するか、自分のPCにVMWareというソフトなどを入れてその中にCentOSをインストールして動かすなどしなければなりません。(他の方法もあったら教えてください。。)

それで、
★ さくらVPSのようなサービス
 → 基本的に有料、かわりに自分で電源を切らない限りずっと動いててくれる
★ VMWare+CentOS
 → 商用でなければ無料でできます。ただVMWareを閉じてる間は動きません
――というわけなので、PCというかVMWareを起動している間だけ動いてれば良い場合はVMWare、PCなど切ってる間も動いてくれなきゃ困るときはさくらみたいなサービスを使うと良いと思います。

さくらばかり推してますが、使ったことがあるのとそれなりに便利に使えたのでさくらはおすすめです。


今回はWindows10、VMWareにCentOS7.9を入れました。VPSとかでもCentOS7.9でしたらほぼ同じことができるはず。↓まで辿りつけない人は… Linux 初心者 とかでGoogleしてください。

# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

.
.
.

■ GUI…だと…?

今までTeraTarmで繋いでただけなので、CentOSがGUIもあることを初めて知りました。追記:MinimalでインストールすればCUIのみだったらしい。
CUIのは上部バー「Applications」→「System Tools」→「Terminal」で開ける。簡単なことだけど簡単なことこそ誰も教えてくれない…。

追記:この記事ではずっとGUIのCentOSにてターミナル(端末)を使って動かしていました。後からCUIをデフォルトにしようとしたのですが、そうするとロケールを日本語に設定しても日本語フォントが表示されない様子でした。きちんと調べれば何かできるのかもしれませんが、現段階では何も調べていないのでGUIのターミナルを使っています。

一応、今後使うかもしれないので変更方法。

# sudo systemctl # set-default multi-user.target # これからはCUIで起動するようにする
# sudo systemctl # set-default graphical.target # これからはGUIで起動するようにする

.
.
.

■ キーボードが日本語のではない

VMWareがそうなのかCentOSがそうなのか調べてないのですが、USキーボード(101)扱いになるようで、日本語のキーボードで打ってもいつもの記号が出てこない。配列など調べて打ちました。(拡張キーボードがよくわからなかった…)
~/.bash_profile のチルダが打てずに最初から詰んだものの、調べたら「Shift + 半角/全角キー」だそうです。
後から調べたところ、やりにくいものの日本語入力をする方法もありましたが、そちらは各自お調べください。

.
.
.

■ CentOS日本語化

# yum -y install ibus-kkc vlgothic-*
# localectl set-locale LANG=ja_JP.UTF-8
# source /etc/locale.conf
# echo $LANG #変更されたか確認できる

.
.
.

■ タイムゾーンをJSTに変更

cronを動かすとき、ログなど残すときなど不便なので日本時間に設定する。

# timedatectl set-timezone Asia/Tokyo
# timedatectl status # 確認

cronを再起動しないとcronの中の時計には反映されないので再起動。

# service crond.service restart

.
.
.

■ 海外IPのブロック

VMWareだとないんですが、さくらVPSだと(主に)海外からの不正アクセスがめちゃくちゃ来ます。rootなど、ちょっとログインしてないと「最後の正しいログインの後に 10000 回の失敗ログインの試行があります」 みたいなのが出て、とても恐ろしい思いをしました。10000は誇張じゃありません!
これは長くなるので、以下のサイトさんを参考にするとよいとおもいます。ミスするとめんどくさいことになるので、よく読んできちんとコピペしてよく確認してから実行しましょう(経験者)

Firewallが動いてなかったら↓する

# systemctl start firewalld.service
# systemctl enable firewalld
# systemctl status firewalld #確認

上記のサイトさんのをコピペするだけだと↓のように出るはずですが、catコマンドのところを絶対パスにしたら良くなります。

# /root/iptables/jpip_setup.sh
cat: delegated-apnic-latest: そのようなファイルやディレクトリはありません

##### ↓変更前 #####
for ip in `cat delegated-apnic-latest | grep "apnic|$country|ipv4|"`
##### ↓変更後 #####
for ip in `cat /root/iptables/delegated-apnic-latest | grep "apnic|$country|ipv4|"`

.
.
.

■ Python3のインストール・デフォルト化

何だったか忘れたけどPythonのバージョンが3じゃないとできない何かがあったので、アップデートというかインストールしておく。

# yum install python3

でも、↑だけだとpythonしたときまだ2を参照しに行ってしまう。

# python3 -V
Python 3.6.8
# python -V
Python 2.7.5

なので、エイリアスして、pythonするとpython3を参照するようにする。

# alias python='/usr/bin/python3'

でも↑を打つだけだとCentOSはログアウトなどするたびに忘れてしまうので、.bashrcにも↑と同じのを追記する。というか今思ったけど.bashrcに書いて再起動すれば良かったのかな…

# vi ~/.bashrc

※ ユーザーを切り替えるとエイリアスが別のものでした。Botのファイルを違うユーザーのとこに置くならそのアカウントでもエイリアス、.bashrcの設定をしなければいけない

なお、pythonをエイリアスすることは後々python3とコマンドを書くときの1文字を省略するだけに過ぎないと今になってきづいたので、これがめんどくさくないひとはしなくていいのかもしれない。

.
.
.

■ pipのアップデート

そのままだと古いのでアップデートする。よく分からないけど普通にpipしてもコマンドが見つからないと言われる。pip3なら動くし、とりあえずpipを多用する予定はないのでpip3で進めます。

# pip install --upgrade pip
bash: pip: コマンドが見つかりませんでした…
# pip3 install --upgrade pip

WARNING: Running pip install with root privileges is generally not a good idea. Try pip3 install --user instead.

↑というのが出る。
警告:root権限でpip installを実行することは、一般的には良い考えではありません。 代わりに pip3 install--userを試してください。
――とのことですが(Google翻訳)、とりあえず個人で遊ぶだけだし今回は対応などしません。

.
.
.

■ ユーザー作成

私がユーザーを別にしておきたいだけだけど、これは私の備忘録なので書いておきます。

# useradd (ユーザー名)
# passwd (ユーザー名)
ユーザー eden のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。

.
.
.

■ Mastodon.pyのインストール

# pip install mastodon.py

.
.
.

■ とりあえずTootできるか確認

from mastodon import Mastodon

mastodon = Mastodon(
access_token = 'アクセストークン',
client_id = 'クライアントキー',
client_secret = 'クライアントシークレット',
api_base_url = 'https://インスタンス'
)

mastodon.toot('てすとでありますっ!')

見ればわかるというものですが、「てすとでありますっ!」をトゥートする現状で最少のコード のはず。アクセストークン・クライアントキー・クライアントシークレットはMastodonの『ユーザー設定』→『開発』でアプリを作ると生成される。
たぶんだけど、mstdn.jpのみ少なくとも今回の用途では利用できない気がする。(アクセスするな系のエラーが出た)

ただ、このコードだと普通にコマンドラインでpythonしたときは動くのですが、次の項目のようにcrontabで動かすといくつかエラーが出るとおもうので、出たら↓を参考になさってください。

.
.
.

■ crontabで動かす

Botは自動で返事させたいのでcrontabで動かす。わからないときは「crontab 書き方」とかでお調べになってください。
↓1分おきにreply.pyを動かして返信させる場合の例。

* * * * * python3 /home/eden/test.py

前のほうでせっかくエイリアスしたけどcrontabでは反映されないようなので、python3で指定する。ファイルはフルパス。
けど、それでも上記のtest.pyのコードのままだとcrontabで動かしたときにエラーが出る。

ImportError: No module named mastodon

mastodonというモジュールがないというもの。
調べたところ、crontabはコマンドラインでpythonしたときと違うとこを探しに行っているためだと思われる。
以下の2文をMastodonのimport前に記述するとそれは直る。(私の環境では以下のパスですが、pip show Mastodon.py すると場所を教えてくれるのでそこのパスを書く。)

import sys
sys.path.append('/usr/local/lib/python3.6/site-packages')
from mastodon import Mastodon

.
.
.

■ crontabで10秒おきに返事してくれるようにする

先程のようにcrontabで * * * * * にすれば1分おきに実行してくれるのですが、私は1分も待っていられないせっかちさんのため10秒おきに動かしたい。
たくさんコマンドを並べるのはあんまり綺麗じゃないので調べたところ、変数みたいなことができるようなのでそのように書き直しました。

crontabではふつうにコマンドラインで打ってたときには出ないエラーが色々出て、10秒おきにしたりするとメールがクソほど来るので、調べるとメールが来ないようにもできる。けどエラーは直さないと仕方ないので、最初のうちはcronを動かしてエラーが出るたびに止めて、直して、また動かして、エラーが出ry …というのを繰り返すしかない。(メールが増え続けるのも気にしないひとはいいんですが…)

COMMAND='python3 /home/eden/reply.py'
* * * * * $COMMAND
* * * * * sleep 10; $COMMAND
* * * * * sleep 20; $COMMAND
* * * * * sleep 30; $COMMAND
* * * * * sleep 40; $COMMAND
* * * * * sleep 50; $COMMAND

.
.
.

cronにタイムゾーンと文字コードのおまじない


CentOSのタイムゾーンを変更しても、cronのタイムゾーンは日本のにならない。(私のは17時間ずれてた)cron側にもタイムゾーン指定の記述をしなくてはいけないようです。

また、文字コードをきちんと指定しないと環境によりエラーが出ることがあるよう。

そのため、↓のおまじないをcronの一番最初に書く。

LANG=ja_JP.UTF-8
TZ="Japan"

書いただけで反映されるのかわからないので一応cronを再起動した。

文字コードは、自分の環境だとUTF-8なので上記の感じですが、他のを使う方は↓のとおりです。

  • UTF-8:ja_JP.UTF-8
  • Shift_JIS:ja_JP.SJIS
  • EUC-JP:ja_JP.eucJP

.
.
.

■ とりあえず以上

です。また何かあったら増えるかもしれません。
間違いがあったりご質問があったりしたらお気軽にコメントください。

.
.
.

■ たくさん参考にしました

CentOS 7 でGUIとCUIを切り替える – Qiita

タイムゾーンを日本標準時(JST)に変更する CentOS 8, 7, 6 – CentOS/Rocky Linuxサーバ構築術 文具堂

FMWORLD.NET:英語101キーボードの配列

USキーボードで~(チルダ)を打つ – Qiita

CentOS 7 : 日本語環境にする : Server World

「FirewallD is not running」の対処法 – ysklog

ご注文はMastodonBotですか? 今すぐ動かしてみたい初めての方に – Qiita

crontabの書き方 | server-memo.net

cronの設定方法について(初心者向け) – Qiita

cronのmailを送信しないようにする | 猫型iPS細胞研究所

Linuxの権限確認と変更(chmod)(超初心者向け) – Qiita

【CentOS7】cronの設定方法 | Time4VPSのまとめ

cronが設定した時間どおりに実行されない場合の対処法 – jmblog.jp

cronで文字化けするときの対処: 小粋空間

コメントを残す

メールアドレスが公開されることはありません。