はじめに
マルコフ連鎖というものを使って、Mastodon 上に流れる投稿から要素を見つけ、それを再構築して投稿する。
マルコフ連鎖については、ニコニコ大百科にわかりやすく書いてある。→ニコニコ大百科 - マルコフ連鎖
Git から落としてくる
terminal1
| https://github.com/m0r016/mastodon-markov-bot.git
|
Mastodon のアクセストークンを取得する
新規アプリにアクセス。
で適当に名前を決めて変更を保存。
アプリページに飛ばされるので、作成したアプリのページを開き、アクセストークンをコピーしてくる
config をいじる
terminal1
| cp src/config.ini.sample src/config.ini
|
src/config.ini1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| [read] // 学習元アカウントの情報をここに入力 // domain にはインスタンスのドメイン(https://抜き)・access_token にはアクセストークンを入力
- domain =
* domain = slum.cloud
- access_token =
* access_token = get_account_token [write] // 投稿用アカウントの情報をここに入力 // access_token にはアクセストークンを入力 // 学習用アカウントと同じアカウントを利用したい場合は同じアクセストークンを入力(非推奨)
- access_token =
* access_token = post_account_token
|
設定がすんだら docker を立ち上げる。
terminal1 2 3
| $ pip install attrs $ docker-compose up -d WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
|
というエラーが出てくるので、
Dockerfile1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| [read] FROM python:3.8.5
- RUN apt update
* RUN apt-get update
- RUN apt install -y mecab libmecab-dev mecab-ipadic-utf8 swig
* RUN apt-get install -y mecab libmecab-dev mecab-ipadic-utf8 swig RUN git clone --depth=1 https://github.com/neologd/mecab-ipadic-neologd RUN cd ./mecab-ipadic-neologd && ./bin/install-mecab-ipadic-neologd -y -p /var/lib/mecab/dic/mecab-ipadic-neologd RUN rm -rf ./mecab-ipadic-neologd RUN ln -s /var/lib/mecab/dic /usr/lib/mecab/dic RUN mkdir /var/app WORKDIR /var/app COPY src/Pipfile ./ COPY src/Pipfile.lock ./ RUN pip install pipenv RUN pipenv install --system
|
apt
をapt-get
に変更。
時間はかかるがきちんと実行される。
はじめて投稿されたツイートがこれ・・・?おもしろい。
#bot がついているのが気に入らないので、app.py にアクセスし、#bot を消す。
src/app.py33 34 35 36 37 38 39 40 41 42
| with open("./chainfiles/{}@{}.json".format(account_info["username"].lower(), domain)) as f: textModel = markovify.Text.from_json(f.read()) sentence = textModel.make_sentence(tries=300)
- sentence = "".join(sentence.split()) + ' #bot'
* sentence = "".join(sentence.split()) sentence = re.sub(r'(:.*?:)', r' \1 ', sentence) print(sentence)
|
投稿する頻度を 20 分から 1 時間にする。
src/app.py45 46 47 48 49 50 51 52 53 54 55 56 57 58
| - def schedule(f, interval=3600, wait=True):
* def schedule(f, interval=1200, wait=True): base_time = time.time() next_time = 0 while True: t = threading.Thread(target=f) t.start() if wait: t.join() next_time = ((base_time - time.time()) % interval) or interval time.sleep(next_time)
|
設定がすんだら docker を立ち上げる。