[PYTHON] J'ai fait mon chien "Monaka Bot" avec Line Bot

Screenshot_20160408-151644.png

J'ai essayé LineBot. Je suis désolé pour l'argent, alors je l'ai construit avec GAE. J'ai utilisé Python / Flask parce que Java est maladroit.

Génération de projet avec GCP

Si vous êtes nouveau dans ce domaine, il sortira.

Préparation de app.yaml

La source ressemble à ceci.

app.yaml


runtime: python27
api_version: 1
threadsafe: yes

- url: .*  # This regex directs all routes to main.app
  script: main.app

libraries:
- name: ssl
  version: latest

Au début, il s'adapte sans ajouter la bibliothèque ssl.

Implémentation du callback

Lorsque l'utilisateur parle au Bot, l'API spécifiée dans le rappel est appelée. C'est comme appeler l'API de Line dans un rappel et envoyer du texte et des photos. Veuillez vous référer au manuel et aux autres qiita pour les paramètres de rappel.

La source ressemble à ceci.

main.py


# -*- coding: utf-8 -*-

import logging, random
import requests

from flask import Flask, request,Response

app = Flask(__name__)
app.config.from_object(__name__)
app.logger.setLevel(logging.DEBUG)

LINE_ENDPOINT = "https://trialbot-api.line.me"
HEADERS = {
    "X-Line-ChannelID": "<Voir les informations du bassin>",
    "X-Line-ChannelSecret": "<Voir les informations du bassin>",
    "X-Line-Trusted-User-With-ACL": "<Voir les informations du bassin>"
}

#Groupe de messages fixes
TALKS = [
    "Hou la la! Allons! !!",
    "Ouais ... je veux ...",
    "Pipi! Pipi!",
    "Où est allé le propriétaire",
    "Shinotomo ~~~",
    "Ngu ~ ngu ~~",
    "Hehehehehehehehe",
    "Uo ・ e ・ oU",
    "Lécher lécher",
    "Je veux me lécher les mains",
    "Je me demande si le riz est tombé",
    "Facile et facile",
    "Regardez!",
    "Danse! Danse Danse! !!"
]

#Groupe d'images
IMAGES = [
    {"origin": "https://storage.googleapis.com/linebot-1275.appspot.com/monaka1.jpg ",
     "thumb": "https://storage.googleapis.com/linebot-1275.appspot.com/monaka1thum.jpg "}
]


@app.route("/")
def hello():
    return "line bot api"


@app.route("/callback", methods=["POST"])
def callback():
    # TODO Signature validation

    app.logger.info(request.json)
    app.logger.info(request.headers)
    req = request.json["result"][0]

    if req["eventType"] == "138311609100106403":
        """
La réception des demandes d'amis vient ici.
Envoyez un message de remerciement dès que vous postulez.
TODO non vérifié
        """

        send_text([req["from"]], u"C'est aussi à l'intérieur. Merci pour votre demande d'ami.")

    elif req["eventType"] == "138311609000106303":
        """
Venez ici lorsque vous recevez un message de conversation.
Lorsque vous dites "Monaka", une photo et un message sont renvoyés.
Sinon, le texte préparé est renvoyé au hasard.
        """

        to = [req["content"]["from"]]
        if req["content"]["text"] == u"Monaka":
            #Envoyer des photos
            i = random.randint(0, len(IMAGES) - 1)
            send_picture(to, IMAGES[i])
            send_text(to, "Quoi?")
        else:
            #Envoyer un message
            i = random.randint(0, len(TALKS) - 1)
            send_text(to, TALKS[i])

    #La valeur de retour est fixée à 200
    return Response(status=200)


def send_text(to, text):
    """
Envoyer un SMS à
    """
    content = {
        "contentType": 1,
        "toType": 1,
        "text": text
    }
    events(to, content)


def send_picture(to, img):
    """
Envoyer l'image à
    """
    content = {
        "contentType": 2,
        "toType": 1,
        "originalContentUrl": img["origin"],
        "previewImageUrl": img["thumb"]
    }
    events(to, content)


def events(to, content):
    """
Données pour au(Texte / images / vidéos)Envoyer
    """
    app.logger.info(content)
    data = {
        "to": to,
        "toChannel": "1383378250",
        "eventType": "138311608800106203",
        "content": content
    }
    r = requests.post(LINE_ENDPOINT + "/v1/events", json=data, headers=HEADERS)
    app.logger.info(r.text)

définition d'une adresse IP statique

Le serveur étant sur liste blanche, le serveur de Line renverra une erreur si vous ne définissez pas l'adresse IP. Cependant, comme il s'agit de GAE, il n'y a pas d'adresse IP fixe. Lorsque j'ai essayé d'y accéder, j'ai eu une erreur 403 et le message suivant a été affiché.

{"statusCode":"427","statusMessage":"Your ip address [107.178.194.118] is not allowed to access this API."}

Donc, si vous ajoutez cette adresse IP et la déplacez

{"statusCode":"427","statusMessage":"Your ip address [107.178.194.122, 10.128.141.149] is not allowed to access this API."}

Ensuite, on m'a demandé de définir quelque chose qui semble être une adresse IP interne, je vais donc le définir docilement.

Ça a marché. Il y a de fortes chances que l'adresse IP change un jour et que cela ne fonctionne pas. Je voudrais me laisser la solution à l'avenir.

Demander un ami

Il semble que vous puissiez le faire à partir du code QR. (Je n'ai pas compris et j'ai souffert tout le temps) Cette fois, mon chien "Monaka Bot"

rjs9046g.png

Vous pouvez ajouter à partir de.

Recommended Posts

J'ai fait mon chien "Monaka Bot" avec Line Bot
J'ai fait un robot de remplacement de tampon avec une ligne
J'ai créé un Bot LINE avec Serverless Framework!
Made Mattermost Bot avec Python (+ Flask)
[AWS] J'ai créé un BOT de rappel avec LINE WORKS
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
J'ai créé un bot de livre de compte de ménage avec LINE Bot
J'ai essayé de faire LINE BOT avec Python et Heroku
J'ai fait un blackjack avec du python!
J'ai fait ma propre langue. (1)
J'ai fait ma propre langue (2)
J'ai fait ma propre AML
J'ai fait un robot discord
J'ai créé COVID19_simulator avec JupyterLab
J'ai créé Word2Vec avec Pytorch
J'ai fait un blackjack avec Python.
J'ai créé wordcloud avec Python.
J'ai essayé de créer LINE-bot avec Python + Flask + ngrok + LINE Messaging API
J'ai fait une caméra de surveillance avec Raspberry PI pour la première fois.
Quand j'ai créé un Discord Bot, mes camarades de classe ont détruit mon ordinateur
[AWS] J'ai créé un BOT de rappel avec LINE WORKS (implémentation)
J'ai fait un wikipedia gacha bot
J'ai créé ma propre bibliothèque Python
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
J'ai créé un bot Twitter avec Go x Qiita API x Lambda
J'ai fait un compteur de caractères avec Python
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu de vie avec Numpy
J'ai fait un générateur Hanko avec GAN
J'ai fait un jeu rogue-like avec Python
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait une application WEB avec Django
J'ai fait un simulateur de neurones avec Python
Avec LINEBot, j'ai fait une application qui m'informe de "l'heure du bus"
J'ai fait une prévision météo de type bot avec Python.
J'ai essayé de créer un bloqueur de filles pourries sur Twitter avec Python ①
Procédure de création d'un LineBot réalisé avec Python
[Python] J'ai créé un téléchargeur Youtube avec Tkinter.
J'ai fait un simple portefeuille de Bitcoin avec pycoin
J'ai créé mon propre générateur de site statique primitif
Bot LINE sans serveur conçu avec IBM Cloud Functions
J'ai essayé d'utiliser Linux avec Discord Bot
J'ai fait un graphique de nombres aléatoires avec Numpy
J'ai fait un jeu de cueillette avec Python
J'ai créé mon propre robot de liaison parallèle (édition logicielle)
J'ai créé un serveur syslog prêt à l'emploi avec Play with Docker
J'ai fait un jeu d'éclairage de sapin de Noël avec Python
J'ai créé une fenêtre pour la sortie du journal avec Tkinter
J'ai créé une application de notification de nouvelles en ligne avec Python
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
J'ai fait un jeu mono tombé avec Sense HAT
Je l'ai fait avec le traitement, "Le gars d'Othello live de Sakanaction".
J'ai fait mon propre robot à liaison parallèle (édition mécanique)