影刀RPA 钉钉自动化完全指南:审批流程与数据提取实战

📅 2026/7/26 5:55:36 👁️ 阅读次数 📝 编程学习
影刀RPA 钉钉自动化完全指南:审批流程与数据提取实战

影刀RPA 钉钉自动化完全指南:审批流程与数据提取实战

作者:林焱


写在前面

钉钉是很多中小企业的核心协作工具。影刀有两种方式操控钉钉:一是通过钉钉开放平台API,二是直接操控钉钉桌面客户端界面。这篇文章两种方式都讲,明确告诉你什么时候用哪种。


一、两种方式的区别

方式适用场景优点缺点
API方式发消息、读考勤、拉审批数据稳定、数据完整需要企业管理员开通权限
界面自动化点击审批、回复消息无需API权限界面变动可能失效

原则:能用API就用API,API解决不了的才用界面操控。


店群矩阵自动化突破运营极限!


二、钉钉API方式

获取Access Token

importrequestsimportjsondefget_access_token(app_key,app_secret):url="https://oapi.dingtalk.com/gettoken"params={"appkey":app_key,"appsecret":app_secret}response=requests.get(url,params=params)data=response.json()ifdata.get("errcode")==0:returndata["access_token"]else:raiseException(f"获取token失败:{data}")ACCESS_TOKEN=get_access_token("你的AppKey","你的AppSecret")

发送群消息

defsend_group_message(access_token,chat_id,content):"""向钉钉群发送文本消息"""url=f"https://oapi.dingtalk.com/chat/send?access_token={access_token}"payload={"chatid":chat_id,"msg":{"msgtype":"text","text":{"content":content}}}![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f53dcbcf91794b0b8b8b1de1262c528b.png#pic_center)response=requests.post(url,json=payload)returnresponse.json()# 发送日报result=send_group_message(ACCESS_TOKEN,"chat123456789","今日销售日报\n总金额:98,000元\n订单数:156笔\n退款:3笔")print(result)

发送群机器人消息(更简单,不需要企业APP)

钉钉群机器人Webhook不需要任何权限申请:

defsend_robot_message(webhook_url,title,content):"""通过群机器人Webhook发送消息"""payload={"msgtype":"markdown","markdown":{"title":title,"text":f"##{title}\n\n{content}"}}response=requests.post(webhook_url,json=payload)returnresponse.json()# 日报发送WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=你的token"send_robot_message(WEBHOOK,"📊 每日数据报告","| 指标 | 数值 |\n|------|------|\n| 访客数 | 1,234 |\n| 订单数 | 56 |\n| 转化率 | 4.5% |")

拉取审批记录

defget_approval_instances(access_token,process_code,start_time,end_time):""" 获取指定审批流程的审批记录 process_code: 审批模板ID(在钉钉后台流程模板里找) start_time / end_time: 毫秒时间戳 """url=f"https://oapi.dingtalk.com/topapi/processinstance/listids?access_token={access_token}"payload={"process_code":process_code,"start_time":start_time,"end_time":end_time,"size":20,"cursor":0![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d1670e82996745498752f344f3c35f3e.png#pic_center)}response=requests.post(url,json=payload)returnresponse.json()importtime# 最近7天的审批end_ms=int(time.time()*1000)start_ms=end_ms-7*24*3600*1000result=get_approval_instances(ACCESS_TOKEN,"PROC-xxx",start_ms,end_ms)instance_ids=result.get("result",{}).get("list",[])

获取审批详情并提取字段

defget_approval_detail(access_token,process_instance_id):"""获取单个审批实例的详情"""url=f"https://oapi.dingtalk.com/topapi/processinstance/get?access_token={access_token}"payload={"process_instance_id":process_instance_id}response=requests.post(url,json=payload)returnresponse.json()defextract_form_values(instance_detail):"""从审批详情中提取表单字段值"""form_values={}components=instance_detail.get("result",{}).get("form_component_values",[])forcomponentincomponents:name=component.get("name")value=component.get("value")form_values[name]=valuereturnform_values# 批量提取审批数据rows=[]forinstance_idininstance_ids[:50]:# 每次最多处理50条detail=get_approval_detail(ACCESS_TOKEN,instance_id)values=extract_form_values(detail)# 获取申请人和审批时间process_info=detail.get("result",{})values["申请人"]=process_info.get("originator_name")values["提交时间"]=process_info.get("create_time")values["审批结果"]=process_info.get("status")rows.append(values)# 写入Excelimportopenpyxl wb=openpyxl.Workbook()ws=wb.activeifrows:ws.append(list(rows[0].keys()))forrowinrows:ws.append(list(row.values()))wb.save("审批数据导出.xlsx")print(f"共导出{len(rows)}条审批记录")

三、界面自动化方式(处理API无法覆盖的场景)

当企业没有开通API权限,或需要操作钉钉界面(如手动点击审批按钮),用界面自动化:

场景:批量处理待审批事项

importpyautoguiimporttimedefapprove_pending_items():"""处理钉钉桌面版的待审批列表"""# 点击钉钉"工作"tabwork_tab=pyautogui.locateOnScreen('dingtalk_work_tab.png',confidence=0.85)ifwork_tab:pyautogui.click(work_tab)time.sleep(1)# 点击"待我审批"pending_btn=pyautogui.locateOnScreen('dingtalk_pending_approval.png',confidence=0.85)ifpending_btn:pyautogui.click(pending_btn)time.sleep(1.5)# 逐个处理processed=0max_items=20# 每次最多处理20条whileprocessed<max_items:# 找第一个待审批itemitem=pyautogui.locateOnScreen('dingtalk_approval_item.png',confidence=0.80)ifnotitem:print("没有更多待审批")breakpyautogui.click(item)time.sleep(2)# 截图保存审批内容timestamp=time.strftime("%Y%m%d_%H%M%S")pyautogui.screenshot(f"approval_{timestamp}.png")# 点击"同意"按钮agree_btn=pyautogui.locateOnScreen('dingtalk_agree_btn.png',confidence=0.85)ifagree_btn:pyautogui.click(agree_btn)time.sleep(1)# 确认弹窗confirm=pyautogui.locateOnScreen('dingtalk_confirm.png',confidence=0.85)ifconfirm:pyautogui.click(confirm)time.sleep(1)processed+=1print(f"已处理第{processed}个审批")else:print("未找到同意按钮,跳过")pyautogui.press('escape')time.sleep(0.5)breakprint(f"批量审批完成,处理{processed}条")approve_pending_items()

四、考勤数据自动汇总

temu店群自动化报活动案例

defget_attendance_data(access_token,user_ids,work_date):"""获取指定日期的考勤打卡记录"""url=f"https://oapi.dingtalk.com/attendance/list?access_token={access_token}"payload={"workDateFrom":work_date,"workDateTo":work_date,"userIdList":user_ids[:50],# 每次最多50人"offset":0,"limit":50}response=requests.post(url,json=payload)returnresponse.json()# 获取全部员工列表defget_all_users(access_token,dept_id=1):url=f"https://oapi.dingtalk.com/user/listid?access_token={access_token}&department_id={dept_id}"response=requests.get(url)returnresponse.json().get("userlist",[])users=get_all_users(ACCESS_TOKEN)user_ids=[u["userid"]foruinusers]# 获取今天考勤importdatetime today=datetime.date.today().strftime("%Y-%m-%d")attendance_records=[]foriinrange(0,len(user_ids),50):batch=user_ids[i:i+50]result=get_attendance_data(ACCESS_TOKEN,batch,today)records=result.get("recordresult",[])attendance_records.extend(records)# 汇总到Excelwb=openpyxl.Workbook()ws=wb.active ws.append(["员工ID","姓名","打卡时间","打卡类型","打卡结果"])forrecinattendance_records:ws.append([rec.get("userId"),rec.get("recordId"),rec.get("userCheckTime"),rec.get("checkType"),# OnDuty=上班 OffDuty=下班rec.get("timeResult")# Normal=正常 Late=迟到 Early=早退])wb.save(f"考勤汇总_{today}.xlsx")

五、常见坑

坑1:钉钉API接口变动频繁
钉钉从旧版API迁移到新版(dingtalk.openapi),旧接口陆续停用。建议查官方文档确认当前有效接口,不要直接复制网上的老代码。

坑2:消息频率限制
群机器人每分钟最多20条消息。批量发送要加delay:time.sleep(3)每条消息间隔3秒。

坑3:用户ID vs 手机号
钉钉API大多数接口用userId,但有时需要先用手机号换取userId:

url=f"https://oapi.dingtalk.com/user/get_by_mobile?access_token={token}&mobile=13800138000"

坑4:界面自动化的图片素材需要提前截好
界面操控的图片定位素材(dingtalk_agree_btn.png等)需要在目标机器上截取,分辨率要匹配,否则confidence再高也找不到。


总结

钉钉自动化的核心经验:API能搞的用API,不要费力去界面操控。API拿审批数据、考勤记录、员工信息都很稳定。界面操控只用于"点击审批同意"这类没有API支持的操作。

署名:林焱