Misskeyでbotを作ってみる
Twitterくんの動向も気になるしみんないろんなSNSに新たに垢を作成してる。
イマイチ仕組みがよくわからないMisskeyを少しでも理解できないかな?と思って定期的にノートを投稿するだけのbotを作ってみたよ。
Twitterと比べてAPIを叩く敷居は低くて、というか誰でも叩ける。
(無料時代も)面倒くさい審査申請があったTwitterと比べると楽勝だよ。
なお、実際に動作させている「らいすてゃんbot」は下記。
作成準備
Botフラグの設定&連絡先の明記
Misskey.ioでbotを動かす場合、サーバーによるんだろうけどBotフラグを付ける必要があるらしいので注意してね。
Botフラグは 設定→プロフィール→高度な設定→Botとして設定 でOK。
管理者の連絡先明記が必要なので 追加情報でラベルに管理者、内容に自分の別の垢を設定
アクセストークンの発行
下記イメージの通り設定→API→アクセストークンの発行から発行。
発行時の確認以外で再確認はできないようなので控えておくこと。
自分で使う分には「全て有効にする」で良いかな?
前準備はこれで完了。
ちなみに制限に引っかかる投稿頻度については問い合わせてみたけど教えてもらえず。あまり高頻度の投稿だと煩いと言われて停止措置とか来るかもしれない?
botのコードを書いていく
言語選択&ライブラリインストール
言語は難易度低めなPythonで。
Misskey.pyというライブラリが用意されているのでそれを利用。
インストールはpipから行えるのでインストール。
pip install Misskey.py
実際に書いてみた(全体)
ものっすごい適当に書いた全貌
import time
import datetime
import random
import pandas as pd
from misskey import Misskey
# インスタンス(サーバー)とアクセストークンをセット
mk = Misske("misskey.io")
mk.token = "ここにトークンをセット"
# 同じ内容の投稿を連続で行わないようにするために使う
x = 65535
# ループの停止処理なし
while True:
# ノート投稿内容は予め用意しているCSVをPandasで読み込んで利用
df = pd.read_csv("message.csv", header=None)
num = df.shape[0] - 1
y = random.randint(0,num) # ランダム値を作成
if x == y :
pass
else:
mk.notes_create(text=df[1][y])
print(datetime.datetime.now().strftime('%Y年%m月%d日 %H:%M:%S'))
print("-------------------------------")
print(df[1][y])
print()
print()
x = y
time.sleep(6000) # ノート周期を設定
CSV形式で保存した文章を読み込んで投稿するというもの。
おまじない部分(import)
import time
import datetime
import random
import pandas as pd
from misskey import Misskey
必要なものをimport。
Pandas以外はPythonをインストールしたらたぶん標準で入ってるよ。
Pandasはpipでインストール。かなり便利だよ、Pandas。
APIを叩く準備
Misskey.pyでまず行うべき設定はこれだけ。
これでMisskey.pyを使ってかんたんにAPIを叩けるようになる。
# インスタンス(サーバー)とアクセストークンをセット
mk = Misske("misskey.io")
mk.token = "ここにトークンをセット"
インスタンス(今回はmisskey.ioで動かすのでmisskey.io)と事前準備で発行したアクセストークンをセットする。
ループ処理/CSV読み込み/ランダム値生成
# 同じ内容の投稿を連続で行わないようにするために使う
x = 65535
# ループの停止処理なし
while True:
# ノート投稿内容は予め用意しているCSVをPandasで読み込んで利用
df = pd.read_csv("message.csv", header=None)
num = df.shape[0] - 1
y = random.randint(0,num) # ランダム値を作成
while True:
ループ処理はwhileで行う。
Trueになることがないのでループを抜けることなくずっと投稿を繰り返す。
x
同一内容連続投稿回避に使う。
用意している投稿内容数(CSV)より大きい数値を指定。
これ以降、xには投稿したCSVの最新の行番号を記録していく。
df
pandasでCSVを読み込んでデータフレーム化する(CSVの内容は後述)。
ヘッダを用意していないCSVなのでheader=Noneとしておかないと(たぶん)一行目がヘッダになってしまう。
num
データフレームからdf.shape[0]で行数を取得して入れる。
例えば100行あったら100が返ってくる。これを-1する必要がある。
pandasでデータを読み込む場合、行数ではなく0から始まる行番号(列番号も同様)を指定するので最終行として行数の100を指定してしまうとエラーになってしまうため-1はその回避に必要。
y
0~最終行番号の間のランダム値を生成して入れる。
投稿を連番にするのではなくランダムで行うために生成するランダム値。
ランダム値にはけっこう偏りがあるというのが個人的な印象でxはその偏りを多少回避するために使用。
message.csvの中身
0,"ライスは……
ヒールじゃない……
……ヒーローだ!!!!"
1,"ブーイングはチャレンジャーの勲章です、傷付く必要はありません。
でもいつか、これが歓喜と祝福の声になる日は必ず来ます。
あなたが勝ち続ければきっと
だって……あなたの名前は“ライスシャワー”なんですから"
2,"はぅ……授業中、ちょっとだけお腹なっちゃった……。
しっかり食べたんだよ? ロールパン5つに、にんじんサラダ……。
にんじんハンバーグ、ベーコンと目玉焼き。 ミネストローネと、デザートのゼリーも……。
……走って全部なくなっちゃたのかな? 購買行ってこようかな……。"
3,"ブルボンさんの気持ち、受け取りました。ライス、もう一度頑張ってみます
怖いって気持ちはまだあるけど……
ライスもブルボンさんと一緒に走りたい。だから……ライス出ます、天皇賞に!"
投稿させる内容はCSV形式で記述してる。
一部ライスちゃんじゃなくてブルボンさんのセリフが混ざってる()
誤解されやすいんだけどCSVはあくまでもカンマでデータを区切るという仕様なので""で括った1項目内で改行することは可能。これを利用すればこういった用途で使う場合でも比較的見やすくなるよ。
投稿~コンソールへ出力
if x == y :
pass
else:
mk.notes_create(text=df[1][y])
print(datetime.datetime.now().strftime('%Y年%m月%d日 %H:%M:%S'))
print("-------------------------------")
print(df[1][y])
print()
print()
x = y
time.sleep(6000) # ノート周期を設定
if x == y :
xには前回の番号を格納するのでランダム値yと一致した場合は何もせずランダム値生成に戻る。
mk.notes_create(text=df[1][y])
Misskey.pyを使ってノートの投稿を行う。
テキストを直接入力してももちろん投稿できるけど、データフレーム1列目ランダム行の内容を指定する。
print()
コンソールへの出力。何も出力されないと動いてるのかもわからないしね。
こんな感じでコンソールに結果を表示し続けてるよ。
x = y
投稿した番号をxに入れて同一内容の連続投稿を回避する。
Misskeyが同一内容の連続投稿を許可しているかがまず不明だけど好ましいとは思えないので同一内容の連続投稿は避けたほうが無難。
time.sleep(6000)
適切な投稿間隔は不明。
1時間おきにするつもりで勘違いして6000秒止める処理にしてしまったけどこれくらいの頻度で投稿してくれれば充分かな?と、、、
最後に
説明するほど難しいことはしてないし雑な部分が多い。
エラー対策も特にしてなくて、例えばサーバーが重たくてうまく投稿できなかった場合、タイムアウトなんたらいうエラーがでてプログラム自体が終了してしまう。
そんな初心者レベルの内容だから、逆に作ってみたい人の取っ掛かりにでもなれば、という気もしたのでまとめた。ぶっちゃけコード書くより遥かに時間掛かってる()
Twitterに対する不信感の多い時代になってきたよね。
でも代替SNSになりえるSNSというのは、現状存在しないという感想。
Threads、Misskey、タイッツーなどなど色々あるけど、どれもTwitterライクに使うには使いにくい。タイッツーが一番それに近いけどTwitterユーザーの受け皿になれるほどではなさそう。
望むらくは、Twitterくんがこのままなんとか現状維持してくれることなんだけどね、、、
この記事が気に入ったらサポートをしてみませんか?