325 lines
11 KiB
Python
325 lines
11 KiB
Python
# -*- coding: utf-8 -*-
|
|
# from __future__ import absolute_import
|
|
from ops.mtga import GetTgaConfig, FromTga
|
|
import os
|
|
from flask import Flask, render_template, request, jsonify
|
|
from flask_mail import Mail, Message
|
|
from threading import Thread
|
|
from collections import defaultdict
|
|
from ops.plog import define_logger
|
|
import logging
|
|
import datetime
|
|
from ops.minterface import MpInterface
|
|
define_logger("/data/logs/ops/daily_report.log")
|
|
import pdb
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
sender = "ops@kingsome.cn"
|
|
app = Flask(__name__)
|
|
app.config['MAIL_SERVER'] = 'smtp.exmail.qq.com'
|
|
app.config['MAIL_PORT'] = '465'
|
|
app.config['MAIL_USE_SSL'] = True
|
|
app.config['MAIL_USE_TLS'] = False ## 默认就是 false, 加上警示自己
|
|
app.config['MAIL_USERNAME'] = sender
|
|
app.config['MAIL_PASSWORD'] = 'bX8cfBAyj9MBqH22'
|
|
|
|
mail = Mail(app)
|
|
|
|
recipients = ["pengtao@kingsome.cn"]
|
|
|
|
|
|
# FROMAPPID_CN = {"wxdb103a128e118619": "拯救熊猫泡泡", "wxc137c93eedeab6f2": "爆冰达人"}
|
|
|
|
|
|
def send_async_email(app, msg):
|
|
with app.app_context():
|
|
mail.send(msg)
|
|
|
|
|
|
@app.route('/send-dailyreport')
|
|
def send_dailyreport():
|
|
title = "主题"
|
|
msg = Message(title, sender=sender, recipients=recipients)
|
|
|
|
gameid = request.args.get('gameid')
|
|
channelid = request.args.get('channelid')
|
|
day = request.args.get('day')
|
|
project = request.args.get('project') or 'mini_games'
|
|
if not (gameid and channelid and day):
|
|
return jsonify("PLS input arfs")
|
|
rp = Report(gameid, channelid, day, project)
|
|
data = rp.run()
|
|
data[gameid] = gameid
|
|
data[channelid] = channelid
|
|
data[day] = day
|
|
msg.subject = f"{gameid}_{day}_数据"
|
|
msg.html = render_template('report.html', data=data)
|
|
|
|
thread = Thread(target=send_async_email, args=[app, msg])
|
|
thread.start()
|
|
|
|
return jsonify("邮件发送成功")
|
|
|
|
|
|
class Report:
|
|
def __init__(self, day, project):
|
|
self.day = day
|
|
self.project = project
|
|
|
|
|
|
|
|
def get_data(self):
|
|
data = defaultdict(tuple)
|
|
fromappids = ()
|
|
for fromappid in fromappids:
|
|
activa, new, share, k = self.collect_tga(fromappid)
|
|
data[fromappid] = (activa, new, share, k)
|
|
|
|
|
|
def get_all_data(self, args):
|
|
activa_sql = f"""SELECT
|
|
count(distinct "#account_id")
|
|
FROM
|
|
v_event_{args['suffix']}
|
|
where
|
|
gameid='{args['gameid']}'
|
|
and channel='{args['channelid']}'
|
|
and "$part_event"='event_11_1'
|
|
and "$part_date"='{self.day}'"""
|
|
|
|
new_sql = f"""SELECT
|
|
count(distinct "#account_id")
|
|
FROM
|
|
v_event_{args['suffix']}
|
|
where
|
|
gameid='{args['gameid']}'
|
|
and channel='{args['channelid']}'
|
|
and "$part_event"='event_11_1'
|
|
and account_register_date between timestamp'{self.day} 00:00:00' and timestamp'{self.day} 23:59:59'"""
|
|
|
|
share_sql = f"""SELECT
|
|
count(distinct \"#account_id\")
|
|
FROM
|
|
v_event_{args['suffix']}
|
|
where
|
|
"$part_event"='event_11_10'
|
|
and gameid='{args['gameid']}'
|
|
and channel='{args['channelid']}'
|
|
and "$part_event"='event_11_1'
|
|
and "$part_date"='{self.day}'"""
|
|
|
|
# byshare_sql = f"""SELECT
|
|
# count(distinct \"#account_id\")
|
|
# FROM
|
|
# v_event_{args['suffix']}
|
|
# where
|
|
# "$part_event"='event_11_11'
|
|
# and gameid='{args['gameid']}'
|
|
# and channel='{args['channelid']}'
|
|
# and "$part_event"='event_11_1'
|
|
# and "$part_date"='{self.day}'"""
|
|
|
|
timeonlie_sql = f"""SELECT
|
|
sum(cast(online_duration as int))
|
|
FROM
|
|
v_event_19
|
|
where
|
|
"$part_event"='event_21_2'
|
|
and gameid='{args['gameid']}'
|
|
and "$part_date"='{self.day}' """
|
|
|
|
ad_101_sql = f"""SELECT
|
|
count(1)
|
|
FROM
|
|
v_event_{args['suffix']}
|
|
WHERE
|
|
"$part_event"='event_11_21'
|
|
and gameid='{args['gameid']}'
|
|
and "channel"='{args['channelid']}'
|
|
AND activity_id=101
|
|
and "$part_date"='{self.day}' """
|
|
|
|
ad_1_sql = f"""SELECT
|
|
count(1)
|
|
FROM
|
|
v_event_{args['suffix']}
|
|
WHERE
|
|
"$part_event"='event_11_21'
|
|
and gameid='{args['gameid']}'
|
|
and "channel"='{args['channelid']}'
|
|
AND activity_id=1
|
|
and "$part_date"='{self.day}' """
|
|
|
|
ad_201_sql = f"""SELECT
|
|
count(1)
|
|
FROM
|
|
v_event_{args['suffix']}
|
|
WHERE
|
|
"$part_event"='event_11_21'
|
|
and gameid='{args['gameid']}'
|
|
and "channel"='{args['channelid']}'
|
|
AND activity_id=201
|
|
and "$part_date"='{self.day}' """
|
|
jumpout_sql = f"""SELECT
|
|
count(distinct "#account_id")
|
|
FROM
|
|
v_event_19
|
|
where
|
|
"$part_event"='event_1_4'
|
|
and "$part_date"='{self.day}'
|
|
and "jump_result"=1 """
|
|
try:
|
|
activa = args['tga'].get_data(activa_sql)[0][0]
|
|
new = args['tga'].get_data(new_sql)[0][0]
|
|
share = args['tga'].get_data(share_sql)[0][0]
|
|
timeonlie = args['tga'].get_data(timeonlie_sql)[0][0]
|
|
ad_101 = args['tga'].get_data(ad_101_sql)[0][0]
|
|
ad_1 = args['tga'].get_data(ad_1_sql)[0][0]
|
|
ad_201 = args['tga'].get_data(ad_201_sql)[0][0]
|
|
jumpout = args['tga'].get_data(jumpout_sql)[0][0]
|
|
jump_per = (100 * jumpout) / activa
|
|
return [activa, new, share, timeonlie, ad_1, ad_101, ad_201, jump_per]
|
|
except Exception:
|
|
log.error(f"get data from tga failed ,{args['gameid']}", exc_info=True)
|
|
return None
|
|
|
|
|
|
def get_input_fromappid(self, args):
|
|
activa_sql = f"""SELECT
|
|
count(distinct "#account_id")
|
|
FROM
|
|
v_event_{args['suffix']}
|
|
where
|
|
gameid='{args['gameid']}'
|
|
and channel='{args['channelid']}'
|
|
and "$part_event"='event_11_1'
|
|
and "$part_date"='{self.day}'
|
|
and from_appid='{args['fromappid']}'"""
|
|
new_sql = f"""SELECT
|
|
count(distinct "#account_id")
|
|
FROM
|
|
v_event_{args['suffix']}
|
|
where
|
|
gameid='{args['gameid']}'
|
|
and channel='{args['channelid']}'
|
|
and "$part_event"='event_11_1'
|
|
and account_register_date between timestamp'{self.day} 00:00:00' and timestamp'{self.day} 23:59:59'
|
|
and from_appid='{args['fromappid']}' """
|
|
|
|
share_sql = f"""SELECT
|
|
count(distinct \"#account_id\")
|
|
FROM
|
|
v_event_{args['suffix']}
|
|
where
|
|
"$part_event"='event_11_10'
|
|
and gameid='{args['gameid']}'
|
|
and channel='{args['channelid']}'
|
|
and "$part_event"='event_11_1'
|
|
and "$part_date"='{self.day}'
|
|
and from_appid='{args['fromappid']}' """
|
|
|
|
byshare_sql = f"""SELECT
|
|
count(distinct \"#account_id\")
|
|
FROM
|
|
v_event_{args['suffix']}
|
|
where
|
|
"$part_event"='event_11_11'
|
|
and gameid='{args['gameid']}'
|
|
and channel='{args['channelid']}'
|
|
and "$part_event"='event_11_1'
|
|
and "$part_date"='{self.day}'
|
|
and from_appid='{args['fromappid']}' """
|
|
try:
|
|
activa = args['tga'].get_data(activa_sql)[0][0] or 0
|
|
new = args['tga'].get_data(new_sql)[0][0] or 0
|
|
share = args['tga'].get_data(share_sql)[0][0] or 0
|
|
byshare = args['tga'].get_data(byshare_sql)[0][0] or 0
|
|
if activa == 0:
|
|
k = 0
|
|
else:
|
|
k = (100 * byshare / (activa - byshare))
|
|
return (args['fromappid'], args['fromappid_cn'], activa, new, share, k)
|
|
except Exception:
|
|
log.error(f"collect input failed {args['gameid']} {args['fromappid']}", exc_info=True)
|
|
return None
|
|
|
|
|
|
def get_output_fromappid(self, args):
|
|
jump_sql = f"""SELECT
|
|
count("#account_id"),count(distinct "#account_id")
|
|
FROM
|
|
v_event_19
|
|
where
|
|
"$part_event"='event_1_4'
|
|
and "$part_date"='{self.day}'
|
|
and "jump_appid"='{args['fromappid']}'
|
|
and "jump_result"=1 """
|
|
|
|
data = args['tga'].get_data(jump_sql)
|
|
if data:
|
|
try:
|
|
jump_num, jump_pre = data[0]
|
|
return (args['fromappid'], args['fromappid_cn'], jump_num, jump_pre)
|
|
except Exception:
|
|
log.error(f"get data from output by {args['gameid']} {args['fromappid']} failed", exc_info=True)
|
|
return None
|
|
else:
|
|
return None
|
|
|
|
def run(self):
|
|
if self.project == 'mini_games':
|
|
parms = [(1004, 6001), (2001, 6001), (1001, 6001)]
|
|
else:
|
|
parms = [(2001, 6001), (2002, 6001)]
|
|
|
|
|
|
data = dict()
|
|
|
|
data['day'] = self.day
|
|
for item in parms:
|
|
args = {}
|
|
args['gameid'], args['channelid'] = item
|
|
key = f"{args['gameid']}#{args['channelid']}"
|
|
g = GetTgaConfig()
|
|
item = g.get_api_key(args['gameid'])
|
|
url = item['url']
|
|
args['suffix'] = item.get('suffix', 0)
|
|
api_key = item.get('api_key', None)
|
|
tga = FromTga(url, api_key)
|
|
|
|
args['tga'] = tga
|
|
mp = MpInterface()
|
|
fromappids = mp.get_fromappid_cn(args['gameid'], args['channelid'])
|
|
|
|
data[key] = {}
|
|
data[key]['all'] = self.get_all_data(**args)
|
|
data[key]['input'] = defaultdict(list)
|
|
data[key]['output'] = defaultdict(list)
|
|
data[key]['input'] = []
|
|
data[key]['output'] = []
|
|
keys = fromappids.keys()
|
|
if not keys:
|
|
break
|
|
for key in keys:
|
|
args['fromappid'] = key
|
|
args['fromappid_cn'] = fromappids.get(key, None) or "未知"
|
|
data[key]['input'].append(self.get_input_fromappid(**args))
|
|
data[key]['output'].append(self.get_output_fromappid(**args))
|
|
print(data)
|
|
return data
|
|
|
|
|
|
|
|
|
|
def main():
|
|
day = (datetime.date.today() - datetime.timedelta(days=1)).strftime('%Y-%m-%d')
|
|
project = 'mini_games'
|
|
cc = Report()
|
|
data = cc.run(day, project)
|
|
print(data)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() # app.run(host='0.0.0.0', port=6700, debug=False)
|