demo_feiyu_ad_tk_refresh.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. # -*- codeing = utf-8 -*-
  2. # @Time : 2023/4/11 19:08
  3. # @Author : Clown
  4. # @File : demo_feiyu_ad_tk_refresh.py
  5. # @Software : PyCharm
  6. import pymysql
  7. import json
  8. import requests
  9. from datetime import datetime,timedelta
  10. import time
  11. def linkTomySql(host, passwd, db_name, port):
  12. '''连接至数据库返回【db】,v2新增local_infile=1 打开文件导入权限'''
  13. try:
  14. # 本地连接为:localhost 服务器连接为:124.222.188.59
  15. db = pymysql.connect (
  16. host=host, user="root",
  17. passwd=passwd,
  18. db=db_name,
  19. port=port,
  20. charset='utf8mb4',
  21. local_infile=1)
  22. print ('\nconnect to mysql server 成功')
  23. print ('---------------------------------------')
  24. except:
  25. print ("\ncould not connect to mysql server")
  26. db = "连接失败"
  27. return db
  28. def save_oauth_to_db(db,rsp_data,brandName):
  29. lastCatchTime = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  30. cursor = db.cursor()
  31. sql = '''INSERT INTO feiyu_ad_tk_refresh VALUES (%s,%s,%s,%s);'''
  32. values = (lastCatchTime,brandName,rsp_data,0)
  33. cursor.execute(sql,values)
  34. db.commit()
  35. cursor.close()
  36. def select_secret_by_app_id(db,app_id):
  37. cursor = db.cursor ()
  38. sql = f'''SELECT * FROM feiyu_ad_app_id_sct WHERE app_id = {app_id};'''
  39. cursor.execute (sql)
  40. out = cursor.fetchall ()[0]
  41. secret =out[2]
  42. brandName = out[1]
  43. cursor.close ()
  44. return secret,brandName
  45. def get_access_token_by_auth_code(app_id,auth_code):
  46. """
  47. auth_code换取access-token详见https://ad.oceanengine.com/openapi/doc/index.html?id=1696710505596940
  48. :param auth_code:
  49. :return:
  50. """
  51. host = '124.222.188.59'
  52. passwd = '111...Clown'
  53. db_name = 'zuzu_data'
  54. port = 63306
  55. db = linkTomySql (host, passwd, db_name, port)
  56. secret,brandName = select_secret_by_app_id (db, app_id)
  57. open_api_url_prefix = "https://ad.oceanengine.com/open_api/"
  58. uri = "oauth2/access_token/"
  59. url = open_api_url_prefix + uri
  60. headers = {'Content-Type':'application/json'}
  61. data = {
  62. "app_id": app_id,
  63. "secret": secret,
  64. "grant_type": "auth_code",
  65. "auth_code": auth_code
  66. }
  67. rsp = requests.post(url, json=data, headers=headers)
  68. rsp_data = rsp.text
  69. save_oauth_to_db(db,rsp_data,brandName) # 将access_token等信息进行存储
  70. db.close ()
  71. return
  72. # 选择所有有效账户
  73. def selectAllUsers(db):
  74. cursor = db.cursor ()
  75. sql = f'''SELECT * FROM feiyu_ad_app_id_sct WHERE state = 1;'''
  76. cursor.execute (sql)
  77. out = cursor.fetchall ()
  78. list_out = []
  79. for row in out:
  80. dict_out = {'brandName': row[1],
  81. 'appid': row[0],
  82. 'secret':row[2],
  83. 'userName':row[3]}
  84. list_out.append (dict_out)
  85. cursor.close ()
  86. return list_out
  87. # 选择品牌下的token信息
  88. def selectAccessToken(db,brandName):
  89. cursor = db.cursor ()
  90. sql = f'''SELECT * FROM feiyu_ad_tk_refresh WHERE brandName = '{brandName}' ORDER BY lastCatchTime DESC;'''
  91. cursor.execute (sql)
  92. out = cursor.fetchall ()[0]
  93. json_data = out[2]
  94. cursor.close ()
  95. return json_data
  96. # 查询已授权账户信息
  97. def getAdvertiser_ids(json_data):
  98. open_api_url_prefix = "https://ad.oceanengine.com/open_api/"
  99. uri = "oauth2/advertiser/get/"
  100. url = open_api_url_prefix + uri
  101. data = {
  102. "access_token": json_data['access_token']
  103. }
  104. headers = {'Content-Type':'application/json'}
  105. rsp = requests.get (url, json=data, headers = headers).json()
  106. print(rsp)
  107. advertiser_data = rsp['data']
  108. advertiser_ids = []
  109. for info in rsp['data']['list']:
  110. advertiser_id = info['advertiser_id']
  111. advertiser_ids.append(advertiser_id)
  112. return advertiser_data,advertiser_ids
  113. # 独立刷新token
  114. def refresh_access_token(db,brandName,appid,secret):
  115. json_data = selectAccessToken(db,brandName)
  116. json_data = json.loads(json_data)['data']
  117. open_api_url_prefix = "https://ad.oceanengine.com/open_api/"
  118. uri = "oauth2/refresh_token/"
  119. refresh_token_url = open_api_url_prefix + uri
  120. data = {
  121. "appid": appid,
  122. "secret": secret,
  123. "grant_type": "refresh_token",
  124. "refresh_token": json_data['refresh_token'],
  125. }
  126. rsp = requests.post(refresh_token_url, json=data).json()
  127. save_oauth_to_db (db, json.dumps (rsp, ensure_ascii=False), brandName)
  128. json_data = selectAccessToken (db, brandName)
  129. json_data = json.loads (json_data)['data']
  130. advertiser_data, advertiser_ids = getAdvertiser_ids (json_data)
  131. rsp['data']['advertiser_ids'] = advertiser_ids
  132. rsp['advertiser_data'] = advertiser_data
  133. time.sleep(2)
  134. save_oauth_to_db(db,json.dumps(rsp,ensure_ascii=False),brandName)
  135. # 批量更新密钥
  136. def refreshAllFeiYuUsersToken(db):
  137. Users = selectAllUsers (db)
  138. for userInfo in Users:
  139. try:
  140. refresh_access_token (db, userInfo['brandName'], userInfo['appid'], userInfo['secret'])
  141. except Exception as e:
  142. print(e)
  143. print(f'【{userInfo["brandName"]}】token 更新失败 ')
  144. # 获取资源账户id
  145. def get_advertiser(advertiser_id,accessToken):
  146. out_list = []
  147. open_api_url_prefix = "https://ad.toutiao.com/open_api/"
  148. uri = "2/majordomo/advertiser/select/"
  149. url = open_api_url_prefix + uri
  150. params = {
  151. "advertiser_id": advertiser_id
  152. }
  153. headers = {"Access-Token": accessToken}
  154. try:
  155. rsp = requests.get (url, json=params, headers=headers).json ()
  156. rsp_list = rsp['data']['list']
  157. for rsp_0 in rsp_list:
  158. advertiser_id = rsp_0['advertiser_id']
  159. out_list.append(advertiser_id)
  160. except:
  161. rsp = {'message':'error'}
  162. return rsp,out_list
  163. # 获取广告主们的详细信息
  164. def get_advertiser_info(userName,advertisers_id,accessToken):
  165. open_api_url_prefix = "https://ad.oceanengine.com/open_api/"
  166. uri = "2/advertiser/info/"
  167. url = open_api_url_prefix + uri
  168. params = {
  169. "advertiser_ids": advertisers_id,
  170. "fields": ["id", "name", "note"]
  171. }
  172. headers = {"Access-Token": accessToken}
  173. rsp = requests.get (url, json=params, headers=headers)
  174. rsp_data = rsp.json ()
  175. # print(rsp_data)
  176. out_list = []
  177. brand_list = ['浆小白','粥小鲜','楼兰说']
  178. brand_dict = {'浆小白':{'brandName':'浆小白','list':[]},
  179. '粥小鲜':{'brandName':'粥小鲜','list':[]},
  180. '楼兰说':{'brandName':'楼兰说','list':[]}}
  181. for advertiser_info in rsp_data['data']:
  182. try:
  183. brand_dict[advertiser_info['note']]['list'].append(advertiser_info['id'])
  184. except:
  185. ...
  186. for brand in brand_list:
  187. brandName = brand_dict[brand]['brandName']
  188. out_list_0 = brand_dict[brand]['list']
  189. if len(out_list_0) > 0:
  190. dict_out = {'userName': userName,
  191. 'accessToken': accessToken,
  192. 'brandName': brandName,
  193. 'advertiser_ids': out_list_0,
  194. 'routeName': 'feiyu'}
  195. out_list.append(dict_out)
  196. # print(out_list)
  197. return out_list
  198. # 获取所有飞鱼投流账户信息
  199. def getAllFeiYuUsersList(db):
  200. Users = selectAllUsers (db)
  201. out_list = []
  202. for userInfo in Users:
  203. userName = userInfo['userName']
  204. brandName = userInfo['brandName']
  205. json_data = selectAccessToken (db, brandName)
  206. json_data = json.loads (json_data)['data']
  207. accessToken = json_data['access_token']
  208. advertisers_id = json_data['advertiser_ids']
  209. for advertiser_id in advertisers_id:
  210. rsp,out_list_0 = get_advertiser (advertiser_id, accessToken) #获取总帐号下的分账号
  211. if brandName == '综合':
  212. out_list_z = get_advertiser_info (userName, out_list_0, accessToken)
  213. out_list = out_list + out_list_z
  214. else:
  215. if rsp['message'] == 'OK' and len(out_list_0)>0:
  216. dict_out = {'userName':userName,
  217. 'accessToken':accessToken,
  218. 'brandName':brandName,
  219. 'advertiser_ids':out_list_0,
  220. 'routeName':'feiyu'}
  221. out_list.append(dict_out)
  222. return out_list
  223. if __name__ == '__main__':
  224. host = '124.222.188.59'
  225. passwd = '111...Clown'
  226. db_name = 'zuzu_data'
  227. port = 63306
  228. db = linkTomySql (host, passwd, db_name, port)
  229. advertiser_ids = ['1762396620978184', '1762396621515784', '1762396622070791']
  230. accessToken = 'c06ac76994e55d4951223e38d174b2591efb7065'
  231. out_list = getAllFeiYuUsersList(db)
  232. print(out_list)
  233. db.close ()
  234. if 1 == 0:
  235. open_api_url_prefix = "https://ad.oceanengine.com/open_api/"
  236. uri = "2/majordomo/advertiser/select/"
  237. url = open_api_url_prefix + uri
  238. params = {
  239. "advertiser_id": 1668398135393287
  240. }
  241. headers = {"Access-Token": "f1c777bd288b700ee9fa25cac83c941277f061c1"}
  242. rsp = requests.get (url, json=params, headers=headers)
  243. rsp_data = rsp.json()
  244. print(json.dumps(rsp_data,ensure_ascii=False))