datacollect/taptap/taptap_report_new.py
2019-11-11 11:28:02 +08:00

228 lines
9.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
from ops.mtga import FromTga
from ops.plog import define_logger
from ops.mmysql import MysqlBase
import logging
import datetime
import pdb
import sys
from bson.objectid import ObjectId
import json
define_logger("/data/logs/ops/taptap_report.log")
log = logging.getLogger(__name__)
import sys
class TapTapReport:
def __init__(self, day):
self.db_conf = {'user': 'mytga', 'pswd': 'gzVwh4HGR68G', 'host': '10.10.3.5', 'db': 'external_data'}
self.url = "http://10.10.3.17:8992/querySql"
self.api_secret = "n9H4R32ZcjtSeN89ljCY6ESzTmOlnwwnOB3r4YsggnP5M1AXLtKtiS4sS1KKLOEQ"
self.tga = FromTga(url=self.url, token=self.api_secret)
self.day = day
self.bday = (datetime.datetime.strptime(self.day, "%Y-%m-%d") - datetime.timedelta(days=1)).strftime('%Y-%m-%d')
self.bbday = (datetime.datetime.strptime(self.day, "%Y-%m-%d") - datetime.timedelta(days=2)).strftime(
'%Y-%m-%d')
def clear_noice(self):
# 结合前后2天的数据清理diff_order >200的数据
pass
def build_report(self):
mydb = MysqlBase(**self.db_conf)
all = dict()
gameid_order = dict()
# get 最新的gameid info数据
gameid_info = self.get_gameid_info(self.bday)
for item in (self.day, self.bday, self.bbday):
b_d = self.split_order_data(item)
for key in b_d:
gameid_order.setdefault(key, {}).update(b_d[key])
for key in gameid_order.keys():
all.setdefault(key, {})['gameid'] = key.split("#")[0]
all[key]['catename'] = key.split('#')[1]
all[key]['date'] = self.bday
if gameid_order[key].get(self.bday, 0) and gameid_order[key].get(self.bbday, 0) and gameid_order[key].get(
self.day, 0):
all[key]['diff_order'] = gameid_order[key].get(self.bbday, 0) - gameid_order[key].get(self.bday, 0)
all.setdefault(key, {})['current_order'] = gameid_order[key].get(self.bday, 0)
elif gameid_order[key].get(self.bday, 0) and gameid_order[key].get(self.bbday, 0):
all[key]['diff_order'] = gameid_order[key].get(self.bbday, 0) - gameid_order[key].get(self.bday, 0)
all.setdefault(key, {})['current_order'] = gameid_order[key].get(self.bday, 0)
elif gameid_order[key].get(self.bday, 0) and gameid_order[key].get(self.day, 0):
all[key]['diff_order'] = "新晋榜"
all.setdefault(key, {})['current_order'] = gameid_order[key].get(self.bday, 0)
elif gameid_order[key].get(self.bbday, 0) and gameid_order[key].get(self.day, 0):
all[key]['diff_order'] = gameid_order[key].get(self.bbday, 0) - gameid_order[key].get(self.day, 0)
all.setdefault(key, {})['current_order'] = gameid_order[key].get(self.day, 0)
else:
# 三天中有2天没数据写入日志不予处理
log.error(f"{key} missing 2 days data,{self.bday}={gameid_order[key].get(self.bday, 0)},{self.bbday}={gameid_order[key].get(self.bbday, 0)},{self.day}={gameid_order[key].get(self.day, 0)}")
for key in gameid_info.keys():
all[key]['title'] = gameid_info[key]['title']
all[key]['cate'] = gameid_info[key]['cate']
all[key]['topic'] = gameid_info[key]['topic']
all[key]['score'] = gameid_info[key]['score']
all[key]['reserve'] = gameid_info[key]['reserve']
all[key]['watch'] = gameid_info[key]['watch']
all[key]['download'] = gameid_info[key]['download']
all[key]['sell'] = gameid_info[key]['sell']
all[key]['review'] = gameid_info[key]['review']
all[key]['tags'] = gameid_info[key]['tags']
b_game_info = self.get_gameid_info(self.bbday)
n_game_info = self.get_gameid_info(self.day)
for key in all.keys():
if not all[key].get('title', None):
try:
all[key]['title'] = b_game_info.get(key,{}).get('title',None) or n_game_info.get(key,{}).get('title',None)
all[key]['cate'] = b_game_info.get(key,{}).get('cate',None) or n_game_info.get(key,{}).get('cate',None)
all[key]['topic'] = b_game_info.get(key,{}).get('topic',None) or n_game_info.get(key,{}).get('topic',None)
all[key]['score'] = b_game_info.get(key, {}).get('score', 0) or n_game_info.get(key, {}).get(
'score', 0)
all[key]['reserve'] = b_game_info.get(key, {}).get('reserve', 0) or n_game_info.get(key, {}).get(
'reserve', 0)
all[key]['watch'] = b_game_info.get(key, {}).get('watch', 0) or n_game_info.get(key, {}).get(
'watch', 0)
all[key]['download'] = b_game_info.get(key, {}).get('download', 0) or n_game_info.get(key, {}).get(
'download', 0)
all[key]['sell'] = b_game_info.get(key, {}).get('sell', 0) or n_game_info.get(key, {}).get('sell',
0)
all[key]['review'] = b_game_info.get(key, {}).get('review', 0) or n_game_info.get(key, {}).get(
'review', 0)
all[key]['tags'] = b_game_info.get(key,{}).get('tags',None) or n_game_info.get(key,{}).get('tags',None)
except Exception:
log.error(f"0={key} 1={all.get(key, 0)} 2={b_game_info.get(key, 0)} 3={n_game_info.get(key, 0)}",
exc_info=True)
for line in all.values():
try:
#print(line)
if line.get('current_order', 0) > 0:
mydb.insert("taptap_data_new", line)
else:
log.error(f"some value is zore ,{line}!")
except Exception:
log.error(f"install 2 db failed ,values={line}", exc_info=True)
def get_gameid_info(self, day):
all_data = dict()
sql = f"""SELECT
gameid,
catename,
title,
cate,
topic,
score,
reserve,
watch,
download,
sell,
review ,
tags
FROM
v_event_25
where
"$part_date"='{day}'"""
data = self.tga.get_data(sql)
if data:
for line in data:
try:
gameid, catename, title, cate, topic, score, reserve, watch, download, sell, review, tags = line
key = f"{str(int(gameid))}#{catename}"
all_data.setdefault(key, {})["key"] = key
all_data.setdefault(key, {})["catename"] = catename
all_data.setdefault(key, {})["title"] = title
all_data.setdefault(key, {})["cate"] = cate
all_data.setdefault(key, {})["topic"] = topic
all_data.setdefault(key, {})["score"] = score
all_data.setdefault(key, {})["reserve"] = reserve
all_data.setdefault(key, {})["watch"] = watch
all_data.setdefault(key, {})["download"] = download
all_data.setdefault(key, {})["sell"] = sell
all_data.setdefault(key, {})["review"] = review
all_data.setdefault(key, {})["tags"] = tags
except Exception:
log.error(f"split {line} failed", exc_info=True)
return all_data
def split_order_data(self, day):
all_data = dict()
mydb = MysqlBase(**self.db_conf)
sql = f"select gameid,catename,`order`,date from taptap_order WHERE date='{day}'"
data = mydb.query(sql)
if data:
for line in data:
try:
gameid, catename, order, date = line
key = f"{str(gameid)}#{catename}"
temp = {}
temp[date] = order
all_data[key] = temp
except Exception:
log.error(f"split line failed,values={line}", exc_info=True)
return all_data
def get_order(self):
sql = f"""
SELECT
gameid,
catename,
"order"
FROM
v_event_25
WHERE
"$part_date"='{self.day}'
"""
data = self.tga.get_data(sql)
if data:
self.order2mysql(data)
return True
else:
return False
def order2mysql(self, data):
mydb = MysqlBase(**self.db_conf)
table_name = "taptap_order"
for line in data:
temp = {}
try:
temp["gameid"], temp["catename"], temp["order"] = line
temp["date"] = self.day
mydb.insert(table_name, temp)
except Exception:
log.error(f"instert {line} 2 db failed", exc_info=True)
def main():
if len(sys.argv) == 3:
day = sys.argv[2]
methods = sys.argv[1]
else:
methods = sys.argv[1]
day = (datetime.date.today() - datetime.timedelta(days=1)).strftime('%Y-%m-%d')
if not (day and methods):
raise Exception(f"PLs input day={day} methods={methods}")
tap = TapTapReport(day)
if methods == 'data':
tap.get_order()
elif methods == "report":
tap.build_report()
elif methods == 'all':
# tap.get_order()
tap.build_report()
else:
print("PLS input methods in ('data','report')")
if __name__ == "__main__":
main()