Python 发送企业微信消息

下方代码实现功能

1、联接Sqlserver数据库,取出发送消息清单

2、根据appid,secret获取企业微信token

3、根据消息清单类型决定发送客户消息还是内部员工消息

4、更新发送消标记

5、创建发送定时任务

python 复制代码
from datetime import datetime
import time
import threading
from queue import Queue
from queue import Empty
import pymssql
from http_utils import *

class UserMsgServer(object):


    def init(self):
        self.connect = pymssql.connect('xxxxxx:6229', 'user_name', 'pass', 'HD_Common')  #建立连接
        if self.connect:
            print("连接成功!")
        self.appid = None;
        self.secret_abs = None;
        self.secret_kh = None;
        self.agentid = None;
        self.token_abs = None;
        self.token_kh = None;


    def getToken(self):
        url = f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={self.appid}&corpsecret={self.secret_abs}"
        result = httpGet(url)
        self.token_abs = result["access_token"]
        print(self.token_abs)
        url = f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={self.appid}&corpsecret={self.secret_kh}"
        result = httpGet(url)
        self.token_kh = result["access_token"]
        print(self.token_kh)
        pass


    #发送给内部员工
    def send(self, userId, conent):

        url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + self.token_abs
        print(url)
        data = {
            "touser" : userId,
            "toparty" : "",
            "totag" : "",
            "msgtype" : "text",
            "agentid" : self.agentid,
            "text" : {
                "content" : conent
            },
            "safe":0,
            "enable_id_trans": 0,
            "enable_duplicate_check": 0,
            "duplicate_check_interval": 1800
        }
        result = httpPost(url, data)
        print(result)
        return result["errcode"]
        pass

    #发送给客户
    def send1(self, userId, sender, conent):

        url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_msg_template?access_token=" + self.token_kh + "&debug=1"
        print(url)
        data = {
            "chat_type": "single",
            "external_userid": [
                userId
            ],
            "sender": sender,
            "text": {
                "content": conent
            }
        }
        result = httpPost(url, data)
        print(result)
        return result["errcode"]
        pass    

    def sendMsg(self):
        cursor = self.connect.cursor()   #创建一个游标对象,python里的sql语句都要通过cursor来执行
        sql = "select IndexId,UserId,Content,UserType from W_UserMessage where state = 0 and (ISNULL(PlanFlag,0)= 0 or (ISNULL(PlanFlag,0)= 1 and PlanTime <= GETDATE()))"
        cursor.execute(sql)   #执行sql语句
        row = cursor.fetchone()  #读取查询结果,            
        index = 1    
        while row:            #循环读取所有结果
            if index == 1:
                self.getToken();  #获取token

            id = row[0]
            userId = row[1]
            content = row[2]
            userType = row[3]
            
            print("发送消息给"+ userId +",content=" + content)
            if userType == "guest":
                users = userId.split('|');
                sender = "";
                if len(users) > 1:
                    userId = users[0];
                    sender =  users[1];
                    
                result = self.send1(userId, sender, content)
                self.updateMsg(id, result)

            else:    
                result = self.send(userId,content)
                self.updateMsg(id, result)
                
                           
            row = cursor.fetchone()
            index = index + 1
            time.sleep(1)
            
        
    def updateMsg(self,id, result):

        print("result")
        print(result);
        cursor = self.connect.cursor()
        if result == 0:
             cursor.execute(f"update W_UserMessage set state=1 where IndexId={id}")
        else:
             cursor.execute(f"update W_UserMessage set state=-1 where IndexId={id}")
             
        self.connect.commit()  #提交
        

    # 每n秒执行一次
    def job(self):
        while True:
            #print(datetime.now().strftime("%Y-%m-%d  %H:%M:%S"))
            try:
                self.sendMsg()
                time.sleep(3)      
            except Exception as reason:
                print(reason)
                

        
userMsgServer = UserMsgServer()
userMsgServer.init()
userMsgServer.appid = "wwe72868b229a****"
userMsgServer.secret_abs = "sGbP3HiG2e4ciZFuqyiHlAxnHvmY_Xlku8B7******"
userMsgServer.secret_kh = "Xw24GyBQCDj_IEJL7Sv1Sd1eSRGUJLo*******"
userMsgServer.agentid = 1000012
userMsgServer.job()
相关推荐
聪明的墨菲特i4 分钟前
Django前后端分离基本流程
后端·python·django·web3
工业3D_大熊10 分钟前
【虚拟仿真】CEETRON SDK在船舶流体与结构仿真中的应用解读
java·python·科技·信息可视化·c#·制造·虚拟现实
SEEONTIME19 分钟前
python-24-一篇文章彻底掌握Python HTTP库Requests
开发语言·python·http·http库requests
Bearnaise19 分钟前
PointMamba: A Simple State Space Model for Point Cloud Analysis——点云论文阅读(10)
论文阅读·笔记·python·深度学习·机器学习·计算机视觉·3d
哇咔咔哇咔1 小时前
【科普】conda、virtualenv, venv分别是什么?它们之间有什么区别?
python·conda·virtualenv
CSXB991 小时前
三十四、Python基础语法(文件操作-上)
开发语言·python·功能测试·测试工具
亚图跨际2 小时前
MATLAB和Python及R潜变量模型和降维
python·matlab·r语言·生物学·潜变量模型
IT古董2 小时前
【机器学习】决定系数(R²:Coefficient of Determination)
人工智能·python·机器学习
德育处主任Pro2 小时前
『Django』APIView基于类的用法
后端·python·django
Star Patrick2 小时前
算法训练(leetcode)二刷第十九天 | *39. 组合总和、*40. 组合总和 II、*131. 分割回文串
python·算法·leetcode