做了两年RPA,大部分时间在跟网页元素打交道。直到有一天老板说:“能不能把ERP系统的订单数据拉过来?”——那个ERP提供了API接口,不需要打开网页、不需要捕获元素,发一个HTTP请求就能拿到数据。
HTTP请求是RPA的“高速公路”。 不用等页面加载、不用处理弹窗、不用管XPath变不变。但前提是——你得搞清楚GET和POST的区别、Token怎么管、分页怎么处理、报错怎么看。这篇文章把API调用的完整流程讲清楚。
一、HTTP请求基础回顾
影刀的“HTTP请求”指令在右侧指令面板的“网络”分类下。它有5个核心参数:
| 参数 | 说明 | 常见取值 |
|---|---|---|
| 请求方式 | 你要对服务器做什么 | GET(查)/ POST(增)/ PUT(改)/ DELETE(删) |
| URL | 接口地址 | 可包含查询参数(?key1=val1&key2=val2)|
| 请求头(Headers) | 告诉服务器你是谁、要什么格式 | Content-Type、Authorization |
| 请求体(Body) | POST和PUT要发过去的数据 | JSON格式字符串 |
| 返回结果保存到 | 响应结果存到哪个变量 | 自定义变量名 |
最容易被忽略的是请求头。 我见过太多人URL填对了、方法选对了但接口返回401或者400,就是因为没填Content-Type或者Authorization。
响应结果的结构:返回的变量里包含三个字段:
status_code:状态码(200表示成功)content_type:内容类型(如application/json)
content:响应内容(JSON字符串或文本)
二、GET请求:查数据
GET请求用于获取数据,参数直接放在URL里。
实战:调用免费汇率API
有一个免费的汇率API:https://api.iyuns.com/api/allrates,返回美元和欧元兑人民币汇率。
影刀操作步骤:
- 拖入“HTTP请求”指令
- 请求方式选
GET
3. URL填
https://api.iyuns.com/api/allrates
- 返回结果保存到变量
汇率响应 - 用“文本转JSON对象”解析
汇率响应.content - 提取汇率数据写入Excel
完整配置:
# 请求方式:GET
# URL:https://api.iyuns.com/api/allrates
# 请求头:(留空或填 Content-Type: application/json)
# 请求体:(GET不需要)
# 返回结果保存到:汇率响应
# 解析响应
JSON转文本(汇率响应.content) → 汇率数据
提取汇率数据.rates.USD → 美元汇率
提取汇率数据.rates.EUR → 欧元汇率
这里容易踩坑:GET请求的参数要拼在URL里,用?开头,多个参数用&连接。比如https://api.example.com/data?page=1&size=20。
三、POST请求:发数据
POST请求用于提交数据,参数放在请求体(Body)里。
实战:调用登录接口获取Token
很多API需要先登录获取Token,后续请求带上Token才能访问数据。
// POST请求体(JSON格式)
{
"username": "test@example.com",
"password": "your_password"
}
影刀操作步骤:
- 拖入“HTTP请求”指令
- 请求方式选
POST - URL填登录接口地址
- 请求头填:
Content-Type: application/json - 请求体填上面的JSON(把账号密码换成变量)
- 返回结果保存到
登录响应 - 解析响应提取
access_token
请求体的写法:
{
"username": ${账号变量},
"password": ${密码变量}
}
这里容易踩坑:POST请求的Body必须是合法的JSON格式。少了一个引号、多了一个逗号都会返回400。我习惯先在Postman里调通,再把请求体原样复制到影刀里。
四、请求头(Headers):鉴权的关键
请求头告诉服务器“你是谁”。最常见的两个请求头:
| 请求头 | 作用 | 示例 |
|---|---|---|
Content-Type | 告诉服务器请求体的格式 | application/json |
|
Authorization | 身份认证 | Bearer eyJhbGciOiJIUzI1NiIs... |
实战:携带Token调用业务接口
# 请求头配置(在影刀"协议头"参数中填写,每行一个)
Content-Type: application/json
Authorization: Bearer ${access_token}
填写格式:每行一个请求头,格式为协议头名称:协议头内容。
影刀操作:
- 先用登录接口获取
access_token,存到全局变量 - 在业务接口的“协议头”参数中填:
Authorization: Bearer ${全局变量.access_token} - 发送请求获取业务数据
五、Token管理:不反复登录,但不过期失效
几乎所有的开放平台API都需要Token(Access Token),Token的有效期通常是1-2小时。Token管理有两个核心原则:
- 不要每次都重新获取(浪费时间和资源)
- 但要确保获取到的Token是有效的(过期了要能自动刷新)
推荐方案:全局变量 + 过期检测
【流程开始】
→ 检查 全局变量.token 是否为空
→ 如果为空:调用"获取Token"子流程 → 存到全局变量
→ 如果不为空:直接使用
【每次调用API前】
→ 检查 当前时间 - 全局变量.token获取时间 > 7200秒(2小时)
→ 如果超过:重新获取Token → 更新全局变量
→ 如果没超过:直接使用
获取Token的Python代码(可直接复制到“执行Python代码”指令)
# 输入变量:app_id, app_secret
# 输出变量:token_info(字典,包含token和过期时间)
import requests
def get_token(app_id, app_secret):
url = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal"
resp = requests.post(
url,
json={"app_id": app_id, "app_secret": app_secret},
timeout=30
)
data = resp.json()
if data.get('code') == 0:
return {
'token': data['tenant_access_token'],
'expire': data.get('expire', 7200) # 默认7200秒
}
else:
return {'error': data}
print(get_token(app_id, app_secret))
为什么用Python而不是直接在影刀里拼HTTP请求? 因为Python处理异常和重试比影刀的指令流要灵活——比如Token获取失败了,Python可以自动重试3次。
六、分页处理:一次性拿不完的数据
API接口通常不会一次返回所有数据,而是分页返回。分页处理是API采集中最常遇到的场景。
常见的分页参数
| 参数名 | 含义 | 示例 |
|---|---|---|
page / pageNum | 当前页码 | 1, 2, 3... |
pageSize / limit | 每页条数 | 20, 50, 100 |
total | 总条数(从响应里获取) | 1234 |
翻页采集的完整逻辑
【初始化】
→ 设置 当前页码 = 1
→ 设置 每页条数 = 50
→ 设置 全部数据 = []
【循环采集】
→ 条件循环(True):
→ 构造URL:接口地址?page={当前页码}&size={每页条数}
→ 发送GET请求 → 响应数据
→ 解析响应 → 当前页数据列表
→ 如果 当前页数据列表 为空:跳出循环(没有更多数据了)
→ 追加 当前页数据 到 全部数据
→ 当前页码 = 当前页码 + 1
→ 【可选】如果 当前页码 > 总页数:跳出循环
→ 【可选】等待0.5秒(防止限流)
判断“是否还有下一页”的三种方式:
- 根据返回数据是否为空:如果当前页没有数据,说明已经到最后一页了
- 根据总条数计算:如果
当前页码 * 每页条数 >= total,说明已经采集完了 - 根据响应里的
hasMore字段:有些接口会直接告诉你还有没有下一页
容易踩坑:有些接口的页码从0开始,有些从1开始。先发一页看看响应数据,确认清楚再写循环。
七、HTTP状态码速查(出现频率排序)
接口返回的不是200就代表出问题了:
| 状态码 | 含义 | 怎么办 |
|---|---|---|
| 200 | 成功 | 但!200不代表数据一定是对的,有些接口“查询无结果”也返回200 |
| 400 | 请求参数错了 | 检查Body的JSON格式是否正确 |
| 401 | 没认证或Token过期了 | 重新获取Token |
| 403 | 没有权限 | 检查app有没有申请对应的权限范围 |
| 404 | 接口地址错了 | 检查URL里有没有拼错的路径 |
| 429 | 请求太频繁被限流了 | 加等待时间,降低请求频率 |
| 500 | 服务器出问题了 | 不是你代码的问题,等一会儿重试 |
我第一次调飞书API的时候,URL里少写了一个斜杠,返回404。我以为是权限问题,花了半小时查app配置,最后才发现是URL拼错了。从那以后,每次调新接口我都先用Postman测试,确认能通再写到影刀里。
八、完整实战:调用API采集商品数据并写入飞书多维表格
这是一个完整的API采集流程,包含登录获取Token、分页采集、数据清洗、写入飞书。
A_Main(主流程)
├─ 【Step 1:获取Token】
│ ├─ POST请求(登录接口) → 登录响应
│ ├─ 解析JSON提取access_token → 全局变量.token
│ └─ 记录Token获取时间 → 全局变量.token_time
│
├─ 【Step 2:分页采集数据】
│ ├─ 设置 页码 = 1
│ ├─ 设置 每页条数 = 50
│ ├─ 设置 全部数据 = []
│ │
│ ├─ 条件循环(True):
│ │ ├─ 【检查Token是否过期】
│ │ │ └─ 如果 当前时间 - token_time > 7200秒:
│ │ │ ├─ 重新获取Token
│ │ │ └─ 更新token_time
│ │ │
│ │ ├─ 【发送请求】
│ │ │ ├─ URL:https://api.example.com/products?page={页码}&size={每页条数}
│ │ │ ├─ 请求头:Authorization: Bearer ${token}
│ │ │ └─ GET请求 → 响应数据
│ │ │
│ │ ├─ 【解析响应】
│ │ │ ├─ 解析JSON → 当前页数据列表
│ │ │ ├─ 提取总条数 → total
│ │ │ └─ 如果 当前页数据列表 为空:跳出循环
│ │ │
│ │ ├─ 【数据清洗】(Python代码)
│ │ │ └─ 清洗价格、去除空格、格式化日期
│ │ │
│ │ ├─ 追加 当前页数据 到 全部数据
│ │ ├─ 页码 = 页码 + 1
│ │ └─ 等待时间(0.5秒) # 防止限流
│ └─ 循环结束
│
├─ 【Step 3:写入飞书多维表格】
│ ├─ 连接飞书多维表格 → 多维表对象
│ └─ 批量添加记录(多维表对象, 全部数据)
│
└─ 【Step 4:发送通知】
└─ 飞书群通知:"采集完成,共{总数}条数据"
数据清洗的Python代码(放在“执行Python代码”指令里):
# 输入:raw_data(从API返回的原始数据列表)
# 输出:clean_data(清洗后的数据列表)
import re
clean_data = []
for item in raw_data:
# 清洗价格("¥99.00" → 99.00)
price_raw = item.get('price', '0')
match = re.search(r'[\d.]+', price_raw)
price = float(match.group()) if match else 0.0
# 清洗标题(去除首尾空格和换行)
title = item.get('title', '').strip()
clean_data.append({
'title': title,
'price': price,
'sales': item.get('sales', 0)
})
print(clean_data)
九、社区版用户注意
- “HTTP请求”指令社区版也支持,不消耗运行时长
- 但调用API获取数据不占RPA时长,这部分可以大胆用
- 只有操作网页、循环、等待这些才消耗时长
- 建议:能用API拿数据就别用网页采集,又快又稳还不占时长
常见问题/易错速查
-
接口返回401 → Token过期了或没传对。检查Authorization请求头的格式是否正确(
Bearer+ token)。 -
接口返回400 → 请求体JSON格式不对。在Postman里调通了再复制到影刀里。
-
接口返回504超时 → 影刀HTTP请求默认超时30秒。在“连接超时秒数”参数里调大(比如60秒)。如果还不行,可能是服务器那边压力大。
-
分页采集只采到第一页 → 检查页码参数是否从1开始。有些接口页码从0开始。
-
Token管理混乱 → 用全局变量存Token+获取时间,每次调用前检查是否过期。
-
响应内容解析失败 → 先“输出日志”打印原始响应内容,看看返回的到底是什么格式。有时候接口返回的是纯文本而不是JSON。
-
Postman能通,影刀里不通 → 检查请求头是否完全一致。Postman会自动加一些请求头(如User-Agent),影刀不会。把Postman里的请求头全部复制过来试试。
推荐资源
- 影刀官方帮助中心搜索“HTTP请求”有完整指令文档
- Postman:调试API的神器,先把接口调通再写到影刀里
- 影刀开发者社区搜“HTTP请求”有大量踩坑记录
- 飞书/企业微信官方API文档(调用开放平台接口必看)
#影刀RPA #RPA自动化 #HTTP请求 #API调用 #数据采集 #电商自动化
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
