cost_util.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539
  1. import json
  2. import random
  3. import requests
  4. import time
  5. from datetime import datetime
  6. import pymysql
  7. import logging
  8. from concurrent.futures import ThreadPoolExecutor
  9. from model.DataBaseUtils import MysqlUtils
  10. logging.getLogger().setLevel(logging.WARNING)
  11. from model.ComUtils import *
  12. from model.DateUtils import DateUtils
  13. du = DateUtils()
  14. db = MysqlUtils()
  15. max_workers = 10
  16. count = []
  17. t = du.get_n_days(-10)
  18. def get_adcreatives(account_id,access_token,flag,adc_ids,dt): # 获取创意
  19. url = 'https://api.e.qq.com/v1.1/adcreatives/get'
  20. li =[]
  21. page = 1
  22. while True:
  23. parameters = {
  24. 'access_token': access_token,
  25. 'timestamp': int(time.time()),
  26. 'nonce': str(time.time()) + str(random.randint(0, 999999)),
  27. 'fields': ('campaign_id', 'adcreative_id', 'adcreative_name', 'adcreative_elements', 'promoted_object_type', 'page_type',
  28. 'page_spec', 'link_page_spec', 'universal_link_url', 'promoted_object_id','site_set'),
  29. "filtering": [{
  30. "field": "adcreative_id",
  31. "operator": "IN",
  32. "values": adc_ids.split(',')
  33. }],
  34. "account_id": account_id,
  35. "page": page,
  36. "page_size": 100,
  37. "is_deleted": False
  38. }
  39. for k in parameters:
  40. if type(parameters[k]) is not str:
  41. parameters[k] = json.dumps(parameters[k])
  42. while True:
  43. h = requests.get(url, params=parameters)
  44. if h.status_code == 200:
  45. r = h.json()
  46. # print(r)
  47. break
  48. else:
  49. time.sleep(1)
  50. print("爬取失败 等待1s")
  51. if 'data' in r.keys():
  52. for i in r['data']['list']:
  53. # print(i)
  54. if flag=='MP':
  55. if len(i['adcreative_elements'])>0:
  56. d = i['adcreative_elements']
  57. title =d.get('title','')
  58. if 'image' in d.keys():
  59. image=d.get('image','')
  60. elif 'image_list' in d.keys():
  61. image =','.join(d.get('image_list'))
  62. else:
  63. image=''
  64. else:
  65. title = image=''
  66. li.append((
  67. i['adcreative_id'],i['adcreative_name'],i['campaign_id'],image,title,
  68. i.get('promoted_object_type',''),i.get('page_type',''),
  69. i['page_spec'].get('page_id',''),i.get('promoted_object_id',''),
  70. '','','MP',account_id,dt
  71. ))
  72. else:
  73. if len(i['adcreative_elements'])>0:
  74. d =i['adcreative_elements']
  75. if 'image' in d.keys():
  76. image =d['image']
  77. elif 'element_story' in d.keys():
  78. image= ','.join([x['image'] for x in d['element_story']])
  79. else:
  80. image=''
  81. title =d.get('title','')
  82. description = d.get('description','')
  83. else:
  84. image=title=description=''
  85. li.append(
  86. (
  87. i['adcreative_id'], i['adcreative_name'], i['campaign_id'],image,title,
  88. i.get('promoted_object_type', ''), i.get('page_type', ''),
  89. i['page_spec'].get('page_id', ''), i.get('promoted_object_id', ''),
  90. ','.join(i['site_set']),description,'GDT',account_id,dt
  91. )
  92. )
  93. total_page = r['data']['page_info']['total_page']
  94. if total_page > page:
  95. page += 1
  96. else:
  97. break
  98. else:
  99. break
  100. if len(li)>0:
  101. print(f"{account_id}有创意:",len(li))
  102. sql='replace into adcreative_info values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s) '
  103. db.quchen_text.executeMany(sql,li)
  104. def images_info_get(account_id,access_token,image_ids): # 获取图片信息
  105. fields = ('image_id','width','height','file_size','signature','preview_url')
  106. interface = 'images/get'
  107. url = 'https://api.e.qq.com/v1.3/' + interface
  108. page = 1
  109. li = []
  110. while True:
  111. common_parameters = {
  112. 'access_token': access_token,
  113. 'timestamp': int(time.time()),
  114. 'nonce': str(time.time()) + str(random.randint(0, 999999)),
  115. 'fields': fields
  116. }
  117. parameters = {
  118. "account_id": account_id,
  119. "filtering":[{
  120. "field": "image_id",
  121. "operator": "IN",
  122. "values": image_ids.split(',')
  123. }],
  124. "page": page,
  125. "page_size": 100
  126. }
  127. parameters.update(common_parameters)
  128. for k in parameters:
  129. if type(parameters[k]) is not str:
  130. parameters[k] = json.dumps(parameters[k])
  131. while True:
  132. h = requests.get(url, params=parameters)
  133. # print(h.text)
  134. if h.status_code == 200:
  135. r = h.json()
  136. break
  137. else:
  138. time.sleep(1)
  139. print("请求出错 等待1s..")
  140. if 'data' in r.keys():
  141. li.extend(r['data']['list'])
  142. total_page = r['data']['page_info']['total_page']
  143. if total_page > page:
  144. page += 1
  145. else:
  146. break
  147. # print(li)
  148. data = []
  149. for i in li:
  150. data.append((i['image_id'],i['width'],i['height'],i['signature'],i['preview_url']))
  151. # print(data)
  152. print(f"{account_id} 有图片:", li.__len__())
  153. if li.__len__() > 0:
  154. sql="replace into image_info value (%s,%s,%s,%s,%s)"
  155. db.quchen_text.executeMany(sql, data)
  156. db.close()
  157. def ad_info():
  158. accounts = db.quchen_text.getData("""
  159. select account_id,access_token,name channel,'GDT' type from advertiser_qq where name !='' or name is not null
  160. union
  161. select account_id,access_token,name channel,'MP' type from advertiser_vx where name !='' or name is not null
  162. """)
  163. total_data =[]
  164. executor = ThreadPoolExecutor(max_workers=max_workers)
  165. for i in accounts:
  166. # print(i)
  167. account_id =i[0]
  168. access_token = i[1]
  169. type = i[3]
  170. executor.submit(get_ad_info,account_id, access_token,type,total_data)
  171. executor.shutdown()
  172. print(len(total_data))
  173. if len(total_data)>0:
  174. sql="replace into ad_info values(%s,%s,%s,%s,%s,%s,%s) "
  175. db.quchen_text.executeMany(sql, total_data)
  176. """获取广告基础信息"""
  177. def get_ad_info(account_id, access_token, flag,ad_ids,dt):
  178. path = 'ads/get'
  179. fields = ('ad_id', 'ad_name', 'adcreative_id', 'adgroup_id', 'campaign_id')
  180. url = 'https://api.e.qq.com/v1.3/' + path
  181. li = []
  182. page = 1
  183. while True:
  184. parameters = {
  185. 'access_token': access_token,
  186. 'timestamp': int(time.time()),
  187. 'nonce': str(time.time()) + str(random.randint(0, 999999)),
  188. 'fields': fields,
  189. "filtering": [{
  190. "field": "ad_id",
  191. "operator": "IN",
  192. "values":
  193. ad_ids.split(',')
  194. }],
  195. "account_id": account_id,
  196. "page": page,
  197. "page_size": 100,
  198. "is_deleted": False
  199. }
  200. for k in parameters:
  201. if type(parameters[k]) is not str:
  202. parameters[k] = json.dumps(parameters[k])
  203. while True:
  204. r = requests.get(url, params=parameters).json()
  205. code = r['code']
  206. if code == 11017:
  207. time.sleep(61)
  208. else:
  209. break
  210. # print(r)
  211. total_page = r['data']['page_info']['total_page']
  212. if page > total_page:
  213. break
  214. else:
  215. page += 1
  216. if r.get("data"):
  217. for i in r['data']['list']:
  218. li.append((str(i['ad_id']), i['ad_name'], i['adcreative_id'], i['campaign_id'], i['adgroup_id'],
  219. account_id, flag, dt))
  220. if li.__len__()>0:
  221. print(f"{account_id}有广告:",li.__len__())
  222. sql = "replace into ad_info values(%s,%s,%s,%s,%s,%s,%s,%s) "
  223. db.quchen_text.executeMany(sql, li)
  224. db.close()
  225. def get_ad_cost_day(account_id,access_token,flag,st,et):
  226. if flag == 'MP':
  227. ad_cost_day_mp(account_id,access_token, st, et)
  228. else:
  229. ad_cost_day_gdt(account_id,access_token, st, et)
  230. def ad_cost_day_gdt(account_id,access_token,st,et):
  231. url = 'https://api.e.qq.com/v1.3/daily_reports/get'
  232. fields = ('date', 'ad_id', 'cost', 'view_count', 'ctr', 'follow_count','web_order_count','order_amount')
  233. li = []
  234. page = 1
  235. while True:
  236. parameters = {
  237. 'access_token': access_token,
  238. 'timestamp': int(time.time()),
  239. 'nonce': str(time.time()) + str(random.randint(0, 999999)),
  240. 'fields': fields,
  241. "account_id": account_id,
  242. "group_by" : ['ad_id','date'],
  243. "level": 'REPORT_LEVEL_AD',
  244. "page": page,
  245. "page_size": 1000,
  246. "date_range": {
  247. "start_date": st,
  248. "end_date": et
  249. }
  250. }
  251. for k in parameters:
  252. if type(parameters[k]) is not str:
  253. parameters[k] = json.dumps(parameters[k])
  254. while True:
  255. r = requests.get(url, params=parameters).json()
  256. # print(r)
  257. code =r['code']
  258. if code==11017:
  259. time.sleep(61)
  260. else:
  261. break
  262. if r.get("data"):
  263. for i in r['data']['list']:
  264. if i['cost']>0:
  265. li.append(
  266. (
  267. i['date'], i['ad_id'], i['cost']/100, i['view_count'], i['ctr']*i['view_count'],
  268. i['follow_count'],i['web_order_count'],i['order_amount']/100,account_id,'GDT'
  269. )
  270. )
  271. total_page = r['data']['page_info']['total_page']
  272. if page >= total_page:
  273. break
  274. else:
  275. page += 1
  276. # print(li)
  277. if len(li) > 0:
  278. print(f"{account_id} have ad cost :{len(li)} ")
  279. db.quchen_text.executeMany('replace into ad_cost_day values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)', li)
  280. db.close()
  281. def ad_cost_day_mp(account_id,access_token,st,et):
  282. url = 'https://api.e.qq.com/v1.3/daily_reports/get'
  283. fields = ('date', 'ad_id', 'cost', 'view_count', 'valid_click_count', 'official_account_follow_count','order_count','order_amount')
  284. li = []
  285. page = 1
  286. while True:
  287. parameters = {
  288. 'access_token': access_token,
  289. 'timestamp': int(time.time()),
  290. 'nonce': str(time.time()) + str(random.randint(0, 999999)),
  291. 'fields': fields,
  292. "account_id": account_id,
  293. "level": 'REPORT_LEVEL_AD_WECHAT',
  294. "page": page,
  295. "page_size": 1000,
  296. "date_range": {
  297. "start_date": st,
  298. "end_date": et
  299. }
  300. }
  301. for k in parameters:
  302. if type(parameters[k]) is not str:
  303. parameters[k] = json.dumps(parameters[k])
  304. while True:
  305. r = requests.get(url, params=parameters).json()
  306. # print(r)
  307. code = r['code']
  308. if code == 11017:
  309. time.sleep(61)
  310. else:
  311. break
  312. if r.get("data"):
  313. for i in r['data']['list']:
  314. if i['cost']>0:
  315. li.append(
  316. (
  317. i['date'],i['ad_id'],i['cost']/100,i['view_count'],i['valid_click_count'],
  318. i['official_account_follow_count'],i['order_count'],i['order_amount']/100,account_id,'MP'
  319. )
  320. )
  321. total_page = r['data']['page_info']['total_page']
  322. if page >=total_page:
  323. break
  324. else:
  325. page += 1
  326. # print(li)
  327. if len(li) > 0:
  328. print(f"{account_id} have ad cost :{len(li)} ")
  329. db.quchen_text.executeMany('replace into ad_cost_day values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)', li)
  330. db.close()
  331. def daily_reports_get(access_token, account_id, level, start_date, end_date, fields): # 获取wx投放计划日报数据
  332. interface = 'daily_reports/get'
  333. url = 'https://api.e.qq.com/v1.3/' + interface
  334. common_parameters = {
  335. 'access_token': access_token,
  336. 'timestamp': int(time.time()),
  337. 'nonce': str(time.time()) + str(random.randint(0, 999999)),
  338. 'fields': fields
  339. }
  340. parameters = {
  341. "account_id": account_id,
  342. "level": level,
  343. "date_range":
  344. {
  345. "start_date": start_date,
  346. "end_date": end_date
  347. },
  348. "page": 1,
  349. "page_size": 1000,
  350. "fields":
  351. [
  352. ]
  353. }
  354. parameters.update(common_parameters)
  355. for k in parameters:
  356. if type(parameters[k]) is not str:
  357. parameters[k] = json.dumps(parameters[k])
  358. while True:
  359. r = requests.get(url, params=parameters)
  360. if r.status_code == 200:
  361. break
  362. else:
  363. time.sleep(1)
  364. print("请求出错 等待1s..")
  365. return r.json()
  366. def daily_qq_reports_get(access_token, account_id, compaign_id, level, start_date, end_date, fields): # 获取gdt投放计划日报数据
  367. interface = 'daily_reports/get'
  368. url = 'https://api.e.qq.com/v1.1/' + interface
  369. common_parameters = {
  370. 'access_token': access_token,
  371. 'timestamp': int(time.time()),
  372. 'nonce': str(time.time()) + str(random.randint(0, 999999)),
  373. 'fields': fields
  374. }
  375. parameters = {
  376. "account_id": account_id,
  377. "filtering":
  378. [
  379. {
  380. "field": "campaign_id",
  381. "operator": "EQUALS",
  382. "values":
  383. [
  384. compaign_id
  385. ]
  386. }
  387. ],
  388. "level": level,
  389. "date_range":
  390. {
  391. "start_date": start_date,
  392. "end_date": end_date
  393. },
  394. "page": 1,
  395. "page_size": 1000,
  396. "fields":
  397. [
  398. ]
  399. }
  400. parameters.update(common_parameters)
  401. for k in parameters:
  402. if type(parameters[k]) is not str:
  403. parameters[k] = json.dumps(parameters[k])
  404. r = requests.get(url, params=parameters)
  405. return r.json()
  406. def mysql_insert_adcreative(data):
  407. db = pymysql.connect('rm-bp1c9cj79872tx3aaro.mysql.rds.aliyuncs.com', 'superc', 'Cc719199895', 'quchen_text')
  408. cursor = db.cursor()
  409. sql = 'replace 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)'
  410. try:
  411. cursor.executemany(sql, data)
  412. db.commit()
  413. print('insert [adcreative] ', len(data))
  414. except:
  415. db.rollback()
  416. print('insert [adcreative] defeat')
  417. if __name__ == '__main__':
  418. account_id = 19016239
  419. access_token = '65407243a6072b7dee3a013b58225e16'
  420. #
  421. account_id2 = 14709511
  422. access_token2 = 'e87f7b6f860eaeef086ddcc9c3614678'
  423. # get_ad_cost_day(account_id2,access_token2,'GDT','2021-03-01','2021-03-24')