# -*- coding: utf-8 -*- from ops.plog import define_logger import logging import datetime from ops.mmysql import MysqlBase import pdb define_logger("/data/logs/gather_new_user.log") log = logging.getLogger(__name__) TimeDelay = 10 DB = {'user': 'mytga', 'pswd': 'gzVwh4HGR68G', 'host': '10.10.3.5', 'db': 'test'} mydb = MysqlBase(**DB) def get_last_time(gameid, channelid, ad_channel): sql = f"""SELECT last_time FROM newusers_line where gameid={gameid} and channelid={channelid} and ad_channel='{ad_channel}' ORDER BY last_time DESC LIMIT 1""" data = mydb.query(sql) try: if not data: last_time = "2019-08-30 00:00:00" else: last_time = data[0][0].strftime("%Y-%m-%d %H:%M:%S") except Exception: log.info("get last time form db failed!", exc_info=True) last_time = None return last_time def comp_datetime(x, y): xx = datetime.datetime.strptime(x, "%Y-%m-%d %H:%M:%S") yy = datetime.datetime.strptime(y, "%Y-%m-%d %H:%M:%S") if xx - datetime.timedelta(minutes=TimeDelay) > yy: return True else: return False def get_ad_chanllel(gameid): sql = f"select distinct ad_channel from newuser where gameid={gameid};" data = mydb.query(sql) ad_channel = [] if data: for line in data: try: ad_channel.append(line[0]) except Exception: log.info(f"split data error,{line}", exc_info=True) return ad_channel def gather_data(last_time, gameid, channelid, ad_channel): begin = (datetime.datetime.strptime(last_time, "%Y-%m-%d %H:%M:%S") - datetime.timedelta( minutes=TimeDelay)).strftime("%Y-%m-%d %H:%M:%S") total_user_sql = f"""select count(accountid) from newuser where gameid={gameid} AND channelid={channelid} AND ad_channel='{ad_channel}' AND register_time <'{last_time}'""" try: data = mydb.query(total_user_sql) total_user = data[0][0] except Exception: log.error(f"get total user failed!{data}") total_user = 0 new_user_sql = f"""select count(accountid) from newuser where gameid={gameid} AND channelid={channelid} AND ad_channel='{ad_channel}' AND register_time > '{begin}' AND register_time<'{last_time}'""" try: data = mydb.query(new_user_sql) new_user = data[0][0] except Exception: log.error(f"get total user failed!{data}") new_user = 0 table_name = 'newusers_line' temp = {} temp['gameid'] = gameid temp['channelid'] = channelid temp['ad_channel'] = ad_channel temp['new_user'] = new_user temp['total_user'] = total_user temp['last_time'] = last_time mydb.insert(table_name, temp) def run(gameid, channelid, ad_channel): now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") last_time = get_last_time(gameid, channelid, ad_channel) if not last_time: raise Exception("last_time get failed") while comp_datetime(now, last_time): gather_data(last_time, gameid, channelid, ad_channel) last_time = (datetime.datetime.strptime(last_time, "%Y-%m-%d %H:%M:%S") + datetime.timedelta(minutes=TimeDelay)).strftime("%Y-%m-%d %H:%M:%S") def main(): gameids = (1004, 1011, 2001) for gameid in gameids: channel = 6001 ad_channel = get_ad_chanllel(gameid) for item in ad_channel: run(gameid, channel, item) if __name__ == "__main__": main()