影刀RPA 钉钉自动化完全指南:审批流程与数据提取实战 影刀RPA 钉钉自动化完全指南审批流程与数据提取实战作者林焱写在前面钉钉是很多中小企业的核心协作工具。影刀有两种方式操控钉钉一是通过钉钉开放平台API二是直接操控钉钉桌面客户端界面。这篇文章两种方式都讲明确告诉你什么时候用哪种。一、两种方式的区别方式适用场景优点缺点API方式发消息、读考勤、拉审批数据稳定、数据完整需要企业管理员开通权限界面自动化点击审批、回复消息无需API权限界面变动可能失效原则能用API就用APIAPI解决不了的才用界面操控。店群矩阵自动化突破运营极限二、钉钉API方式获取Access Tokenimportrequestsimportjsondefget_access_token(app_key,app_secret):urlhttps://oapi.dingtalk.com/gettokenparams{appkey:app_key,appsecret:app_secret}responserequests.get(url,paramsparams)dataresponse.json()ifdata.get(errcode)0:returndata[access_token]else:raiseException(f获取token失败{data})ACCESS_TOKENget_access_token(你的AppKey,你的AppSecret)发送群消息defsend_group_message(access_token,chat_id,content):向钉钉群发送文本消息urlfhttps://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)responserequests.post(url,jsonpayload)returnresponse.json()# 发送日报resultsend_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}}}responserequests.post(webhook_url,jsonpayload)returnresponse.json()# 日报发送WEBHOOKhttps://oapi.dingtalk.com/robot/send?access_token你的tokensend_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: 毫秒时间戳 urlfhttps://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)}responserequests.post(url,jsonpayload)returnresponse.json()importtime# 最近7天的审批end_msint(time.time()*1000)start_msend_ms-7*24*3600*1000resultget_approval_instances(ACCESS_TOKEN,PROC-xxx,start_ms,end_ms)instance_idsresult.get(result,{}).get(list,[])获取审批详情并提取字段defget_approval_detail(access_token,process_instance_id):获取单个审批实例的详情urlfhttps://oapi.dingtalk.com/topapi/processinstance/get?access_token{access_token}payload{process_instance_id:process_instance_id}responserequests.post(url,jsonpayload)returnresponse.json()defextract_form_values(instance_detail):从审批详情中提取表单字段值form_values{}componentsinstance_detail.get(result,{}).get(form_component_values,[])forcomponentincomponents:namecomponent.get(name)valuecomponent.get(value)form_values[name]valuereturnform_values# 批量提取审批数据rows[]forinstance_idininstance_ids[:50]:# 每次最多处理50条detailget_approval_detail(ACCESS_TOKEN,instance_id)valuesextract_form_values(detail)# 获取申请人和审批时间process_infodetail.get(result,{})values[申请人]process_info.get(originator_name)values[提交时间]process_info.get(create_time)values[审批结果]process_info.get(status)rows.append(values)# 写入Excelimportopenpyxl wbopenpyxl.Workbook()wswb.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_tabpyautogui.locateOnScreen(dingtalk_work_tab.png,confidence0.85)ifwork_tab:pyautogui.click(work_tab)time.sleep(1)# 点击待我审批pending_btnpyautogui.locateOnScreen(dingtalk_pending_approval.png,confidence0.85)ifpending_btn:pyautogui.click(pending_btn)time.sleep(1.5)# 逐个处理processed0max_items20# 每次最多处理20条whileprocessedmax_items:# 找第一个待审批itemitempyautogui.locateOnScreen(dingtalk_approval_item.png,confidence0.80)ifnotitem:print(没有更多待审批)breakpyautogui.click(item)time.sleep(2)# 截图保存审批内容timestamptime.strftime(%Y%m%d_%H%M%S)pyautogui.screenshot(fapproval_{timestamp}.png)# 点击同意按钮agree_btnpyautogui.locateOnScreen(dingtalk_agree_btn.png,confidence0.85)ifagree_btn:pyautogui.click(agree_btn)time.sleep(1)# 确认弹窗confirmpyautogui.locateOnScreen(dingtalk_confirm.png,confidence0.85)ifconfirm:pyautogui.click(confirm)time.sleep(1)processed1print(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):获取指定日期的考勤打卡记录urlfhttps://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}responserequests.post(url,jsonpayload)returnresponse.json()# 获取全部员工列表defget_all_users(access_token,dept_id1):urlfhttps://oapi.dingtalk.com/user/listid?access_token{access_token}department_id{dept_id}responserequests.get(url)returnresponse.json().get(userlist,[])usersget_all_users(ACCESS_TOKEN)user_ids[u[userid]foruinusers]# 获取今天考勤importdatetime todaydatetime.date.today().strftime(%Y-%m-%d)attendance_records[]foriinrange(0,len(user_ids),50):batchuser_ids[i:i50]resultget_attendance_data(ACCESS_TOKEN,batch,today)recordsresult.get(recordresult,[])attendance_records.extend(records)# 汇总到Excelwbopenpyxl.Workbook()wswb.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条消息。批量发送要加delaytime.sleep(3)每条消息间隔3秒。坑3用户ID vs 手机号钉钉API大多数接口用userId但有时需要先用手机号换取userIdurlfhttps://oapi.dingtalk.com/user/get_by_mobile?access_token{token}mobile13800138000坑4界面自动化的图片素材需要提前截好界面操控的图片定位素材dingtalk_agree_btn.png等需要在目标机器上截取分辨率要匹配否则confidence再高也找不到。总结钉钉自动化的核心经验API能搞的用API不要费力去界面操控。API拿审批数据、考勤记录、员工信息都很稳定。界面操控只用于点击审批同意这类没有API支持的操作。署名林焱

本月热点