企业消息转发服务器,Python构建企业微信自动消息转发服务端

2023-11-08

目前有在项目分组,就小组成员中,微信群消息回复较多的情况下,想根据组来转发特定消息,包含文字、图片、语言等。在此只是自己实现仅供参考,可以根据自身需求修改更多功能。

二、代码

2.1 企业微信相关信息

企业ID:corpid

301977fec79ca57c1cee8f3081df1178.png

自建应用appid

自建应用secret

23debeb7029b50ff934b4dadd619d02b.png

2.2 服务端部署 运行环境: python 版本 2.7

git clone https://github.com/redhatxl/wechatmsg.git

nohup python2.7 wechatmsg/wx_msg_server.py &

复制代码

2.3 参考RUL:

2.4 代码

# flask 框架后台

def server_run(self):

app = Flask(__name__)

@app.route('/index', methods=['GET', 'POST'])

def index():

wxcpt = WXBizMsgCrypt(self.sToken, self.sEncodingAESKey, self.sCorpID)

# 获取url验证时微信发送的相关参数

sVerifyMsgSig = request.args.get('msg_signature')

sVerifyTimeStamp = request.args.get('timestamp')

sVerifyNonce = request.args.get('nonce')

sVerifyEchoStr = request.args.get('echostr')

# 验证url

if request.method == 'GET':

ret, sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr)

print type(ret)

print type(sEchoStr)

if (ret != 0):

print "ERR: VerifyURL ret:" + str(ret)

sys.exit(1)

return sEchoStr

# 接收客户端消息

if request.method == 'POST':

sReqMsgSig = sVerifyMsgSig

sReqTimeStamp = sVerifyTimeStamp

sReqNonce = sVerifyNonce

sReqData = request.data

print(sReqData)

ret, sMsg = wxcpt.DecryptMsg(sReqData, sReqMsgSig, sReqTimeStamp, sReqNonce)

print ret, sMsg

if (ret != 0):

print "ERR: DecryptMsg ret: " + str(ret)

sys.exit(1)

# 解析发送的内容并打印

xml_tree = ET.fromstring(sMsg)

print('xml_tree is ', xml_tree)

复制代码

消息内容发送

def _send_text_msg(self, content):

data = {

"touser": ('|').join(self.userid.split(',')),

"toparty": ('|').join(self.partid.split(',')),

# "toparty":int(self.partid),

"msgtype": "text",

"agentid": self.agent_id,

"text": {

"content": content

},

"safe": 0

}

try:

response = requests.post(self.send_msg_url.format(self.access_token), json.dumps(data))

self.logoper.info(response.text)

print(response.text)

result_msg = json.loads(response.content)['errmsg']

return result_msg

except Exception as e:

self.logoper.info(e)

复制代码

日志

def create_dir(self):

"""

创建目录

:return: 文件名称

"""

_LOGDIR = os.path.join(os.path.dirname(__file__), self.logdir_name)

_TIME = time.strftime('%Y-%m-%d', time.gmtime()) + '-'

_LOGNAME = _TIME + self.logfile_name

LOGFILENAME = os.path.join(_LOGDIR, _LOGNAME)

if not os.path.exists(_LOGDIR):

os.mkdir(_LOGDIR)

return LOGFILENAME

def create_logger(self, logfilename):

"""

创建logger对象

:param logfilename:

:return: logger对象

"""

logger = logging.getLogger()

logger.setLevel(logging.INFO)

handler = logging.FileHandler(logfilename)

handler.setLevel(logging.INFO)

formater = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

handler.setFormatter(formater)

logger.addHandler(handler)

return logger

复制代码

配置文件

# 定义微信公众号信息

[common]

# 企业微信企业ID

corpid = wxe23xxxxxxxxxxx

# 接收消息 服务器 配置

[recmsg]

Token = mVNAAw3xxxxxxxxxxxxxxxxx

EncodingAESKey = vwbKImxc3WPeE073xxxxxxxxxxxxxxxxxx

# 自建应用信息

[appconfig]

# 自建应用agentid

agentid = 1000002

# 自建应用secret

secret = 6HAGX7Muw36pv5anxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# 消息接收信息

# 消息接收用户id,如果多个用户用英文','隔开

userid = xuel|yaoy

# 消息接收部门id,如果多个用英文','隔开

partid = 11

[urlconfig]

# 获取应用token的api接口

get_access_token_url = https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={}&corpsecret={}

# 发送消息api接口

send_msg_url = https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={}

# 上传媒体api接口,获取mediaid

upload_media_url = https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token={}&type=image

# 上传高清语音接口

upload_video_url = https://qyapi.weixin.qq.com/cgi-bin/media/get/jssdk?access_token={}&media_id={}

[loginfo]

#日志目录

logdir_name = logdir

#日志文件名称

logfile_name = wechat_server.log

复制代码

三、测试

在企业微信发送消息,可以修改配置文件制定转发到特定的群组,从而避免消息分流。 启用应用API,设置回调地址

7986749796b97ff7d3ba4593c2acee42.png

70082e8717c55d6eb959ced9a395597f.png

测试发送消息

92b76607316fbbac4dbcea286439bf19.png

查看接受消息

1059ca5720cf0b29fb22442c0cd09956.png

四、优化

后期可以配合 数据库 将每次获取的access_token 保存至数据库,待2小时过期后,再重新获取新的。

更多内容转发

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

企业消息转发服务器,Python构建企业微信自动消息转发服务端 的相关文章

随机推荐

  • vue3 数组清空与重新赋值

    vue3里面 如果数组是用reactive 声明的 要清空数组得用list length 0 如果想要使用list 或者直接赋值类型list 1 2 3 4 5 得把数组用ref 来声明 然后用list value 来修改 然后如果是对象里
  • 使用Stream流,根据条件去重并求数量

    一 去重类型 1 先创建数据 放入4个对象 其中有两个对象name属性相同 求name不一样的对象有多少数量 List
  • 锈湖新作地铁繁花试玩版正式上线啦

    地铁繁花是锈湖厂商新作点击式解谜冒险解谜游戏 英文名称为 Underground Blossom 在游戏中你将深入锈湖的地下 扮演并追溯Laura Vanderboom的人生和记忆吧 从一个车站到另一个车站 每个地铁站都象征着劳拉的一段过去
  • Ubuntu16.04下安装JDK1.8

    前提条件 拥有Ubuntu16 04环境 安装步骤 下载JDK安装包 下载版本 jdk 8u171 linux x64 tar gz 下载方式 云盘下载 云盘下载 提取码 7brp 官网下载 https www oracle com tec
  • python获取clickhouse数据表的全部列名称

    使用python获取的方法 import clickhouse connect client clickhouse connect get client host 127 0 0 1 def get col name table name
  • 详解:Char 和 varChar 之间的区别

    MySQL中的字符串有两个常用的类型 char和varchar 二者各有优势 下面我们来详细分析一下 通常在建表的时候对于String 类型的数据定义我们或许会很纠结 什么时候用char 什么时候用 varchar 呢 首先可以明确的是 c
  • 如何解决java.lang.NoClassDefFoundError--第二部分

    如何解决NoClassDefFoundError 第二部分 第一部分请看 http vipcowrie iteye com blog 1561291 本文面向的是JAVA初学者 建议你们自己编译和运行例子程序 本文包含了NoClassDef
  • c++单链表的简单实现(内含实现代码)

    考研报名等待之时闲来无事 写了一个简单的单链表 简单实现了以下功能 头插法建立单链表 按序遍历链表 单链表原地排序 不使用额外的空间 单链表按序删除 单链表原地倒置 附上代码如下 节点结构体定义 typedef int ElemType t
  • uniapp uview内置样式记录

    uview内置样式 文字省略 u line 1 u line 2 u line 3 u line 4 u line 5五个类名在文字超出内容盒子时 分别只显示一行 两行 三行 四行 五行 省略号 定位 uView内置了关于相对和绝对定位的两
  • 基于springboot的旅游信息管理系统完整源码

    基于springboot的旅游信息管理系统完整源码 技术栈 jdk1 8 mysql8 maven3 6 0 idea 功能模块 旅游路线 旅游景点 旅游酒店 旅游车票 旅游保险 旅游策略 订单管理 留言管理 数据分析等等 项目下载 htt
  • Matlab 如何生成一个[a,b]范围内随机整数的2种方法【已经解决】

    如何使用MATLAB生成一个 a b 范围内的随机整数 比如 随机生成 9 13 范围内的一个 或多个 整数 首先感谢 slandarer的指正 现已经更改 round 为四舍五入取整 而非向上取整 方法1为一个较为不错的方法 方法1 ra
  • 游戏开发-虚幻引擎天源了 [分享]

    https www unrealengine com zh CN 虚幻引擎4现在可供每个人免费使用 而且所有未来的更新都将免费 您可以下载引擎并将其用于游戏开发的各个方面 包括教育 建筑以及可视化 甚至虚拟现 实 电影和动画 当您发布游戏或
  • 计算机图形学入门(十六)-光线追踪(渲染方程)

    本部分主要介绍了渲染方程的逐步完善和简单的推导过程 从BRDF开始 到反射公式的推导再到渲染方程的完善 最后展示了实际渲染的例子 学习视频 GAMES101 现代计算机图形学入门 闫令琪 哔哩哔哩 bilibilihttps www bil
  • leaftlet 显示个性化图标、旋转图标

    1 引用leaftlet 高版本 比如1 8 3 在map js 中定义图标 L marker geo rotationAngle 270 icon L AwesomeMarkers icon icon awesomeIcon prefix
  • 创建匿名线程的5种方式

    package mythread 使用匿名内部类开启线程 public class Demo02anonymous thread public static void main String args 方式一 使用匿名内部类创建线程的子类对
  • java 是静态语言还是动态_java是动态语言还是静态语言?,

    java是动态语言还是静态语言 Java是动态语言还是静态语言 Java是一种静态语言 Java是编译时确定的变量类型 不能在运行时更改 在类型转换中也是强制的 例如 当大规模整数类型转换为小规模整数类型时 必须进行强转换 比如int必须强
  • 【TVM 学习资料】用 Schedule 模板和 AutoTVM 优化算子

    本篇文章译自英文文档 Optimizing Operators with Schedule Templates and AutoTVM 作者是 Lianmin Zheng Chris Hoge 更多 TVM 中文文档 访问 TVM 中文站
  • torch的GLU函数

    import torch nn as nn nn GLU GLU门控线性单元的描述 API
  • memcached查看所有的key

    memcached list all keys 1 打开命令窗口输入 gt telnet 127 0 0 1 11211 2 查找 输入 stats items 回车 显示各个slab 中 item 的数目和存储时长 最后一次访问距离现在的
  • 企业消息转发服务器,Python构建企业微信自动消息转发服务端

    目前有在项目分组 就小组成员中 微信群消息回复较多的情况下 想根据组来转发特定消息 包含文字 图片 语言等 在此只是自己实现仅供参考 可以根据自身需求修改更多功能 二 代码 2 1 企业微信相关信息 企业ID corpid 自建应用appi