微信公衆號開發之模板消息推送系統

微信公衆號開發之模板消息推送系統

小程序爬蟲接單、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爬蟲接單、網頁爬蟲接單、接口定製、網站開發、小程序開發 > 點擊這裏聯繫我們 <

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