python构建通知api服务

模块准备

有必要的话先安装虚拟环境,进行隔离

pip install virtualenv
# 或者
apt-get install python3-venv
# 当前目录创建虚拟环境
python -m venv venv
# 激活虚拟环境
source venv/bin/activate
# 关闭虚拟环境
deactive

安装必要模块

pip install flask
pip requests

代码

利用flask创建api服务

from flask import Flask, request, jsonify
import requests

app = Flask(__name__)

# Telegram 机器人的 API 地址
telegram_bot_api = "your token api url"

@app.route('/send_notification', methods=['POST'])
def send_notification():
    try:
        # 获取请求中的数据
        data = request.json
        chat_id = data.get('chat_id')
        text = data.get('text')

        # 检查是否缺少必要的参数
        if not chat_id or not text:
            return jsonify({"error": "Missing required parameters"}), 400

        # 构建请求参数
        params = {
            "chat_id": chat_id,
            "text": text,
        }

        # 发送 HTTP 请求
        response = requests.get(telegram_bot_api, params=params)

        # 返回响应结果
        return jsonify({"status": "success", "response": response.text}), 200

    except Exception as e:
        return jsonify({"error": str(e)}), 500

if __name__ == '__main__':
    app.run(port=5000)

ngixn 反代该服务

通过nginx实现反向代理:

  • 第一种写法nginx会将/api 路径带入服务导致路由路径变为/api/send_notification 从而报错,需要改flask路由
  • 第二种写法则去掉了路径中的/api
location /api {
    proxy_pass http://127.0.0.1:5000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}
location /api {
    rewrite ^/api(/.*)$ $1 break;  # 去掉路径中的 /api 部分
    proxy_pass http://127.0.0.1:5000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

服务请求

通过python request 请求服务实现通知发送

import requests

def notice(text):
    api_url = "https://address.com/api/send_notification"
    data = {
        "chat_id": "-1001970059003",
        "text": text
    }
    response = requests.post(api_url, json=data)

    return print(response.json())

if __name__ == "__main__":
    text = "你好"
    notice(text)

后记

感觉像是在无限套娃,虽然少写了一个bot token,也还行吧!