做TEMU半托管或全托管,每天要批量上架几十个商品,还要采集竞品的价格和销量。TEMU后台操作繁琐,手动上架一个商品要5分钟。
用影刀实现批量上架+数据采集: 读取Excel商品信息 → 自动登录TEMU卖家中心 → 逐条填写上架表单 → 提交并记录结果。同时还能采集竞品数据做分析。
整体流程结构
| 子流程 | 职责 |
|---|---|
A_初始化 | 打开TEMU卖家中心,登录,准备Excel |
B_上架主流程 | 循环读取Excel商品列表,调用上架子流程 |
|
C_填写商品信息 | 在商品发布页面填写标题、价格、库存、图片等 |
| C_提交商品 | 点击提交,处理弹窗和错误提示 |
| C_采集竞品数据 | 搜索竞品关键词,采集价格和销量 |
| D_Excel读写 | 读取待上架列表,写入上架结果 |
| D_数据清洗 | 处理价格格式、图片URL等 |
第一步:捕获TEMU卖家中心的关键元素
先手动捕获以下元素(XPath参考):
# 1. 登录页:账号输入框
//input[@type='text' and contains(@placeholder,'邮箱/手机号')]

# 2. 密码输入框
//input[@type='password']
# 3. 登录按钮

//button[contains(@class,'login-btn')]
# 4. 卖家后台:商品管理菜单
//*[contains(text(),'商品管理')]

# 5. 发布商品按钮
//button[contains(text(),'发布商品')]
# 6. 商品标题输入框
//input[@placeholder='商品标题' or contains(@class,'title')]
# 7. 价格输入框(美元)
//input[@name='price' or contains(@placeholder,'价格')]
# 8. 库存输入框
//input[@name='stock' or contains(@placeholder,'库存')]
# 9. 类目选择器(可能是一级、二级、三级)
//div[contains(@class,'category-select')]
# 10. 提交按钮
//button[contains(text(),'提交') or contains(text(),'发布')]
# 11. 商品图片上传区域(可能需要点击+上传文件)
//div[contains(@class,'upload-area')]
# 12. 采集时:搜索结果页商品卡片
//div[contains(@class,'goods-card')]
⚠️ 注意:TEMU后台经常更新class,以上XPath用了contains匹配稳定文字。如果捕获时失效,改用页面上的固定文字(如按钮文本)定位。
第二步:登录TEMU卖家中心
A_登录TEMU子流程:
流程参数:
- 输入:账号、密码
- 输出:是否成功
输出日志("【登录】开始")
打开网页("https://seller.temu.com/")
等待元素出现("账号输入框", 超时=10)
输入文本(账号输入框, ${账号}, 模式="输入文本")
输入文本(密码输入框, ${密码}, 模式="输入文本")
点击元素("登录按钮", 模式="模拟鼠标点击")
# 等待登录跳转完成(出现卖家中心首页元素)
Try:
等待元素出现("商品管理菜单", 超时=15)
输出日志("【登录】成功")
返回 True
Catch:
输出日志("【登录】失败,可能验证码或账号错误")
屏幕截图("temu_login_error.png")
返回 False
处理登录验证码:TEMU有时会弹出滑块验证码,影刀社区版无法自动处理。建议:
- 首次登录时手动过验证码,保持登录态
- 或使用创业版的“验证码识别”模块
保持登录态的技巧:在A_初始化里先判断是否已登录(检查是否存在“商品管理菜单”),如果已登录就不重新登录。
第三步:批量上架商品(核心)
Excel表格结构(待上架列表):
| 标题 | 价格(USD) | 库存 | 类目 | 图片URL | 描述 |
|---|---|---|---|---|---|
| 无线鼠标 | 12.99 | 200 | 电子产品 | https://... | 静音省电 |
B_上架主流程:
# 1. 登录
调用子流程(A_登录TEMU) → ${登录成功}
如果 ${登录成功} == False:
输出日志("登录失败,终止")
停止流程()
# 2. 读取待上架列表
打开Excel("待上架商品.xlsx")
读取区域数据(起始行=2, 起始列=1, 结束列=6) → ${商品列表}
关闭Excel()
输出日志("共" + ${商品列表}.长度 + "个商品待上架")
# 3. 循环上架
${成功数} = 0
${失败数} = 0
${失败记录} = 创建空列表()
列表循环(${商品列表}):
${当前商品} = 当前项
${标题} = ${当前商品}[0]
${价格} = ${当前商品}[1]
${库存} = ${当前商品}[2]
${类目} = ${当前商品}[3]
${图片URL} = ${当前商品}[4]
${描述} = ${当前商品}[5]
输出日志("【上架】" + ${标题})
# 调用上架子流程
调用子流程(C_单个商品上架,
输入参数=[${标题}, ${价格}, ${库存}, ${类目}, ${图片URL}, ${描述}]
) → ${上架结果}
如果 ${上架结果} == "成功":
${成功数} = ${成功数} + 1
否则:
${失败数} = ${失败数} + 1
添加元素到列表(${失败记录}, ${标题})
# 两个商品之间间隔几秒,避免风控
固定等待(3)
# 4. 写入上架结果
打开Excel("上架结果.xlsx")
追加行到表格(["执行时间", "成功数", "失败数", "失败列表"])
追加行到表格([获取当前时间(), ${成功数}, ${失败数}, ${失败记录}])
关闭Excel()
输出日志("上架完成,成功${成功数},失败${失败数}")
第四步:单个商品上架的具体操作
C_单个商品上架子流程:
流程参数:
- 输入:标题, 价格, 库存, 类目, 图片URL, 描述
- 输出:结果("成功"/"失败")
# 进入商品发布页面
Try:
# 点击“商品管理” -> “发布商品”
# 注意:如果已经在发布页面,跳过
点击元素("商品管理菜单")
固定等待(1)
点击元素("发布商品按钮")
等待元素出现("商品标题输入框", 超时=10)
Catch:
输出日志("无法进入发布页面")
返回 "失败"
# 填写标题
输入文本("商品标题输入框", ${标题}, 模式="模拟输入")
# 选择类目(多级,比较复杂,此处简化)
# 实际需要一级一级点击,根据传入的类目名匹配
调用子流程(C_选择类目, 输入参数=${类目})
# 填写价格和库存
输入文本("价格输入框", ${价格})
输入文本("库存输入框", ${库存})
# 上传图片(TEMU支持URL上传或本地文件)
# 方法1:如果图片URL可用,找到“从URL添加”按钮,输入URL
Try:
点击元素("从URL添加图片按钮")
输入文本("图片URL输入框", ${图片URL})
点击元素("确认添加")
Catch:
输出日志("图片上传失败,跳过")
# 填写描述
输入文本("描述输入框", ${描述})
# 提交
点击元素("提交按钮", 模式="模拟鼠标点击")
# 处理提交后的弹窗(如“提交成功”或“请填写xxx”)
Try:
等待元素出现("提交成功提示", 超时=5)
输出日志("上架成功:" + ${标题})
返回 "成功"
Catch:
# 可能有错误提示,截图记录
屏幕截图("error_" + ${标题} + ".png")
输出日志("上架失败:" + ${标题})
# 尝试关闭错误弹窗
Try: 点击元素("关闭按钮", 超时=2) Catch: 无操作
返回 "失败"
选择类目的子流程(C_选择类目):TEMU类目是三级联动,可以用等待元素出现+点击元素逐级选择。传入类目名如“电子产品>电脑>鼠标”,用split分割后依次点击。
第五步:采集竞品数据(可选)
在上架前或上架后,可以采集竞品同类商品的售价和销量,用于定价参考。
C_采集竞品数据子流程:
流程参数:
- 输入:搜索关键词
- 输出:竞品列表(价格、销量)
# 在TEMU前台搜索
打开网页("https://www.temu.com/")
等待元素出现("搜索框")
输入文本(搜索框, ${关键词}, 模式="模拟输入")
点击搜索按钮
等待元素出现("商品卡片", 超时=8)
# 滚动加载(TEMU前台也是无限滚动)
调用子流程(C_滚动加载前台)
# 获取所有商品卡片
获取相似元素列表("商品卡片") → ${卡片列表}
${竞品结果} = 创建空列表()
元素列表循环(${卡片列表}):
相对于元素(当前卡片) → 捕获价格元素 → ${价格元素}
${价格} = 获取文本(${价格元素})
相对于元素(当前卡片) → 捕获销量元素 → ${销量元素}
${销量文本} = 获取文本(${销量元素})
# 清洗销量(如“1.2万件”)
调用子流程(D_清洗销量, 输入=${销量文本}) → ${销量数}
添加元素到列表(${竞品结果}, [${价格}, ${销量数}])
输出日志("采集到" + ${竞品结果}.长度 + "个竞品")
返回 ${竞品结果}
销量清洗Python代码:
import re
def clean_sales(text):
text = str(text)
if '万' in text:
num = re.search(r'[\d.]+', text)
if num:
return int(float(num.group()) * 10000)
else:
num = re.search(r'\d+', text)
return int(num.group()) if num else 0
return 0
完整流程组合(上架+采集)
如果你想上架前先看竞品价格,可以这样:
# 1. 登录TEMU卖家中心
调用子流程(A_登录TEMU)
# 2. 读取待上架商品列表
${商品列表} = 调用子流程(D_读取Excel)
# 3. 对每个商品,先采集竞品价格,再决定定价
列表循环(${商品列表}):
${商品名} = 当前项.标题
# 采集竞品
${竞品} = 调用子流程(C_采集竞品数据, 输入=${商品名})
# 计算平均售价
${均价} = 调用子流程(D_计算均价, 输入=${竞品})
# 定价 = 均价 * 0.9(比竞品便宜10%)
${定价} = ${均价} * 0.9
# 上架
调用子流程(C_单个商品上架, 输入=[${商品名}, ${定价}, ...])
常见问题速查
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 登录出现滑块验证 | TEMU风控 | 手动过验证后保持登录态;或用创业版+打码平台 |
| 类目选择失败 | 类目树结构变化 | 用contains(text(),'类目名')模糊匹配 |
| 图片上传失败 | URL不可访问或格式不支持 | 先下载图片到本地,用文件上传方式 |
| 提交后提示“请填写xxx” | 必填项漏了 | 检查是否有必填字段(如重量、尺寸),在流程中补充 |
| 上架速度太快被限 | 频繁提交 | 每个商品间隔5-10秒,模拟人类速度 |
| 采集竞品时被封IP | 频繁搜索 | 换IP或用代理;每个关键词间隔10秒以上 |
| 社区版30分钟不够 | 上架一个商品约2分钟 | 升级创业版,或分批上架 |
TEMU上架的注意事项
-
必填字段检查:除了标题、价格、库存,TEMU可能要求填写重量、尺寸、商品属性(颜色、尺寸)。在Excel里把这些字段也加进去。
-
图片要求:TEMU要求图片至少800x800像素,白底。如果URL图片不符合,需要先下载处理再上传。
-
价格单位:TEMU前台显示美元,价格输入框通常也是美元。注意汇率转换(如果Excel里是人民币)。
-
类目ID:直接点选类目比文字匹配更稳。可以用
获取相似元素列表获取类目选项,用文字匹配点击。 -
库存预警:上架后定期采集库存,低于安全值自动发飞书通知(参考选题31)。
推荐资源
- TEMU卖家中心官方帮助文档:搜索“商品发布API”(如果有API权限,比RPA更稳定)
- 影刀官方应用市场:搜索“TEMU”,有上架模板(部分付费)
- 飞书通知联动:参考本系列选题31《飞书表格自动读写与消息通知联动》,在上架成功/失败时发消息到群
我的建议:TEMU后台改版频繁,上线后每周检查一次元素是否失效。最好将关键元素捕获后存为“元素库”,定期批量测试。另外,创业版用户可以考虑用“手机自动化”配合TEMU商家App,有时App端操作更稳定。
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
