当前位置: 首页 > news >正文

对接企业微信API自建应用配置企业可信IP

前言

        为了实现系统调用团队会议功能,组织发起企业微信会议,于是需要和企业微信做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.documentElementname_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].dataif msg_type == "text": #文本消息name = name_xml[0].childNodes[0].data        #发送者idmsg = 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].datapic_url = pic_xml[0].childNodes[0].dataf.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进行对接,慎重慎重。

相关文章:

对接企业微信API自建应用配置企业可信IP

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

Windows右键新建Markdown文件类型配置 | Typora | VSCode

🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 今天毛毛张分享的是如何在右键的新建菜单中添加新建MarkdownFile文件,这是毛毛张分享的关于Typora软件的相关知识的第三期 文章目录 1.前言🏝…...

PyTorch构建一个肺部CT图像分类模型来分辨肺癌

当你有5万个标注的肺部CT DICOM图像数据,并且希望使用PyTorch构建一个肺部CT图像分类模型来分辨肺癌,以下是详细的步骤和示例代码: 数据准备 首先,确保你的数据集被正确分为训练集、验证集和测试集,并且每个图像都有相…...

MySQL简介及数据库

mysql简介 mysql是一个轻量级关系型数据库管理系统,具有体积小,速度快,开源的优点 sql是一种结构化查询语言(Structured Query Language),专门用来管理和处理关系型数据库的标准化编程语言,mysql实现了SQL标准&#xf…...

服务器基础1

服务器基础复习01 1.环境部署 系统:华为欧拉系统 网络简单配置nmtui 因为华为欧拉系统密码需要复杂度 所以我们可以进入后更改密码 echo 123 | passwd --stdin root也可以 echo "root:123" | chpasswd2.关闭防火墙,禁用SElinux 首先先关…...

<数据集>光伏板缺陷检测数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:2400张 标注数量(xml文件个数):2400 标注数量(txt文件个数):2400 标注类别数:4 标注类别名称:[Crack,Grid,Spot] 序号类别名称图片数框数1Crack8688922Grid8248843S…...

leetcode 513. 找树左下角的值

给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7提示: 二叉树的节点个数的范围是 [1,104]-231 < Node.val &…...

C++并发编程实战学习笔记

一、C的并发&#xff1a; 多进程并发&#xff1a; 将应用程序分为多个独立的进程&#xff0c;它们在同一时刻运行&#xff0c;就像同 时进行网页浏览和文字处理一样。独立的进程可以通过进程间常规的通信渠道传递讯息(信号、套接字、文件、管道等等)。不过&#xff0c;这种进程…...

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【25】【分布式事务】

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【25】【分布式事务】 本地事务事务的基本性质事务的隔离级别&#xff08;下面四个越往下&#xff0c;隔离级 别越高&#xff0c;并发能力越差&#xff09;事务的传播行为&#xff08;是否…...

HC05主从一体蓝牙模块的裸机使用——单片机<-->蓝牙模块

HC-05是一种常用的蓝牙模块&#xff0c;具有低功耗、低成本、易于使用的特点。它可以实现与其他蓝牙设备&#xff08;如手机、电脑等&#xff09;进行无线通信。HC-05蓝牙模块具有串口通信接口&#xff0c;可以通过串口与主控制器&#xff08;如Arduino、Raspberry Pi等&#x…...

“点点通“餐饮点餐小程序-计算机毕业设计源码11264

"点点通"餐饮点餐小程序 XXX专业XX级XX班&#xff1a;XXX 指导教师&#xff1a;XXX 摘要 随着中国经济的飞速增长&#xff0c;消费者的智能化水平不断提高&#xff0c;许多智能手机和相关的软件正在得到更多的关注和支持。其中&#xff0c;微信的餐饮点餐小程序更…...

C#知识|账号管理系统-账号信息管理界面[1]:账号分类选择框、Panel面板设置

哈喽,你好啊,我是雷工! 前一节实现了多条件查询后端代码的编写, 接下来继续学习账号信息管理界面的功能编写,本节主要记录账号分类选择框和Panel的设置, 以下为学习笔记。 01 功能说明 本节实现以下功能: ①:账号分类选择框只能选择,无法自由输入; ②:账号分类框默认…...

Meta即将推出4000亿的Llama 3 超级AI模型,或将改写大语言模型竞争格局!|TodayAI

2024年4月&#xff0c;科技巨头Meta发布了其最新的AI大型语言模型——Llama 3&#xff0c;该模型基于一个至少比前代产品Llama 2大七倍的数据集&#xff0c;展现出前所未有的性能。在最初发布时&#xff0c;Llama 3提供了8B和70B两种参数规模的版本&#xff0c;并迅速超越了Goo…...

数据挖掘新技能:Python爬虫编程指南

Python爬虫的优势 Python之所以成为数据爬取的首选语言&#xff0c;主要得益于其丰富的库和框架支持。以下是一些常用的库&#xff1a; Requests&#xff1a;用于发送HTTP请求&#xff0c;简单易用&#xff0c;是Python爬虫的基础库。BeautifulSoup&#xff1a;用于解析HTML文…...

object-C 解答算法:移动零(leetCode-283)

移动零(leetCode-283) 题目如下图:(也可以到leetCode上看完整题目,题号283) 解题思路: 本质就是把非0的元素往前移动,接下来要考虑的是怎么移动,每次移动多少? 这里需要用到双指针,i 记录每次遍历的元素值, j 记录“非0元素值”需要移动到的位置; 当所有“非0元素值”都移…...

靖江美食元宇宙

关于“靖江美食元宇宙”的具体信息&#xff0c;搜索结果中并未提供直接相关的详细描述。不过&#xff0c;搜索结果显示了有关元宇宙在食品领域的应用和探索&#xff0c;例如食品元宇宙的概念、不同品牌尝试进入元宇宙市场的例子等。这些信息表明&#xff0c;元宇宙技术正在被用…...

模板方法设计模式

模板方法设计模式: 模板方法设计模式&#xff1a;解决方法中存在重复代码的问题。 模板方法设计模式的写法&#xff1a; 1、定义一个抽象类 2、在里面定义2个方法 ​ 一个是模板方法&#xff1a;把相同代码放里面去 ​ 一个是抽象方法&#xff1a;具体实现交给子类完成 建议使用…...

对象存储解决方案:高性能分布式对象存储系统MinIO

文章目录 引言I 自动化数据管理界面1.1 图形用户界面:GUI1.2 命令行界面:MinIO CLI1.3 应用程序编程接口:MinIO APIII 部署集成2.1 建议使用RPM或DEB安装方式2.2 创建环境变量文件2.3 启动MinIO服务2.4 将NGINX用作反向代理,配置负载。III 基础概念3.1 为什么是对象存储?3…...

2024 年需要考虑的 16 个知识库趋势和统计数据

自2017年以来&#xff0c;千禧一代已成为全球人口最多的一代。如果您的企业还没有准备好应对这一变化带来的挑战&#xff0c;那么是时候加快这一进程了。 毫不奇怪&#xff0c;千禧一代痴迷于智能手机和技术。他们具有流动性&#xff0c;期望与他们互动的品牌能够即时高效。 …...

微信小程序-实现跳转链接并拼接参数(URL拼接路径参数)

第一种常用拼接方法&#xff1a;普通传值的拼接 //普通传值的拼接checkRouteBinttap: function (e) {wx.navigateTo({url: ../checkRoute/checkRoute?classId this.data.classInfo.classId "&taskId" this.data.classInfo.taskId,})}第二种&#xff1a;拼接…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...