cost_util.py 15 KB

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