微信公众号开发之模板消息推送系统

微信公众号开发之模板消息推送系统

小程序爬虫接单、app爬虫接单、网页爬虫接单、接口定制、网站开发、小程序开发、微信公众号开发> 点击这里联系我们 <

微信请扫描下方二维码

在这里插入图片描述

代码仅供学习交流,请勿用于非法用途

一、准备数据库(sqlserver)

create table  notify_list(
    id INT NOT NULL identity(1,1),
    openid VARCHAR(40) not null,
    templateid VARCHAR(50) not null,
    toUrl VARCHAR(200) default null,
    mpappid VARCHAR(60) default null,
    mppath VARCHAR(200) default null,
    sendstatus VARCHAR(20) default null,
    sendres VARCHAR(20) default null,
    flag VARCHAR(1) default null,
    f1 varchar(100) default null,
    f2 varchar(100) default null,
    f3 varchar(100) default null,
    f4 varchar(100) default null,
    f5 varchar(100) default null,
    f6 varchar(100) default null,
    f7 varchar(100) default null,
    f8 varchar(100) default null,
    f9 varchar(100) default null,
    f10 varchar(100) default null,
    f11 varchar(100) default null,
    f12 varchar(100) default null,
    PRIMARY KEY(id)
)

二、代码实现

dao.py

# -*- coding:utf-8 -*-
import pymssql
import configparser
import os

cf = configparser.ConfigParser()
try:
    cf.read(os.getcwd() + "/conf.ini", encoding="utf-8-sig")
except Exception as e:
    print("程序目录下不存在conf.ini配置文件~")
    exit(0)


def getConf(sec, key):
    try:
        return cf.get(sec, key)
    except Exception as e:
        print(e)
        print("未得到以下配置:" + sec + " - " + key)
        exit(0)

#####################################################
# 配置段
host = getConf("Mysql-Database", "host")
user = getConf("Mysql-Database", "user")
password = getConf("Mysql-Database", "password")
port = getConf("Mysql-Database", "port")
database = getConf("Mysql-Database", "database")


def execSql(sql):
    try:
        conn = pymssql.connect(host=host, user=user, password=password, port=port, database=database)
        cur = conn.cursor()
        cur.execute(sql)
        conn.commit()
        return True
    except Exception as e:
        pass
    return False


def querySql(sql):
    try:
        conn = pymssql.connect(host=host, user=user, password=password, port=port, database=database)
        cur = conn.cursor()
        cur.execute(sql)
        return cur.fetchall()
    except Exception as e:
        pass
    return

service.py

# -*- coding:utf-8 -*-
from wxservice import *
from dao import *
import time
import re


##############################
# 配置文件段
notify_table_name = getConf("Mysql-Database", "notify_table_name")
startTime = getConf("app-sys", "start")
# 启动时间段
startTimes = []
try:
    startTimes = startTime.split(",")
except Exception as e:
    pass

##############################
# 固定配置段
# 间隔启动判断
intervalStartTime = 29


def getCurrentDate():
    return str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))


def install():
    sql1 = '''
        if not exists (select * from sysobjects where id = object_id(\'''' + notify_table_name + '''\') and OBJECTPROPERTY(id, 'IsUserTable') = 1)
        create table ''' + notify_table_name + '''(
            id INT NOT NULL identity(1,1),
            openid VARCHAR(40) not null,
            templateid VARCHAR(50) not null,
            toUrl VARCHAR(200) default null,
            mpappid VARCHAR(60) default null,
            mppath VARCHAR(200) default null,
            sendstatus VARCHAR(20) default null,
            sendres VARCHAR(20) default null,
            flag VARCHAR(1) default null,
            f1 varchar(100) default null,
            f2 varchar(100) default null,
            f3 varchar(100) default null,
            f4 varchar(100) default null,
            f5 varchar(100) default null,
            f6 varchar(100) default null,
            f7 varchar(100) default null,
            f8 varchar(100) default null,
            f9 varchar(100) default null,
            f10 varchar(100) default null,
            f11 varchar(100) default null,
            f12 varchar(100) default null,
            PRIMARY KEY(id)
        )
    '''
    res = execSql(sql1)
    if res:
        pass
        # print("创建数据表:" + notify_table_name + "成功!")
    else:
        print("创建数据表:" + notify_table_name + "失败!")


def queryNotifyList():
    '''
    获取消息通知表内所有通知列表
    :return:
    '''
    sql = "select * from " + notify_table_name + " where flag is null"
    return querySql(sql)


def updateNotify(id, status, msg, flag):
    '''
    更新消息通知状态
    :param id       :通知id
    :param status   :通知状态
    :param msg      :官方发送文本结果
    :param flag     :结果标识
    :return:
    '''
    sql = "update " + notify_table_name + " set sendres = '%s', sendstatus = '%s', flag = '%s' where id = %d" % (msg, status, flag, int(id))
    return execSql(sql)


def getTemplateDetail(templateid):
    templateList = getTemplateList()
    if templateList and len(templateList) > 0:
        for template in templateList:
            try:
                template_id = template['template_id']
                if template_id == templateid:
                    return template['content']
            except Exception as e:
                pass
    else:
        print("节点:%s,对象:%s,执行结果:%s,操作时间:%s!" % ("模板消息列表", "无", "无任何审核通过的模板", getCurrentDate()))


def getTemplateDatas(content):
    pat = re.compile("{{(.*?)\.DATA}}")
    return re.findall(pat, content)


def asseMsg(notify, templateFileds):
    msg = {}
    index = 9
    for templateFiled in templateFileds:
        try:
            msg[templateFiled] = {}
            msg[templateFiled]['value'] = str(notify[index])
            msg[templateFiled]['color'] = "#173177"
            index += 1
        except Exception as e:
            pass
    return msg


def dosend():
    notifyList = queryNotifyList()
    if notifyList and len(notifyList) > 0:
        updateToken()
        for notify in notifyList:
            try:
                lid = notify[0]
                openid = notify[1]
                templateid = notify[2]
                content = getTemplateDetail(templateid)
                if content:
                    templateFileds = getTemplateDatas(content)
                    if templateFileds and len(templateFileds) > 0:
                        toUrl = notify[3]
                        mpappid = notify[4]
                        mppath = notify[5]
                        msg = asseMsg(notify, templateFileds)
                        status, wxmsg = sendTemplateMsg(openid, templateid, msg, toUrl, mpappid, mppath)
                        sendstatus = ""
                        flag = ""
                        if status:
                            flag = "1"
                            sendstatus = "发送成功"
                        else:
                            flag = "0"
                            sendstatus = "发送失败"
                        updateNotify(lid, sendstatus, wxmsg, flag)
                        print("节点:%s,对象:%s,执行结果:%s,操作时间:%s!" % ("消息推送", str(openid), sendstatus, getCurrentDate()))
                    else:
                        print("节点:%s,对象:%s,执行结果:%s,操作时间:%s!" % ("消息模板获取", "templateid", "id为:%s 的消息模板无规范数据体" % str(templateid), getCurrentDate()))
                else:
                    print("节点:%s,对象:%s,执行结果:%s,操作时间:%s!" % ("消息模板获取", "templateid", "没有id为:%s 的消息模板" % str(templateid), getCurrentDate()))
            except Exception as e:
                print("节点:%s,对象:%s,执行结果:%s,操作时间:%s!" % ("消息推送错误", "未知", str(e), getCurrentDate()))
    else:
        print("节点:%s,对象:%s,执行结果:%s,操作时间:%s!" % ("消息推送准备", "无", "数据库暂无任何可发送数据", getCurrentDate()))


def getCurrTime():
    return str(time.strftime('%H:%M'))


def parser():
    dosend()


def main():
    # 初始化项目
    install()
    # 首次执行
    parser()
    if len(startTimes) == 0:
        while True:
            parser()
    else:
        while True:
            currTime = getCurrTime()
            if currTime in startTimes:
                print("到达启动时间 %s ,执行一次爬虫~" % currTime)
                parser()
            else:
                print("检查时间:%s 程序休眠中~" % currTime)
                time.sleep(intervalStartTime)


if __name__ == '__main__':
    main()


小程序爬虫接单、app爬虫接单、网页爬虫接单、接口定制、网站开发、小程序开发 > 点击这里联系我们 <

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章