现在创建应用想要使用需要设置企业可信IP,而配置企业可信IP需要先配置 设置可信域名 或 设置接收消息服务器URL,域名需要花钱而且配置麻烦,这里选择 设置接收消息服务器URL。
不设置就报这个错误:
真麻烦呀!!!
{u'errcode': 60020, u'errmsg': u'not allow to access from your ip, hint: [1692000515331], from ip: xxx.xxx.xxx.xx, more info at https://open.work.weixin.qq.com/devtool/query?e=60020'}
这里其实是一个类似防火墙的功能,只要在里面配置可以访问过来的 IP 就可以了
配置条件:
* 找一台有公网的linux服务器 没有可以选择内网穿透软件 都没有我也没办法
* 安装python3 百度一下
创建自定义应用
登录网页版 >应用管理>创建应用>进入应用>最下面有个企业可信IP>选择设置接收消息服务器URL
脚本里的这段代码配置一下
点击一下这里获取个随机值Token 和 EncodingAESKey 粘贴进去就行了,注意: 不要关闭网页一会还要用。
企业信息的ID在我的企业可以找到
这里提示下:下面改 2.py 文件时,改的时候只要改下面文件里的这个部分就好了
1. qy_api = [ 2. WXBizMsgCrypt("XXXXXXX", "XXXXXXX", "XXXXXXX"), 3. ] #对应接受消息回调模式中的token,EncodingAESKey 和 企业信息中的企业id
引入WXBizMsgCrypt模块步骤
将这个文件放在和脚本同一个目录即可
1. # 下载项目 2. wget https://github.com/sbzhu/weworkapi_python/archive/refs/heads/master.zip 3. 4. # 解压 5. unzip master.zip 6. 7. # 改名 8. mv weworkapi_python-master weworkapi_python
⚠️:引入模块上面这里切记要修改模块名为 weworkapi_python ,否则无法使用
随便起个名vim到一个文件即可 我这里叫2.py 这里改的时候只要改上面框出的企业的信息即可
1. [root@apphost dba]# cat 2.py 2. #-*- encoding:utf-8 -*- 3. from flask import abort, request 4. from flask import Flask 5. from xml.dom.minidom import parseString 6. import _thread 7. import time 8. import os 9. import sys 10. sys.path.append("weworkapi_python/callback") # 正确的模块导入路径 11. from WXBizMsgCrypt3 import WXBizMsgCrypt # https://github.com/sbzhu/weworkapi_python 项目地址 12. app = Flask(__name__) 13. 14. # 对应步骤4中接受消息回调模式中的URL,如域名是'www.example.com' 那么在步骤4中填入的url就为"http://www.example.com/hook_path" 15. @app.route('/hook_path', methods=['GET','POST']) 16. def douban(): 17. if request.method == 'GET': 18. echo_str = signature(request, 0) 19. return(echo_str) 20. elif request.method == 'POST': 21. echo_str = signature2(request, 0) 22. return(echo_str) 23. 24. qy_api = [ 25. WXBizMsgCrypt("XXXXXXX", "XXXXXXX", "XXXXXXX"), 26. ] #对应接受消息回调模式中的token,EncodingAESKey 和 企业信息中的企业id # 只改这里即可 27. 28. # 开启消息接受模式时验证接口连通性 29. def signature(request, i): 30. msg_signature = request.args.get('msg_signature', '') 31. timestamp = request.args.get('timestamp', '') 32. nonce = request.args.get('nonce', '') 33. echo_str = request.args.get('echostr', '') 34. ret,sEchoStr=qy_api[i].VerifyURL(msg_signature, timestamp,nonce,echo_str) 35. if (ret != 0): 36. print("ERR: VerifyURL ret: " + str(ret)) 37. return("failed") 38. else: 39. return(sEchoStr) 40. 41. # 实际接受消息 42. def signature2(request, i): 43. msg_signature = request.args.get('msg_signature', '') 44. timestamp = request.args.get('timestamp', '') 45. nonce = request.args.get('nonce', '') 46. data = request.data.decode('utf-8') 47. ret,sMsg=qy_api[i].DecryptMsg(data,msg_signature, timestamp,nonce) 48. if (ret != 0): 49. print("ERR: DecryptMsg ret: " + str(ret)) 50. return("failed") 51. else: 52. with open ("/var/log/qywx.log", 'a+') as f: # 消息接收日志 53. doc = parseString(sMsg) 54. collection = doc.documentElement 55. name_xml = collection.getElementsByTagName("FromUserName") 56. msg_xml = collection.getElementsByTagName("Content") 57. type_xml = collection.getElementsByTagName("MsgType") 58. pic_xml = collection.getElementsByTagName("PicUrl") 59. msg = "" 60. name = "" 61. msg_type = type_xml[0].childNodes[0].data 62. if msg_type == "text": #文本消息 63. name = name_xml[0].childNodes[0].data #发送者id 64. msg = msg_xml[0].childNodes[0].data #发送的消息内容 65. f.write(time.strftime('[%Y-%m-%d %H:%M:%S]') + "[ch%d] %s:%s\n" % (i, name, msg)) 66. _thread.start_new_thread(os.system, ("python3 command.py '%s' '%s' '%d' '%d'" % (name, msg, i, 0), )) #此处将消息进行外部业务处理 67. 68. elif msg_type == "image": #图片消息 69. name = name_xml[0].childNodes[0].data 70. pic_url = pic_xml[0].childNodes[0].data 71. f.write(time.strftime('[%Y-%m-%d %H:%M:%S]') + "[ch%d] %s:图片消息\n" % (i, name)) 72. _thread.start_new_thread(os.system, ("python3 command.py '%s' '%s' '%d' '%d'" % (name, pic_url, i, 1), )) #此处将消息进行外部业务处理 73. 74. f.close() 75. 76. return("ok") 77. 78. if __name__=='__main__': 79. app.run("0.0.0.0", 888) #本地监听端口,可自定义
运行项目
python3 2.py
这里运行的时候可能会缺少模块,缺少什么模块会提示使用下面的命令安装即可,安装不上百度直接贴百度,有些包名不一样
pip3 install 模块名
这样就运行起来了
运行时注意引入的库是否引入正确
脚本里的端口注意不要和现有的端口冲突了
防火墙或云主机网络限制是否开放了888端口
解决以上问题后访问你的url即可
1. # 路径要写上 2. http://你的IP地址:888/hook_path
这样就说明好了
然后在API接收消息的网页上输入这个路径点击保存即可成功
注意:
确保网页上的Token 和 EncodingAESKey 和脚本里的一致
即:上面提示不要关的网页
点击保存成功后就可以写进去 IP 了
这样就可以写可信IP了 铁汁
把你的IP写进去就不报错了
用完把脚本关了就行,铁汁们,点个赞咋样