En Python, j'ai créé un LINE Bot qui envoie des informations sur le pollen à partir des informations de localisation.

(1. Origines

・ Je souffre toujours de pollen de cette époque. ・ C'est difficile pour les personnes atteintes de pollinose à cause de la corona cette année. ・ Masque insuffisant. ・ Je veux créer quelque chose en utilisant python, grattage et heroku. ・ Image de sortie ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ unnamed.png

(2) Construction de l'environnement

Créez un répertoire line_kafun sur votre bureau. Créez main.py qui gère line-sdk et weather.py qui collecte des informations sur le pollen à partir des informations météo de Yahoo

La structure des répertoires est la suivante.

line_kafun
├main.py
├weather.py
├Procfile
├runtime.txt
└requirements.txt

Installez les packages requis.

pip install flask
pip install line-bot-sdk
pip install beautifulsopu4
pip install gunicorn
pip install lxml
pip install requests

(3)main.py

.py:main.py


from flask import Flask, request, abort
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,LocationMessage
)
import os
import weather as wt #weather.Importer py


app = Flask(__name__)

#Paramètres des variables d'environnement Heroku
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)

@app.route("/")
def hello_world():
    return "hello world!"


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

    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)
    return 'OK'



@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    if 'pollen' in event.message.text:
        line_bot_api.reply_message(
            event.reply_token,
       [
            TextSendMessage(text='Quelles sont vos informations de localisation actuelles?'),
            TextSendMessage(text='https://line.me/R/nv/location/'),
            ]
        )
  

@handler.add(MessageEvent, message=LocationMessage)
def handle_location(event):
    text = event.message.address
    result = wt.get_weather(text)
    line_bot_api.reply_message(
    event.reply_token,
    TextSendMessage(text=result + '\uDBC0\uDC20')
    )


if __name__ == "__main__":
    port = int(os.getenv("PORT", 5000))
    app.run(host="0.0.0.0", port=port)

Explication supplémentaire

-Pour l'adresse à la place de text = event.message.address, reportez-vous à la [référence api] de linesevelopers (https://developers.line.biz/ja/reference/messaging-api/#audio-message). Capture d'écran 2020-03-25 22.51.02.png -Pour la partie TextSendMessage, je me suis référé au schéma d'URL de la référence API LINE. スクリーンショット 2020-03-25 23.03.19.png ・ ** Le schéma d'URL ne peut être utilisé que pour des discussions en tête-à-tête, pas pour des groupes. ** ** ・ '\ UDBC0 \ uDC20' est un pictogramme, et je me suis référé à Utiliser le "pictogramme LINE" dans LINE BOT. ..

(4)weather.py Récupération des informations sur le pollen de Yahoo.

.py:weather.py


import requests
from bs4 import BeautifulSoup
import re
import lxml


def get_weather(text):
    location = re.findall('\d{3}-\d{4}',text)
    location2 = location[0].replace('-','')
    url1 = "https://weather.yahoo.co.jp/weather/search/?p={}".format(location2)
    url2 = ""

    #Obtenez des informations html à partir de la première URL et obtenez la deuxième URL à partir de là
    res = requests.get(url1)
    res.encoding = res.apparent_encoding
    html_doc = res.text
    soup = BeautifulSoup(html_doc,"lxml")
    content_1 = soup.find_all(id = 'rsltmuni')
    for i in content_1:
        content_2 = i.find('a')
        url2 = 'https:' + content_2.get('href')


    #Obtenez les dates d'aujourd'hui et de demain à partir de la deuxième URL(today、nextday)
    res = requests.get(url2)
    res.encoding = res.apparent_encoding
    html_doc = res.text
    soup = BeautifulSoup(html_doc,"lxml")
    content_3 = soup.find_all('p',class_='date')
    today = content_3[0].get_text()
    nextday = content_3[1].get_text()

    #Obtenez le statut pollinique aujourd'hui et demain
    content_4 = soup.find_all('p',class_='flying')
    today_kafun = content_4[0].get_text()
    nextday_kafun = content_4[1].get_text()

    #Obtenir la zone
    content_5 = soup.find_all('h2',class_='yjM')
    area = content_5[0].get_text()


    result = today + 'de' + area + 'Est' + '「{}」'.format(today_kafun) + 'C'est vrai.' + '\n' +'\n'+ nextday + 'de' + area + 'Est' + '「{}」'.format(nextday_kafun) + 'C'est vrai.' + '\n' +'\n' + 'Faites attention.'

    return result

(5) Déployer sur Heroku et configurer les webhooks LINE Developers

Enfin, créez les fichiers requis (requirements.txt, Procfile, runtime.txt) et déployez-les sur Heroku. La méthode de déploiement est introduite sur de nombreux sites, je vais donc l'omettre. Pour plus de détails, reportez-vous à Créer un tableau d'affichage avec Heroku, Flask, SQL Alchemy. En outre, les paramètres Webhook des développeurs LINE sont également introduits sur de nombreux sites, je les omettrai donc. Pour plus de détails, reportez-vous à Créer un LINE BOT.

Lorsque vous entrez «pollen» dans le LINE Bot terminé, il vous sera demandé des informations de localisation, alors appuyez dessus pour obtenir des informations sur le pollen (terminé).

Recommended Posts

En Python, j'ai créé un LINE Bot qui envoie des informations sur le pollen à partir des informations de localisation.
J'ai créé un bot Discord en Python qui se traduit quand il réagit
J'ai essayé de faire LINE BOT avec Python et Heroku
J'ai créé un Line Bot qui utilise Python pour récupérer les e-mails non lus de Gmail!
J'ai créé un robot LINE qui envoie des images recommandées tous les jours à l'heure
Je souhaite envoyer un message de Python à LINE Bot
J'ai fait un programme de gestion de la paie en Python!
J'ai créé un robot Line qui devine le sexe et l'âge d'une personne à partir de l'image
J'ai créé un générateur brouillé qui encode vos phrases préférées de UTF-8 à Shift-JIS (cp932) en Python
J'ai créé une application Web en Python qui convertit Markdown en HTML
[IOS] J'ai créé un widget qui affiche la tendance de Qiita dans Pythonista3. [Python]
J'ai fait un robot de remplacement de tampon avec une ligne
Un mémo que j'ai écrit un tri rapide en Python
J'ai créé un Bot LINE avec Serverless Framework!
J'ai créé un programme cryptographique César en Python.
Made Mattermost Bot avec Python (+ Flask)
[Python] J'ai créé un robot qui me dit la température actuelle lorsque j'entre un nom de lieu sur LINE
J'ai créé une image Docker qui peut appeler FBX SDK Python à partir de Node.js
[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 créé une VM qui exécute OpenCV pour Python
Un modèle personnellement utilisé pour créer Discord BOT en Python (Notes)
J'ai fait un texte Python
J'ai fait un robot discord
J'ai fait un jeu de frappe simple avec tkinter de Python
python Extraction de condition de la liste que j'oublie souvent
J'ai créé un lecteur de flux rapide en utilisant feedparser en Python
Jusqu'à ce que Django retourne quelque chose avec un robot de ligne!
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python
[AWS] J'ai créé un BOT de rappel avec LINE WORKS (implémentation)
J'ai fait un Line-bot avec Python!
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
J'ai essayé la notification de ligne en Python
Créer un bot LINE avec Django
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
J'ai créé un programme qui résout la recherche d'erreur en quelques secondes
Facile! Implémenter un bot Twitter qui s'exécute sur Heroku en Python
Décrire un réseau qui accepte les informations d'annotation des utilisateurs dans Keras
Comment obtenir une chaîne à partir d'un argument de ligne de commande en python
J'ai créé un robot Twitter qui marmonne le Pokémon capturé par #PokemonGO
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python (2) ~ Server ~
[python] J'ai créé une classe qui peut écrire rapidement une arborescence de fichiers
J'ai créé un plugin pour générer une table Markdown à partir de csv avec Vim
[Python] J'ai fait un décorateur qui ne semble pas avoir d'utilité.
J'ai fait un compteur de caractères avec Python
J'ai essayé de développer un formateur qui génère des journaux Python en JSON
[Python] J'ai créé un utilitaire qui peut accéder au type dict comme un chemin
J'ai créé un script en python pour convertir des fichiers .md au format Scrapbox
J'ai fait une simple minuterie qui peut être démarrée depuis le terminal
J'ai fait une carte hexadécimale avec Python