初めてのbot作成

フェティッシュな投稿をしても怒られないSNS、『フェチストドン』が先々週爆誕しました。

そこに私もアカウントを作成して眺めているのですが、ローカル(コミュニティ)タイムラインでも2~3時間に1ポストとかがザラ
まだ始まったばかりのサーバーなのでそういうものだとは思いつつ、何か面白いこと起きないかな〜と思っていました。

何か面白いことって、私は何を期待しているんだろうか…
私はネットのノリが好きで(後追いでニコニコ動画のカルチャーとか嗜んでた人)、例えば発想の自由さ、多様性とかミームの流行とか技術の無駄遣いとか良い
そしたら、botあったら面白いかな?
と考えていたところに雪の日が発生、まとまった時間が得られたのでbotを作りました。

元々のスキル

  • 大学のときに、プログラミングができる友人に憧れてちょっと齧って途中で放り投げた感じ
    (ポインタ?わかんね、忙しいしやめるか…というレベル)

  • 開発環境のインストールくらいはできる

  • インターンでrubyやらされた

  • 一番やる機会が多かったのはデータ解析(有意差とかそういうの)

戦略

  • プログラミングスキルが足りないことは明白なので、

    • どちらかというと設計の方を頑張ってそっちで補う

    • 小さく区切って動くか確認する

    • 難しいことは基本諦める、まずは出てきた情報をちょっと変えることを目標にする

  • 他人に迷惑はかけない

  • 他力本願
    プログラムを公開したら、誰か面白く活用してくれないかな〜()

参考にしたプログラム

ほぼ上記のプログラムをそのまま動かしただけです。
先人の知恵に感謝、マジで…


プログラム

#Bot.py
#
from mastodon import Mastodon, StreamListener
import requests
import random
import datetime



# Botの主な挙動をここに記述します。
class Bot(StreamListener):
    # Botの準備してくれる所。所謂おまじない。
    def __init__(self):
        super(Bot, self).__init__()
    # アカウントのローカルタイムラインに動きがあると新規トゥートの情報を持って中の挙動を読み取る。
    def on_update(self, status):
        print(status['content'])
        #pass

    def on_notification(self,notif): #通知が来た時に呼び出されます
        if notif['type'] == 'mention': #通知の内容がリプライかチェック
            content = notif['status']['content'] #リプライの本体です
            id = notif['status']['account']['username']
            st = notif['status']
            main(content, st, id)


def Login():
    mastodon = Mastodon(
                access_token = "",           # ここにさっき取得したアクセストークンを入れる。
                api_base_url = "https://fetistodon.com"    # ここにMastodonのインスタンスのURLを記述
                )
    return mastodon

def LTLlisten(mastodon):
    bot = Bot()
    mastodon.stream_local(bot)

def hello():
    hello = [
        #内容
        ]
    reply = random.choice(hello)
    return reply

def fortune(id):
    results = [
        #結果がここ
     ]

    #今日の日付の取得
    d_today = datetime.date.today()
    #シード値の設定:一日、一人当たり同じ結果のみが返されるようにする
    #idの処理
    seed = d_today.month * 100 + d_today.day + int(format(int.from_bytes(id.encode('utf-8'), byteorder='big')))
    random.seed(seed)
    #resultsの要素数からランダムな値を生成
    reply = d_today.strftime("%Y-%m-%d") + "\n" + results[
            random.randrange(len(results)-1)
            ]
    return reply

def rsp(hand):
    #ジャンケンの内容(まさかの全部if分岐)
  return reply


def main(content,st,id):
    req = content.rsplit(">")[-2].split("<")[0].strip() #リプライの本体から余分な情報を削ります
    r_date = requests.get(url + "?title=" + req, headers="") #apiを叩きます
    print(req)
    if "占い" in req or "うらない" in req:
        resr = fortune(id)
    elif "じゃんけん" in req or "ジャンケン" in req:
        resr = rsp(req)
    elif "マゾ" in req or "M" in req or "S" in req:
        resr = "ぼくは縄とSMを嗜んでるだけで、別にマゾでもSでもないよ〜"
    elif "遊び方" in req or "説明" in req or "自己紹介" in req:
        resr = "こんにちは!\nぼくはなゆどん、占いかじゃんけんができるよ!なゆどんじゃんけんとっても強い!\n\n占いなら、「占い」ってリプライして!\n\nじゃんけんなら、「じゃんけん」の後に「✊」、「✌️」、「🖐」️のどれかをつけてリプライして!\nex)じゃんけん✊"
    else:
        resr = hello()

    mastodon.status_reply(st,
                          resr,
                          id,
                          visibility='unlisted') #未収載

# ログインする処理
mastodon = Login()
url = "https://fetistodon.com/api/"
notif = mastodon.notifications() #通知を取得
count = 0

while True:
    if notif[count]['type'] == 'mention':
        if notif[count]['status']['replies_count'] == 0: #リプライが既にされてないのかの確認
            content = notif[count]['status']['content']
            id = notif[count]['status']['account']['username']
            st = notif[count]['status']
            main(content, st, id)
            count += 1
        else:
            break
    else:
        count += 1
    count += 1

mastodon.stream_user(Bot())

頑張ったところ

占いの結果が一人・一日当たり一通りになるようなシード値の設定
(まだワークしてるか検証しきれてない)
5時間くらいゾーンに入って作業した(気がする)

キモいところ

スキルが足りなさすぎて、丸パクリパート以外はif分岐ばっか。スマートじゃなさすぎてキモい

感想

やっぱプログラミングできないタイプの人間だわ、エラー文が読めないもん
でも、動いてくれた時の嬉しさはとっても嬉しかったな(語彙力)

この記事が気に入ったらサポートをしてみませんか?