添加daily report生成
This commit is contained in:
parent
d200d6750d
commit
f2b972ddb4
@ -1,16 +1,268 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
from flask import render_template
|
from flask import render_template
|
||||||
|
from ops.mtga import GetTgaConfig, FromTga
|
||||||
|
import os
|
||||||
|
from flask import Flask, render_template, request
|
||||||
|
from flask_mail import Mail, Message
|
||||||
|
from threading import Thread
|
||||||
|
from collections import defaultdict
|
||||||
|
from ops.plog import define_logger
|
||||||
|
import logging
|
||||||
|
|
||||||
|
define_logger("/data/logs/ops/daily_report.log")
|
||||||
|
|
||||||
|
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"]
|
||||||
|
|
||||||
|
|
||||||
|
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')
|
||||||
|
|
||||||
|
rp = Report(gameid, channelid, day)
|
||||||
|
data = rp.get_data()
|
||||||
|
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 '<h1>邮件发送成功</h1>'
|
||||||
|
|
||||||
|
|
||||||
class Report:
|
class Report:
|
||||||
def __init__(self, gameid, channelid):
|
def __init__(self, gameid, channelid, day):
|
||||||
self.gameid = gameid
|
self.gameid = gameid
|
||||||
self.channelid = channelid
|
self.channelid = channelid
|
||||||
|
self.day = day
|
||||||
|
g = GetTgaConfig()
|
||||||
|
item = g.get_api_key(self.gameid)
|
||||||
|
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):
|
||||||
|
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):
|
||||||
|
activa_sql = f"""SELECT
|
||||||
|
count(distinct "#account_id")
|
||||||
|
FROM
|
||||||
|
v_event_{self.suffix}
|
||||||
|
where
|
||||||
|
gameid='{self.gameid}'
|
||||||
|
and channel='{self.channelid}'
|
||||||
|
and "$part_event"='event_11_1'
|
||||||
|
and "$part_date"='{self.day}'"""
|
||||||
|
|
||||||
|
new_sql = f"""SELECT
|
||||||
|
count(distinct "#account_id")
|
||||||
|
FROM
|
||||||
|
v_event_{self.suffix}
|
||||||
|
where
|
||||||
|
gameid='{self.gameid}'
|
||||||
|
and channel='{self.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_{self.suffix}
|
||||||
|
where
|
||||||
|
"$part_event"='event_11_10'
|
||||||
|
and gameid='{self.gameid}'
|
||||||
|
and channel='{self.channelid}'
|
||||||
|
and "$part_event"='event_11_1'
|
||||||
|
and "$part_date"='{self.day}'"""
|
||||||
|
|
||||||
|
# byshare_sql = f"""SELECT
|
||||||
|
# count(distinct \"#account_id\")
|
||||||
|
# FROM
|
||||||
|
# v_event_{self.suffix}
|
||||||
|
# where
|
||||||
|
# "$part_event"='event_11_11'
|
||||||
|
# and gameid='{self.gameid}'
|
||||||
|
# and channel='{self.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='{self.gameid}'
|
||||||
|
and "$part_date"='{self.day}' """
|
||||||
|
|
||||||
|
ad_101_sql = f"""SELECT
|
||||||
|
count(1)
|
||||||
|
FROM
|
||||||
|
v_event_{self.suffix}
|
||||||
|
WHERE
|
||||||
|
"$part_event"='event_11_21'
|
||||||
|
and gameid='{self.gameid}'
|
||||||
|
and "channel"='{self.channelid}'
|
||||||
|
AND activity_id=101
|
||||||
|
and "$part_date"='{self.day}' """
|
||||||
|
|
||||||
|
ad_1_sql = f"""SELECT
|
||||||
|
count(1)
|
||||||
|
FROM
|
||||||
|
v_event_{self.suffix}
|
||||||
|
WHERE
|
||||||
|
"$part_event"='event_11_21'
|
||||||
|
and gameid='{self.gameid}'
|
||||||
|
and "channel"='{self.channelid}'
|
||||||
|
AND activity_id=1
|
||||||
|
and "$part_date"='{self.day}' """
|
||||||
|
|
||||||
|
ad_201_sql = f"""SELECT
|
||||||
|
count(1)
|
||||||
|
FROM
|
||||||
|
v_event_{self.suffix}
|
||||||
|
WHERE
|
||||||
|
"$part_event"='event_11_21'
|
||||||
|
and gameid='{self.gameid}'
|
||||||
|
and "channel"='{self.channelid}'
|
||||||
|
AND activity_id=201
|
||||||
|
and "$part_date"='{self.day}' """
|
||||||
|
|
||||||
|
try:
|
||||||
|
activa = self.tga.get_data(activa_sql)[0][0]
|
||||||
|
new = self.tga.get_data(new_sql)[0][0]
|
||||||
|
share = self.tga.get_data(share_sql)[0][0]
|
||||||
|
timeonlie = self.tga.get_data(timeonlie_sql)[0][0]
|
||||||
|
ad_101 = self.tga.get_data(ad_101_sql)[0][0]
|
||||||
|
ad_1 = self.tga.get_data(ad_1_sql)[0][0]
|
||||||
|
ad_201 = self.tga.get_data(ad_201_sql)[0][0]
|
||||||
|
return (activa, new, share, timeonlie, ad_101, ad_1, ad_201)
|
||||||
|
except Exception:
|
||||||
|
log.error(f"get data from tga failed ,{self.gameid}", exc_info=True)
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def get_input_fromappid(self, fromappid):
|
||||||
|
activa_sql = f"""SELECT
|
||||||
|
count(distinct "#account_id")
|
||||||
|
FROM
|
||||||
|
v_event_{self.suffix}
|
||||||
|
where
|
||||||
|
gameid='{self.gameid}'
|
||||||
|
and channel='{self.channelid}'
|
||||||
|
and "$part_event"='event_11_1'
|
||||||
|
and "$part_date"='{self.day}'
|
||||||
|
and fromappid='{fromappid}'"""
|
||||||
|
new_sql = f"""SELECT
|
||||||
|
count(distinct "#account_id")
|
||||||
|
FROM
|
||||||
|
v_event_{self.suffix}
|
||||||
|
where
|
||||||
|
gameid='{self.gameid}'
|
||||||
|
and channel='{self.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 fromappid='{fromappid}' """
|
||||||
|
|
||||||
|
share_sql = f"""SELECT
|
||||||
|
count(distinct \"#account_id\")
|
||||||
|
FROM
|
||||||
|
v_event_{self.suffix}
|
||||||
|
where
|
||||||
|
"$part_event"='event_11_10'
|
||||||
|
and gameid='{self.gameid}'
|
||||||
|
and channel='{self.channelid}'
|
||||||
|
and "$part_event"='event_11_1'
|
||||||
|
and "$part_date"='{self.day}'
|
||||||
|
and fromappid='{fromappid}' """
|
||||||
|
|
||||||
|
byshare_sql = f"""SELECT
|
||||||
|
count(distinct \"#account_id\")
|
||||||
|
FROM
|
||||||
|
v_event_{self.suffix}
|
||||||
|
where
|
||||||
|
"$part_event"='event_11_11'
|
||||||
|
and gameid='{self.gameid}'
|
||||||
|
and channel='{self.channelid}'
|
||||||
|
and "$part_event"='event_11_1'
|
||||||
|
and "$part_date"='{self.day}'
|
||||||
|
and fromappid='{fromappid}' """
|
||||||
|
try:
|
||||||
|
activa = self.tga.get_data(activa_sql)[0][0] or 0
|
||||||
|
new = self.tga.get_data(new_sql)[0][0] or 0
|
||||||
|
share = self.tga.get_data(share_sql)[0][0] or 0
|
||||||
|
byshare = self.tga.get_data(byshare_sql)[0][0] or 0
|
||||||
|
if activa == 0:
|
||||||
|
k = 0
|
||||||
|
else:
|
||||||
|
k = (100 * byshare / (activa - byshare))
|
||||||
|
return (activa, new, share, k)
|
||||||
|
except Exception:
|
||||||
|
log.error(f"collect input failed {self.gameid} {fromappid}", exc_info=True)
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def get_output_fromappid(self, jump_appid):
|
||||||
|
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"='{jump_appid}'
|
||||||
|
and "jump_result"=1
|
||||||
|
order by
|
||||||
|
"#server_time" desc limit 10"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
jump_num, jump_pre = self.tga.get_data(jump_sql)[0]
|
||||||
|
return (jump_num, jump_pre)
|
||||||
|
except Exception:
|
||||||
|
log.error(f"get data from output by {self.gameid} {jump_appid} failed", exc_info=True)
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
pass
|
fromappid = 'wxcff7381e631cf54e'
|
||||||
|
a = self.get_all_data()
|
||||||
|
b = self.get_input_fromappid(fromappid)
|
||||||
|
c = self.get_output_fromappid(fromappid)
|
||||||
|
print(f"{a},{b},{c}")
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
50
daily_report/templates/report.html
Normal file
50
daily_report/templates/report.html
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>金蚕游戏日报,By ops</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
游戏ID:{{data.get(gameid)}}
|
||||||
|
渠道ID:{{data.get('channelid')}}='6001'
|
||||||
|
日期:{{data.get(day)}}
|
||||||
|
|
||||||
|
总计数据:
|
||||||
|
活跃
|
||||||
|
新增
|
||||||
|
时长
|
||||||
|
分享
|
||||||
|
K值
|
||||||
|
视频/banner
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
导入数据:
|
||||||
|
<tr>
|
||||||
|
<th>渠道ID</th>
|
||||||
|
<th>游戏名称</th>
|
||||||
|
<th>活跃</th>
|
||||||
|
<th>新增</th>
|
||||||
|
<th>分享</th>
|
||||||
|
<th>K值</th>
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
|
||||||
|
{% for line in data.get('data') %}
|
||||||
|
<tr>
|
||||||
|
{%for item in line%}
|
||||||
|
<th>{{ item }}</th>
|
||||||
|
{% endfor %}
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
导出数据:
|
||||||
|
fromappid
|
||||||
|
中文
|
||||||
|
跳转次数
|
||||||
|
跳转人数
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
x
Reference in New Issue
Block a user