Ich habe einen Line-Bot mit Python gemacht!

Fehler gefunden

image.png

Zweck und Funktion

Registrieren Sie Ihr Lieblingsgeschäft / Ihre Lieblingseinrichtung mit Ihrem Lieblingsnamen und erstellen Sie einen Line-Bot, der Informationen zu diesem Geschäft / dieser Einrichtung erhalten kann.

image.png

Dinge notwendig

Entwicklungsfluss

1 Registrieren Sie sich bei LINE Developers und heroku (weggelassen).

2 Lassen Sie uns vorerst LINE-bot mit dem von LINE verteilten Beispielcode erstellen.

app.py Von Line verteilter Beispielcode.



from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

app = Flask(__name__)

# line-Zugriff von der Entwicklerseite_Token und Kanal_Generieren Sie jedes Geheimnis und fügen Sie es hier in eine Variable ein
#Wenn Sie es nicht wissen, lesen Sie andere Artikel. Ich werde es hier weglassen, weil viele andere Leute es geschrieben haben.
line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('YOUR_CHANNEL_SECRET')


@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']
    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        print("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)

    return 'OK'

#Die Veranstaltung enthält viele Benutzerinformationen.
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))

if __name__ == "__main__":
    app.run()

Bereiten Sie die folgenden beiden im selben Ordner vor.

require.txt (schreibe, was auf dem Heroku-Server installiert werden muss)

Stellen Sie sicher, dass Sie Gunicorn installieren. (Es scheint eine Bibliothek zu sein, die vom Heroku-Server benötigt wird.) Die Verwendung einer virtuellen Python-Umgebung namens venv macht es noch sauberer, aber ich habe es nicht getan, weil ich es nicht gut machen konnte, wie in Aktueller Artikel beschrieben.

argon2-cffi==20.1.0
asgiref==3.2.10
async-generator==1.10
attrs==20.2.0
backcall==0.2.0
bleach==3.1.5
certifi==2020.6.20
cffi==1.14.2
chardet==3.0.4
click==7.1.2
colorama==0.4.3
decorator==4.4.2
defusedxml==0.6.0
entrypoints==0.3
Flask==1.1.2
gunicorn==20.0.4
idna==2.10
itsdangerous==1.1.0
jedi==0.17.2
Jinja2==2.11.2
json5==0.9.5
jsonschema==3.2.0
line-bot-sdk==1.17.0
MarkupSafe==1.1.1
mistune==0.8.4
nbclient==0.5.0
nbconvert==6.0.2
nbformat==5.0.7
nest-asyncio==1.4.0
notebook==6.1.4
numpy==1.19.2
packaging==20.4
pandocfilters==1.4.2
parso==0.7.1
pickleshare==0.7.5
prometheus-client==0.8.0
prompt-toolkit==3.0.7
pycparser==2.20
Pygments==2.7.0
pyparsing==2.4.7
pyrsistent==0.17.3
python-dateutil==2.8.1
pytz==2020.1
pywinpty==0.5.7
pyzmq==19.0.2
requests==2.24.0
selenium==3.141.0
Send2Trash==1.5.0
six==1.15.0
sqlparse==0.3.1
terminado==0.8.3
testpath==0.4.4
tornado==6.0.4
urllib3==1.25.10
wcwidth==0.2.5
webencodings==0.5.1
Werkzeug==1.0.1

Procfile

web: gunicorn app:app --log-file -

Befolgen Sie die nachstehenden Schritte, um Heroku bereitzustellen!

heroku login
heroku git:clone -a [Mein App-Name]
cd [Mein App-Name]
* Wenn Sie im aktuellen Verzeichnis arbeiten, müssen Sie dies nicht tun
git add . #Ich füge eine Datei hinzu
git commit -am "make it better" #Ich aktualisiere die geänderte Datei
git push heroku master #Ich dränge

Lassen Sie uns vorerst eine Nachricht an line senden.

Herausforderungen bei der Erstellung des Linebots, den Sie diesmal erstellen möchten

Verwenden Sie Google Map Api, um Informationen zum Geschäft abzurufen.

Lösungen: Nichts Bestimmtes. Schauen Sie sich einfach die Google Map Api-Dokumentation an.

Benutzerinformationen einzeln speichern.

Lösungen: Das war ziemlich nervig. Zuerst dachte ich, ich sollte versuchen, die Datenbank zu verwenden, aber diesmal hörte ich auf, weil die Lernkosten hoch zu sein schienen. Als nächstes habe ich versucht, das Wörterbuch in einer Pickle-Datei zu speichern, aber aus irgendeinem Grund hat es nicht funktioniert. Sind Binärdaten nutzlos? ?? Die Ursache ist nicht klar. Schließlich habe ich beschlossen, das Wörterbuch im JSON-Format zu speichern. Es hat funktioniert, aber jedes Mal, wenn ich eine Änderung vorgenommen habe, sind die Daten verschwunden. Ich dachte, ich würde eine JSON-Datei senden, wenn ich das Passwort online eingebe, aber diesmal hörte ich auf.

Empfangen Sie eine Nachricht vom Benutzer und antworten Sie entsprechend der Nachricht.

Lösungen Das war wieder ziemlich schwierig. Zusätzlich zum "Registrieren" und "Löschen" von Variablen habe ich vier Antworten gegeben: "Bestätigen" der von mir erstellten Variablen und "Bestätigen" der Informationen zu Geschäften und Einrichtungen. (Es erklärt die Lösung nicht, aber ich hoffe, Sie können die Python-Datei unten sehen.)

Erstellte Datei (außer require.txt, Procfile)

Ich beabsichtige, so viele Bibliotheken und Grammatiken wie möglich für mein Studium aufzunehmen.

app.py Hauptdatei.

import json

class create_reply_message(object):
    user_id = None
    user_dictionaries = None
    the_user_dictionary = None

    def __init__(self, user_id=None,*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.user_id = user_id

        #Wörterbuch vorbereiten
        with open("users_info.json", 'r') as f:
            self.user_dictionaries = json.load(f)
            self.the_user_dictionary = self.user_dictionaries.setdefault(self.user_id, {})

    def legister_fav_shop_institution(self, shop_institute_actual_name, shop_institute_variable):
        user_dictionaries_copy = self.user_dictionaries.copy()
        the_user_dictionary_copy = user_dictionaries_copy[self.user_id]
        the_user_dictionary_copy[shop_institute_variable] = shop_institute_actual_name
        with open("users_info.json", 'w') as f:
            json.dump(user_dictionaries_copy, f)
        return 'Abschluss der Registrierung!'

    def confirm_what_legistered(self):
        if self.the_user_dictionary == {}:
            reply_msg = "Es sind noch keine Geschäfte / Einrichtungen registriert ..."
            return reply_msg
        else:
            reply_msg = []
            for dict_key in self.the_user_dictionary:
                reply_msg.append(dict_key)
            reply_msg.insert(0, f'Die registrierten Geschäfte und Einrichtungen sind unten{len(self.the_user_dictionary)}Einer! !!')
            return "\Hmm ·".join(reply_msg)

    def delete_fav_shop_institution(self, shop_institute_variable):
        user_dictionaries_copy = self.user_dictionaries.copy()
        the_user_dictionary_copy = user_dictionaries_copy[self.user_id]
        del the_user_dictionary_copy[shop_institute_variable]
        with open("users_info.json", 'w') as f:
            json.dump(user_dictionaries_copy, f)
        return shop_institute_variable + 'Ist gelöscht!'

google_maps_client.py Eine Klasse, die nur Informationen von Google Map Api erhält und diese in die Variable self.


import requests
from urllib.parse import urlencode, urlparse, parse_qsl


class locate_fav_shop_institution(object):
    data_type="json"
    location_query = None
    api_key = None

    def __init__(self, api_key=None, shop_institution_name=None,
                 *args, **kwargs):
        super().__init__(*args, **kwargs)
        if api_key == None:
            raise Exception('API key is required')
        self.api_key = api_key
        self.location_query = shop_institution_name

        if self.location_query != None:
            self.place_id = self.extract_place_id()
        if self.place_id == '':
            raise Exception('Your fav shop/instition couldn\'t be located.')
        self.fav_shop_institution_info = self.extract_details()

    def extract_place_id(self):
        base_endpoint_places = f"https://maps.googleapis.com/maps/api/place/findplacefromtext/{self.data_type}"
        params = {
            "key": self.api_key,
            "input": self.location_query,
            "inputtype": "textquery",
             "fields": "place_id"
        }

        params_encoded = urlencode(params)
        places_endpoint = f"{base_endpoint_places}?{params_encoded}"

        r = requests.get(places_endpoint)
        if r.status_code not in range(200, 299):
            return ""
        return r.json()['candidates'][0]['place_id']

    def extract_details(self):
        detail_base_endpoint = f"https://maps.googleapis.com/maps/api/place/details/{self.data_type}"

        detail_params = {
            "place_id": f"{self.place_id}",
            "fields": "business_status,opening_hours,formatted_phone_number,website",
            "language": "ja",
            "key": self.api_key
        }
        detail_params_encoded = urlencode(detail_params)
        detail_url = f"{detail_base_endpoint}?{detail_params_encoded}"
        r = requests.get(detail_url)
        return r.json()['result']

how_to_reply.py Eine Klasse, mit der Sie auf Nachrichten antworten können, die von der anderen Partei empfangen wurden.


import json

class create_reply_message(object):
    user_id = None
    user_dictionaries = None
    the_user_dictionary = None

    def __init__(self, user_id=None,*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.user_id = user_id

        #Wörterbuch vorbereiten
        with open("users_info.json", 'r') as f:
            self.user_dictionaries = json.load(f)
            self.the_user_dictionary = self.user_dictionaries.setdefault(self.user_id, {})

    def legister_fav_shop_institution(self, shop_institute_actual_name, shop_institute_variable):
        user_dictionaries_copy = self.user_dictionaries.copy()
        the_user_dictionary_copy = user_dictionaries_copy[self.user_id]
        the_user_dictionary_copy[shop_institute_variable] = shop_institute_actual_name
        with open("users_info.json", 'w') as f:
            json.dump(user_dictionaries_copy, f)
        return 'Abschluss der Registrierung!'

    def confirm_what_legistered(self):
        if self.the_user_dictionary == {}:
            reply_msg = "Es sind noch keine Geschäfte / Einrichtungen registriert ..."
            return reply_msg
        else:
            reply_msg = []
            for dict_key in self.the_user_dictionary:
                reply_msg.append(dict_key)
            reply_msg.insert(0, f'Die registrierten Geschäfte und Einrichtungen sind unten{len(self.the_user_dictionary)}Einer! !!')
            return "\Hmm ·".join(reply_msg)

    def delete_fav_shop_institution(self, shop_institute_variable):
        user_dictionaries_copy = self.user_dictionaries.copy()
        the_user_dictionary_copy = user_dictionaries_copy[self.user_id]
        del the_user_dictionary_copy[shop_institute_variable]
        with open("users_info.json", 'w') as f:
            json.dump(user_dictionaries_copy, f)
        return shop_institute_variable + 'Ist gelöscht!'

personal_informations.py Da es persönliche Informationen enthält, werden diese nicht veröffentlicht. Ich habe dem unzähligen Substantiv namens information s hinzugefügt.

confirm.txt Text für die Vorlage, die gesendet werden soll, wenn die Informationen des Geschäfts / der Einrichtung abgerufen werden.

$Ich habe den Namen gesehen!
$businessStatus

Der Zeitplan für diese Woche ist ↓↓
$openingHours

Wenn etwas passiert, kontaktieren Sie die unten stehende Telefonnummer!
$phoneNumber

Die Homepage ist übrigens ↓↓
$website

explanation.txt Text für die Vorlage zur Beschreibung des Bots.

$Vielen Dank für die Kontaktaufnahme Name!

$Wenn Sie wissen möchten, welche Geschäfte / Einrichtungen dieser Name bisher registriert hat
"Bestätigung"Bitte sende!
(Beispiel: Bestätigung)

$Wenn Sie die Informationen von Geschäften und Einrichtungen überprüfen möchten, die dieser Name bisher registriert hat
"Bestätigung[Registrierter Name]"Bitte sende!
(Beispiel: Bestätigungsbibliothek)

Wenn Sie neue Geschäfts- / Einrichtungsinformationen registrieren möchten
"Anmeldung[Offizieller Name des Geschäfts / der Einrichtung] [Registrierter Name]"bitte sende!
(Beispiel: Registrierung: Bibliothek am Tokyo Institute of Technology)

Im Gegenteil, wenn Sie die Informationen des Shops / der Einrichtung löschen möchten
"Löschen[Registrierter Name]"bitte sende!
(Beispiel: Gelöschte Bibliothek)

Freut mich, dich kennenzulernen! !!

user_info.json Eine JSON-Datei, in der Benutzerinformationen gespeichert werden. Die Pickle-Datei hat nicht funktioniert, also habe ich mich für json entschieden. Ich wollte wenn möglich die Datenbank benutzen.

{user_id: {"\u81ea\u8ee2\u8eca\u5c4b": "\u30b5\u30a4\u30af\u30eb\u30d9\u30fc\u30b9\u3042\u3055\u3072\u4e09\u9df9\u4e95\u53e3\u5e97", "\u3061\u305a\u3051": "\u6771\u4eac\u5de5\u696d\u5927\u5b66\u4ed8\u5c5e\u56f3\u66f8\u9928"}}

Es wird überhaupt nicht erklärt, aber ich habe es so abgeschlossen. Ich bin ein Anfänger, obwohl es Python ist, ist der Code ziemlich schwer zu lesen, aber wenn Sie interessiert sind, lesen Sie ihn bitte.

Eigentlich verwenden

Senden Sie eine entsprechende Nachricht

Senden Sie eine entsprechende Nachricht und geben Sie eine Line-Bot-Beschreibung zurück. image.png

Senden Sie die Nachricht "Bestätigung"

Sie können die Namen überprüfen, die Sie bisher registriert haben! image.png

Senden Sie die Nachricht "Registrierung [Offizieller Name] [Name, den Sie registrieren möchten]"

Sie können Ihre Lieblingsgeschäfte und -einrichtungen neu registrieren. Stellen Sie sicher, dass der Abstand zwischen ihnen in voller Breite ist! image.png

Senden Sie die Nachricht "Löschen [registrierter Name]"

Sie können die bisher registrierten Geschäfte / Einrichtungen löschen. image.png

Überprüfen Sie hier erneut.

image.png

Senden Sie die Nachricht "Bestätigung [Registrierter Shop / Einrichtung]"

Sie können Geschäftszeiten, Telefonnummern und Webseiten überprüfen, um festzustellen, ob das Geschäft geöffnet ist. image.png

Aufgabe

Impressionen

Die Liste der schlechten Dinge hat kein Ende, aber die Herstellung macht wirklich Spaß! Da mein Hauptfach Maschinenbau ist, habe ich nicht viele Möglichkeiten, Programmierung zu schreiben, und ich habe möglicherweise keine Zeit, andere Dinge zu studieren, weil ich mit Laborunterricht ziemlich beschäftigt sein werde, aber ich kann mir Ideen einfallen lassen und Dinge machen. In dieser Hinsicht ist es dasselbe, und ich bin sicher, dass es von Vorteil sein wird. Und vor allem macht es Spaß, deshalb möchte ich weiter programmieren.

Schließlich

Es ist ein Line-Bot von ↓. Es wurde von einem Anfänger gemacht und es gibt viele Fehler (ich kenne einige, aber ich habe es nicht behoben, lol) Ich habe es sehr schwer gemacht! Ich wäre Ihnen dankbar, wenn Sie Freunde hinzufügen könnten. messageImage_1602075610648.jpg

Recommended Posts

Ich habe einen Line-Bot mit Python gemacht!
Ich habe einen Python-Text gemacht
Ich habe einen Anmelde- / Abmeldevorgang mit Python's Bottle durchgeführt.
Ich habe mit Python eine Lotterie gemacht.
Ich habe mit Python einen Daemon erstellt
Ich habe einen schnellen Feed-Reader mit Feedparser in Python erstellt
Ich habe Chatbot mit LINE Messaging API und Python erstellt
Ich habe ein Pay-Management-Programm in Python erstellt!
Ich habe mit Python einen Zeichenzähler erstellt
Anfänger: Ich habe einen Launcher mit dem Wörterbuch erstellt
Ich habe mit Python eine Hex-Map erstellt
Nachdem ich Python3 studiert hatte, machte ich einen Slackbot
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe mit Python einen Neuronensimulator erstellt
〇✕ Ich habe ein Spiel gemacht
Ich habe einen Pokerspielserver Chat-Holdem mit Websocket mit Python erstellt
Ich habe Chatbot mit der LINE Messaging API und Python (2) ~ Server ~ erstellt
Ich habe eine Python-Wörterbuchdatei für Neocomplete erstellt
Ich habe mit Python eine Bot-Wettervorhersage gemacht.
Ich habe eine GUI-App mit Python + PyQt5 erstellt
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
Vorgehensweise zum Erstellen eines mit Python erstellten LineBot
[Python] Ich habe mit Tkinter einen Youtube Downloader erstellt.
Ich habe versucht, eine CSV-Datei mit Python zu lesen
Ich habe ein Caesar-Kryptografieprogramm in Python erstellt.
Ich habe mit Python ein Bin-Picking-Spiel gemacht
Mattermost Bot mit Python gemacht (+ Flask)
Python Qiita API Wrapper "qiipy" gemacht
Ich habe einen Blackjack mit Python gemacht!
Ich habe einen Zwietrachtbot gemacht
Ich habe mit Python einen Blackjack gemacht.
Ich habe Wordcloud mit Python gemacht.
Ich habe einen Twitter BOT mit GAE (Python) gemacht (mit einer Referenz)
Ich habe mit Python ein Weihnachtsbaum-Beleuchtungsspiel gemacht
Ich habe mit Python eine App für die Benachrichtigung über Netznachrichten erstellt
Ich habe eine VM erstellt, auf der OpenCV für Python ausgeführt wird
Ich habe ein Python-Modul erstellt, um Kommentare zu übersetzen
Ich habe eine Python3-Umgebung unter Ubuntu mit direnv erstellt.
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
[Python] Ich habe einen Klassifikator für Iris erstellt [Maschinelles Lernen]
[Python] Ich habe versucht, einen lokalen Server mit flask auszuführen
Ich habe versucht, mit Python eine Pseudofraktalfigur zu zeichnen
Ich habe eine Python-Bibliothek erstellt, die einen rollierenden Rang hat
Ich habe mit Ren’py ein Einführungsspiel für das Schulfest gemacht
Ich habe versucht, Python (3) anstelle eines Funktionsrechners zu verwenden
Ich habe ein Skript erstellt, das das aktive Fenster mit win32gui von Python aufzeichnet
Ich habe ein einfaches Tippspiel mit tkinter of Python gemacht
Ich habe ein CUI-basiertes Übersetzungsskript erstellt (2)
Erstellen Sie mit tkinter eine Python-GUI
Ich habe einen Wikipedia Gacha Bot gemacht
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Zeichnen einer Silbersteinkurve mit Python
[VSCode] Ich habe ein Benutzer-Snippet für Python-Druck-F-String erstellt
Ich habe meine eigene Python-Bibliothek erstellt
Ich habe versucht, LINE-Bot mit Python + Flask + ngrok + LINE Messaging API zu erstellen