影刀RPA Webhook接收后解析JSON并触发流程

作者:林焱

前面讲了如何向外推送消息,这篇反过来——让影刀接收外部系统发来的Webhook,自动触发流程。比如:GitHub仓库有新issue时自动通知你、客户下单后自动录入Excel、监控系统告警后自动处理。
在这里插入图片描述

Webhook接收原理

Webhook本质是一个HTTP POST请求。外部系统在特定事件发生时(比如新订单),向你的URL发一个POST请求,请求体里带着事件数据(通常是JSON)。

问题来了:影刀的本地流程怎么接收HTTP请求?影刀本身没有内置HTTP服务器。

方案一:Python Flask搭建简易Web服务

在Python代码块里启动一个Flask服务器:

在这里插入图片描述

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/webhook', methods=['POST'])
def handle_webhook():
    data = request.json  # 拿到外部系统发来的JSON数据
    print(f"收到Webhook: {data}")
    
    
[video(video-G1S0ulzl-1783721822785)(type-csdn)(url-https://live.csdn.net/v/embed/526818)(image-https://v-blog.csdnimg.cn/asset/582d14c3bd0451c5399cd990b56e2a0d/cover/Cover0.jpg)(title-拼多多店群自动化报活动上架!)]

    # 处理数据:写入Excel、发通知等
    # ...
    
    return jsonify({"status": "ok"}), 200

# 启动服务(监听5000端口)
app.run(host='0.0.0.0', port=5000)

但这个方案有个问题:app.run()是阻塞的,一旦启动,后续影刀流程代码不会执行。如果你放在单独的线程里,又涉及到线程管理。

方案二(推荐):用第三方中转服务

更实用的做法是用免费的Webhook中转服务。工作流程:

在这里插入图片描述

外部系统 → Webhook中转服务 → 定期查询或转发 → 影刀处理

1. 使用企业微信/钉钉机器人作为中转

外部系统 → 企微群机器人(发消息)→ 影刀定期读取群消息 → 触发处理

2. 使用飞书的Webhook Action

在这里插入图片描述

飞书支持把Webhook转成消息推送,影刀定时读取。

3. 创建一个简单的中转方案

# 这个Python脚本独立运行,接收Webhook存到SQLite
# 影刀定期读取SQLite,发现有新数据就处理

import sqlite3
from flask import Flask, request
import json
import datetime

app = Flask(__name__)

def init_db():
    conn = sqlite3.connect('webhooks.db')
    conn.execute('''CREATE TABLE IF NOT EXISTS events
                    (id INTEGER PRIMARY KEY AUTOINCREMENT,
                     source TEXT,
                     data TEXT,
                     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                     processed INTEGER DEFAULT 0)''')
    conn.commit()
    conn.close()

@app.route('/webhook/<source>', methods=['POST'])
def receive(source):
    conn = sqlite3.connect('webhooks.db')
    conn.execute(
        'INSERT INTO events (source, data) VALUES (?, ?)',
        (source, json.dumps(request.json))
    )
    conn.commit()
    conn.close()
    return 'OK', 200

init_db()
app.run(host='0.0.0.0', port=5000)

然后在影刀里,每5分钟读取SQLite中未处理的事件:

在这里插入图片描述

import sqlite3

conn = sqlite3.connect('webhooks.db')
cursor = conn.execute(
    "SELECT id, source, data FROM events WHERE processed = 0 LIMIT 50"
)
events = cursor.fetchall()

for event in events:
    event_id, source, data_json = event
    data = json.loads(data_json)
    
    # 根据source执行不同的处理逻辑
    if source == 'github':
        print(f"新的GitHub事件: {data}")
        # 影刀:写入Excel、发通知等
    elif source == 'order':
        print(f"新订单: {data}")
    
    # 标记为已处理
    conn.execute("UPDATE events SET processed = 1 WHERE id = ?", (event_id,))

conn.commit()
conn.close()

踩坑实录

坑1:内网穿透

你的影刀跑在本机,外面的系统访问不到。要么把Flask服务部署到有公网IP的服务器上,要么用ngrok/frp做内网穿透(适合测试)。

在这里插入图片描述

坑2:Flask服务进程管理

启动Flask服务后,如果不小心关掉窗口,服务就停了。建议用nssm或Windows服务把Flask注册为系统服务。

坑3:并发处理

TEMU店群矩阵自动化运营核价报活动


在这里插入图片描述

Flask默认是单线程的,同时来多个Webhook请求会排队。设置threaded=True

app.run(host='0.0.0.0', port=5000, threaded=True)

坑4:数据安全性

Webhook URL是个公开入口(虽然URL可以设计得很长很难猜),任何人都可以往你的URL发POST请求。在影刀处理数据前,验证请求来源(比如校验签名字段)。

简化方案:定时轮询替代Webhook

在这里插入图片描述

如果外部系统不支持Webhook,但有API可以查询"最近变更",定时轮询也是一种方案:

# 每5分钟查询是否有新数据
import requests
import hashlib

last_check = ""  # 上次检查时最新记录的ID或时间戳

resp = requests.get("https://api.example.com/recent?since=" + last_check)
new_items = resp.json()

for item in new_items:
    # 处理新数据
    
# 更新last_check
if new_items:
    last_check = new_items[0]["id"]

写在最后

Webhook接收是一种进阶能力,让外部系统能主动触发你的影刀流程。对于大多数场景,定时轮询API已经够用。但如果你的业务需要"秒级响应"(比如监控告警、订单提醒),搭建一个Webhook接收服务是必要的投资。
在这里插入图片描述
在这里插入图片描述

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐