[PYTHON] [Bot dekodieren] Ich habe versucht, einen Bot zu erstellen, der mir den Rassenwert von Pokemon angibt

Hintergrund der Schöpfung

Der Rennwert ist ein wichtiger Faktor bei der Bestimmung des Status in Pokemon. Wenn Sie Pokemon spielen, können Sie möglicherweise kein anständiges Spiel spielen, es sei denn, Sie kennen den Rennwert. Wenn Sie den Rassenwert von Pokemon nicht kennen, müssen Sie derzeit nacheinander nach Google suchen, was ich als problematisch empfand. Also begann ich zu denken, dass es praktisch wäre, einen Chat-Bot zu haben, der mir interaktiv den Rennwert mitteilt.

Zweck

Es gibt drei Hauptzwecke.

Zu den Teilen und Kenntnissen, die für die Entwicklung verwendet werden können, gehören insbesondere "Pokemon Race Value Database" und "Common Pokemon Name Mistakes". (Ich möchte den richtigen Pokemon-Namen korrigieren, indem ich weiß, wie man einen Fehler in einem allgemeinen Pokemon-Namen macht.)

Abschlusszeichnung

[Pokemon Name] Bilderbuch Wenn Sie auf den Chat klicken, wird der Rennwert von Pokemon angezeigt. IMG_0468.jpg Vorerst habe ich es nur auf dem von mir ausgeführten Discord-Server installiert. Einführung des Discord-Servers "Gatserver" für Pokemon Gachi Ungefähr 200 Personen nahmen teil, darunter mehrere Personen, die den ersten Platz in der Saison erlebt haben.

[github](https://github.com/ryoYAMAZAKI11/Pokemonbot )

Umgebung

【lokal】 MacOS Catalina Ver. 10.15.4 Python Ver. 3.7.7 【Server】 Ich habe den Bot auf xserver resident gemacht, indem ich das Verfahren auf der folgenden Site befolgt habe. https://ogapsan.com/archives/1077

Implementierung

Als ich es mit Discord Bot nachgeschlagen habe, schien Python Spaß zu machen. Im Voraus habe ich die Rennwertdaten von Pokemon in einer JSON-Datei als Datenbank gespeichert und in Python "die Rennwertdaten herausnehmen und auf den Dicord-Bot reagieren lassen".

Rennwertdatenbank

Erstellt unter Bezugnahme auf Nationales Bilderbuch zur gründlichen Erfassung von Pokemon.

Teil der Datenbank


{
...

"Menschliche Eidechse":{"No":"4","Pokemon Name":"Menschliche Eidechse","HP":"39","Attacke":"52","Verteidigung":"43","Spezialangriff":"60","Sonderverteidigung":"50","Beweglichkeit":"65","gesamt":"309"},
"Eidechse":{"No":"5","Pokemon Name":"Eidechse","HP":"58","Attacke":"64","Verteidigung":"58","Spezialangriff":"80","Sonderverteidigung":"65","Beweglichkeit":"80","gesamt":"405"},
"Eidechse":{"No":"6","Pokemon Name":"Eidechse","HP":"78","Attacke":"84","Verteidigung":"78","Spezialangriff":"109","Sonderverteidigung":"85","Beweglichkeit":"100","gesamt":"534"},

...
}

Body of Pokemon Bilderbuch Bot

https://qiita.com/1ntegrale9/items/9d570ef8175cf178468f Ich habe discord.py aus dem Erwerb des Bot-Tokens mit Bezug auf installiert.

Der Quellcode ist unten

main.py


import sys
import discord
import json
from collections import OrderedDict
import pprint
import re
import bot_token

client = discord.Client()

@client.event
async def on_ready():
    print('Logged in as', file=sys.stderr)
    print(client.user.name, file=sys.stderr)
    print(client.user.id, file=sys.stderr)
    print('------', file=sys.stderr)
    
@client.event



async def on_message(message):
    #Ich möchte nicht reagieren, wenn der Absender ein Bot ist
    if message.author.bot:
        return
    #Finden Sie heraus, ob es mit "Bilderbuch" beginnt
    if message.content == 'Zakoyamas Bilderbuch':
        message_send = "Lotto, der Schöpfer dieses Bots!" + "\n" + "Lotto, um uns auf Twitter bei Problemen zu kontaktieren!"+ "\n" + "https://twitter.com/zakoyama_com"
        
    elif re.match('.+Bilderbuch$', message.content):
        json_open = open('pokedex_zen.json', 'r')
        json_load = json.load(json_open)    
        #Erhalten des Pokemon-Namens aus der Nachricht (entfernen Sie den Teil "Bilderbuch")
        m = message.content[0:len(message.content)-3]
        
        #Senden Sie eine Nachricht an den Kanal, an den die Nachricht gesendet wurde
        if m in json_load:
            message_send = "```"
            for key, value in json_load[m].items():
                if key == 'No':
                    message_send = message_send + '%s.%s'%(key, value) + ' '
 elif key == 'Pokemon name':
 message_send = message_send + '% s'% (Wert) + "\ n" + 'HP Angriffsabwehr Spezialangriff Spezialabwehr Spezialabwehr Quick Total \ n'
                elif key == 'HP' :    
                    message_send = message_send + '%3d'%(int(value))
                else:    
                    message_send = message_send + '%4d'%(int(value))
                    
            message_send = message_send + "```"
            print('0 ' + m)#Aufzeichnen
        else:
            message_send = "Lotto, wo kein Pokemon gefunden werden kann!"
            print('1 ' + m)#Aufzeichnen
            
    await message.channel.send(message_send)
    
client.run(bot_token.TOKEN)

bot_token.py


TOKEN = "Hier erhaltene Token"

Punkt 1: Löse das Bilderbuch von [Pokemon name] aus

Die meisten Benutzer sind Japaner und tippen von ihrem Smartphone aus. Daher sind Befehle wie "! P", die in Discord-Bots üblich sind, nicht gut. Ich dachte. Daher antwortet der Bot mit dem Bilderbuch "[Pokemon name]", das auch von einem Smartphone aus leicht einzugeben ist.

main.Auszug aus py


    elif re.match('.+Bilderbuch$', message.content):

Auf diese Weise wird es mit dem regulären Ausdrucksmodul `` `re``` extrahiert.

main.Auszug aus py


    #Erhalten des Pokemon-Namens aus der Nachricht (entfernen Sie den Teil "Bilderbuch")
    m = message.content[0:len(message.content)-3]

Auf diese Weise wurde der Pokemon-Name in der Variablen `` `m``` gespeichert, indem der dreistellige Teil" Bilderbuch "vom Ende entfernt wurde.

Punkt 2: Machen Sie den Rennwert so einfach wie möglich

In Discord unterscheidet sich die Zeichenbreite von Alphabeten und Leerzeichen je nach Typ. Wenn Sie sie nur anordnen, entsteht eine große Abweichung wie diese. IMG_0594.jpg Also habe ich den Discord-Codeblock verwendet. ""```Wenn Sie es in "einschließen, wird es zu einem Codeblock. Die Größe des Alphabets und der Raum mit halber Breite sind einheitlich, und die japanische Zeichengröße ist ebenfalls kleiner, wodurch die Anzeige erleichtert wird. IMG_0595.jpg Die Größe von Japanern und Alphabeten in voller Breite sowie Leerzeichen in halber Breite beträgt jedoch 2:Da es nicht 1 ist, scheint es sich ein wenig zu verschieben, wenn versucht wird, es ins Japanische zu übersetzen. Es wird wie folgt im Quellcode implementiert.

main.Auszug aus py


 #Senden Sie eine Nachricht an den Kanal, an den die Nachricht gesendet wurde
        if m in json_load:
            message_send = "```"#Starten Sie hier den Codeblock
            for key, value in json_load[m].items():
                if key == 'No':
                    message_send = message_send + '%s.%s'%(key, value) + ' '
                elif key == 'Pokemon Name':
                    message_send = message_send + '%s'%(value) + " \n"  + 'HP Attack Defense Spezialangriff Spezialverteidigung Quick Total\n'
                elif key == 'HP' :    
                    message_send = message_send + '%3d'%(int(value))
                else:    
                    message_send = message_send + '%4d'%(int(value))
                    
 message_send = message_send + "` `` "# Schließen Sie hier den Codeblock

###Punkt 3: Protokoll ist Standardausgabe Wenn es wahr ist, wollte ich ein Protokoll aufzeichnen und es wie "Pokemon-Ranking, das häufig durchsucht wird" erstellen, aber ich habe nicht das Gefühl, dass ich es sofort erstellen kann, und der Zweck der Protokollierung ist "Ich möchte wissen, wie man einen Fehler in einem allgemeinen Pokemon-Namen macht". Aus diesem Grund habe ich beschlossen, die Standardausgabe durch Spucken eines Protokolls aufzuzeichnen. Es wird mit der Druckfunktion wie folgt ausgespuckt.

main.Auszug aus py


 print ('0' + m) # Zum Protokollieren
...

 print ('1' + m) # Zum Protokollieren

Wenn Pokemon gefunden wird0, Wenn nicht gefunden1Sie können "häufige Fehler in Pokemon-Namen" überprüfen. (Wenn Sie eine Textverarbeitung durchführen, können Sie auch das Pokemon kennen, das häufig durchsucht wird.)

Teil des Protokolls


 0 Rotom erhitzen
 0 Galados
 0 Chiracino
 0 Yukimenoko
 1 Arora Kyukon
 0 Kyukon
 0 Dornenkuss

Führen Sie den folgenden Befehl aus, wenn Sie ihn auf dem Server ausführen, um dieses Protokoll zu erstellen.

nohup python3 main.py 1>> out.log 2> /dev/null &

mit diesemout.logIst protokolliert. #Zielerreichung Ich habe diesen Bot für ungefähr 2 Monate eingeführt. Überprüfen Sie das Leistungsniveau für jedes der drei Ziele.

-Reduzierter Suchaufwand -Discord Server Aktivierung -Erwerben Sie Teile und Wissen, die für die zukünftige Entwicklung verwendet werden können

###Reduzierter Suchaufwand Es ist ziemlich einfach. Sie müssen nicht nach Google suchen, es ist also einfach. Da der Rennwert allein jedoch nicht als Information ausreicht und ich die Technik und die Eigenschaften kennen möchte, kann es sein, dass ich am Ende eine Google-Suche durchführe. Dies ist eine zukünftige Ausgabe.

###Discord Server Aktivierung Zu Beginn der Einführung von Bot betrug die Teilnehmerzahl etwa 20, überschritt jedoch 200. Es ist ziemlich aktiv geworden. Es wird angenommen, dass einer der Gründe dafür ist, dass die Tweets, die gerade erstellt werden, ziemlich viel RT erhalten haben. Erweiterte Tweets

###Erwerben Sie Teile und Wissen, die für die zukünftige Entwicklung verwendet werden können Ich konnte eine Liste der Pokemon-Rennwerte erstellen.

Als ich das Protokoll überprüfte und kein Pokemon fand, war es mit 80% weniger Material gefüllt und nutzlos. Wahrscheinlich der AuslöserBilderbuch vonweilEs scheint, dass es Leute gibt, die mit obszönen Worten in der Rolle von spielen.

#Zusammenfassung Es wurde in einer Woche erstellt und während der Einführung für etwa zwei Monate angepasst. Ich habe etwas mit einer anständigen Funktion gemacht, aber ehrlich gesagt funktioniert es nicht sehr gut (ungefähr einmal am Tag). Ich werde es auf jeden Fall weiter verbessern.

Was mich beeindruckt hat, war, dass als der Tweet RT war, viele Leute sagten, dass sie ihn verwenden wollten, aber nur wenige ihn tatsächlich verwendeten. Ich erkannte sehr genau, dass die Bedürfnisse, die die Leute sagen, und die wahren Bedürfnisse, die tatsächlich benötigt werden, unterschiedlich sein können.

Recommended Posts

[Bot dekodieren] Ich habe versucht, einen Bot zu erstellen, der mir den Rassenwert von Pokemon angibt
Ich habe einen schlaffen Bot gemacht, der mich über die Temperatur informiert
Ich habe mit Heroku + Flask + PostgreSQL (Heroku Postgres) einen LINE-Bot erstellt, der mir den Typ und die Stärke von Pokemon in der Garal-Region angibt.
Ich möchte einen Slack-Bot, der das Gehalt eines Teilzeitjobs aus dem Zeitplan von Google Kalender berechnet und anzeigt!
Da ich zu verschiedenen Zeiten anfing zu arbeiten, machte ich einen Bot, der mir die Zeit sagt, die Arbeit zu verlassen
[Python] Ich habe einen Bot erstellt, der mir die aktuelle Temperatur anzeigt, wenn ich einen Ortsnamen in LINE eingebe
Die Geschichte, einen Line Bot zu erstellen, der uns den Zeitplan für die Wettbewerbsprogrammierung erzählt
Erstellen Sie einen BOT, der die Discord-URL verkürzt
Erstellt einen Slack-Bot, der AWS Lambda über das Ablaufdatum eines SSL-Zertifikats bestätigt und benachrichtigt
[Los] Erstellen Sie ein Tool, das den Rennwert des Pokémon zurückgibt, der von der Standardeingabe empfangen wurde
[Python & SQLite] Ich habe den erwarteten Wert eines Rennens mit Pferden im 1x-Gewinnbereich ② analysiert
Beim Inkrementieren des Werts eines Schlüssels, der nicht vorhanden ist
Ich habe einen Twitter-Bot erstellt, der das von #PokemonGO gefangene Pokemon murmelt
Ich habe einen Linienbot erstellt, der das Geschlecht und das Alter einer Person anhand des Bildes errät
Ich habe einen Kalender erstellt, der den Verteilungsplan von Vtuber automatisch aktualisiert
Ich habe einen Korpusleser geschrieben, der die Ergebnisse der MeCab-Analyse liest
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
[Python & SQLite] Ich habe den erwarteten Wert eines Rennens mit Pferden im 1x-Gewinnbereich ① analysiert
Ich habe einen LINE BOT erstellt, der mithilfe der Flickr-API ein Bild von Reis-Terroristen zurückgibt
Die Geschichte der IPv6-Adresse, die ich auf ein Minimum beschränken möchte
Ich habe einen SlackBot erstellt, der mich jede Woche über Informationen zum AtCoder-Wettbewerb informiert
Mit LINEBot habe ich eine Anwendung erstellt, die mich über die "Buszeit" informiert.
Ich habe einen Linebot erstellt, der mich über nahegelegene Evakuierungsstellen auf AWS informiert
Erstellen Sie einen BOT, der die Anzahl der infizierten Personen in der neuen Corona anzeigt
Ich habe eine Funktion erstellt, die eine ungeschickte Kopie eines PDF-Textes ziemlich gut aufteilt.
Ich habe eine Twitter-App erstellt, die die Zeichen der Vorverbindung mit Heroku entschlüsselt (Fehler).
[Python / C] Ich habe versucht, ein Gerät zu erstellen, das den Bildschirm eines PCs drahtlos aus der Ferne scrollt.
Ich habe einen Kalender erstellt, der den Verteilungsplan von Vtuber automatisch aktualisiert (Google Kalender Edition).
Eine Geschichte, die den Aufwand für Betrieb / Wartung reduziert
[Python] Ein Programm, das die Anzahl der Täler zählt
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
LINE Bot, der Sie über die interessierenden Aktien informiert
Erzeugen Sie diese Form des Bodens einer Haustierflasche
Ein Memo, dass ich den Datenspeicher mit Python berührt habe
Die Geschichte, dass der Rückgabewert von tape.gradient () None war
Eine Geschichte, die die Lieferung von Nico Nama analysierte.
[Python] Ein Programm, das die Positionen von Kängurus vergleicht.
Wenn ich einen ECR-Scan von einem CDK erstellt habe, konnte ich die Rückseite des Scans sehen
Ich habe mit Docker eine API erstellt, die den vorhergesagten Wert des maschinellen Lernmodells zurückgibt
Ein Werkzeug, das die Gacha von Soshage automatisch dreht
Code, der bei AttributeError Standardwerte festlegt
Mit den Daten von COVID-19 wurde ein Netzwerkdiagramm erstellt.
Suchen Sie den Index des Maximalwerts (Minimalwerts) eines mehrdimensionalen Arrays
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
Ich habe ein Punktbild des Bildes von Irasutoya gemacht. (Teil 1)
Ich habe ein wenig versucht, das Verhalten der Zip-Funktion
Ich habe ein Punktbild des Bildes von Irasutoya gemacht. (Teil 2)
Extrahieren Sie den Wert von dict oder list als Zeichenfolge
Die Geschichte, wie man mit discord.py einen Fragenkasten-Bot erstellt
Python-Skript, das den Inhalt zweier Verzeichnisse vergleicht
Ich habe ein Skript geschrieben, das das Bild in zwei Teile teilt
Ich habe versucht, eine Site zu erstellen, mit der die aktualisierten Informationen von Azure einfach angezeigt werden können
Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten
Veröffentlichen Sie das erstellte Shell-Skript, um die Probleme beim Erstellen von LiveUSB unter Linux zu verringern
Ich habe versucht, das Bild des Bogenschießen-Bewertungsbuchs (eine Broschüre, in der die Ergebnisse von Treffern aufgezeichnet werden) zu analysieren. (Google Colaboratory)