#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Jun  5 17:00:45 2020

@author: chencong
"""

import json
import random
import requests
import time
import pandas as pd 
import pymysql
from apscheduler.schedulers.blocking import BlockingScheduler
import datetime
import token_list as tl


def adcreatives_get(access_token,account_id,fields) : #获取创意

    interface = 'adcreatives/get'
    url = 'https://api.e.qq.com/v1.1/' + interface
    page =1 
    list1 = []
    common_parameters = {
            'access_token': access_token, 
            'timestamp': int(time.time()), 
            'nonce': str(time.time()) + str(random.randint(0, 999999)),
            'fields':fields
        }

    parameters = {
            "account_id": account_id,
            "page": page,
            "page_size": 100,
            "is_deleted": False
        }

    parameters.update(common_parameters)
    for k in parameters:
        if type(parameters[k]) is not str:
            parameters[k] = json.dumps(parameters[k])

    r = requests.get(url, params = parameters).json()
    if 'data' in r.keys():
        list1 = list1+r['data']['list']

        total_page=r['data']['page_info']['total_page']
        if total_page>1:
            for page in range(2,total_page+1):
                common_parameters = {
            'access_token': access_token, 
            'timestamp': int(time.time()), 
            'nonce': str(time.time()) + str(random.randint(0, 999999)),
            'fields':fields
        }
                parameters = {
            "account_id": account_id,
            "page": page,
            "page_size": 100,
            "is_deleted": False
        }   
                parameters.update(common_parameters)
                for k in parameters:
                    if type(parameters[k]) is not str:
                        parameters[k] = json.dumps(parameters[k])

                r = requests.get(url, params = parameters).json()
                if 'data' in r.keys():
                    list1 = list1+r['data']['list']            
    return list1

#print(adcreatives_get('3bbbae77bed9fcde94cc0f1742a18c6e',11436446,('campaign_id','adcreative_id','adcreative_name','adcreative_elements','promoted_object_type','page_type','page_spec','link_page_spec','universal_link_url','promoted_object_id')))


def ads_get(access_token,account_id,fields) : #获取广告

    interface = 'ads/get'
    url = 'https://api.e.qq.com/v1.1/' + interface

    common_parameters = {
            'access_token': access_token, 
            'timestamp': int(time.time()), 
            'nonce': str(time.time()) + str(random.randint(0, 999999)),
            'fields':fields
        }

    parameters = {
            "account_id": account_id,
            "page": 1,
            "page_size": 10,
            "is_deleted": False
        }

    parameters.update(common_parameters)
    for k in parameters:
        if type(parameters[k]) is not str:
            parameters[k] = json.dumps(parameters[k])

    r = requests.get(url, params = parameters)

    return r.json()

#print(ads_get('2a674bef201314d338be30420369671f',14985162,('ad_id','ad_name','adcreative_id','adcreative')))
    

def wechat_pages_get(access_token,account_id,page_id,fields) : #获取微信原生页

    interface = 'wechat_pages/get'
    url = 'https://api.e.qq.com/v1.1/' + interface

    common_parameters = {
            'access_token': access_token, 
            'timestamp': int(time.time()), 
            'nonce': str(time.time()) + str(random.randint(0, 999999)),
            'fields':fields
        }

    parameters = {
            "account_id": account_id,
            "filtering": 
            [
                
                {
                    "field": "page_id",
                    "operator": "EQUALS",
                    "values": 
                    [
                        page_id
                    ]
                }
            ],
            "page": 1,
            "page_size": 10
        }

    parameters.update(common_parameters)
    for k in parameters:
        if type(parameters[k]) is not str:
            parameters[k] = json.dumps(parameters[k])

    r = requests.get(url, params = parameters)

    return r.json()
#print(wechat_pages_get('2a674bef201314d338be30420369671f',14985162,1900495593,('page_id','page_name','created_time','last_modified_time','page_template_id','preview_url','page_type','source_type')))
    

def adgroups_get(access_token,account_id,fields) : #获取广告组

    interface = 'adgroups/get'
    url = 'https://api.e.qq.com/v1.1/' + interface

    common_parameters = {
            'access_token': access_token, 
            'timestamp': int(time.time()), 
            'nonce': str(time.time()) + str(random.randint(0, 999999)),
            'fields':fields
        }

    parameters = {
            "account_id": account_id,
            "page": 4,
            "page_size": 100,
            "is_deleted": False
        }

    parameters.update(common_parameters)
    for k in parameters:
        if type(parameters[k]) is not str:
            parameters[k] = json.dumps(parameters[k])

    r = requests.get(url, params = parameters)

    return r.json()

#print(adgroups_get('2a674bef201314d338be30420369671f',14985162,('campaign_id','adgroup_id','adgroup_name','optimization_goal','billing_event','bid_amount','daily_budget','targeting','begin_date','end_date','time_series','bid_strategy','cold_start_audience','auto_audience','expand_enabled','expand_targeting','deep_conversion_spec','deep_optimization_action_type','conversion_id','deep_conversion_behavior_bid','deep_conversion_worth_rate','system_status')))

def images_get(access_token,account_id,fields) : #获取图片信息

    import json
    import random
    import requests
    import time

    interface = 'images/get'
    url = 'https://api.e.qq.com/v1.1/' + interface
    page = 1
    list1 = []
    common_parameters = {
            'access_token': access_token, 
            'timestamp': int(time.time()), 
            'nonce': str(time.time()) + str(random.randint(0, 999999)),
            'fields':fields
        }

    parameters = {
            "account_id": account_id,

            "page": page,
            "page_size": 100
        }

    parameters.update(common_parameters)
    for k in parameters:
        if type(parameters[k]) is not str:
            parameters[k] = json.dumps(parameters[k])

    r = requests.get(url, params = parameters).json()
    if 'data' in r.keys():
        list1 = list1+r['data']['list']

        total_page=r['data']['page_info']['total_page']
        if total_page>1:
            for page in range(2,total_page+1):
                common_parameters = {
            'access_token': access_token, 
            'timestamp': int(time.time()), 
            'nonce': str(time.time()) + str(random.randint(0, 999999)),
            'fields':fields
        }
                parameters = {
            "account_id": account_id,
            "page": page,
            "page_size": 100
        }   
                parameters.update(common_parameters)
                for k in parameters:
                    if type(parameters[k]) is not str:
                        parameters[k] = json.dumps(parameters[k])

                r = requests.get(url, params = parameters).json()
                if 'data' in r.keys():
                    list1 = list1+r['data']['list']            
    return list1  


#print(images_get('2a674bef201314d338be30420369671f',14985162,('image_id','preview_url')))

def campaigns_get(access_token,account_id,fields) : #获取推广计划

    import json
    import random
    import requests
    import time

    interface = 'campaigns/get'
    url = 'https://api.e.qq.com/v1.1/' + interface
    page = 1
    list1 = []
    common_parameters = {
            'access_token': access_token, 
            'timestamp': int(time.time()), 
            'nonce': str(time.time()) + str(random.randint(0, 999999)),
            'fields':fields
        }

    parameters = {
            "account_id": account_id,
            "page": page,
            "page_size": 100,
            "is_deleted": False
        }

    parameters.update(common_parameters)
    for k in parameters:
        if type(parameters[k]) is not str:
            parameters[k] = json.dumps(parameters[k])

    r = requests.get(url, params = parameters).json()
    if 'data' in r.keys():
        list1 = list1+r['data']['list']

        total_page=r['data']['page_info']['total_page']
        if total_page>1:
            for page in range(2,total_page+1):
                common_parameters = {
            'access_token': access_token, 
            'timestamp': int(time.time()), 
            'nonce': str(time.time()) + str(random.randint(0, 999999)),
            'fields':fields
        }   
                parameters = {
            "account_id": account_id,
            "page": page,
            "page_size": 100,
            "is_deleted": False
        }   
                parameters.update(common_parameters)
                for k in parameters:
                    if type(parameters[k]) is not str:
                        parameters[k] = json.dumps(parameters[k])

                r = requests.get(url, params = parameters).json()
                if 'data' in r.keys():
                    list1 = list1+r['data']['list']            
    return list1  
  
#aa=tl.token_list_vx[-2]
#print(campaigns_get(aa[2],aa[0],('campaign_id','campaign_name','configured_status','campaign_type','promoted_object_type','daily_budget','budget_reach_date','created_time','last_modified_time','speed_mode','is_deleted')))


def daily_reports_get(access_token,account_id,level,start_date,end_date,fields) : #获取wx投放计划日报数据

    interface = 'daily_reports/get'
    url = 'https://api.e.qq.com/v1.1/' + interface

    common_parameters = {
            'access_token': access_token, 
            'timestamp': int(time.time()), 
            'nonce': str(time.time()) + str(random.randint(0, 999999)),
            'fields':fields
        }

    parameters = {
            "account_id": account_id,
            "level": level,
            "date_range": 
            {
                "start_date": start_date,
                "end_date": end_date
            },
            
            "page": 1,
            "page_size": 1000,
            "fields": 
            [
        
            ]
        }

    parameters.update(common_parameters)
    for k in parameters:
        if type(parameters[k]) is not str:
            parameters[k] = json.dumps(parameters[k])

    r = requests.get(url, params = parameters)

    return r.json()

def daily_qq_reports_get(access_token,account_id,compaign_id,level,start_date,end_date,fields) : #获取gdt投放计划日报数据

    interface = 'daily_reports/get'
    url = 'https://api.e.qq.com/v1.1/' + interface

    common_parameters = {
            'access_token': access_token, 
            'timestamp': int(time.time()), 
            'nonce': str(time.time()) + str(random.randint(0, 999999)),
            'fields':fields
        }

    parameters = {
            "account_id": account_id,
            "filtering": 
            [
                
                {
                    "field": "campaign_id",
                    "operator": "EQUALS",
                    "values": 
                    [
                        compaign_id
                    ]
                }
            ],
            "level": level,
            "date_range": 
            {
                "start_date": start_date,
                "end_date": end_date
            },
            
            "page": 1,
            "page_size": 1000,
            "fields": 
            [
                    
            ]
        }

    parameters.update(common_parameters)
    for k in parameters:
        if type(parameters[k]) is not str:
            parameters[k] = json.dumps(parameters[k])

    r = requests.get(url, params = parameters)

    return r.json()


def mysql_insert_daily_vx_campaign(data):
    db = pymysql.connect('rm-bp1c9cj79872tx3aaro.mysql.rds.aliyuncs.com','superc','Cc719199895','quchen_text')
    cursor = db.cursor() 
    time1 = time.time()
    sql = 'insert ignore into daily_vx_campaign (account_id,date,campaign_id,view_count,cost,ctr,cpc,order_roi,thousand_display_price,valid_click_count,official_account_follow_count,conversions_count,official_account_follow_rate,conversions_rate,order_count,order_rate,order_unit_price,first_day_order_amount) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);'
    try:
        cursor.executemany(sql,data)
        db.commit()
        cost_time =round((time.time()-time1)/60,1)
        print('insert_daily_vx_campaign access',len(data),'cost_minutes:',cost_time)
    except:
        db.rollback()
        print('insert_daily_vx_campaign defeat')
        
def mysql_insert_daily_qq_campaign(data):
    db = pymysql.connect('rm-bp1c9cj79872tx3aaro.mysql.rds.aliyuncs.com','superc','Cc719199895','quchen_text')
    cursor = db.cursor() 
    time1 = time.time()
    sql = 'insert ignore into daily_qq_campaign (account_id,date,campaign_id,view_count,thousand_display_price,valid_click_count,ctr,cpc,cost,order_roi) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
    try:
        cursor.executemany(sql,data)
        db.commit()
        cost_time =round((time.time()-time1)/60,1)
        print('insert_daily_qq_campaign access',len(data),'cost_minutes:',cost_time)
    except:
        db.rollback()
        print('insert_daily_qq_campaign defeat')
#print(daily_reports_get('2a674bef201314d338be30420369671f',14985162,'REPORT_LEVEL_CAMPAIGN_WECHAT','2020-07-20','2020-07-20',('account_id','date','campaign_id','view_count','cost','ctr','cpc','order_roi','thousand_display_price','valid_click_count','official_account_follow_count','conversions_count','official_account_follow_rate','conversions_rate','order_count','order_rate','order_unit_price','first_day_order_amount')))
#print(daily_reports_get('27b2f2768640555133162b5982872b83',15223385,'REPORT_LEVEL_CAMPAIGN','2020-07-10','2020-07-19',('account_id','date','campaign_id','view_count','thousand_display_price','valid_click_count','ctr','cpc','cost','order_roi')))

def mysql_insert_campaign_vx(data,data2):
    db = pymysql.connect('rm-bp1c9cj79872tx3aaro.mysql.rds.aliyuncs.com','superc','Cc719199895','quchen_text')
    cursor = db.cursor() 
    time1 = time.time()
    sql = 'insert ignore into campaign_vx (campaign_id,campaign_name,configured_status,campaign_type,promoted_object_type,daily_budget,created_time,last_modified_time,account_id) values (%s,%s,%s,%s,%s,%s,%s,%s,%s)'
    sql2 = 'delete from campaign_vx where campaign_id =%s '
    try:
        cursor.executemany(sql2,data2)
        db.commit()
        print('delete campaign_vx access',len(data2))
    except:
        db.rollback()
        print('delete campaign_vx defeat')
    try:
        cursor.executemany(sql,data)
        db.commit()
        cost_time =round((time.time()-time1)/60,1)
        print('insert_campaign_vx access',len(data),'cost_minutes:',cost_time)
    except:
        db.rollback()
        print('insert_campaign_vx defeat')


def mysql_insert_adcreative(data):
    db = pymysql.connect('rm-bp1c9cj79872tx3aaro.mysql.rds.aliyuncs.com','superc','Cc719199895','quchen_text')
    cursor = db.cursor() 
    time1 = time.time()
    sql = 'insert ignore into adcreative (campaign_id,adcreative_id,adcreative_name,image_id,title,promoted_object_type,page_type,page_id,link_page_id,promoted_object_id) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
    try:
        cursor.executemany(sql,data)
        db.commit()
        cost_time =round((time.time()-time1)/60,1)
        print('insert_adcreative access',len(data),'cost_minutes:',cost_time)
    except:
        db.rollback()
        print('insert_adcreative defeat')


def mysql_insert_image(data):
    db = pymysql.connect('rm-bp1c9cj79872tx3aaro.mysql.rds.aliyuncs.com','superc','Cc719199895','quchen_text')
    cursor = db.cursor() 
    time1 = time.time()
    sql = 'insert ignore into image (image_id,preview_url,account_id) values (%s,%s,%s)'
    try:
        cursor.executemany(sql,data)
        db.commit()
        cost_time =round((time.time()-time1)/60,1)
        print('insert image access',len(data),'cost_minutes:',cost_time)
    except:
        db.rollback()
        print('insert image defeat')


def get_daily_vx_campaign(st,et): #获取投放计划、日报数据
    token_list_v = tl.token_list_vx
    r = ()
    p = ()
    q=[]
    for x in token_list_v:
        account_id = x[0]
        access_token = x[2]
        start_date = time.strftime("%Y-%m-%d",time.localtime(st))
        end_date = time.strftime("%Y-%m-%d",time.localtime(et))
        
        l = campaigns_get(access_token,account_id,('campaign_id','campaign_name','configured_status','campaign_type','promoted_object_type','daily_budget','budget_reach_date','created_time','last_modified_time','speed_mode','is_deleted'))
        
        if len(l)>0:
            for ll in l:
                ll['account_id']=account_id
                if ll['created_time']>st or ll['last_modified_time']>st:
                    q.append(ll['campaign_id'])
                    lt = tuple(ll.values())
                    p = p+((lt),)
        
        
        data_list = daily_reports_get(access_token,account_id,'REPORT_LEVEL_CAMPAIGN_WECHAT',start_date,end_date,('account_id','date','campaign_id','view_count','cost','ctr','cpc','order_roi','thousand_display_price','valid_click_count','official_account_follow_count','conversions_count','official_account_follow_rate','conversions_rate','order_count','order_rate','order_unit_price','first_day_order_amount'))
        if 'data' in data_list.keys():
            
            for y in data_list['data']['list']:
                y['account_id'] = account_id
                y = tuple(y.values()) 
                r=r+((y),)  
        
    mysql_insert_daily_vx_campaign(r)
    mysql_insert_campaign_vx(p,q)

    
#get_daily_vx_campaign(1597766400,1597852800)


def get_daily_qq_campaign(st,et):
    token_list_q = tl.token_list_qq
    r=()
    for x in token_list_q:
        account_id = x[0]
        access_token = x[2]
        start_date = st
        end_date = et
        
        l = campaigns_get(access_token,account_id,('campaign_id','campaign_name','configured_status','campaign_type','promoted_object_type','daily_budget','budget_reach_date','created_time','last_modified_time','speed_mode','is_deleted'))

        for ll in l:
            campaign_id =ll['campaign_id']
            
            data_list = daily_qq_reports_get(access_token,account_id,campaign_id,'REPORT_LEVEL_CAMPAIGN',start_date,end_date,('account_id','date','campaign_id','view_count','thousand_display_price','valid_click_count','ctr','cpc','cost','order_roi'))
            if len(data_list['data']['list'])>0:
                print(data_list)
                print(l)
            
            if 'data' in data_list.keys():
            
                for y in data_list['data']['list']:
                    
                    y = tuple(y.values()) 
                    r=r+((y),) 
      
    #mysql_insert_daily_qq_campaign(r)        

#get_daily_vx_campaign('2020-01-01','2020-07-27')
#get_daily_qq_campaign('2020-07-10','2020-07-24')

def get_campaign_update_list():
    db = pymysql.connect('rm-bp1c9cj79872tx3aaro.mysql.rds.aliyuncs.com','superc','Cc719199895','quchen_text')
#db = pymysql.connect('localhost','root','chencong1996','quchen_text')
    cursor = db.cursor()
    sql = 'select distinct advertiser_vx.account_id,access_token from campaign_vx left join advertiser_vx on advertiser_vx.account_id = campaign_vx.account_id where created_time>=%s or last_modified_time>=%s'
    data = (int((time.time()+8*3600)//86400*86400-8*3600-86400),int((time.time()+8*3600)//86400*86400-8*3600-86400))
    try:
        cursor.execute(sql,data)
        db.commit()
        x=cursor.fetchall()
        print('access get campaign update list',x)
    except:
        db.rollback()
        print('defeat get campaign update list')
    a = []
    if len(x)>0:
        for t in x:
            a.append(t[0])
    sql2 = 'delete from adcreative where campaign_id=%s'
    try:
        cursor.executemany(sql2,a)
        db.commit()
        y=cursor.fetchall()
        print('access delete adcreative',y)
    except:
        db.rollback()
        print('defeat delete adcreative')
    return x


def get_adcreative_vx():
    token_list_vx=get_campaign_update_list()
    r = ()
    for x in token_list_vx:
        account_id = x[0]
        access_token = x[1]
        l = adcreatives_get(access_token,account_id,('campaign_id','adcreative_id','adcreative_name','adcreative_elements','promoted_object_type','page_type','page_spec','link_page_spec','universal_link_url','promoted_object_id'))
    
        if len(l)>0:
            for ll in l:
                
                
                if 'image_list' in ll['adcreative_elements'].keys():
                    for image_id in ll['adcreative_elements']['image_list']:
                        a={}
                        a['campaign_id']=ll['campaign_id']
                        a['adcreative_id'] = ll['adcreative_id']
                        a['adcreative_name'] = ll['adcreative_name']
                        a['image_id'] = image_id
                        a['title'] = ll['adcreative_elements']['title']
                        a['promoted_object_type'] = ll['promoted_object_type']
                        a['page_type'] = ll['page_type']
                        if 'page_spec' in ll.keys():
                            if 'page_id' in ll['page_spec'].keys():
                                a['page_id'] = ll['page_spec']['page_id']
                            else :
                                a['page_id'] = None
                        else:
                            a['page_id'] = None
                            
                        if 'link_page_spec' in ll.keys():
                            if 'page_id' in ll['link_page_spec'].keys():
                                a['link_page_id']= ll['link_page_spec']['page_id']
                            else:
                                a['link_page_id']=None
                        else:
                            a['link_page_id'] = None
                            
                        a['promoted_object_id'] = ll['promoted_object_id']
                        y = tuple(a.values())
                        r = r+((y),)
                elif 'image' in ll['adcreative_elements'].keys() :
                    a={}
                    a['campaign_id']=ll['campaign_id']
                    a['adcreative_id'] = ll['adcreative_id']
                    a['adcreative_name'] = ll['adcreative_name']
                    a['image_id'] = ll['adcreative_elements']['image']
                    if 'title' in ll['adcreative_elements']:
                        a['title'] = ll['adcreative_elements']['title']
                    else:
                        a['title']=''
                    a['promoted_object_type'] = ll['promoted_object_type']
                    a['page_type'] = ll['page_type']
                    if 'page_spec' in ll.keys():
                        if 'page_id' in ll['page_spec'].keys():
                            a['page_id'] = ll['page_spec']['page_id']
                        else :
                            a['page_id'] = None
                    else:
                        a['page_id'] = None
                            
                    if 'link_page_spec' in ll.keys():
                        if 'page_id' in ll['link_page_spec'].keys():
                            a['link_page_id']= ll['link_page_spec']['page_id']
                        else:
                            a['link_page_id']=None
                    else:
                        a['link_page_id'] = None
                            
                    a['promoted_object_id'] = ll['promoted_object_id']
                    y = tuple(a.values())
                    r = r+((y),)
                    
    mysql_insert_adcreative(r)
#get_adcreative_vx()

def get_image_imformation():
    token_list_vx = tl.token_list_vx
    r = ()
    for x in token_list_vx:
        account_id = x[0]
        access_token = x[2]
        
        l = images_get(access_token,account_id,('image_id','preview_url'))
        if len(l)>0:
            for ll in l:
                ll['account_id']=account_id
                y=tuple(ll.values())
                r=r+((y),)
    mysql_insert_image(r)
#get_image_imformation()
#get_adcreative_vx()
#get_image_imformation()


def start_all_job():
    start_time = int((time.time()+8*3600)//86400*86400-8*3600-86400)
    end_time = int((time.time()+8*3600)//86400*86400-8*3600-86400)
    get_daily_vx_campaign(start_time,end_time)
    get_adcreative_vx()
    get_image_imformation()



start_job_time = '2020-10-10 06:10:10'

if __name__ == '__main__':
    scheduler = BlockingScheduler()
    scheduler.add_job(start_all_job, 'interval',days=1,start_date=start_job_time)
    scheduler.start()