Je veux connaître la météo avec LINE bot avec Heroku + Python

Objectif

Même si je suis ingénieur, je pense toujours aux vêtements parce que je sors, mais je fais souvent des erreurs parce que je suis une personne qui ne vérifie pas les prévisions météorologiques. Par conséquent, je voudrais enseigner à LINE bot la météo (température). Nous vous recommandons de commencer par créer et tester avec un retour de perroquet, puis de faire le codage proprement dit.

référence

Cet article est comme un dossier de travail et un mémorandum. Si vous souhaitez lire des documents détaillés et faciles à comprendre, veuillez suivre le lien ci-dessous. [J'ai créé LINE BOT avec Python + Heroku](https://qiita.com/shimajiri/items/cf7ccf69d184fdb2fb26#flask%E3%81%A8line-bot-sdk%E3%82%92%E3%82%A4 % E3% 83% B3% E3% 82% B9% E3% 83% 88% E3% 83% BC% E3% 83% AB) J'ai commencé LINE Bot avec Python (chinois froid) [Partie 1] J'ai commencé LINE Bot avec Python (chinois froid) [Partie 2]

Inscrivez-vous auprès des développeurs LINE

Tout d'abord, inscrivez-vous auprès des développeurs LINE. L'inscription est facile. https://developers.line.me/ja/

Créer des fournisseurs et des canaux

Après vous être enregistré auprès des développeurs LINE, créez un fournisseur. Pour l'anglais, changez la langue en bas à droite. Créez une chaîne (application) dans le fournisseur. Je pense que c'est difficile à comprendre car l'écran continue

  1. Appuyez sur Créer un fournisseur
  2. Entrez les informations sur le fournisseur (comme un projet)
  3. Entrez les informations du canal (comme le nom du bot)

est. Cela se terminera bientôt.

Obtenez les informations dont vous avez besoin

Pour utiliser l'API

Paramètres Heroku

Passons aux paramètres Heroku. Commençons par enregistrer un compte. Ensuite, installez une interface de ligne de commande appelée Heroku CLI. Heroku CLI : https://devcenter.heroku.com/articles/heroku-cli#download-and-install

Connexion Heroku

À l'invite $heroku login Lorsque vous exécutez, vous serez invité à entrer une clé, alors entrez quelque chose. Ensuite, vous pouvez vous connecter via le navigateur.

Créer une application Heroku

Vous pouvez créer une nouvelle application avec $ heroku create app name. Veuillez noter que la barre de soulignement «_» ne peut pas être utilisée.

Définition des variables d'environnement

Définissez les variables d'environnement. La méthode ici semble être différente pour chaque personne, mais je la règle de la même manière que le site de référence. Définissons les deux chaînes de caractères que nous avons notées plus tôt. $ heroku config: set YOUR_CHANNEL_ACCESS_TOKEN =" Channel Access Token "--app App Name $ heroku config: set YOUR_CHANNEL_SECRET =" Channel Secret "--app App Name

Paramètres du webhook

Revenez à la console LINE Developers et définissez l'URL du webhook. URL du webhook: https: // nom de l'application.herokuapp.com / callback Appuyez sur Mettre à jour et configurez pour utiliser les webhooks et vous avez terminé.

https://github.com/line/line-bot-sdk-java/tree/master/sample-spring-boot-echo#step-2 Vous pouvez déployer EchoBot en appuyant sur [** Deploy to Heroku **] ici et en créant une application à partir de celui-ci.

codage

・ Paramètres du bot dans les développeurs LINE ・ Paramètres Heroku ・ Coopération entre les deux Est complet. Commencez à coder à partir d'ici.

Installation de la bibliothèque

Cette fois, j'utiliserai principalement flask et line-bot-sdk. pip install flask line-bot-sdk Dans mon environnement flask : 1.1.1 line-bot-sdk : 1.16.0 est.

De plus, la bibliothèque de scraping utilise: soupsieve==2.0 urllib3==1.25.8 beautifulsoup4

Répertoire de travail et sa structure

Cela peut être n'importe où, mais nous vous recommandons de créer un répertoire pour votre projet. Constitution: line_bot (répertoire de travail) ├ main.py ├ scrape.py ├ Procfile ├ runtime.txt └ requirements.txt

Le contenu du fichier

①main.py C'est le corps principal. Si vous souhaitez tester avec le retour de perroquet [ici](https://qiita.com/shimajiri/items/cf7ccf69d184fdb2fb26#flask%E3%81%A8line-bot-sdk%E3%82%92%E3%82%A4%E3 % 83% B3% E3% 82% B9% E3% 83% 88% E3% 83% BC% E3% 83% AB) sera utile.

main.py


#Importez ce dont vous avez besoin
from flask import Flask, request, abort
import os
import scrape as sc

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
#Obtenez des événements sur LINE
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

app = Flask(__name__)

#Obtenir des variables d'environnement
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["LINE_BOT_CHANNEL_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["LINE_BOT_CHANNEL_SECRET"]

line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)

#Exécuté à l'ouverture du corps de l'application
@app.route("/")
def hello_world():
    return "hello world!"

#/Traitement lors de l'accès au lien de rappel. Pour les webhooks.
@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:
        abort(400)

    return 'OK'

#Événement lors de la réception d'un message
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    '''
    #line_bot_réponse API_événement avec méthode de message.message.text(Message utilisateur)Répondre
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))
    '''
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=sc.getWeather())
    )

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

②scrape.py Grattage des informations météorologiques. J'avais l'intention de l'écrire moi-même, mais pour le moment Cliquez ici → https://qiita.com/RIRO/items/1b67b0418b08a52de0d6 J'ai modifié le code de. Merci beaucoup.

scrape.py


#Importer la bibliothèque
import requests
from bs4 import BeautifulSoup

def getWeather():
    #tenki.URL de la page de la zone cible de jp (cette fois, Chofu City, Tokyo)
    url = 'https://tenki.jp/forecast/3/16/4410/13208/'
    #Requête HTTP
    r = requests.get(url)

    #Décrivez ce qui suit dans le cas d'un environnement proxy
    """
    proxies = {
        "http":"http://proxy.xxx.xxx.xxx:8080",
        "https":"http://proxy.xxx.xxx.xxx:8080"
    }
    r = requests.get(url, proxies=proxies)
    """

    #Analyse HTML
    bsObj = BeautifulSoup(r.content, "html.parser")

    #Obtenez la météo du jour
    today = bsObj.find(class_="today-weather")
    weather = today.p.string

    #Une collection d'informations sur la température
    temp=today.div.find(class_="date-value-wrap")

    #Obtenez la température
    temp=temp.find_all("dd")
    temp_max = temp[0].span.string #Température la plus élevée
    temp_max_diff=temp[1].string #Par rapport à la veille de la température la plus élevée
    temp_min = temp[2].span.string #Température la plus basse
    temp_min_diff=temp[3].string #Par rapport à la veille de la température la plus basse

    #Je veux le voir bouger pour le moment, donc je le renvoie en connectant la météo et la température.
    return weather+temp_max+temp_min

③Procfile Décrit comment exécuter le programme.

web: python main.py

④runtime.txt Un fichier texte qui décrit la version Python. Puisqu'une erreur s'est produite dans 3.7.7, je l'ai mis à 3.6.10. Heroku n'est-il pas compatible avec la version 3.7?

runtime.txt


python-3.6.10

⑤ requirements.txt Un fichier texte qui décrit les bibliothèques à installer.

requirements.txt


Flask==1.1.1
line-bot-sdk==1.16.0
soupsieve==2.0
urllib3==1.25.8
beautifulsoup4



Il y a «scrape.py» parce qu'il gratte les informations météorologiques. EchoBot (retour du perroquet) etc. va bien avec 4 autres.

Déployer sur Heroku


//Créer un fichier initial pour git
git init
//Configurer un référentiel distant qui se connecte à un référentiel local
heroku git:remote -a (Nom de l'application décidé par vous-même)
//Indexer tous les fichiers modifiés
git add .
//Écrivez le fichier modifié dans le référentiel ("inital commit"Est un commentaire, donc tout va bien)
git commit -m "inital commit"
//Pousser un fichier créé localement dans heroku
git push heroku master

* J'ai une erreur ici

J'ai mal orthographié beautifulsoup4 dans requirements.txt et j'ai obtenu une erreur. Je pensais que la spécification de version était mauvaise et j'ai essayé de changer la version, mais le nom de la bibliothèque était faux ()

Vérifiez du côté Heroku

Vérifiez votre activité sur le tableau de bord Heroku. Si cela ressemble à l'image, c'est réussi. b7276e159aa0cadcfe46ba23ed0d4cc4.png

erreur de validation du webhook

J'ai utilisé cette partie en copiant l'échantillon. J'obtiens l'erreur «Le serveur bot a renvoyé un code d'état HTTP autre que 200». Cependant, BOT semble fonctionner normalement, donc je l'ai ignoré.

Contrôle de fonctionnement

Ajoutons un ami avec QR sur l'écran de gestion du BOT et envoyons un message. Si la réponse météo (ou le retour du perroquet) réussit, elle est réussie.

Next Actuellement, j'envoie simplement la météo et la température sous forme de chaînes

--Format --Ajout de paramètres (Région et transmission périodique)

J'aimerais faire quelque chose comme ça. Il y a d'autres projets et études, donc je vais mettre à jour lentement. Merci à tous les articles de référence.

Recommended Posts

Je veux connaître la météo avec LINE bot avec Heroku + Python
[Python] J'ai essayé de laisser LINE BOT répondre aux prévisions météo
Je veux hériter de l'arrière avec la classe de données python
Je veux déboguer avec Python
[Python] Je souhaite utiliser l'option -h avec argparse
Je souhaite envoyer un message de Python à LINE Bot
Je veux connaître la nature de Python et pip
Je veux analyser les journaux avec Python
Je veux jouer avec aws avec python
Je veux sortir le début du mois prochain avec Python
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
Je veux utiliser MATLAB feval avec python
Je veux faire un jeu avec Python
Je souhaite utiliser le répertoire temporaire avec Python2
#Unresolved Je veux compiler gobject-introspection avec Python3
Je veux résoudre APG4b avec Python (chapitre 2)
Je veux écrire dans un fichier avec Python
Je veux afficher la progression en Python!
Je veux gérer l'optimisation avec python et cplex
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
Je veux travailler avec un robot en python.
J'ai essayé de faire LINE BOT avec Python et Heroku
Je veux écrire en Python! (3) Utiliser des simulacres
Je veux AWS Lambda avec Python sur Mac!
J'ai essayé de résoudre le problème avec Python Vol.1
Je veux obtenir le nom du fichier, le numéro de ligne et le nom de la fonction dans Python 3.4
Je veux utiliser le jeu de données R avec python
Je veux faire fonctionner un ordinateur quantique avec Python
J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python
J'ai essayé de trouver l'entropie de l'image avec python
Je veux pouvoir analyser des données avec Python (partie 3)
Je veux initialiser si la valeur est vide (python)
J'ai essayé de simuler la propagation de l'infection avec Python
Je souhaite spécifier une autre version de Python avec pyvenv
Je voulais résoudre le concours de programmation Panasonic 2020 avec Python
Je souhaite enregistrer les photos envoyées par LINE vers S3
J'ai essayé de notifier les informations de retard de train avec LINE Notify
maya Python Je veux réparer à nouveau l'animation cuite.
Je veux pouvoir analyser des données avec Python (partie 1)
Je veux changer le drapeau japonais en drapeau des Palaos avec Numpy
Je veux pouvoir analyser des données avec Python (partie 4)
Ce que j'ai fait pour accueillir le Python2 EOL en toute confiance
Je veux pouvoir analyser des données avec Python (partie 2)
Je veux assister automatiquement à des cours en ligne avec Python + Selenium!
Je ne savais pas comment utiliser l'instruction [python] for
Je veux connaître la légende du monde des technologies informatiques
Obtenez la météo avec les requêtes Python
Obtenez la météo avec les requêtes Python 2
J'ai aimé le tweet avec python. ..
Je veux faire ○○ avec les Pandas
Je connais? Analyse de données à l'aide de Python ou de choses que vous souhaitez utiliser quand vous le souhaitez avec numpy
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove