添加导出率

This commit is contained in:
pengtao 2019-10-22 17:07:38 +08:00
parent 48805bd3b2
commit ae7885e250
3 changed files with 138 additions and 99 deletions

View File

@ -11,6 +11,7 @@ import logging
import datetime import datetime
define_logger("/data/logs/ops/daily_report.log") define_logger("/data/logs/ops/daily_report.log")
import pdb import pdb
from ops.mp_interface import MpInterface
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
sender = "ops@kingsome.cn" sender = "ops@kingsome.cn"
@ -26,7 +27,8 @@ mail = Mail(app)
recipients = ["pengtao@kingsome.cn"] recipients = ["pengtao@kingsome.cn"]
FROMAPPID_CN = {"wxdb103a128e118619": "拯救熊猫泡泡", "wxc137c93eedeab6f2": "爆冰达人"}
# FROMAPPID_CN = {"wxdb103a128e118619": "拯救熊猫泡泡", "wxc137c93eedeab6f2": "爆冰达人"}
def send_async_email(app, msg): def send_async_email(app, msg):
@ -42,9 +44,10 @@ def send_dailyreport():
gameid = request.args.get('gameid') gameid = request.args.get('gameid')
channelid = request.args.get('channelid') channelid = request.args.get('channelid')
day = request.args.get('day') day = request.args.get('day')
project = request.args.get('project') or 'mini_games'
if not (gameid and channelid and day): if not (gameid and channelid and day):
return jsonify("PLS input arfs") return jsonify("PLS input arfs")
rp = Report(gameid, channelid, day) rp = Report(gameid, channelid, day, project)
data = rp.run() data = rp.run()
data[gameid] = gameid data[gameid] = gameid
data[channelid] = channelid data[channelid] = channelid
@ -59,17 +62,10 @@ def send_dailyreport():
class Report: class Report:
def __init__(self, gameid, channelid, day): def __init__(self, day, project):
self.gameid = gameid
self.channelid = channelid
self.day = day self.day = day
g = GetTgaConfig() self.project = project
item = g.get_api_key(self.gameid)
print(f"1={item} 2={gameid}3={day}")
self.url = item['url']
self.suffix = item.get('suffix', 0)
self.api_key = item.get('api_key', None)
self.tga = FromTga(self.url, self.api_key)
def get_data(self): def get_data(self):
@ -80,46 +76,46 @@ class Report:
data[fromappid] = (activa, new, share, k) data[fromappid] = (activa, new, share, k)
def get_all_data(self): def get_all_data(self, args):
activa_sql = f"""SELECT activa_sql = f"""SELECT
count(distinct "#account_id") count(distinct "#account_id")
FROM FROM
v_event_{self.suffix} v_event_{args['suffix']}
where where
gameid='{self.gameid}' gameid='{args['gameid']}'
and channel='{self.channelid}' and channel='{args['channelid']}'
and "$part_event"='event_11_1' and "$part_event"='event_11_1'
and "$part_date"='{self.day}'""" and "$part_date"='{self.day}'"""
new_sql = f"""SELECT new_sql = f"""SELECT
count(distinct "#account_id") count(distinct "#account_id")
FROM FROM
v_event_{self.suffix} v_event_{args['suffix']}
where where
gameid='{self.gameid}' gameid='{args['gameid']}'
and channel='{self.channelid}' and channel='{args['channelid']}'
and "$part_event"='event_11_1' 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 account_register_date between timestamp'{self.day} 00:00:00' and timestamp'{self.day} 23:59:59'"""
share_sql = f"""SELECT share_sql = f"""SELECT
count(distinct \"#account_id\") count(distinct \"#account_id\")
FROM FROM
v_event_{self.suffix} v_event_{args['suffix']}
where where
"$part_event"='event_11_10' "$part_event"='event_11_10'
and gameid='{self.gameid}' and gameid='{args['gameid']}'
and channel='{self.channelid}' and channel='{args['channelid']}'
and "$part_event"='event_11_1' and "$part_event"='event_11_1'
and "$part_date"='{self.day}'""" and "$part_date"='{self.day}'"""
# byshare_sql = f"""SELECT # byshare_sql = f"""SELECT
# count(distinct \"#account_id\") # count(distinct \"#account_id\")
# FROM # FROM
# v_event_{self.suffix} # v_event_{args['suffix']}
# where # where
# "$part_event"='event_11_11' # "$part_event"='event_11_11'
# and gameid='{self.gameid}' # and gameid='{args['gameid']}'
# and channel='{self.channelid}' # and channel='{args['channelid']}'
# and "$part_event"='event_11_1' # and "$part_event"='event_11_1'
# and "$part_date"='{self.day}'""" # and "$part_date"='{self.day}'"""
@ -129,39 +125,39 @@ class Report:
v_event_19 v_event_19
where where
"$part_event"='event_21_2' "$part_event"='event_21_2'
and gameid='{self.gameid}' and gameid='{args['gameid']}'
and "$part_date"='{self.day}' """ and "$part_date"='{self.day}' """
ad_101_sql = f"""SELECT ad_101_sql = f"""SELECT
count(1) count(1)
FROM FROM
v_event_{self.suffix} v_event_{args['suffix']}
WHERE WHERE
"$part_event"='event_11_21' "$part_event"='event_11_21'
and gameid='{self.gameid}' and gameid='{args['gameid']}'
and "channel"='{self.channelid}' and "channel"='{args['channelid']}'
AND activity_id=101 AND activity_id=101
and "$part_date"='{self.day}' """ and "$part_date"='{self.day}' """
ad_1_sql = f"""SELECT ad_1_sql = f"""SELECT
count(1) count(1)
FROM FROM
v_event_{self.suffix} v_event_{args['suffix']}
WHERE WHERE
"$part_event"='event_11_21' "$part_event"='event_11_21'
and gameid='{self.gameid}' and gameid='{args['gameid']}'
and "channel"='{self.channelid}' and "channel"='{args['channelid']}'
AND activity_id=1 AND activity_id=1
and "$part_date"='{self.day}' """ and "$part_date"='{self.day}' """
ad_201_sql = f"""SELECT ad_201_sql = f"""SELECT
count(1) count(1)
FROM FROM
v_event_{self.suffix} v_event_{args['suffix']}
WHERE WHERE
"$part_event"='event_11_21' "$part_event"='event_11_21'
and gameid='{self.gameid}' and gameid='{args['gameid']}'
and "channel"='{self.channelid}' and "channel"='{args['channelid']}'
AND activity_id=201 AND activity_id=201
and "$part_date"='{self.day}' """ and "$part_date"='{self.day}' """
jumpout_sql = f"""SELECT jumpout_sql = f"""SELECT
@ -173,82 +169,82 @@ class Report:
and "$part_date"='{self.day}' and "$part_date"='{self.day}'
and "jump_result"=1 """ and "jump_result"=1 """
try: try:
activa = self.tga.get_data(activa_sql)[0][0] activa = args['tga'].get_data(activa_sql)[0][0]
new = self.tga.get_data(new_sql)[0][0] new = args['tga'].get_data(new_sql)[0][0]
share = self.tga.get_data(share_sql)[0][0] share = args['tga'].get_data(share_sql)[0][0]
timeonlie = self.tga.get_data(timeonlie_sql)[0][0] timeonlie = args['tga'].get_data(timeonlie_sql)[0][0]
ad_101 = self.tga.get_data(ad_101_sql)[0][0] ad_101 = args['tga'].get_data(ad_101_sql)[0][0]
ad_1 = self.tga.get_data(ad_1_sql)[0][0] ad_1 = args['tga'].get_data(ad_1_sql)[0][0]
ad_201 = self.tga.get_data(ad_201_sql)[0][0] ad_201 = args['tga'].get_data(ad_201_sql)[0][0]
jumpout = self.tga.get_data(jumpout_sql)[0][0] jumpout = args['tga'].get_data(jumpout_sql)[0][0]
jump_per = (100 * jumpout) / activa jump_per = (100 * jumpout) / activa
return [activa, new, share, timeonlie, ad_1, ad_101, ad_201, jump_per] return [activa, new, share, timeonlie, ad_1, ad_101, ad_201, jump_per]
except Exception: except Exception:
log.error(f"get data from tga failed ,{self.gameid}", exc_info=True) log.error(f"get data from tga failed ,{args['gameid']}", exc_info=True)
return None return None
def get_input_fromappid(self, fromappid): def get_input_fromappid(self, args):
activa_sql = f"""SELECT activa_sql = f"""SELECT
count(distinct "#account_id") count(distinct "#account_id")
FROM FROM
v_event_{self.suffix} v_event_{args['suffix']}
where where
gameid='{self.gameid}' gameid='{args['gameid']}'
and channel='{self.channelid}' and channel='{args['channelid']}'
and "$part_event"='event_11_1' and "$part_event"='event_11_1'
and "$part_date"='{self.day}' and "$part_date"='{self.day}'
and from_appid='{fromappid}'""" and from_appid='{args['fromappid']}'"""
new_sql = f"""SELECT new_sql = f"""SELECT
count(distinct "#account_id") count(distinct "#account_id")
FROM FROM
v_event_{self.suffix} v_event_{args['suffix']}
where where
gameid='{self.gameid}' gameid='{args['gameid']}'
and channel='{self.channelid}' and channel='{args['channelid']}'
and "$part_event"='event_11_1' 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 account_register_date between timestamp'{self.day} 00:00:00' and timestamp'{self.day} 23:59:59'
and from_appid='{fromappid}' """ and from_appid='{args['fromappid']}' """
share_sql = f"""SELECT share_sql = f"""SELECT
count(distinct \"#account_id\") count(distinct \"#account_id\")
FROM FROM
v_event_{self.suffix} v_event_{args['suffix']}
where where
"$part_event"='event_11_10' "$part_event"='event_11_10'
and gameid='{self.gameid}' and gameid='{args['gameid']}'
and channel='{self.channelid}' and channel='{args['channelid']}'
and "$part_event"='event_11_1' and "$part_event"='event_11_1'
and "$part_date"='{self.day}' and "$part_date"='{self.day}'
and from_appid='{fromappid}' """ and from_appid='{args['fromappid']}' """
byshare_sql = f"""SELECT byshare_sql = f"""SELECT
count(distinct \"#account_id\") count(distinct \"#account_id\")
FROM FROM
v_event_{self.suffix} v_event_{args['suffix']}
where where
"$part_event"='event_11_11' "$part_event"='event_11_11'
and gameid='{self.gameid}' and gameid='{args['gameid']}'
and channel='{self.channelid}' and channel='{args['channelid']}'
and "$part_event"='event_11_1' and "$part_event"='event_11_1'
and "$part_date"='{self.day}' and "$part_date"='{self.day}'
and from_appid='{fromappid}' """ and from_appid='{args['fromappid']}' """
try: try:
activa = self.tga.get_data(activa_sql)[0][0] or 0 activa = args['tga'].get_data(activa_sql)[0][0] or 0
new = self.tga.get_data(new_sql)[0][0] or 0 new = args['tga'].get_data(new_sql)[0][0] or 0
share = self.tga.get_data(share_sql)[0][0] or 0 share = args['tga'].get_data(share_sql)[0][0] or 0
byshare = self.tga.get_data(byshare_sql)[0][0] or 0 byshare = args['tga'].get_data(byshare_sql)[0][0] or 0
if activa == 0: if activa == 0:
k = 0 k = 0
else: else:
k = (100 * byshare / (activa - byshare)) k = (100 * byshare / (activa - byshare))
return (fromappid, FROMAPPID_CN.get(fromappid, None), activa, new, share, k) return (args['fromappid'], args['fromappid_cn'], activa, new, share, k)
except Exception: except Exception:
log.error(f"collect input failed {self.gameid} {fromappid}", exc_info=True) log.error(f"collect input failed {args['gameid']} {args['fromappid']}", exc_info=True)
return None return None
def get_output_fromappid(self, jump_appid): def get_output_fromappid(self, args):
jump_sql = f"""SELECT jump_sql = f"""SELECT
count("#account_id"),count(distinct "#account_id") count("#account_id"),count(distinct "#account_id")
FROM FROM
@ -256,34 +252,59 @@ class Report:
where where
"$part_event"='event_1_4' "$part_event"='event_1_4'
and "$part_date"='{self.day}' and "$part_date"='{self.day}'
and "jump_appid"='{jump_appid}' and "jump_appid"='{args['fromappid']}'
and "jump_result"=1 """ and "jump_result"=1 """
data = self.tga.get_data(jump_sql) data = args['tga'].get_data(jump_sql)
if data: if data:
try: try:
jump_num, jump_pre = data[0] jump_num, jump_pre = data[0]
return (jump_appid, FROMAPPID_CN.get(jump_appid, None), jump_num, jump_pre) return (args['fromappid'], args['fromappid_cn'], jump_num, jump_pre)
except Exception: except Exception:
log.error(f"get data from output by {self.gameid} {jump_appid} failed", exc_info=True) log.error(f"get data from output by {args['gameid']} {args['fromappid']} failed", exc_info=True)
return None return None
else: else:
return None return None
def run(self): def run(self):
if self.project == 'mini_games':
parms = [(1004, 6001), (2001, 6001), (1001, 6001)]
else:
parms = [(2001, 6001), (2002, 6001)]
data = dict() data = dict()
data['day'] = self.day data['day'] = self.day
data['channelid'] = self.channelid for item in parms:
data['gameid'] = self.gameid args = {}
data['all'] = self.get_all_data() args['gameid'], args['channelid'] = item
data['input'] = defaultdict(list) key = f"{args['gameid']}#{args['channelid']}"
data['output'] = defaultdict(list) g = GetTgaConfig()
data['input'] = [] item = g.get_api_key(args['gameid'])
data['output'] = [] url = item['url']
fromappids = FROMAPPID_CN.keys() args['suffix'] = item.get('suffix', 0)
for fromappid in fromappids: api_key = item.get('api_key', None)
data['input'].append(self.get_input_fromappid(fromappid)) tga = FromTga(url, api_key)
data['output'].append(self.get_output_fromappid(fromappid))
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) print(data)
return data return data
@ -291,14 +312,12 @@ class Report:
def main(): def main():
channelid = 6001
gameids = (1004, 2001)
day = (datetime.date.today() - datetime.timedelta(days=1)).strftime('%Y-%m-%d') day = (datetime.date.today() - datetime.timedelta(days=1)).strftime('%Y-%m-%d')
for gameid in gameids: project = 'mini_games'
cc = Report(gameid, channelid, day) cc = Report()
data = cc.run() data = cc.run(day, project)
print(data)
if __name__ == "__main__": if __name__ == "__main__":
# main() main() # app.run(host='0.0.0.0', port=6700, debug=False)
app.run(host='0.0.0.0', port=6700, debug=False)

View File

@ -24,8 +24,8 @@
</strong></h3>> </strong></h3>>
<!-- activa, new, share, timeonlie, ad_101, ad_1, ad_201--> <!-- activa, new, share, timeonlie, ad_101, ad_1, ad_201-->
<tr border="1"> <table border="1">
<thead> <tr>
<th>活跃</th> <th>活跃</th>
<th>新增</th> <th>新增</th>
<th>分享</th> <th>分享</th>
@ -34,17 +34,16 @@
<th>banner显示</th> <th>banner显示</th>
<th>插屏显示</th> <th>插屏显示</th>
<th>导出率</th> <th>导出率</th>
</thead> </tr>
</tr>
> <tbody>
<tbody>
{% for item in data.get('all') %} {% for item in data.get('all') %}
<tr> <tr>
<td>{{ item }}</td> <td>{{ item }}</td>
{% endfor %} {% endfor %}
</tr> </tr>
</tbody> </tbody>
>
</table> </table>

21
ops/mp_interface.py Normal file
View File

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
import requests
class MpInterface:
def __init__(self):
self.base_url = "https://mp.kingsome.cn/api/open/cfg/all?"
def get_data(self, url):
r = requests.get(url)
if r.status_code == requests.codes.ok:
return r.json()
else:
return None
def get_fromappid_cn(self, gameid, channelid):
key = "fromappid_cn"
url = f"{self.base_url}channelid={channelid}&gameid={gameid}&key={key}"
return self.get_data(url)