La raison en est que le deuxième argument est une ** métaclasse ** qui hérite du type. ** L'instance de métaclasse est une classe **, donc cette vérification est True si la classe hérite de la classe Model. Autrement dit, l'expression suivante renvoie True. [^ 2]: Il semble que vous puissiez créer une classe de modèle abstraite qui définit les attributs communs dans l'application, mais allez-vous créer une hiérarchie de modèles aussi compliquée en pratique? Python [Python] J'ai créé un robot Line qui demande au hasard des mots anglais. Introduction La dernière fois, j'ai créé un robot de retour de perroquet, alors appliquez-le J'ai créé un robot qui demande au hasard des mots anglais.

Lien de l'article précédent https://qiita.com/takuya0125/items/36bdea94c249f592a59f

Je vais omettre la méthode d'opération de Heroku et git.

Structure du répertoire

J'ai créé les fichiers suivants dans le répertoire. ・main.py Source principale pour frapper et poser des questions sur l'API de messagerie Line

・ High1.txt Un fichier texte qui décrit les mots anglais et leur signification dans l'unité de cours de première année du secondaire

・ Procfile · Exigences · Durée (.Git dans un fichier caché)

la mise en oeuvre

Je vais vous expliquer le contenu du fichier main.py. Comme il est long, il est plus facile de comprendre si les fichiers sont séparés, mais ils ont été consolidés en un seul.

main.py


#Importation de module
from flask import Flask, request, abort
 
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)
import os
import re
import random

#high1.Lire txt
source = 'high1.txt'
with open(source, encoding="utf-8_sig") as f:
    data = f.read()
english_words = re.findall('[a-z]+', data) #Extraction d'alphabet
ja = re.findall('.*[Ah-Hmm].*', data) #Extraction du japonais
words_dict = dict(zip(english_words, ja)) #Stockez chacun dans un dictionnaire

answer =[] #Créer une boîte japonaise de réponses aux mots

#Questions avec une liste de mots et de significations de 1 à 4 choix
def question():
    question_word =random.choice(english_words)
    correct_answer = words_dict[question_word]
    meanings_copy = ja.copy() #Faites une copie pour extraire les mauvais choix
    meanings_copy.remove(correct_answer)
    wrong_answers = random.sample(meanings_copy, 3)
    answer_options = [correct_answer] + wrong_answers
    random.shuffle(answer_options) #Mélangez la réponse

    list =[] #Mettez les options à poser dans la boîte
    for i in range(4):
        x = '{}. {}'.format(i + 1, answer_options[i])
        list.append(x)
        res = re.findall(correct_answer, x)
        if len(res) ==1:
            answer_num = i+1
            answer.append(answer_num)
            
    question_message = ('problème:{}\n{}\n{}\n{}\n{}\nYour answer?'.format(question_word,list[0],list[1],list[2],list[3]))
    return question_message #question_Retour au message

C'est la question pour les mots anglais.

Ensuite, nous allons créer un lien avec l'API de messagerie Line.

main.py


app = Flask(__name__)
app.debug = False
 
#Obtenir des variables d'environnement
#Obtenez et définissez le jeton d'accès et le secret de chaîne définis dans les développeurs LINE
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]
 
line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)

Jusqu'à présent, des paramètres tels que des jetons ont été définis.

Ensuite, la réponse de l'utilisateur à la question réelle est décrite.

main.py


@app.route("/callback", methods=['POST'])
def callback():
    #Obtenez la valeur pour la vérification de signature à partir de l'en-tête de la demande.
    signature = request.headers['X-Line-Signature']
 
    #Obtenez le corps de la requête.
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)
 
    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)
    return 'OK'

@handler.add(MessageEvent, message=TextMessage) #Réponse au fichier texte
def handle_message(event):

    question_message = question() #Exécuter une question et l'enregistrer dans une variable
    text_pass = event.message.text #Enregistrer le message reçu dans la variable

    #Si l'utilisateur envoie "a", "a", "0", la question sera posée.#
    if text_pass == 'a' or text_pass =='Ah' or text_pass =='0':
        line_bot_api.reply_message(
            event.reply_token,
            [TextSendMessage(text = question_message),])
    elif int(text_pass) == int(answer[-2]): #Si le numéro envoyé par l'utilisateur est correct, répondez
        line_bot_api.reply_message(event.reply_token,
        [TextSendMessage(text = 'Bonne réponse'),])
    elif int(text_pass) != int(answer[-2]): #Si le numéro envoyé par l'utilisateur est incorrect, répondez
        line_bot_api.reply_message(event.reply_token,
        [TextSendMessage(text = 'Réponse incorrecte'),
         TextSendMessage(text = 'La bonne réponse est{}'.format(answer[-2]))],)
        

#Réglage du numéro de port
if __name__ == "__main__":
#    app.run()
    port = int(os.getenv("PORT"))
    app.run(host="0.0.0.0", port=port)

Jusqu'à ce point, il sera lié à Line. Il est difficile d'entrer «a», «a» et «0» chaque fois que vous posez une question. Cette fois, nous continuerons à nous développer jusqu'à présent et à l'améliorer s'il y a une opportunité dans le futur.

Résumé

La coopération avec Line n'est pas un obstacle si élevé En fait, la communication avec les utilisateurs semble être un obstacle. À l'avenir, nous multiplierons et mettrons en œuvre des idées susceptibles d'accroître la coopération avec l'API de messagerie Line. Créez petit à petit des outils conviviaux.

5 mars 2020 Révision du programme int(answer[0])⇒int(answer[-2]) Obtenez l'avant-dernière liste

référence

Comment créer un mot anglais bot

Les références ・ Ingéniosité du message de réponse https://miyabi-lab.space/blog/21 Partie correspondante TextSendMessage (text = 'Qu'est-ce que "' + event.message.text + '"?') )

・ Créez plusieurs messages de réponse https://engineering.linecorp.com/ja/blog/imezimatsupumetsuseziwoshi-tsutezhong-dian-nicheng-richi-renaibotsutowozuo-rimashita/ Partie correspondante TextSendMessage (text = 'Si vous envoyez des informations de localisation, je vous indiquerai une liste des gares ouvertes jusqu'au dernier train (* pictogramme 1)'), TextSendMessage(text='line://nv/location'),

・ Fonctionnalisation et exécution de mots anglais https://shikasen-engineer.com/python_line_bot/ Partie correspondante result = sc.getNews(word)

· Autre https://datacoach.me/data/engineering/python-linebot-talk/ https://keinumata.hatenablog.com/entry/2018/05/08/122348 https://myafu-python.com/line-basic-1/

Recommended Posts