[PYTHON] L'histoire de la création d'un slackbot qui génère un gif ou un png lorsque vous envoyez le code de traitement

introduction

J'ai tout écrit en même temps avec une tension de minuit, donc je peux le réparer beaucoup. Dans cet article, je vais vous expliquer comment démarrer slackbot. Déployez et exploitez! J'espère que vous pourrez faire de votre mieux tout en regardant d'autres articles ... Le code utilisé dans cet article est posté ici [https://github.com/kota-shiokara/processing-slackbot).

Veuillez noter que diverses explications sont omises dans cet article.

Texte

Environnement etc. (Parce que c'est mon environnement, ce n'est qu'un guide)

Installez les bibliothèques slackbot et Pillow avec pip. (Dans certains cas, pip3```)


$ pip install slackbot
$ pip install Pillow

$ pip list #Vérifier les bibliothèques installées

Installez également processing-java. Cet article est recommandé pour l'introduction du traitement. Vous devriez pouvoir l'installer en cliquant sur Traitement du téléchargement, en le lançant et en sélectionnant «Outils»> «Installer processing-java» dans la barre d'outils.

Créer un bot

Veuillez créer un bot à partir du site suivant. Veillez à ne pas vous tromper dans l'espace de travail que vous créez. https://my.slack.com/services/new/bot (À l'origine, ce n'est pas recommandé, et vous devez faire des choses gênantes telles que le réglage de la portée, mais cette fois, je vais aller avec.)

Entrez le nom du bot dans ce nom d'utilisateur et appuyez sur "Ajouter une intégration de bot". slackでの設定.png

Notez le "jeton API" affiché en le copiant. Personnalisez le nom, l'icône, etc. à votre guise. Lorsque vous avez terminé, appuyez sur le bouton en bas de la page pour enregistrer vos paramètres. Après cela, vous pouvez modifier et vérifier le jeton sur la page qui apparaît en recherchant "bots" sur la page https: // <URL de l'espace de travail> / apps```.

Prêt à déplacer le bot

Préparez un répertoire comme celui ci-dessous. Si vous clonez ici, vous pouvez sauter la plupart du travail. (Dans ce cas, veuillez préparer le dossier (*) et les fichiers!)

slackbot         #Un annuaire qui organise les programmes. Chaîne de caractères arbitraire
├─ run.py        #Fichier principal pour démarrer le bot
├─ slackbot_settings.py   #Fichier pour écrire les paramètres liés au bot(※)
├─ plugins                #Ajouter une fonctionnalité de bot à ce répertoire
   ├─ __init__.py         #Un fichier pour indiquer le module. OK dans le ciel
   └─ func.py       #Un fichier pour écrire une fonction. Chaîne de caractères arbitraire
   └─ cfg.py        #Fichier pour mettre le chemin de l'esquisse(※)
└─ sketch (※)
   └─ sketch.pde    #Un fichier d'esquisse à écrire une fois. OK dans le ciel(※)

Écrivez le code ci-dessous.

Code `` `` run.py```

run.py


from slackbot.bot import Bot

def main():
    bot = Bot()
    bot.run()

if __name__ == "__main__":
    print('start slackbot')
    main()
Code `` `` slackbot_settings.py```

slackbot_settings.py


API_TOKEN = "<Jeton d'API noté>"
DEFAULT_REPLY = "<Toute chaîne que vous souhaitez renvoyer par défaut>"
PLUGINS = ['plugins'] #Le nom du répertoire qui contient le code qui écrit la fonctionnalité du bot
Code `` `` func.py```

func.py


from slackbot.bot import respond_to     # @botname:Décodeur qui réagit avec
from slackbot.bot import listen_to      #Décodeur qui répond aux remarques dans le canal
from slackbot.bot import default_reply  #Décodeur qui réagit lorsqu'il n'y a pas de réponse correspondante
import sys, subprocess, os.path, os, glob, time
from .cfg import * #Cfg dans la même hiérarchie.importer depuis py
from PIL import Image

@listen_to('!output (.*)')
def output(message, arg): #arg est facultatif
    #Mettre en forme le texte envoyé
    tmp = message.body['text']
    tmp = tmp.replace("&lt;", "<")
    tmp = tmp.replace("&gt;", ">")

    #Formaté en une chaîne de caractères pour écraser pde
    pdeCode = shaping_code(tmp.strip("!output " + arg + "\n"), arg)
    message.send('wait...')

    #Écraser pde
    print(pdeCode)
    f = open('sketch/sketch.pde', 'w')
    f.write(pdeCode)
    f.close()

    cp = subprocess.run(['processing-java',  sketch_path, '--run']) #Exécution du traitement
    if cp.returncode != 0: #Traitement en cas d'échec du traitement
        message.send('Run is failed.')
        sys.exit(1) #Un système qui ne fonctionne pas pour une raison quelconque.exit()
    
    upload_sequence(message, arg) #processus de téléchargement


def shaping_code(code, option): #Ajout de la méthode de sortie d'image au code pde
    if option == '--png': #option png
        pictFunc = "  if((frameCount <= 15) && (frameCount % 15 == 0)) saveFrame(\"####.png\");\n  else if(frameCount > 15) exit();"
    elif option == '--gif': #option gif
        pictFunc = "  if((frameCount <= 300) && (frameCount % 15 == 0)) saveFrame(\"####.png\");\n  else if(frameCount > 300) exit();"
    else : #Renvoie en png par défaut
        pictFunc = "  if((frameCount <= 15) && (frameCount % 15 == 0)) saveFrame(\"####.png\");\n  else if(frameCount > 15) exit();"
    return code.replace("void draw(){", "void draw(){\n" + pictFunc)

def upload_sequence(message, option):
    if option == '--png': #option png
        message.channel.upload_file(fname="sketch/0015.png ", fpath="sketch/0015.png ")
        if os.path.exists('sketch/0015.png'):
            os.remove('sketch/0015.png')
    elif option == '--gif': #option gif
        time.sleep(6)
        file_list = sorted(glob.glob('sketch/*.png'))  
        images = list(map(lambda file : Image.open(file) , file_list))
        images[0].save('sketch/output.gif' , save_all = True , append_images = images[1:] , duration = 400 , loop = 0)
        if os.path.exists('sketch/output.gif'):
            message.channel.upload_file(fname="sketch/output.gif", fpath="sketch/output.gif")
            for p in glob.glob('sketch/*.png'):
                if os.path.isfile(p):
                    os.remove(p)
            os.remove('sketch/output.gif')
    else : #Télécharger avec png par défaut
        message.channel.upload_file(fname="sketch/0015.png ", fpath="sketch/0015.png ")
        if os.path.exists('sketch/0015.png'):
            os.remove('sketch/0015.png')
Code `` `` cfg.py```
Déclarez le chemin du dossier d'esquisse comme une variable, mais bien sûr, il change en fonction de l'endroit où vous le placez, veuillez donc vous référer à votre répertoire. Il est spécifié par un chemin absolu.

cfg.py


sketch_path = '--sketch=/Users/<Nom d'utilisateur>/slackbot/sketch' #Spécifiez le répertoire contenant le dossier d'esquisse que vous souhaitez lire avec un chemin absolu

démarrage du bot

Commençons réellement le bot lorsque la préparation est terminée. Accédez au répertoire slackbot et


$ python3 run.py

Lançons le programme en appuyant sur.

--Pour png

png.png Si vous envoyez le code avec ``! Output --png``` et que le bot qui retourne en png se déplace comme ça, vous gagnez. De plus, puisque le png complété est automatiquement supprimé, vous n'avez pas à vous soucier de la pression sur la capacité.

--Pour gif

gif.gif Si vous envoyez le code avec ``! Output --gif``` et que le bot qui retourne en png se déplace comme ça, vous gagnez. Les gif et png seront supprimés de la même manière.

À la fin

C'est une mauvaise explication, mais c'est la fin de l'explication jusqu'au démarrage. C'était intéressant de pouvoir frapper des commandes avec sous-processus et créer diverses commandes en utilisant des expressions régulières. Si vous êtes motivé, j'écrirai un article expliquant la méthode utilisée et un article sur le fonctionnement des robots. C'est inconnu car je ne l'ai pas encore déployé ... ~~ (Qu'est-ce que l'infrastructure) ~~

Article de référence

Recommended Posts

L'histoire de la création d'un slackbot qui génère un gif ou un png lorsque vous envoyez le code de traitement
L'histoire de la création d'un module qui ignore le courrier avec python
L'histoire du traitement A du blackjack (python)
L'histoire de la création d'un package qui accélère le fonctionnement de Juman (Juman ++) & KNP
L'histoire de la fabrication d'une boîte qui interconnecte la mémoire AL de Pepper et MQTT
L'histoire de la création d'une application Web qui enregistre des lectures approfondies avec Django
L'histoire de la création d'un Line Bot qui nous raconte le calendrier de la programmation du concours
L'histoire de la création d'un générateur d'icônes mel
C'est une histoire de ferroutage sur le service qui renvoie "Nyan" lorsque vous appuyez sur ping
Une histoire qui réduit l'effort de fonctionnement / maintenance
#Une fonction qui renvoie le code de caractère d'une chaîne de caractères
L'histoire de la création d'un réseau neuronal de génération musicale
Une histoire qui a analysé la livraison de Nico Nama.
Extraire la valeur de dict ou list sous forme de chaîne de caractères
L'histoire de la création d'un bot de boîte à questions avec discord.py
L'histoire de la création d'un outil qui fonctionne sur Mac et Windows sur le site de développement de jeux
Lors de l'incrémentation de la valeur d'une clé qui n'existe pas
L'histoire de l'erreur de hachage est apparue lors de l'utilisation de Pipenv
Précautions lors de l'utilisation d'une liste ou d'un dictionnaire comme argument par défaut
L'histoire de la création d'un pilote standard pour db avec python.
Une fonction qui mesure le temps de traitement d'une méthode en python
[Python] Code qui peut être écrit avec la mort cérébrale au début lors du scraping en tant que débutant
[Pour les débutants chez AtCoder] Parlez de la quantité de calcul que vous voulez connaître approximativement
L'histoire de la création d'un outil pour charger une image avec Python ⇒ l'enregistrer sous un autre nom
L'histoire de l'exportation d'un programme
Une histoire qui visualise le présent de Qiita avec Qiita API + Elasticsearch + Kibana
Si vous voulez un singleton en python, considérez le module comme un singleton
L'histoire du développement d'une application WEB qui génère automatiquement des copies de capture [MeCab]
L'histoire de la création d'une caméra sonore avec Touch Designer et ReSpeaker
[Python3] Code qui peut être utilisé lorsque vous souhaitez modifier l'extension d'une image à la fois