Un bot Telegram simple sur Flask avec des rapports météorologiques

Bonjour à tous, dans cet article, je vais vous dire comment créer le robot télégramme le plus simple en Python pour envoyer la météo actuelle à Moscou.


L'article est destiné aux débutants en Python qui souhaitent en savoir plus sur la façon d'interagir avec des services externes via l'API.


Technologies et API:


  • Python est un langage de programmation
  • Flask - un framework pour crĂ©er des applications web,
  • API Telegram Bot,
  • API Weatherstack
  • Ngrok est un service pour crĂ©er un tunnel vers localhost.

Comment tout fonctionnera-t-il?


  1. L'utilisateur écrit un télégramme au bot.
  2. Le télégramme transmet le message utilisateur au serveur.
  3. Le serveur demande des informations météorologiques à Weatherstack.
  4. Le serveur envoie des informations météorologiques à Telegram.
  5. L'utilisateur reçoit des informations météorologiques.

Bot d'enregistrement de télégramme


À ce stade, nous devons créer un bot et y accéder. Pour ce faire, lancez le bot @botfather dans Telegram avec la commande ci-dessous.


/start

Nous créons un nouveau bot selon les instructions du message du bot.


Bot d'enregistrement de télégramme!


Le bot est créé, mais si vous lui écrivez un message, il n'y réagira en aucune façon. Répare le.


Aide de Flask


Flask est un cadre pour créer des applications Web dans le langage de programmation Python, en utilisant la boîte à outils Werkzeug, ainsi que le moteur de modèle Jinja2. Il appartient à la catégorie des soi-disant microframes - des cadres minimalistes d'applications Web qui ne fournissent délibérément que les fonctionnalités les plus élémentaires.


PyPI, 1.0 Python 2.7, Python 3.3 .


.


Flask


Python . . .


$ mkdir weather_bot
$ cd weather_bot
$ python3 -m venv venv

Flask.


(venv)$ pip install Flask

Installation.


Flask


weather_bot app.py .


from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

.


(venv)$ export FLASK_APP=app.py
(venv)$ flask run
 * Running on http://127.0.0.1:5000/

http://127.0.0.1:5000/ , "Hello, World!".
Quickstart.


localhost ngrok


Ngrok — , .


  1. ngrok.
  2. .
  3. HTTP 5000 .

$ ./ngrok http 5000


, Telegram , . , Telegram. POST setWebhook. .


$ curl --location --request POST 'https://api.telegram.org/bot{token}/setWebhook' \
--header 'Content-Type: application/json' \
--data-raw '{
    "url": "{url}"
}'

{token} — 840446984:AAFuVTW-FYP5tJVu8mqhc9y4E0j1fr2lCD0, BotFather,
{url} — https://32515a83.ngrok.io, ngrok. . https, Telegram url.


cURL wiki.


"ok": true, .


{
    "ok": true,
    "result": true,
    "description": "Webhook was set"
}

, . app.py .


from flask import Flask, request

app = Flask(__name__)

@app.route("/", methods=["GET", "POST"])
def receive_update():
    if request.method == "POST":
        print(request.json)
    return {"ok": True}

Flask. Ctrl+C .


(venv)$ flask run

. Telegram. , .


Message dans la console!



, . "pong" .


API Telegram sendMessage. .


requests, , . .


(venv)$ pip install requests

requests from flask import Flask, request app.py.


import requests

id . Telegram-.


chat_id = request.json["message"]["chat"]["id"]

, id .


def send_message(chat_id, text):
    method = "sendMessage"
    token = "840446984:AAFuVTW-FYP5tJVu8mqhc9y4E0j1fr2lCD0"
    url = f"https://api.telegram.org/bot{token}/{method}"
    data = {"chat_id": chat_id, "text": text}
    requests.post(url, data=data)

requests .


send_message() receive_update().


send_message(chat_id, "pong")

app.py


from flask import Flask, request
import requests

app = Flask(__name__)

def send_message(chat_id, text):
    method = "sendMessage"
    token = "840446984:AAFuVTW-FYP5tJVu8mqhc9y4E0j1fr2lCD0"
    url = f"https://api.telegram.org/bot{token}/{method}"
    data = {"chat_id": chat_id, "text": text}
    requests.post(url, data=data)

@app.route("/", methods=["GET", "POST"])
def receive_update():
    if request.method == "POST":
        print(request.json)
        chat_id = request.json["message"]["chat"]["id"]
        send_message(chat_id, "pong")
    return {"ok": True}


current Weatherstack API .
2 Query Params: access_key — 86a3fe972756lk34a6a042bll348b1e3, , query — , , — Moscow.


.


app = Flask(__name__).


def get_weather():
    params = {"access_key": "86a3fe972756lk34a6a042bll348b1e3", "query": "Moscow"}
    api_result = requests.get('http://api.weatherstack.com/current', params)
    api_response = api_result.json()
    return f"   {api_response['current']['temperature']} "

receive_update() "pong" .


weather = get_weather()
send_message(chat_id, weather)

Le code de l'application Flask entière se compose de 3 fonctions: recevoir des messages de Telegram, envoyer des messages à Telegram et recevoir des informations météorologiques de Weatherstack.


from flask import Flask, request
import requests

app = Flask(__name__)

def get_weather():
    params = {"access_key": "86a3fe972756lk34a6a042bll348b1e3", "query": "Moscow"}
    api_result = requests.get('http://api.weatherstack.com/current', params)
    api_response = api_result.json()
    return f"   {api_response['current']['temperature']} "

def send_message(chat_id, text):
    method = "sendMessage"
    token = "840446984:AAFuVTW-FYP5tJVu8mqhc9y4E0j1fr2lCD0"
    url = f"https://api.telegram.org/bot{token}/{method}"
    data = {"chat_id": chat_id, "text": text}
    requests.post(url, data=data)

@app.route("/", methods=["GET", "POST"])
def receive_update():
    if request.method == "POST":
        print(request.json)
        chat_id = request.json["message"]["chat"]["id"]
        weather = get_weather()
        send_message(chat_id, weather)
    return {"ok": True}

C'est tout! De cette manière simple, nous avons appris à notre bot à nous informer sur la météo à Moscou.


All Articles