Ein einfacher Telegrammbot auf Flask mit Wetterberichterstattung

Hallo allerseits, in diesem Artikel werde ich Ihnen erklären, wie Sie den einfachsten Telegramm-Bot in Python erstellen, um das aktuelle Wetter in Moskau zu senden.


Der Artikel richtet sich an Anfänger in Python, die mehr über die Interaktion mit externen Diensten über die API erfahren möchten.


Technologien und APIs:


  • Python ist eine Programmiersprache
  • Flask - ein Framework zum Erstellen von Webanwendungen,
  • Telegramm-Bot-API,
  • Weatherstack API
  • Ngrok ist ein Dienst zum Erstellen eines Tunnels zum lokalen Host.

Wie wird alles funktionieren?


  1. Der Benutzer schreibt eine Telegrammnachricht an den Bot.
  2. Das Telegramm leitet die Benutzernachricht an den Server weiter.
  3. Der Server fordert Wetterinformationen von Weatherstack an.
  4. Der Server sendet Wetterinformationen an Telegram.
  5. Der Benutzer erhält Wetterinformationen.

Telegrammregistrierungsbot


In dieser Phase müssen wir einen Bot erstellen und Zugriff darauf erhalten. Starten Sie dazu den @ botfather-Bot in Telegram mit dem folgenden Befehl.


/start

Wir erstellen einen neuen Bot gemäß den Anweisungen aus der Nachricht des Bots.


Telegrammregistrierungsbot!


Der Bot wird erstellt, aber wenn Sie eine Nachricht darauf schreiben, reagiert er in keiner Weise darauf. Repariere es.


Flaschenhilfe


Flask ist ein Framework zum Erstellen von Webanwendungen in der Programmiersprache Python mithilfe des Werkzeug-Toolkits sowie der Jinja2-Vorlagen-Engine. Es gehört zur Kategorie der sogenannten Mikroframes - minimalistische Frameworks von Webanwendungen, die bewusst nur die grundlegendsten Funktionen bieten.


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


Nachricht in der Konsole!



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

Der Code der gesamten Flask-Anwendung besteht aus drei Funktionen: Empfangen von Nachrichten aus dem Telegramm, Senden von Nachrichten an das Telegramm und Empfangen von Wetterinformationen von 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}

Das ist alles! Auf diese einfache Weise haben wir unserem Bot beigebracht, uns über das Wetter in Moskau zu informieren.


All Articles