python 企业微信小程序定时推送业务信息

代码仅供参考,请根据自身业务情况修改

#!/usr/bin/python3
#-*- encoding:utf-8 -*-
'''
pip3 install -r requirements.txt
pip3 install requests_toolbelt
pip3 install pymysql
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple xlsxwriter
'''
import requests
import json
from requests_toolbelt import MultipartEncoder
from PIL import Image
import re
##
import pymysql
import sys
import time
import datetime
#
import os
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
#from matplotlib import font_manager
import random
import shutil
import datetime
import pandas as pd
import xlrd
import openpyxl
# import xlsxwriter
# from openpyxl.workbook import Workbook
# from openpyxl.writer.excel import ExcelWriter
# from openpyxl.drawing.image import Image
class DBUtil(object):
host = "10.8.0.1"
port = 3306
user = "root"
password = "pwd@123456."
db = "mysql"
charset = "utf8"
conn = None
def __init__(self,db='mysql',host='10.8.0.1',port=3306,user='root',password='123456',charset='utf8'):
self.db = db
self.host = host
self.port = port
self.user = user
self.password = password
self.charset = charset
pass
def db_connect(self):
try:
#self.db = db_name
#print(self.db)
self.conn = pymysql.connect(host=self.host,port=self.port,user=self.user,password=self.password,db=self.db,charset=self.charset)
cursor = self.conn.cursor()
except Exception as e:
print(e)
else:
print('Connect Success:%s' % cursor)
def db_sql(self,command,sql):
"""
查询数据库数据
:param command:
:param sql:
:return:
"""
if not self.conn:
print("no connect db")
sys.exit()
cursor = self.conn.cursor()
if command in ('SELECT', 'select'):
# 如果为查询指令
sql = sql.encode('utf-8')
try:
cursor.execute(sql)
result = cursor.fetchall()
return result
except Exception as e:
print(e)
finally:
self.conn.close()
elif command in ('delete', 'DELETE', 'update', 'UPDATE', 'insert', 'INSERT'):
# 如果为增删改
sql = sql.encode('utf-8')
try:
cursor.execute(sql)
self.conn.commit()
except Exception as e:
# 如果失败则回滚
self.conn.rollback()
print(e)
finally:
self.conn.close()
else:
print('Command Error!')
class qywx:
# 部门ID
'''
22 [{"id":14,"name":"总经理办公室","parentid":1,"order":100001000,"department_leader":["XingYe"]},{"id":19,"name":"策划","parentid":18,"order":100000000,"department_leader":[]},{"id":22,"name":"程序","parentid":18,"order":99997000,"department_leader":[]},{"id":24,"name":"商务","parentid":5,"order":99995000,"department_leader":[]},{"id":25,"name":"市场","parentid":5,"order":99994000,"department_leader":[]}]
'''
#
corpid = 'ww953722a35a02111a' #步骤1-3中的企业id
app_list = [
(1000002, '-iKikad01lHeFVaZ_2G01F3sZg5T0TV6l3OUXtf2Xr0') #此处将步骤1-2中的AgentId 和 Secret分别填入,多个应用逗号隔开
]
def __init__(self, app_id): #app_id 按app_list顺序编号
self.agentid, self.corpsecret = qywx.app_list[app_id]
# 上传临时文件素材接口,图片也可使用此接口,20M上限
def post_file(self, filepath, filename):
response = requests.get("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={corpsecret}".format(corpid=qywx.corpid, corpsecret=self.corpsecret))
data = json.loads(response.text)
access_token = data['access_token']
post_file_url = "https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token={access_token}&type=file".format(access_token=access_token)
m = MultipartEncoder(
fields={'file': (filename, open(filepath + filename, 'rb'), 'multipart/form-data')},
)
r = requests.post(url=post_file_url, data=m, headers={'Content-Type': m.content_type})
js = json.loads(r.text)
print("upload " + js['errmsg'])
if js['errmsg'] != 'ok':
return None
return js['media_id']
# 向应用发送图片接口,_message为上传临时素材后返回的media_id
def send_img(self, _message, useridlist = ['name1|name2'],toparty=None):
useridstr = "|".join(useridlist)
response = requests.get("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={corpsecret}".format(corpid=qywx.corpid, corpsecret=self.corpsecret))
data = json.loads(response.text)
access_token = data['access_token']
json_dict = {
"touser" : useridstr,
"msgtype" : "image",
"agentid" : self.agentid,
"image" : {
"media_id" : _message,
},
"safe": 0,
"enable_id_trans": 1,
"enable_duplicate_check": 0,
"duplicate_check_interval": 1800
}
if not toparty:
print("use default")
else:
del json_dict['touser']
json_dict['toparty'] = toparty
json_str = json.dumps(json_dict)
response_send = requests.post("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}".format(access_token=access_token), data=json_str)
print("send to " + useridstr + ' ' + json.loads(response_send.text)['errmsg'])
return json.loads(response_send.text)['errmsg'] == 'ok'
# 向应用发送文字消息接口,_message为字符串
def send_text(self, _message, useridlist = ['name1|name2'],toparty=None):
useridstr = "|".join(useridlist) # userid 在企业微信-通讯录-成员-账号
response = requests.get("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={corpsecret}".format(corpid=qywx.corpid, corpsecret=self.corpsecret))
data = json.loads(response.text)
access_token = data['access_token']
json_dict = {
"touser" : useridstr,
"msgtype" : "text",
"agentid" : self.agentid,
"text" : {
"content" : _message
},
"safe": 0,
"enable_id_trans": 1,
"enable_duplicate_check": 0,
"duplicate_check_interval": 1800
}
if not toparty:
print("use default")
else:
del json_dict['touser']
json_dict['toparty'] = toparty
json_str = json.dumps(json_dict)
response_send = requests.post("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}".format(access_token=access_token), data=json_str)
print("send to " + useridstr + ' ' + json.loads(response_send.text)['errmsg'])
return json.loads(response_send.text)['errmsg'] == 'ok'
# 向应用发送markdown消息接口,_message为字符串
def send_markdown(self, _message, useridlist = ['name1|name2'],toparty=None):
useridstr = "|".join(useridlist) # userid 在企业微信-通讯录-成员-账号
response = requests.get("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={corpsecret}".format(corpid=qywx.corpid, corpsecret=self.corpsecret))
data = json.loads(response.text)
access_token = data['access_token']
json_dict = {
"touser" : useridstr,
"msgtype" : "markdown",
"agentid" : self.agentid,
"markdown" : {
"content" : _message
},
"safe": 0,
"enable_id_trans": 1,
"enable_duplicate_check": 0,
"duplicate_check_interval": 1800
}
if not toparty:
print("use default")
else:
del json_dict['touser']
json_dict['toparty'] = toparty
json_str = json.dumps(json_dict)
response_send = requests.post("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}".format(access_token=access_token), data=json_str)
print("send to " + useridstr + ' ' + json.loads(response_send.text)['errmsg'])
return json.loads(response_send.text)['errmsg'] == 'ok'
# 向应用发送file消息接口,_message为上传临时素材后返回的media_id
def send_file(self, _message, useridlist = ['name1|name2'],toparty=None):
useridstr = "|".join(useridlist) # userid 在企业微信-通讯录-成员-账号
response = requests.get("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={corpsecret}".format(corpid=qywx.corpid, corpsecret=self.corpsecret))
data = json.loads(response.text)
access_token = data['access_token']
json_dict = {
"touser" : useridstr,
"msgtype" : "file",
"agentid" : self.agentid,
"file" : {
"media_id" : _message
},
"safe": 0,
"enable_id_trans": 1,
"enable_duplicate_check": 0,
"duplicate_check_interval": 1800
}
if not toparty:
print("use default")
else:
del json_dict['touser']
json_dict['toparty'] = toparty
json_str = json.dumps(json_dict)
response_send = requests.post("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}".format(access_token=access_token), data=json_str)
print("send to " + useridstr + ' ' + json.loads(response_send.text)['errmsg'])
return json.loads(response_send.text)['errmsg'] == 'ok'
def get_login_count():
unit = 3600
cur_time = int(time.time())
hour_stamp = cur_time - ( cur_time % unit )
prev_stamp = hour_stamp - 3600
prev_time_struct = time.localtime(prev_stamp)
print(prev_stamp)
prev_date_string = time.strftime("%Y-%m-%d %H:%M:%S", prev_time_struct)
cur_time_struct = time.localtime(hour_stamp)
cur_date_string = time.strftime("%Y-%m-%d %H:%M:%S", cur_time_struct)
date_int_string = time.strftime("%Y%m%d",prev_time_struct)
db = DBUtil("db_authen_log")
sql = "SELECT COUNT(DISTINCT a_uid) as login FROM tb_authen_log_{} WHERE a_login_time>={} AND a_login_time<{} ;".format(date_int_string, prev_stamp, hour_stamp);
print("{} - {} : sql:{}".format(prev_date_string,cur_date_string, sql))
db.db_connect()
data = db.db_sql('SELECT',sql)
count_login = 0
for i in data:
count_login = i[0]
target = {"key":"login_count","name":"登录人数(全渠道)","value":count_login,"start_time":prev_date_string, "end_time":cur_date_string,"sql":sql}
return target
def get_pay_sum():
unit = 3600
cur_time = int(time.time())
hour_stamp = cur_time - ( cur_time % unit )
prev_stamp = hour_stamp - 3600
prev_time_struct = time.localtime(prev_stamp)
print(prev_stamp)
prev_date_string = time.strftime("%Y-%m-%d %H:%M:%S", prev_time_struct)
cur_time_struct = time.localtime(hour_stamp)
cur_date_string = time.strftime("%Y-%m-%d %H:%M:%S", cur_time_struct)
date_int_string = time.strftime("%Y%m%d",prev_time_struct)
db = DBUtil(db="db_pay_log")
sql = "SELECT SUM(p_price) FROM tb_pay_log_{} WHERE p_status = 0 AND p_finishTime >= {} AND p_finishTime < {} ;".format(date_int_string, prev_stamp, hour_stamp);
print("{} - {} : sql:{}".format(prev_date_string,cur_date_string, sql))
db.db_connect()
data = db.db_sql('SELECT',sql)
sum_data = 0
for i in data:
sum_data = i[0]
target = {"key":"pay_sum","name":"充值金额(全渠道)","value":sum_data,"start_time":prev_date_string, "end_time":cur_date_string,"sql":sql}
return target
def get_login_count_hour():
unit = 3600
cur_time = int(time.time())
hour_stamp = cur_time - ( cur_time % unit )
prev_stamp = hour_stamp - 3600
prev_time_struct = time.localtime(prev_stamp)
print(prev_stamp)
prev_date_string = time.strftime("%Y-%m-%d %H:%M:%S", prev_time_struct)
cur_time_struct = time.localtime(hour_stamp)
cur_date_string = time.strftime("%Y-%m-%d %H:%M:%S", cur_time_struct)
date_int_string = time.strftime("%Y%m%d",prev_time_struct)
db = DBUtil(db="db_authen_log")
sql = "select FROM_UNIXTIME(a_login_time, '%H') AS time, COUNT(1) from tb_authen_log_{} GROUP BY time;".format(date_int_string);
db.db_connect()
data = db.db_sql('SELECT',sql)
target = {"key":"login_count_hour","name":"登录人数(每小时)","value":data,"sql":sql}
return target
def get_pay_sum_hour():
unit = 3600
cur_time = int(time.time())
hour_stamp = cur_time - ( cur_time % unit )
prev_stamp = hour_stamp - 3600
prev_time_struct = time.localtime(prev_stamp)
print(prev_stamp)
prev_date_string = time.strftime("%Y-%m-%d %H:%M:%S", prev_time_struct)
cur_time_struct = time.localtime(hour_stamp)
cur_date_string = time.strftime("%Y-%m-%d %H:%M:%S", cur_time_struct)
date_int_string = time.strftime("%Y%m%d",prev_time_struct)
db = DBUtil(db="db_pay_log")
sql = "select FROM_UNIXTIME(p_finishTime, '%H') AS time, SUM(p_price) from tb_pay_log_{} GROUP BY time;".format(date_int_string);
db.db_connect()
data = db.db_sql('SELECT',sql)
target = {"key":"pay_sum_hour","name":"充值概况(每小时)","value":data,"sql":sql}
return target
def get_pay_order_hour():
unit = 3600
cur_time = int(time.time())
hour_stamp = cur_time - ( cur_time % unit )
cur_time_struct = time.localtime(hour_stamp)
prev_stamp = hour_stamp - 3600
prev_time_struct = time.localtime(prev_stamp)
date_int_string = time.strftime("%Y%m%d",prev_time_struct)
db = DBUtil(db="db_pay_log")
sql = "select FROM_UNIXTIME(p_finishTime, '%H') AS time, COUNT(1) from tb_pay_log_{} GROUP BY time;".format(date_int_string);
db.db_connect()
data = db.db_sql('SELECT',sql)
target = {"key":"pay_sum_hour","name":"充值订单数(每小时)","value":data,"sql":sql}
return target
def create_plt_data(x,y,title,xlabel,ylabel,filename):
# 准备数据
x_data = x #[f"{i}" for i in range(1, 25)]
y_data = y #[random.randint(100, 300) for i in range(24)]
print("titile:{} ,x:{} ,y:{}".format(title,x,y))
# print(matplotlib.matplotlib_fname())
plt.clf()
# 正确显示中文和负号
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 画图,plt.bar()可以画柱状图
for i in range(len(x_data)):
plt.bar(x_data[i], y_data[i])
# 设置图片名称
plt.title(title)
# 设置x轴标签名
plt.xlabel(xlabel)
# 设置y轴标签名
plt.ylabel(ylabel)
save_dir = "/tmp/"
out = None
if not os.path.exists(save_dir):
print("[warning] file save dir not exists")
else:
filepath = save_dir+filename
print("[info] will save file to:",filepath)
plt.savefig(filepath)
out = filepath
# plt.show()
# plt.savefig(path+'scatter.jpg')#保存图片
# plt.savefig(path+'plot.jpg')#保存图片\n",
return {'out':out,'dir':save_dir,'filename':filename}
def create_plt_duiji_data(x,y1,y2,title,xlabel,ylabel,y2label,filename):
plt.clf()
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
plt.bar(x,y2,width=0.4,color='#dddddd',zorder=5,label=y2label)
plt.bar(x,y1,width=0.4,bottom=y2,color='#d62728',zorder=5,label=ylabel)
c=np.mean(y1)
plt.axhline(y=c,color="black",linestyle=':')
plt.title(title)
plt.xlabel(xlabel)
plt.tick_params(axis='x',length=0)
plt.grid(axis='y',alpha=0.5,ls='--')
plt.legend(frameon=False)
plt.tight_layout()
#plt.ylabel(ylabel)
save_dir = "/tmp/"
out = None
if not os.path.exists(save_dir):
print("[warning] file save dir not exists")
else:
filepath = save_dir+filename
print("[info] will save file to:",filepath)
plt.savefig(filepath)
out = filepath
return {'out':out,'dir':save_dir,'filename':filename}
def create_plt_line(x,y,title,xlabel,ylabel,filename):
# 准备数据
x_data = x #[f"{i}" for i in range(1, 25)]
y_data = y #[random.randint(100, 300) for i in range(24)]
print("titile:{} ,x:{} ,y:{}".format(title,x,y))
# print(matplotlib.matplotlib_fname())
plt.clf()
# 正确显示中文和负号
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
#x_ticks_label=["{}:00".format(i) for i in x]
#rotation表示旋转角度
#设置x坐标
#plt.xticks(x,x_ticks_label,rotation=45)
#y_ticks_label=['{}'.format(i) for i in range(min(y),max(y)+1)]
#设置y坐标
#plt.yticks(range(min(y),max(y)+1),y_ticks_label)
plt.plot(x,y,color='blue',alpha=0.8,marker='*',linestyle='--',linewidth=1)
#plt.plot(x,y,color='blue',ls='-',lw=1,marker='*',markevery=20)
# 设置图片名称
plt.title(title,color='black')
# 设置x轴标签名
plt.xlabel(xlabel)
# 设置y轴标签名
plt.ylabel(ylabel)
save_dir = "/tmp/"
out = None
if not os.path.exists(save_dir):
print("[warning] file save dir not exists")
else:
filepath = save_dir+filename
print("[info] will save file to:",filepath)
plt.savefig(filepath)
out = filepath
# plt.show()
# plt.savefig(path+'scatter.jpg')#保存图片
# plt.savefig(path+'plot.jpg')#保存图片\n",
return {'out':out,'dir':save_dir,'filename':filename}
def totalGameOnline(urls,filter_keys=None):
data = {}
for url in urls:
response = requests.get(url)
# regex = r'^haproxy_backend_current_sessions\{backend="(.*?)"\} (\d+)$'
lines = response.text.split('\n')
for line in lines:
if not line.startswith('haproxy_backend_current_sessions'):
continue
result = re.match(r'^haproxy_backend_current_sessions\{backend="(.*?)"\} (\d+)$', line)
if result:
service_name = result.group(1)
online_size = int(result.group(2))
if filter_keys and service_name in filter_keys:
continue
if service_name in data:
# data[service_name] += data[service_name]+online_size
# print(online_size)
if online_size > 0:
data[service_name] = (data[service_name]+online_size)
else:
data[service_name] = online_size
return data
online_metrics_urls=[
"http://127.0.0.1:9912/metrics",
"http://127.0.0.1:9913/metrics",
"http://127.0.0.1:9914/metrics",
"http://127.0.0.1:9915/metrics",
"http://127.0.0.1:9916/metrics"
]
game_tag_with_name={
"game-gate" : "游戏大厅",
"game-ddz-bs" : "斗地主比赛场[id 401-450]",
"game-ddz4-pt" : "四斗普通场[id 61-65]",
"game-ddz4-bxp" : "四斗不洗牌场[id 127-180]",
"game-ddz4-hb" : "四斗红包场[id 68]",
"game-ddz3-pt" : "三斗普通场[id 71-74]",
"game-ddz3-bxp" : "三斗不洗牌[id 124-126]",
"game-ddz3-hb" : "三斗红包场[id 76]",
"game-ddz2-pt" : "二斗普通场[id 81-84]",
"game-ddz2-yl" : "二斗娱乐场[id 69]",
"game-ddz2-hf" : "二斗话费场[id 118]",
"game-dyj-pt" : "大赢家(拼三张)[id 77-80]",
"game-jpfc-pt" : "极品飞车(奔驰宝马)[id 100-106]",
"game-brdp-pt" : "百人斗牌(牛牛)[id 90-91]",
"game-sgj-pt" : "水果机[id 107]",
"game-yyl-pt":"摇摇乐[id 105]",
"game-jkby-pt":"杰克捕鱼[id 109|112|113|120]",
"game-shz-pt":"水浒传[id 121-123]",
"game-ermj-pt":"二人麻将[id 130-133]",
"game-xlmj-pt":"血流麻将[id 139-142]",
"game-guandan-pt":"掼蛋[id 143-147]",
"game-xmbd-pt" : "消灭病毒[id 160]",
"game-bdzc-pt" : "病毒战场[id 170]",
"game-sldj-pt" : "首领对决[id 175]",
"game-lzddz4-pt" : "连炸斗地主[id 51-54]"
}
tag_xxyx=["game-lzddz4-pt","game-guandan-pt","game-ermj-pt","game-xlmj-pt","game-ddz-bs","game-ddz4-pt","game-ddz4-bxp","game-ddz4-hb","game-ddz3-pt","game-ddz3-bxp","game-ddz3-hb","game-ddz2-pt","game-ddz2-yl","game-ddz2-hf"]
def getOnlineStr():
data = totalGameOnline(online_metrics_urls,["admin_stats","game-chat"])
gate = data['game-gate']
del data['game-gate']
val = sum(data.values())
online_info = "\n\n## 在线人数(实时) ##\n"
online_info += "\n游戏大厅: {} 人\n".format(gate)
online_info += "\n游戏局内: {} 人\n".format(val)
dict= sorted(data.items(), key=lambda d:d[1], reverse = True)
for index, item in enumerate(dict):
tag = item[0]
name = game_tag_with_name[tag]
online = data[tag]
rate = (round(online/val,4)*100.0)
online_info += "\n{}. {}: {}人({:.2f}%)\n".format((index+1),name,online,rate)
# print(f'{name}:{online} \n')
return online_info
def getOnlineStrSimple():
data = totalGameOnline(online_metrics_urls,["admin_stats","game-chat"])
gate = data['game-gate']
del data['game-gate']
val = sum(data.values())
online_info = "\n\n##在线人数(实时采样)##\n"
online_info += "\n游戏大厅: {} 人\n".format(gate)
online_info += "\n游戏局内: {} 人\n".format(val)
xxyx_online=0
xyx_online=0
print(tag_xxyx)
for tag in data:
print(tag)
if tag in tag_xxyx:
xxyx_online += data[tag]
else:
xyx_online += data[tag]
online_info += "\n休闲游戏: {}人({:.2f}%)\n".format(xxyx_online,(round(xxyx_online/val,4)*100.00))
online_info += "\n小游戏: {}人({:.2f}%)\n".format(xyx_online,(round(xyx_online/val,4)*100.00))
#online_info += "\n小游戏: {}人({:.2f}%)\n".format(xyx_online,(round(xyx_online/val,4)*100.00))
# print(f'{name}:{online} \n')
return online_info
def getOnlineMap():
data = totalGameOnline(online_metrics_urls,["admin_stats","game-chat"])
gate = data['game-gate']
del data['game-gate']
val = sum(data.values())
xxyx_online=0
xyx_online=0
print(tag_xxyx)
for tag in data:
print(tag)
if tag in tag_xxyx:
xxyx_online += data[tag]
else:
xyx_online += data[tag]
online_dict = {}
online_dict["gate"] = gate
online_dict["game"] = val
online_dict['xxyx'] = xxyx_online
online_dict['xxyx_rate'] = "{:.2f}%".format((round(xxyx_online/val,4)*100.00))
online_dict['xyx'] = xyx_online
online_dict['xyx_rate'] = "{:.2f}%".format((round(xyx_online/val,4)*100.00))
return online_dict
def zhibiao():
send_wechat1 = False
send_wechat2 = False
send_wechat3 = True
qy = qywx(0)
m_login = get_login_count()
m_pay = get_pay_sum()
date_time = time.strftime("%Y-%m-%d", time.localtime())
date_time_hour = time.strftime("%Y%m%d%H", time.localtime())
weekList = ["星期一","星期二","星期三","星期四","星期五","星期六","星期日"]
week = weekList[datetime.datetime.now().weekday()]
msg_login = "## 指标统计 ##\n\n起始时间:{} \n\n截止时间:{}\n\n指标名称:{} \n\n指标数值:{}人".format(m_login["start_time"],m_login["end_time"],m_login["name"],m_login["value"]);
msg_pay = "## 指标统计 ##\n\n起始时间:{} \n\n截止时间:{}\n\n指标名称:{} \n\n指标数值:{}元".format(m_pay["start_time"],m_pay["end_time"],m_pay["name"],m_pay["value"]);
# 发送文本消息
msg_wechat = msg_login+"\n\n"+msg_pay
online_map = getOnlineMap()
msg_tongji = "### 业务指标\n>**<font color=\"info\">整点播报</font>**\n >起始: {}\n >截至: {}\n >登陆人数: {} 人\n >充值金额: {} 元\n >\n\n >**<font color=\"warning\">在线人数(实时采样)</font>**\n >大厅在线: {} 人\n >游戏局内: {} 人\n >休闲游戏: {} 人({})\n >小游戏: {} 人({})\n ".format(m_login["start_time"],m_login["end_time"],m_login["value"],m_pay["value"],online_map['gate'],online_map['game'],online_map['xxyx'],online_map['xxyx_rate'],online_map['xyx'],online_map['xyx_rate'])
#print(msg_tongji)
#if msg_tongji:
# sys.exit()
####
d1 = get_login_count_hour()
print(d1)
login_hour_val = d1["value"]
login_title = d1["name"]
login_file_name = "login_hour_{}.jpg".format(int(time.time()))
login_x = []
login_y = []
for i in login_hour_val:
login_x.append(i[0])
login_y.append(i[1])
x_label = "日期:{}({})".format(date_time,week)
login_out = create_plt_line(login_x,login_y,login_title,x_label,"登录人数",login_file_name)
login_save_dir = login_out['dir']
if send_wechat1:
media_id = qy.post_file(login_save_dir, login_file_name)
online_str = getOnlineStrSimple()
msg_login += online_str
qy.send_text(msg_login, ['@all'])
qy.send_img(media_id, ['@all'])
####
d2 = get_pay_sum_hour()
order_detail = get_pay_order_hour()
order_val = order_detail["value"]
print(d2)
pay_hour_val = d2["value"]
pay_title = d2["name"]
pay_file_name = "pay_hour_{}.jpg".format(int(time.time()))
pay_x = []
pay_y = []
for i in pay_hour_val:
pay_x.append(i[0])
pay_y.append(i[1])
orders = []
for order in order_val:
orders.append(order[1])
pay_sum = sum(pay_y)
y_label = "充值额"
y2_label = "订单数"
x_title = "{} ,∑ = {}".format(x_label,pay_sum)
print(y_label)
#pay_out = create_plt_data(pay_x,pay_y,pay_title,x_label,y_label,pay_file_name)
pay_out = create_plt_duiji_data(pay_x,pay_y,orders,pay_title,x_title,y_label,y2_label,pay_file_name)
pay_save_dir = pay_out['dir']
l_filename = login_save_dir+login_file_name
p_filename = pay_save_dir+pay_file_name
onepic_filename = "tongji_hour_{}.jpg".format(int(time.time()))
onepic = image_Splicing(l_filename,p_filename,"y",onepic_filename)
print(msg_wechat)
print(onepic)
if send_wechat3:
media_id = qy.post_file("/tmp/",onepic_filename)
#qy.send_text(msg_wechat,['@all'])
qy.send_markdown(msg_tongji,['@all'])
qy.send_img(media_id,['@all'])
if send_wechat2:
media_id = qy.post_file(pay_save_dir, pay_file_name)
qy.send_text(msg_pay, ['@all'])
qy.send_img(media_id, ['@all'])
def liuyan():
sql = "SELECT COUNT(1) FROM tb_feedback WHERE fb_status = 0 AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= FROM_UNIXTIME(`fb_timestamp`);"
db = DBUtil(db="db_common_info",host="10.8.18.108")
db.db_connect()
data = db.db_sql('SELECT',sql)
count_message = 0
for i in data:
count_message = i[0]
# target = {"key":"liuyan","name":"用户留言数量(最近一周)","value":data,"sql":sql}
# return target
if count_message > 0:
qy = qywx(0)
#msg_unread = "## 用户反馈 ##\n\n您有新的留言,请注意查收!\n\n未处理数量:{}条 (近一周) \n\n登录后台管理->玩家数据->玩家咨询 进行处理".format(count_message);
#msg_unread = "### 用户反馈 \n\n > 您有的:**{}**条留言未处理, 请注意查收!\n\n > 登录后台管理-玩家数据-玩家咨询 [进行处理](http://o.manage.zhuoyigame.com:9090/)".format(count_message)
#qy.send_text(msg_unread, ['@all'])
msg_unread = '### 用户反馈 \n\n > 您有 {} 条留言未处理, 请注意查收!\n\n > 登录 后台管理-玩家数据-玩家咨询 [进行处理](http://o.manage.zhuoyigame.com:9090/)'.format(count_message)
qy.send_markdown(msg_unread,['@all'])
else:
print("no message need process")
# print("you have a message")
def ribao():
date_time = time.strftime("%Y-%m-%d", time.localtime())
#inotice_msg = '## 每日总结 \n\n > <font color=\"info\">每一天提醒自己,不要忘记理想,不要忘记目标;每一天提醒自己,不要忘记学习,不要忘记看书。每一天提醒自我不要忘记快乐,成为更好的自己</font>\n\n > <font color=\"warning\">今天工作辛苦了,感谢您的付出, 别忘了对今天的自己进行下评价、小结,是否距离小目标更进一步了? </font> \n\n > 明天的你一定会感谢今天努力的自己,加油!'
#notice_msg = '## hello world \n\n > <font color=\"info\"> This is a Test </font>'
notice_msg = '## 每日总结 \n\n > <font color=\"warning\">感谢您的付出,工作一天辛苦了! 别忘了对今天的自己进行下评价、小结,是否距离小目标更近一步了? </font> \n\n > 明天的你一定会感谢今天努力的自己,加油! \n\n '
target = ["@all"]
#toparty = "22"
file_dir = '/root/'
src_file = "/root/workday.xlsx"
to_file_name = "工作日报"+"-"+date_time+".xlsx"
to_file = file_dir + to_file_name
if os.path.exists(to_file):
print("already exists")
else:
print("copy file ")
#shutil.copyfile(src_file,to_file)
qy = qywx(0)
qy.send_markdown(notice_msg,target)
#media_id = qy.post_file(file_dir,to_file_name)
#qy.send_file(media_id,target)
#############
def plt_pannel_graph_duiji(pannel,x,y1,y2,title,xlabel,ylabel,y2label):
pannel.bar(x,y2,width=0.4,color='#dddddd',zorder=5,label=y2label)
pannel.bar(x,y1,width=0.4,bottom=y2,color='#d62728',zorder=5,label=ylabel)
c=np.mean(y1)
pannel.axhline(y=c,color="black",linestyle=':')
#pannel.title(title)
#pannel.xlabel(xlabel)
pannel.tick_params(axis='x',length=0)
pannel.grid(axis='x',ls='-.')
pannel.grid(axis='y',alpha=0.5,ls='--')
pannel.yaxis.tick_right() # 将y轴的数值显示在右边
pannel.legend(frameon=False)
for label in pannel.xaxis.get_ticklabels(): # 设置x轴标签的字体大小
label.set_fontsize(30)
for label in pannel.yaxis.get_ticklabels(): # 设置y轴标签的字体大小
label.set_fontsize(45)
# pannel.tight_layout()
def plt_pannel_graph_line(pannel,x,y,title,xlabel,ylabel):
pannel.plot(x,y,color='blue',alpha=0.8,marker='*',linestyle='--',linewidth=1)
#plt.plot(x,y,color='blue',ls='-',lw=1,marker='*',markevery=20)
# 设置图片名称
# pannel.title(title,color='black')
# 设置x轴标签名
# pannel.xlabel(xlabel)
# 设置y轴标签名
# pannel.ylabel(ylabel)
pannel.grid(axis='x', linestyle='-.') # 添加x轴方向的网格
pannel.grid(axis='y', linestyle='-.') # 添加y轴方向的网格
pannel.yaxis.tick_right() # 将y轴的数值显示在右边
for label in pannel.xaxis.get_ticklabels(): # 设置x轴标签的字体大小
label.set_fontsize(30)
for label in pannel.yaxis.get_ticklabels(): # 设置y轴标签的字体大小
label.set_fontsize(45)
def plt_pannel_text(pannel,text_content,font_size):
pannel.text(0.01, 0.5, text_content,
ha="left", va='center', fontsize=font_size)
for label in pannel.xaxis.get_ticklabels():
label.set_visible(False)
for label in pannel.yaxis.get_ticklabels():
label.set_visible(False)
def plt_pannel_table(pannel, text_content, table_labels,table_font_size, table_scale):
# yeji_list = ['单季度营收', '03-31', '06-30', '09-30', '12-31', '单季度净利润', '03-31', '06-30', '09-30', '12-31', '12-31']
yeji_table = pannel.table(
cellText=text_content, # 表格中内容
colLabels=table_labels, # 表格的列标签
cellLoc='left', # 单元格对齐方式
loc='center',
fontsize=30) # 表格中字体大小
yeji_table.auto_set_font_size(False)
yeji_table.set_fontsize(table_font_size)
yeji_table.scale(1, table_scale) # 调整表格行高
for label in pannel.xaxis.get_ticklabels():
label.set_visible(False)
for label in pannel.yaxis.get_ticklabels():
label.set_visible(False)
def image_Splicing(img_1, img_2, flag='y',filename=None):
img1 = Image.open(img_1)
img2 = Image.open(img_2)
size1, size2 = img1.size, img2.size
if flag == 'x':
joint = Image.new("RGB", (size1[0] + size2[0], size1[1]))
loc1, loc2 = (0, 0), (size1[0], 0)
else:
joint = Image.new("RGB", (size1[0], size2[1]+size1[1]))
loc1, loc2 = (0, 0), (0, size1[1])
joint.paste(img1, loc1)
joint.paste(img2, loc2)
if filename:
save_path="/tmp/"+filename
joint.save(save_path)
return save_path
return None
def onepice():
plt.clf()
# 正确显示中文和负号
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
fig = plt.figure( # 添加fig对象
figsize=(16, 9), # 设置fig大小,长和宽,单位为英寸
dpi=50, # 每英寸的像素点数
facecolor="white")
gs = fig.add_gridspec(
3, 1, # 9行1列的网格
left=0.01, right=0.96, bottom=0.03, top=0.99, # 设置页边距
wspace=0.02, hspace=0.12, # 设置行与行之间的距离,列与列之间的距离
height_ratios=[0.3, 0.45,0.15]) # 这边是9行,设置每行占的高度的比例
# 添加文字说明
pannel1 = fig.add_subplot(gs[0, 0])
plt_pannel_text(pannel1, "title:\n\nhello world", 50)
# 添加表格
pannel2 = fig.add_subplot(gs[1, 0])
plt_pannel_table(pannel2, [["xxx","1%",123],["xxx","2%",423],["xxx","2%",523]],["前十用户充值排名(当日)","占比(当日)","金额(元)"], 46,9.5)
# # 添加登录汇总
# pannel2 = fig.add_subplot(gs[1, 0])
# login_hour_data = get_login_count_hour()
# login_hour_val = login_hour_data["value"]
# login_title = login_hour_data["name"]
# login_x = []
# login_y = []
# for i in login_hour_val:
# login_x.append(i[0])
# login_y.append(i[1])
# x_label = "日期:{}".format("2023-06-06")
# plt_pannel_graph_line(pannel2, login_x,login_y,login_title,x_label,"登录人数")
# # 添加充值汇总
# pannel3 = fig.add_subplot(gs[2, 0])
# order_detail = get_pay_order_hour()
# order_val = order_detail["value"]
# pay_hour_val = order_detail["value"]
# pay_title = order_detail["name"]
# pay_x = []
# pay_y = []
# for i in pay_hour_val:
# pay_x.append(i[0])
# pay_y.append(i[1])
# orders = []
# for order in order_val:
# orders.append(order[1])
# pay_sum = sum(pay_y)
# y_label = "充值额"
# y2_label = "订单数"
# x_title = "{} ,∑ = {}".format(x_label,pay_sum)
# plt_pannel_graph_duiji(pannel3, pay_x,pay_y,orders,pay_title,x_title,y_label,y2_label)
# 8、留白,待后续补充
pannel_empty = fig.add_subplot(gs[1, 0])
pannel_empty.text(0.01, 0.5, '====',
ha="left", va='center', fontsize='100')
filename="huizong.jpg"
save_dir = "/tmp/"
out = None
if not os.path.exists(save_dir):
print("[warning] file save dir not exists")
else:
filepath = save_dir + filename
print("[info] will save file to:",filepath)
plt.savefig(filepath)
out = filepath
plt.close()
return {'out':out,'dir':save_dir,'filename':filename}
def zhoubao():
date_time = time.strftime("%Y-%m-%d", time.localtime())
notice_msg = '## 每周总结 \n\n > 今天是周五,笑容多灿烂。亲人天天盼,相伴周末玩。工作抓紧干,效率翻一番'
#toparty = "22"
file_dir = '/root/'
src_file = "/root/workweek.xlsx"
to_file_name = "工作周报"+"-"+date_time+".xlsx"
to_file = file_dir + to_file_name
if os.path.exists(to_file):
print("already exists")
else:
print("copy file ")
#shutil.copyfile(src_file,to_file)
target = ["@all"]
qy = qywx(0)
qy.send_markdown(notice_msg,target)
#media_id = qy.post_file(file_dir,to_file_name)
#qy.send_file(media_id,target)
'''
查询应用信息
'''
def get_app_info(app_ids):
ids = ','.join(str(i) for i in app_ids)
sql = "SELECT a_appid,a_pn,a_appname,a_channel from tb_app where a_appid in ({});".format(ids)
db = DBUtil(db="db_common_info",host="10.8.18.108")
db.db_connect()
data = db.db_sql('SELECT',sql)
return data
'''
5个日新增超过100的渠道,异常情况监测,及时了解渠道下架或不外显
任意渠道2个小时内新增 = 0
'''
def userRegisterException(minNum):
app_ids = [386,413,429,407,365]
app_data_list = get_app_info(app_ids)
exception_list = []
for app_data in app_data_list:
app_id = app_data[0]
app_pn = app_data[1]
app_name = app_data[2]
app_channel = app_data[3]
querySql = "SELECT COUNT(1) as num FROM tb_account WHERE regDate>=UNIX_TIMESTAMP(NOW())-7200 AND channel={};".format(app_channel)
db = DBUtil(db="zhuoyigame",host="10.8.18.108")
db.db_connect()
data = db.db_sql('SELECT',querySql)
count_num = 0
for i in data:
count_num = i[0]
if count_num <= minNum :
# 添加到数组异常数组中
notice = "*** 应用ID:{} 应用名称:{} 指标值:{} \n".format(app_id,app_name,count_num)
exception_list.append(notice)
return exception_list
'''
7个日活超过1000的渠道,登录异常情况监测(除维护),与现有短信提醒机制不同,防止某个渠道长时间无法登录
'''
def userLoginException(minNum):
app_ids = [386,413,429,407,365,385,351]
app_data_list = get_app_info(app_ids)
exception_list = []
for app_data in app_data_list:
app_id = app_data[0]
app_pn = app_data[1]
app_name = app_data[2]
app_channel = app_data[3]
querySql = "SELECT COUNT(1) as num FROM tb_account WHERE lastLogin>=UNIX_TIMESTAMP(NOW())-1800 AND channel={};".format(app_channel)
db = DBUtil(db="zhuoyigame",host="10.8.18.108")
db.db_connect()
data = db.db_sql('SELECT',querySql)
count_num = 0
for i in data:
count_num = i[0]
if count_num <= minNum :
# 添加到数组异常数组中
notice = "*** 应用ID:{} 应用名称:{} 指标值:{} \n".format(app_id,app_name,count_num)
exception_list.append(notice)
return exception_list
'''
充值异常情况监测,防止长时间无法充值
30分钟内充值成功金额 = 0
'''
def userPayException():
# pay_notice = ""
querySql = "SELECT COUNT(1) as num FROM tb_account WHERE lastPayTime>=UNIX_TIMESTAMP(NOW())-1800;"
db = DBUtil(db="zhuoyigame",host="10.8.18.108")
db.db_connect()
data = db.db_sql('SELECT',querySql)
count_num = 0
for i in data:
count_num = i[0]
# if count_num <=0 :
# pay_notice = "充值异常"
return count_num
'''
获取三人斗地主和四人斗地主的在线人数
'''
def getOnlineDDZ3And4():
data = totalGameOnline(online_metrics_urls,["admin_stats","game-chat"])
target = ["game-lzddz4-pt","game-ddz-bs","game-ddz4-pt","game-ddz4-bxp","game-ddz4-hb","game-ddz3-pt","game-ddz3-bxp","game-ddz3-hb"]
online = 0
for name in data:
if name in target:
online = online + data[name]
return online
'''
后台“平台管理 - 注册权重管理”,包含的全部设备号或IP
2小时内,有新注册账号
'''
def getManageNewUser():
queryIPSQL = "SELECT fb_obj from tb_forbid_weight WHERE fb_type = 1;"
queryIMEISQL = "SELECT fb_obj from tb_forbid_weight WHERE fb_type = 2;"
common_db = DBUtil(db="db_common_info",host="10.8.18.108")
common_db.db_connect()
dataIps = common_db.db_sql('SELECT', queryIPSQL)
common_db.db_connect()
dataImeis = common_db.db_sql('SELECT', queryIMEISQL)
listIps = []
listImeis = []
# count_num = 0
for dataIp in dataIps:
listIps.append(dataIp[0])
for dataImei in dataImeis:
listImeis.append(dataImei[0])
authen_db = DBUtil(db="db_authen_zy",host="10.8.18.108")
newAccountIdsFromLimitIp = []
newAccountidsFromImei = []
if len(listIps) > 0 :
limitData = ",".join("\"{}\"".format(i) for i in listIps)
sql = "SELECT a_uid FROM `db_authen_zy`.`tb_account` WHERE a_login_ip in ({}) AND a_reg_time >= UNIX_TIMESTAMP(NOW())-7200;".format(limitData)
authen_db.db_connect()
res = authen_db.db_sql('SELECT',sql)
for uinfo in res:
newAccountIdsFromLimitIp.append(uinfo[0])
if len(listImeis) > 0 :
limitData = ",".join("\"{}\"".format(i) for i in listImeis)
sql = "SELECT a_uid FROM `db_authen_zy`.`tb_account` WHERE a_imei in ({}) AND a_reg_time >= UNIX_TIMESTAMP(NOW())-2592000;".format(limitData)
authen_db.db_connect()
authen_db.db_sql('SELECT',sql)
for uinfo in res:
newAccountidsFromImei.append(uinfo[0])
return (newAccountIdsFromLimitIp,newAccountidsFromImei)
def bizReg():
target = ["@all"]
val = 1
datalist = userRegisterException(val)
if len(datalist) > 0:
qy = qywx(0)
msg = "## 业务异常 ## \n\n"
msg = msg + "渠道新增异常 <= {} \n\n".format(val)
msg = msg + '\n'.join(datalist)
qy.send_text(msg,target)
def bizLogin():
# print(userLoginException(100))
target = ["@all"]
val = 1
datalist = userLoginException(val)
if len(datalist) > 0:
qy = qywx(0)
msg = "## 业务异常 ## \n\n"
msg = msg + "渠道登陆异常 <={} \n\n".format(val)
msg = msg + '\n'.join(datalist)
qy.send_text(msg,target)
def bizPay():
payuserSize = userPayException()
target = ["@all"]
val = 1
if payuserSize <= val:
qy = qywx(0)
msg = "## 业务异常 ## \n\n"
msg = msg + "平台充值异常 充值人数: {} <= {}".format(payuserSize, val)
qy.send_text(msg,target)
def bizDdz():
gameUserOnlineSize = getOnlineDDZ3And4()
target = ["@all"]
val = 10
if gameUserOnlineSize <= val:
qy = qywx(0)
msg = "## 业务异常 ## \n\n"
msg = msg + "游戏场次异常 人数: {} <= {}".format(gameUserOnlineSize, val)
qy.send_text(msg,target)
def bizGlyh():
manageUsers = getManageNewUser()
manageUserIp = manageUsers[0]
manageUserImei = manageUsers[1]
target = ["@all"]
# target = ["22"]
msg = "## 业务关注 ## \n\n"
ipUsers = len(manageUserIp)
imeiUsers = len(manageUserImei)
if ipUsers > 0:
uids = "\n".join(str(i) for i in manageUserIp)
msg = "{} 后台监控IP有新注册账号:\n {} \n".format(msg, uids)
if imeiUsers > 0:
uids = "\n".join(str(i) for i in manageUserImei)
msg = "{} 后台监控设备号有新注册账号:\n {} \n".format(msg, uids)
if (ipUsers + imeiUsers) > 0:
qy = qywx(0)
qy.send_text(msg,target,"22")
#生成xlsx文件的函数
def retxls(ret,dt,title):
dir="/root/query/"
basename = dt + datetime.datetime.now().strftime("%Y%m%d%H%M")+ ".xlsx"
filename = dir + basename
dret = pd.DataFrame.from_records(list(ret))
dret.style.set_properties(**{'border': '1px solid black'})
###z注意openpyxl这个库可能在生成xls的时候出错,pip install openpyxls==1.8.6,其他版本似乎与pandas有点冲突,安装1.8.6的即可
dret.to_excel(filename,"Sheet1",engine="openpyxl",header=title,index=False)
print ("Ok!!! the file in",filename)
return basename
'''
屏蔽字异常报警
'''
def bizPbz():
#targetKeyWords=["毛泽东","朱德","周恩来","刘少奇","任弼时","陈云","宋庆龄","李济深","张澜","高岗","邓小平","林彪","董必武","陶铸","陈伯达","康生","李富春","王洪文","叶剑英","李德生","张春桥","华国锋","李先念","汪东兴","赵紫阳","胡耀邦","乌兰夫","彭真","邓颖超","乔石","胡启立","姚依林","杨尚昆","万里","李鹏","王震","江泽民","宋平","李瑞环","朱镕基","刘华清","胡锦涛","荣毅仁","尉健行","李岚清","吴邦国","温家宝","贾庆林","曾庆红","黄菊","吴官正","李长春","罗干","贺国强","周永康","习近平","李克强","张德江","俞正声","刘云山","王岐山","张高丽","栗战书","汪洋","王沪宁","赵乐际","韩正"]
sql = "SELECT * FROM tb_pbz_record WHERE timestamp >= UNIX_TIMESTAMP(NOW())-1800 and level>=1;"
db = DBUtil(db="db_common_info",host="10.8.18.108")
db.db_connect()
data = db.db_sql('SELECT',sql)
if len(data)>0:
title = ("序号","应用名称","公司名称","用户昵称","UID","拦截测试样本","场景(评论、昵称等)","发布时间","最近一次登录日志(含源端口号)","应用登录方式");
matrix = list(data)
retsLevel1 = []
retsLevel2 = []
for item in matrix:
# print(item)
dbkey=item[0]
uid=item[1]
#content=item[2]
content="******"
timestamp=item[4]
username=item[5]
sceneType=item[6]
loginSource=item[7]
loginType=item[8]
level=item[9]
scene=sceneType
# print(scene)
if not loginSource:
loginSource = "Unknown"
if not loginType:
loginType = "Unknown"
timeArray = time.localtime(timestamp)
sendTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
if sceneType=="sign":
scene = "修改签名"
if sceneType=="changeName":
scene = "修改昵称"
if loginType == "user":
loginType = "渠道账号"
if loginType == "third":
loginType = "联运账号"
if loginType == "mobile":
loginType = "手机号码"
if loginType == "wechat":
loginType = "微信号"
# print(level)
tupleItem=(dbkey,"卓毅四人斗地主","卓毅(上海)网络技术有限公司",username,uid,content,scene,sendTime,loginSource,loginType)
#target = ["22"]
target = ["@all"]
if level==1 :
retsLevel1.append(tupleItem)
if level==2 :
retsLevel2.append(tupleItem)
ret1=tuple(retsLevel1)
ret2=tuple(retsLevel2)
qy = qywx(0)
if len(ret1) > 0:
print(ret1)
main_file = retxls(ret1,"一级屏蔽字",title);
media_id = qy.post_file("/root/query/",main_file)
qy.send_file(media_id,target)
if len(ret2) > 0:
print(ret2)
main_file = retxls(ret2,"二级屏蔽字",title);
media_id = qy.post_file("/root/query/",main_file)
qy.send_file(media_id,target)
# qy = qywx(0)
# qy.send_text("触发二级屏蔽字",target,"22")
pass
now = datetime.datetime.now()
weekday = now.weekday()
week_val = weekday + 1
# 调用示例
if __name__ == '__main__':
argc = len( sys.argv );
if argc < 2:
print("not exists args")
sys.exit()
command = sys.argv[1];
if command == "zhibiao":
zhibiao()
elif command == "liuyan":
liuyan()
elif command == "online":
print(getOnlineStrSimple())
elif command == "online2":
print(getOnlineStr())
elif command == "one":
print(onepice())
elif command == "hetu":
print(image_Splicing("/tmp/login_hour_1685646002.jpg","/tmp/pay_hour_1685350803.jpg","y","hetu.jpg"))
elif command == "ribao":
if week_val == 5:
zhoubao()
else:
ribao()
elif command == "bizReg" :
bizReg()
elif command == "bizLogin" :
bizLogin()
elif command == "bizPay" :
bizPay()
elif command == "bizDdz" :
bizDdz()
elif command == "bizGlyh" :
bizGlyh()
elif command == "bizPbz" :
bizPbz()
else:
print(f"\n[ Error] 未知参数:{command},请检查。")
正文完
 
linxiaokai
版权声明:本站原创文章,由 linxiaokai 2023-09-25发表,共计34555字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。