影刀RPA 企业微信自动化消息推送与员工数据管理作者林焱写在前面企业微信是现在很多公司的核心内部协作工具。影刀结合企业微信API可以做自动给员工或群发消息、读取部门架构和员工列表、发送工作通知卡片、管理审批数据。本文聚焦最实用的几个场景每个都有完整代码。一、企业微信API基础获取Access Tokenimportrequestsdefget_wxwork_token(corp_id,corp_secret): 获取企业微信access_token corp_id: 企业ID在企业微信后台我的企业→企业信息中查看 corp_secret: 应用的Secret在应用管理中查看 urlhttps://qyapi.weixin.qq.com/cgi-bin/gettokenparams{corpid:corp_id,corpsecret:corp_secret}[video(video-QYftWuLK-1783794446247)(type-csdn)(url-https://live.csdn.net/v/embed/525010)(image-https://v-blog.csdnimg.cn/asset/f4faa587144cb7070f19e8b36813806b/cover/Cover0.jpg)(title-店群矩阵自动化突破运营极限)]resprequests.get(url,paramsparams)dataresp.json()ifdata.get(errcode)0:returndata[access_token]raiseException(f获取token失败{data})TOKENget_wxwork_token(企业ID,应用Secret)二、发送应用消息企业微信应用消息是最常用的通知方式可以发给指定员工、部门或全员。发送文本消息defsend_text_message(access_token,to_users,content,to_departmentsNone): 发送文本消息 to_users: 员工userID列表如 [zhangsan, lisi]或 all 发全员 to_departments: 部门ID列表如 [1, 2, 3] urlfhttps://qyapi.weixin.qq.com/cgi-bin/message/send?access_token{access_token}payload{touser:|.join(to_users)ifisinstance(to_users,list)elseto_users,msgtype:text,agentid:你的应用AgentID,# 在企业微信应用管理中查看text:{content:content},safe:0# 0普通消息 1加密消息}![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/93ab49358e58406fbedfcdd8a385cb64.png#pic_center)ifto_departments:payload[toparty]|.join(str(d)fordinto_departments)resprequests.post(url,jsonpayload)returnresp.json()# 给指定员工发消息resultsend_text_message(TOKEN,[zhangsan,lisi],今日数据报告已生成请查看共享文件夹)print(result)# 给全员发消息resultsend_text_message(TOKEN,all,系统将于今晚22:00-23:00进行维护请提前保存工作)发送Markdown消息排版更丰富defsend_markdown_message(access_token,to_users,markdown_content):发送Markdown格式消息支持标题、加粗、列表、链接urlfhttps://qyapi.weixin.qq.com/cgi-bin/message/send?access_token{access_token}payload{touser:|.join(to_users)ifisinstance(to_users,list)elseto_users,msgtype:markdown,agentid:你的AgentID,markdown:{content:markdown_content}}resprequests.post(url,jsonpayload)returnresp.json()# 发送格式化日报daily_report# 今日销售日报 **统计日期**2024-01-15 | 指标 | 今日 | 昨日 | 环比 | |------|------|------|------| | 销售额 | 98,000元 | 85,000元 | ↑15.3% | | 订单数 | 156笔 | 142笔 | ↑9.9% | | 新客户 | 23人 | 18人 | ↑27.8% | **重点关注** 华东区销售额今日超额完成目标表现突出 [查看完整报告](https://docs.qq.com/xxxxx)send_markdown_message(TOKEN,[sales_manager],daily_report)发送卡片消息图文卡片defsend_card_message(access_token,to_users,title,description,url,button_text查看详情):发送图文卡片消息点击可跳转链接api_urlfhttps://qyapi.weixin.qq.com/cgi-bin/message/send?access_token{access_token}payload{touser:|.join(to_users)ifisinstance(to_users,list)elseto_users,msgtype:textcard,agentid:你的AgentID,textcard:{title:title,description:description,url:url,btntxt:button_text}}resprequests.post(api_url,jsonpayload)returnresp.json()send_card_message(TOKEN,[hr_manager], 待处理新员工入职申请,姓名张三\n部门技术部\n入职日期2024-01-20\n请在系统中完成入职手续,https://oa.company.com/onboarding/123)三、获取部门与员工数据获取部门架构defget_departments(access_token):获取所有部门列表urlfhttps://qyapi.weixin.qq.com/cgi-bin/department/list?access_token{access_token}resprequests.get(url)dataresp.json()ifdata.get(errcode)0:returndata.get(department,[])raiseException(f获取部门失败{data})departmentsget_departments(TOKEN)fordeptindepartments:print(f部门ID:{dept[id]}名称:{dept[name]}上级:{dept.get(parentid)})获取部门员工列表defget_department_users(access_token,department_id,fetch_childTrue): 获取指定部门的员工详细信息 fetch_child: True递归获取子部门员工 urlfhttps://qyapi.weixin.qq.com/cgi-bin/user/list?access_token{access_token}params{department_id:department_id,fetch_child:1iffetch_childelse0}resprequests.get(url,paramsparams)dataresp.json()ifdata.get(errcode)0:returndata.get(userlist,[])raiseException(f获取员工失败{data})# 获取全公司员工从根部门1开始all_usersget_department_users(TOKEN,department_id1,fetch_childTrue)print(f全公司共{len(all_users)}名员工)# 保存员工花名册importopenpyxl wbopenpyxl.Workbook()wswb.active ws.append([员工ID,姓名,手机,邮箱,部门,职位,是否在职])foruserinall_users:ws.append([user.get(userid),user.get(name),user.get(mobile),user.get(email),|.join(str(d)fordinuser.get(department,[])),user.get(position),是ifuser.get(enable)1else否])wb.save(企业员工花名册.xlsx)四、实战案例生日祝福自动发送场景每天早上8点自动给当天生日的员工发送生日祝福。importdatetimeimportopenpyxldefcheck_and_send_birthday_wishes(access_token):检查今日生日员工并发送祝福todaydatetime.date.today()month_day(today.month,today.day)# 从花名册读取生日信息需要提前维护生日字段wbopenpyxl.load_workbook(员工生日信息.xlsx)wswb.active birthday_users[]forrowinws.iter_rows(min_row2,values_onlyTrue):user_id,name,birthday_strrow[0],row[1],row[2]ifbirthday_str:try:birthdaydatetime.datetime.strptime(str(birthday_str),%Y-%m-%d).date()if(birthday.month,birthday.day)month_day:birthday_users.append({user_id:user_id,name:name})except:passifnotbirthday_users:print(今天没有生日员工)returnforuserinbirthday_users:messagef{user[name]}生日快乐\n\n感谢您一路以来的付出和努力祝您在新的一岁里事事顺心、工作愉快\n\n——来自公司全体同仁resultsend_text_message(access_token,[user[user_id]],message)print(f已向{user[name]}发送生日祝福{result})check_and_send_birthday_wishes(TOKEN)temu店群自动化报活动案例五、企业微信群机器人无需API权限不需要任何开发权限直接在企业微信群里添加群机器人defsend_wxwork_robot_message(webhook_url,message_type,**kwargs): 通过企业微信群机器人发送消息 无需任何API权限只需群机器人Webhook URL payload{msgtype:message_type}ifmessage_typetext:payload[text]{content:kwargs.get(content)}mentionedkwargs.get(mentioned_list,[])ifmentioned:payload[text][mentioned_list]mentionedelifmessage_typemarkdown:payload[markdown]{content:kwargs.get(content)}elifmessage_typenews:payload[news]{articles:kwargs.get(articles,[])}resprequests.post(webhook_url,jsonpayload)returnresp.json()ROBOT_WEBHOOKhttps://qyapi.weixin.qq.com/cgi-bin/webhook/send?key你的key# 发送所有人的紧急通知send_wxwork_robot_message(ROBOT_WEBHOOK,text,content⚠️ 紧急通知生产环境出现异常请相关人员立即登录处理,mentioned_list[all])六、踩坑记录坑1消息发送频率限制应用消息每个企业每天最多发送200条部分版本有更高限额。超出会报错43501。批量发消息时要合并到一次调用touser: zhangsan|lisi|wangwu而不是多次调用。坑2员工userID大小写敏感企业微信的userid是大小写不敏感的但建议统一小写处理避免出现一个人被发两次的情况。坑3获取员工列表需要通讯录权限获取员工详细信息含手机号需要在企业微信后台给应用开通通讯录权限。如果只是发消息不需要这个权限。坑4群机器人每分钟限20条群机器人Webhook每分钟最多发20条消息同一内容1分钟内只能发1次防刷。批量推送要加delay。总结企业微信自动化的核心价值替代人工发通知、自动同步员工数据、定时推送数据报告。能用应用消息的场景用应用消息到个人需要群通知的用群机器人Webhook简单稳定。署名林焱