Um bot simples do Telegram no Flask com previsão do tempo

Olá pessoal, neste artigo vou explicar como fazer o bot de telegrama mais simples em Python para enviar o clima atual em Moscou.


O artigo é destinado a iniciantes em Python que desejam aprender mais sobre como interagir com serviços externos via API.


Tecnologias e APIs:


  • Python é uma linguagem de programação
  • Flask - uma estrutura para criar aplicativos da web,
  • API de bot de telegrama,
  • API do Weatherstack
  • Ngrok é um serviço para criar um túnel para o host local.

Como tudo vai funcionar?


  1. O usuário escreve uma mensagem de telegrama no bot.
  2. O telegrama encaminha a mensagem do usuário para o servidor.
  3. O servidor solicita informações sobre o tempo do Weatherstack.
  4. O servidor envia informações meteorológicas para o Telegram.
  5. O usuário recebe informações meteorológicas.

Bot de registro de telegrama


Nesta fase, precisamos criar um bot e ter acesso a ele. Para fazer isso, inicie o @botfather bot no Telegram com o comando abaixo.


/start

Criamos um novo bot de acordo com as instruções da mensagem do bot.


Bot de registro de telegrama!


O bot é criado, mas se você escrever alguma mensagem para ele, ele não reagirá de forma alguma. Consertá-lo.


Ajuda do frasco


O Flask é uma estrutura para criar aplicativos da Web na linguagem de programação Python, usando o kit de ferramentas Werkzeug e o mecanismo de modelo Jinja2. Pertence à categoria dos chamados microframes - estruturas minimalistas de aplicativos da Web que fornecem deliberadamente apenas os recursos mais básicos.


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. , .


Mensagem no 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)

O código de todo o aplicativo Flask consiste em 3 funções: recebimento de mensagens do Telegram, envio de mensagens ao Telegram e recebimento de informações meteorológicas do 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}

Isso é tudo! Dessa maneira simples, ensinamos nosso bot a nos informar sobre o clima em Moscou.


All Articles