[PYTHON] Die Geschichte, einen Slackbot zu erstellen, der beim Senden des Verarbeitungscodes ein GIF oder PNG ausgibt

Einführung

Ich habe alles auf einmal mit Mitternachtsspannung geschrieben, damit ich es viel reparieren kann. In diesem Artikel werde ich erklären, wie man Slackbot startet. Bereitstellen und betreiben! Ich hoffe, Sie können Ihr Bestes geben, während Sie sich andere Artikel ansehen ... Der in diesem Artikel verwendete Code wird hier veröffentlicht [https://github.com/kota-shiokara/processing-slackbot].

Bitte beachten Sie, dass in diesem Artikel verschiedene Erklärungen weggelassen werden.

Text

Umwelt usw. (Weil es meine Umgebung ist, ist es nur eine Anleitung)

Installieren Sie Slackbot- und Pillow-Bibliotheken mit pip. (In einigen Fällen `` `pip3```)


$ pip install slackbot
$ pip install Pillow

$ pip list #Überprüfen Sie die installierten Bibliotheken

Installieren Sie auch Processing-Java. Dieser Artikel wird für die Einführung der Verarbeitung empfohlen. Sie sollten in der Lage sein, es zu installieren, indem Sie auf Download-Verarbeitung herunterladen klicken, es starten und in der Symbolleiste "Extras"> "Processing-Java installieren" auswählen.

Einen Bot erstellen

Bitte erstellen Sie einen Bot von der folgenden Seite. Achten Sie darauf, dass Sie im von Ihnen erstellten Arbeitsbereich keinen Fehler machen. https://my.slack.com/services/new/bot (Ursprünglich wird dies nicht empfohlen, und Sie müssen einige problematische Dinge tun, z. B. das Festlegen des Bereichs, aber diesmal werde ich damit fortfahren.)

Geben Sie den Namen des Bots in diesen Benutzernamen ein und klicken Sie auf "Bot-Integration hinzufügen". slackでの設定.png

Notieren Sie sich das angezeigte "API-Token", indem Sie es kopieren. Passen Sie den Namen, das Symbol usw. nach Ihren Wünschen an. Wenn Sie fertig sind, drücken Sie die Taste unten auf der Seite, um Ihre Einstellungen zu speichern. Danach können Sie das Token auf der angezeigten Seite bearbeiten und überprüfen, indem Sie auf der Seite `` https: // > / apps``` nach "Bots" suchen.

Bereit, den Bot zu bewegen

Bereiten Sie ein Verzeichnis wie das folgende vor. Wenn Sie [hier] klonen (https://github.com/kota-shiokara/processing-slackbot), können Sie den größten Teil der Arbeit überspringen. (In diesem Fall bereiten Sie bitte den Ordner (*) und die Dateien vor!)

slackbot         #Ein Verzeichnis, das Programme organisiert. Beliebige Zeichenfolge
├─ run.py        #Hauptdatei zum Starten des Bots
├─ slackbot_settings.py   #Datei zum Schreiben von Einstellungen für Bot(※)
├─ plugins                #Fügen Sie diesem Verzeichnis Bot-Funktionen hinzu
   ├─ __init__.py         #Eine Datei zur Angabe des Moduls. OK am Himmel
   └─ func.py       #Eine Datei zum Schreiben einer Funktion. Beliebige Zeichenfolge
   └─ cfg.py        #Datei, um den Pfad der Skizze zu setzen(※)
└─ sketch (※)
   └─ sketch.pde    #Eine einmal zu schreibende Skizzendatei. OK am Himmel(※)

Schreiben Sie den folgenden Code.

`` `run.py``` code

run.py


from slackbot.bot import Bot

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

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

slackbot_settings.py


API_TOKEN = "<Notiertes API-Token>"
DEFAULT_REPLY = "<Jede Zeichenfolge, die Sie standardmäßig zurückgeben möchten>"
PLUGINS = ['plugins'] #Der Name des Verzeichnisses, das den Code enthält, der die Funktionalität des Bots schreibt
`` `func.py``` code

func.py


from slackbot.bot import respond_to     # @botname:Decoder, der mit reagiert
from slackbot.bot import listen_to      #Decoder, der auf kanalinterne Bemerkungen reagiert
from slackbot.bot import default_reply  #Decoder, der reagiert, wenn keine entsprechende Antwort erfolgt
import sys, subprocess, os.path, os, glob, time
from .cfg import * #Cfg in der gleichen Hierarchie.Import von py
from PIL import Image

@listen_to('!output (.*)')
def output(message, arg): #arg ist optional
    #Formatieren Sie den gesendeten Text
    tmp = message.body['text']
    tmp = tmp.replace("&lt;", "<")
    tmp = tmp.replace("&gt;", ">")

    #Formatiert in eine Zeichenfolge zum Überschreiben von pde
    pdeCode = shaping_code(tmp.strip("!output " + arg + "\n"), arg)
    message.send('wait...')

    #Pde überschreiben
    print(pdeCode)
    f = open('sketch/sketch.pde', 'w')
    f.write(pdeCode)
    f.close()

    cp = subprocess.run(['processing-java',  sketch_path, '--run']) #Ausführung der Verarbeitung
    if cp.returncode != 0: #Verarbeitung bei fehlgeschlagener Verarbeitung
        message.send('Run is failed.')
        sys.exit(1) #System, das aus irgendeinem Grund nicht funktioniert.exit()
    
    upload_sequence(message, arg) #Upload-Prozess


def shaping_code(code, option): #Bildausgabemethode zum PDE-Code hinzugefügt
    if option == '--png': #PNG-Option
        pictFunc = "  if((frameCount <= 15) && (frameCount % 15 == 0)) saveFrame(\"####.png\");\n  else if(frameCount > 15) exit();"
    elif option == '--gif': #GIF-Option
        pictFunc = "  if((frameCount <= 300) && (frameCount % 15 == 0)) saveFrame(\"####.png\");\n  else if(frameCount > 300) exit();"
    else : #Gibt standardmäßig als PNG zurück
        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': #PNG-Option
        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': #GIF-Option
        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 : #Standardmäßig mit PNG hochladen
        message.channel.upload_file(fname="sketch/0015.png ", fpath="sketch/0015.png ")
        if os.path.exists('sketch/0015.png'):
            os.remove('sketch/0015.png')
`` `cfg.py``` code
Deklarieren Sie den Pfad des Skizzenordners als Variable, aber er ändert sich natürlich je nachdem, wo Sie ihn ablegen. Bitte beziehen Sie sich auf Ihr Verzeichnis. Es wird durch einen absoluten Pfad angegeben.

cfg.py


sketch_path = '--sketch=/Users/<Nutzername>/slackbot/sketch' #Geben Sie das Verzeichnis mit dem Skizzenordner, den Sie lesen möchten, mit einem absoluten Pfad an

Bot starten

Lassen Sie uns den Bot tatsächlich starten, wenn die Vorbereitung abgeschlossen ist. Gehen Sie zum Slackbot-Verzeichnis und


$ python3 run.py

Lassen Sie uns das Programm durch Drücken von ausführen.

png.png Wenn Sie den Code mit `` `! Output --png``` senden und der Bot, der in png zurückkehrt, sich so bewegt, gewinnen Sie. Da das fertige PNG automatisch gelöscht wird, müssen Sie sich außerdem keine Gedanken über den Druck auf die Kapazität machen.

gif.gif Wenn Sie den Code mit `` `! Output --gif``` senden und der Bot, der in png zurückkehrt, sich so bewegt, gewinnen Sie. Sowohl gif als auch png werden auf die gleiche Weise gelöscht.

Am Ende

Dies ist eine schlechte Erklärung, aber dies ist das Ende der Erklärung bis zum Start. Es war interessant, Befehle mit Unterprozessen treffen und verschiedene Befehle mit regulären Ausdrücken erstellen zu können. Wenn Sie motiviert sind, schreibe ich einen Artikel, in dem die verwendete Methode erläutert wird, und einen Artikel über die Bot-Operation. Es ist unbekannt, weil ich es noch nicht bereitgestellt habe ... ~~ (Was ist Infrastruktur) ~~

Referenzartikel

Recommended Posts

Die Geschichte, einen Slackbot zu erstellen, der beim Senden des Verarbeitungscodes ein GIF oder PNG ausgibt
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
Die Geschichte der Verarbeitung A von Blackjack (Python)
Die Geschichte, ein Paket zu erstellen, das den Betrieb von Juman (Juman ++) & KNP beschleunigt
Die Geschichte einer Box, die Peppers AL Memory und MQTT miteinander verbindet
Die Geschichte der Erstellung einer Webanwendung, die umfangreiche Lesungen mit Django aufzeichnet
Die Geschichte, einen Line Bot zu erstellen, der uns den Zeitplan für die Wettbewerbsprogrammierung erzählt
Die Geschichte eines Mel-Icon-Generators
Es ist eine Huckepack-Geschichte über den Dienst, der "Nyan" zurückgibt, wenn Sie Ping drücken
Eine Geschichte, die den Aufwand für Betrieb / Wartung reduziert
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
Die Geschichte eines neuronalen Netzwerks der Musikgeneration
Eine Geschichte, die die Lieferung von Nico Nama analysierte.
Extrahieren Sie den Wert von dict oder list als Zeichenfolge
Die Geschichte, wie man mit discord.py einen Fragenkasten-Bot erstellt
Die Geschichte, ein Tool zu erstellen, das auf Mac und Windows auf der Spieleentwicklungsseite ausgeführt wird
Beim Inkrementieren des Werts eines Schlüssels, der nicht vorhanden ist
Die Geschichte, dass ein Hash-Fehler bei der Verwendung von Pipenv auftrat
Vorsichtsmaßnahmen bei Verwendung einer Liste oder eines Wörterbuchs als Standardargument
Die Geschichte, einen Standardtreiber für db mit Python zu erstellen.
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
[Python] Code, der zu Beginn beim Scraping als Anfänger mit Hirntod geschrieben werden kann
[AtCoder für Anfänger] Sprechen Sie über den Rechenaufwand, den Sie grob wissen möchten
Die Geschichte, ein Tool zum Laden von Bildern mit Python zu erstellen ⇒ Speichern unter
Die Geschichte des Exportierens eines Programms
Eine Geschichte, die die Gegenwart von Qiita mit Qiita API + Elasticsearch + Kibana visualisiert
Wenn Sie einen Singleton in Python möchten, stellen Sie sich das Modul als Singleton vor
Die Geschichte der Entwicklung einer WEB-Anwendung, die automatisch Fangkopien generiert [MeCab]
Die Geschichte einer Soundkamera mit Touch Designer und ReSpeaker
[Python3] Code, der verwendet werden kann, wenn Sie die Erweiterung eines Bildes sofort ändern möchten