Créez un bot Mastodon avec une fonction pour répondre automatiquement avec Python

introduction

J'ai essayé de faire un bot Mastodon et c'était étonnamment facile, donc je vais le résumer. La seule bibliothèque à utiliser est "Mastodon.py", veuillez donc la pipeter à l'avance.

Réglage initial

Tout d'abord, obtenez les informations d'enregistrement et d'authentification de l'application côté Mastodon. Vous pouvez le faire une fois au début, alors supprimez-le ou commentez-le lorsque vous avez terminé.

setup.py



    from mastodon import Mastodon

    url = "imastodon.net"  #Adresse de l'instance à utiliser

    Mastodon.create_app("OtakuCDDB",  #Décidons librement le nom du client
                        api_base_url=url,
                        to_file="cred.txt"
                        )

    mastodon = Mastodon(
        client_id="cred.txt",
        api_base_url=url
    )

    mastodon.log_in(
        "****@*****",  #adresse e-mail de connexion
        "******",  #mot de passe
        to_file="auth.txt"
    )

Je l'ai sauvegardé dans les informations d'authentification, cred.txt et auth.txt, donc je vais l'utiliser pour l'authentification la prochaine fois. À propos, la clé client et le secret client sont stockés dans cred.txt et le jeton d'accès est stocké dans auth.txt.

corps de bot

Maintenant, faisons le corps du bot. Cette fois, nous allons créer un bot qui accède à l'API et renvoie le résultat en fonction du contenu envoyé dans la réponse.

bot.py


from mastodon import Mastodon, StreamListener
import requests

class Stream(StreamListener):
    def __init__(self): #Héritage
        super(Stream, self).__init__()
        # self.logger = logging.getLogger

    def on_notification(self,notif): #Appelé lorsqu'une notification arrive
        if notif['type'] == 'mention': #Vérifiez si le contenu de la notification est une réponse
            content = notif['status']['content'] #C'est le corps principal de la réponse
            id = notif['status']['account']['username']
            st = notif['status']
            main(content, st, id)

def main(content,st,id):
    req = content.rsplit(">")[-2].split("<")[0].strip() #Supprimer les informations supplémentaires du corps de la réponse
    r_date = requests.get(url + "?title=" + req, headers="") #Hit api
    print(req)
    try:
        r = r_date.json()["Items"][0] #Traitez un peu les données renvoyées

        resr = "\n" + "Titre de la chanson:" + r["Title"] + "\n" + \ #Je vais faire le corps de la réponse
               "Nom d'artiste:" + r["Artist"] + "\n" + \
               "vocal:" + ",".join(r["Vocal"]) + "\n" + \
               "Paroles:" + ",".join(r["Word"]) + "\n" + \
               "Composition:" + ",".join(r["Composer"]) + "\n" + \
               "Arrangement:" + ",".join(r["Arranger"]) + "\n" + \
               "l'oeuvre:" + ",".join(r["TieUp"]) + "\n" + \
               "marque:" + ",".join(r["Brand"]) + "\n" + \
               "Genre:" + ",".join(r["Genre"])
    except IndexError: #Si les données ne sont pas enregistrées, une erreur sera générée et elle sera traitée.
        resr = "Cette chanson n'est pas enregistrée"

    mastodon.status_reply(st,
                          resr,
                          id,
                          visibility='unlisted') #Non listé

mastodon = Mastodon(
    client_id = "cred.txt",
    access_token = "auth.txt",
    api_base_url = "https://imastodon.net") #exemple

url = "https://********" #URL de l'API

notif = mastodon.notifications() #Avoir des notifications
count = 0

while True:
    if notif[count]['type'] == 'mention':
        if notif[count]['status']['replies_count'] == 0: #Vérifiez si la réponse a déjà été faite
            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(Stream()) #Lancer le flux

Tout d'abord, si vous recevez la notification jusqu'à présent au démarrage et qu'il n'y a pas de réponse, nous y répondrons immédiatement. Il est normal de sauter ici parce que je voulais simplement répondre à la réponse qui a volé lorsque le programme était en panne.

Une fois le flux démarré, on_notification (self, notif) sera appelé lorsque la notification vole, alors incluez la fonction de réponse ici. De plus, il ne sert à rien de répondre aux redémarrages ou aux favoris, alors vérifiez si la notification est une réponse. Il ne semble pas y avoir de moyen pratique d’obtenir uniquement des réponses. Après cela, faisons divers traitements de manière appropriée et sautons la réponse avec mastodon.status_reply c'est tout. N'était-ce pas étonnamment facile?

Références

Documentation Exemple utilisant l'API de flux dans Mastodon.py 50 exemples de codes inversés Python (API Mastodon débutants) [Python] J'ai créé un bot Mastodon et l'ai essayé!

Recommended Posts

Créez un bot Mastodon avec une fonction pour répondre automatiquement avec Python
Étapes pour créer un bot Twitter avec Python
Créer un décorateur de fonction Python avec Class
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
Créer un LINE BOT avec Minette pour Python
Créez un outil qui secoue automatiquement furigana avec html en utilisant Mecab de Python3
[Outlook] J'ai essayé de créer automatiquement un e-mail de rapport quotidien avec Python
Créer une fonction en Python
Créer un répertoire avec python
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
Probablement le moyen le plus simple de créer un pdf avec Python 3
Créez un environnement virtuel avec Python!
Créez un Twitter BOT avec le SDK GoogleAppEngine pour Python
[Python] J'ai essayé de créer automatiquement un rapport quotidien de YWT avec la messagerie Outlook
Créer un message correspondant à la localisation avec la chaîne de traduction python
5 façons de créer un chatbot Python
J'ai écrit un script pour créer rapidement un environnement de développement pour Twitter Bot avec AWS Lambda + Python 2.7
[Road to Intermediate Python] Appelez une instance de classe comme une fonction avec __call__
[Introduction à Python] Comment fractionner une chaîne de caractères avec la fonction split
[Python 3.8 ~] Comment définir intelligemment des fonctions récursives avec des expressions lambda
Essayez de créer un environnement python avec Visual Studio Code et WSL
J'ai essayé de créer une liste de nombres premiers avec python
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
Créer un bot pour retweeter les informations sur le virus corona
Créez automatiquement la documentation de l'API Python avec Sphinx
Créez une image factice avec Python + PIL.
[Python] Créez un environnement virtuel avec Anaconda
Créons un groupe gratuit avec Python
[Python] [LINE Bot] Créer un robot LINE de retour de perroquet
Créer un compteur de fréquence de mots avec Python 3.4
Faisons un bot Twitter avec Python!
Les débutants en Python ont décidé de créer un bot LINE avec Flask (commentaire approximatif de Flask)
[Python] Explique comment utiliser la fonction range avec un exemple concret
J'ai essayé de créer un programme qui convertit les nombres hexadécimaux en nombres décimaux avec python
Procédure de création d'un environnement virtuel Python avec VS Code sous Windows
[Introduction à Python] Comment écrire une chaîne de caractères avec la fonction format
3. Traitement du langage naturel avec Python 1-2. Comment créer un corpus: Aozora Bunko
Créer un cadre avec un arrière-plan transparent avec tkinter [Python]
[Python] Compréhension de liste Différentes façons de créer une liste
Comment lire un fichier CSV avec Python 2/3
Envoyer un message à LINE avec Python (LINE Notify)
Enregistrer automatiquement les arguments de fonction dans argparse en Python
Comment créer un objet fonction à partir d'une chaîne
Je veux créer une fenêtre avec Python
Comment créer un fichier JSON en Python
Essayez de dessiner une courbe de vie avec python
Je veux faire un jeu avec Python
Créer un environnement virtuel avec conda avec Python
Créer une page qui se charge indéfiniment avec python
[Note] Créez une classe de fuseau horaire sur une ligne avec python
Vous pouvez facilement créer une interface graphique même avec Python
Créer un environnement de construction python3 avec Sublime Text3
Essayez de créer un code de "décryptage" en Python