对接企业微信API自建应用配置企业可信IP
创始人
2025-01-10 20:33:31
0

前言

        为了实现系统调用团队会议功能,组织发起企业微信会议,于是需要和企业微信做API对接。对接过程很难受,文档不清晰、没有SDK、没有技术支持甚至文档报文和实际接口报文都不匹配,只能说企业微信的API是从业以来见过的最难用的API,仅个人观点。

        在配置自建应用后,访问API接口竟然需要设置可信IP,不论是出于安全还是别的商业目的,该手段都太古老,怎奈人在屋檐下不得不低头。可是在配置时又需要域名验证等杂七杂八的问题,特此记录解决过程分享给大家。

正文

1、自信满满配置IP

        本以为打开这个页面直接输入外网IP即可,未曾想是个只读框,需要处理蓝色背景的提示信息,设置可信域名或解析加密URL

        可信域名自然没有,申请证书申请域名费时费力,测试阶段根本没必要

      

        于是选择第二个选项,文字描述很抽象,笔者也是查阅各方资料才总结出来。

        大体意思就是要在能外网访问的机器上部署一个服务,当企业微信的测试请求访问过去时,按照一定的加解密规则以及入参,返回对应的响应信息。这样企业微信才认为你这台机器是“自己人”,允许你继续配置可信IP,简直就是!@#*¥&()@!!。

2、骂骂咧咧获取信任

        一回头看自己还在屋檐下,继续低头想办法呗。首先把后两项全部选择随机获取,记录好生成的字符串,一会发布服务需要使用。接下来表演开始:

2.1、准备外网服务器

        找一台可以外网访问的机器,当然还需要一个打通的端口,在这台机器上安装Python3

2.2、获取Python项目

        按照这个GitHub地址,下载一个python项目,解压后重命名为 weworkapi_python

        https://github.com/sbzhu/weworkapi_python/archive/refs/heads/master.zip

        也可以使用指令处理:

wget https://github.com/sbzhu/weworkapi_python/archive/refs/heads/master.zip unzip master.zip mv weworkapi_python-master weworkapi_python

2.3、执行监听服务脚本

与上述项目同级开启命令窗,使用下述脚本触发执行,其中执行前需要替换三个参数,前两个为刚刚随机生成的,最后一个在企业信息中可以看到的企业ID。

qy_api = [     WXBizMsgCrypt("XXXXXXX", "XXXXXXX", "XXXXXXX"),  ] #对应接受消息回调模式中的token,EncodingAESKey 和 企业信息中的企业id 
#-*- encoding:utf-8 -*- from flask import abort, request from flask import Flask from xml.dom.minidom import parseString import _thread import time import os import sys sys.path.append("weworkapi_python/callback")  # 正确的模块导入路径 from WXBizMsgCrypt3 import WXBizMsgCrypt   # https://github.com/sbzhu/weworkapi_python 项目地址 app = Flask(__name__)   # 对应步骤4中接受消息回调模式中的URL,如域名是'www.example.com' 那么在步骤4中填入的url就为"http://www.example.com/hook_path" @app.route('/hook_path', methods=['GET','POST'])  def douban():     if request.method == 'GET':         echo_str = signature(request, 0)         return(echo_str)     elif request.method == 'POST':         echo_str = signature2(request, 0)         return(echo_str)   qy_api = [     WXBizMsgCrypt("qCV0ro7W4CJQtn3RHbVwgYU5GAZ29AK", "PQzmYlT4vGP3ItW9OmvreGkkLpDS3A9jH2GsyfDtP3q", "ww7b1bc3d6d"),  ] #对应接受消息回调模式中的token,EncodingAESKey 和 企业信息中的企业id   # 开启消息接受模式时验证接口连通性 def signature(request, i):      msg_signature = request.args.get('msg_signature', '')     timestamp = request.args.get('timestamp', '')     nonce = request.args.get('nonce', '')     echo_str = request.args.get('echostr', '')     ret,sEchoStr=qy_api[i].VerifyURL(msg_signature, timestamp,nonce,echo_str)     if (ret != 0):         print("ERR: VerifyURL ret: " + str(ret))         return("failed")     else:         return(sEchoStr)   # 实际接受消息 def signature2(request, i):     msg_signature = request.args.get('msg_signature', '')     timestamp = request.args.get('timestamp', '')     nonce = request.args.get('nonce', '')     data = request.data.decode('utf-8')     ret,sMsg=qy_api[i].DecryptMsg(data,msg_signature, timestamp,nonce)     if (ret != 0):         print("ERR: DecryptMsg ret: " + str(ret))         return("failed")     else:         with open ("/var/log/qywx.log", 'a+') as f: # 消息接收日志             doc = parseString(sMsg)             collection = doc.documentElement             name_xml = collection.getElementsByTagName("FromUserName")             msg_xml = collection.getElementsByTagName("Content")             type_xml = collection.getElementsByTagName("MsgType")             pic_xml = collection.getElementsByTagName("PicUrl")             msg = ""             name = ""             msg_type = type_xml[0].childNodes[0].data             if msg_type == "text": #文本消息                 name = name_xml[0].childNodes[0].data        #发送者id                 msg = msg_xml[0].childNodes[0].data          #发送的消息内容                 f.write(time.strftime('[%Y-%m-%d %H:%M:%S]') + "[ch%d] %s:%s\n" % (i, name, msg))                 _thread.start_new_thread(os.system, ("python3 command.py '%s' '%s' '%d' '%d'" % (name, msg, i, 0), )) #此处将消息进行外部业务处理                              elif msg_type == "image": #图片消息                 name = name_xml[0].childNodes[0].data                 pic_url = pic_xml[0].childNodes[0].data                 f.write(time.strftime('[%Y-%m-%d %H:%M:%S]') + "[ch%d] %s:图片消息\n" % (i, name))                 _thread.start_new_thread(os.system, ("python3 command.py '%s' '%s' '%d' '%d'" % (name, pic_url, i, 1), ))  #此处将消息进行外部业务处理               f.close()           return("ok")   if __name__=='__main__':     app.run("0.0.0.0", 8066)  #本地监听端口,可自定义 
#执行脚本 python wechat.py

若执行报错提示缺失依赖,按照pip3进行安装即可。

2.4、最终结果获取

执行成功后会根据token和secret生成监听服务,命令窗提示 ip:port ,其中端口可以在上述脚本中配置。

3、配置可验证的URL

将生成的信息配置到对应目录

http://公网IP地址:8066/hook_path

点击保存后即可正常配置可信IP,至此整个荒诞的信任危机解除,只能三个字形容:真无聊。

总结

        整个配置过程网上资料甚少,企业微信方也没有在线支持,只依靠社区实现网友之间的相濡以沫,如果能再给我一次机会,我一定选别的app进行对接,慎重慎重。

相关内容

热门资讯

实测分享!微信小程序免费黑科技... 实测分享!微信小程序免费黑科技,蜜瓜大厅辅助免费下载窍门教程(有挂猫腻)1、玩家可以在微信小程序免费...
截至发稿!微乐小程序黑科技,蛮... 截至发稿!微乐小程序黑科技,蛮籽酉阳大贰辅助手册教程(有挂方法)1、进入到微乐小程序黑科技是否有挂之...
一分钟教会你!微信小程序免费黑... 一分钟教会你!微信小程序免费黑科技开挂,欢乐茶馆脚本方案教程(有挂细节)1、微信小程序免费黑科技透视...
热门推荐!微信小程序免费黑科技... 热门推荐!微信小程序免费黑科技辅助,朋友局辅助器绝活教程(发现有挂)热门推荐!微信小程序免费黑科技辅...
2024教程!微信小程序免费黑... 2024教程!微信小程序免费黑科技透视,卡五星辅助器逍遥模块教程(确实有挂)1、玩家可以在微信小程序...
现有关情况通报如下!微信小程序... 现有关情况通报如下!微信小程序免费黑科技开挂,潮汕木虱有辅助挂吗积累教程(有挂详细)1)微信小程序免...
据相关数据显示!微乐小程序黑科... 据相关数据显示!微乐小程序黑科技,途游手游辅助脚本平台教材教程(有挂方略)1、超多福利:超高返利,海...
今日焦点!微信小程序免费黑科技... 今日焦点!微信小程序免费黑科技,途游手游辅助秘籍教程(有挂技巧)1、下载好微信小程序免费黑科技正确养...
最新研发!微乐小程序黑科技,吉... 最新研发!微乐小程序黑科技,吉祥填大坑攻略窍门教程(新版有挂)1、每一步都需要思考,不同水平的挑战微...
三分钟了解!微乐小程序免费黑科... 三分钟了解!微乐小程序免费黑科技,闲逸碰胡辅助积累教程(有挂方法)1、许多玩家不知道微乐小程序免费黑...