main.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import io, json, os
  2. from oauthlib.oauth2 import BackendApplicationClient
  3. from requests_oauthlib import OAuth2Session
  4. from dataclasses import dataclass
  5. from flask import Flask
  6. from datetime import datetime
  7. @dataclass
  8. class bbg_schedule_run:
  9. credentail_file: str
  10. def get_sched_data(self, identifier):
  11. with io.open(self.credentail_file, encoding="utf-8") as credential_file:
  12. CREDENTIALS = json.load(credential_file)
  13. CLIENT = BackendApplicationClient(client_id=CREDENTIALS['client_id'])
  14. OAUTH2_ENDPOINT = 'https://bsso.blpprofessional.com/ext/api/as/token.oauth2'
  15. SESSION = OAuth2Session(client=CLIENT)
  16. SESSION.fetch_token(token_url=OAUTH2_ENDPOINT, client_secret=CREDENTIALS['client_secret'])
  17. URL = 'https://api.bloomberg.com/eap/catalogs/47929/content/responses/?requestIdentifier=' + identifier
  18. rep = SESSION.get(URL, headers={'api-version': "2"})
  19. # rep.json()
  20. DATA_URL = 'https://api.bloomberg.com/eap/catalogs/47929/content/responses/' + rep.json()['contains'][0]['key']
  21. jdata = SESSION.get(DATA_URL, headers={'api-version': "2"}).json()
  22. # return (pd.json_normalize(jdata).to_json())
  23. return jdata
  24. # hug接口输出为json格式
  25. app = Flask(__name__)
  26. # 服务端口号
  27. server_port = 7110
  28. # 鉴权文件地址
  29. ps_credential_path = "ps-credential.txt" # 鉴权文件地址
  30. # 日度
  31. # daily_price_sched_key = "IDpcsgDailyType6Price" # 日度Price任务key(第一版)
  32. # daily_general_sched_key = "IDpcsgDailyGeneral" # 日度general任务key(第一版)
  33. # daily_data_price_dir = "data/day/price" # 日度Price数据文件夹
  34. # daily_data_general_dir = "data/day/general" # 日度Price数据文件夹
  35. daily_sched_key = "IDpcsgDailyRun2" # 日度任务key
  36. daily_data_dir = "data/day2" # 日度数据文件夹
  37. # 周度
  38. # weekly_sched_key = "IDpcsgWeeklyRunETA223" # 周度任务key(暂停)
  39. # weekly_data_dir = "data/week"
  40. # 月度
  41. # month_sched_key = "IDpcsgMonthRun" # 月度任务key(第一版)
  42. month_sched_key = "IDpcsgMonthRun2" # 月度任务key
  43. monthly_data_dir = "data/month2" # 月度数据文件夹
  44. @app.route('/api/bloomberg/server')
  45. def bloomberg_server():
  46. return {"code": 200, "data": "ok", "error": ""}
  47. @app.route('/api/bloomberg/daily_data', methods=['POST'])
  48. def get_bloomberg_daily_data():
  49. try:
  50. # bbg_down = bbg_schedule_run(ps_credential_path)
  51. # df_daily_price = bbg_down.get_sched_data(daily_price_sched_key)
  52. # df_daily_general = bbg_down.get_sched_data(daily_general_sched_key)
  53. #
  54. # # 写入文件留档
  55. # write_data_to_file(df_daily_price, daily_data_price_dir)
  56. # write_data_to_file(df_daily_general, daily_data_general_dir)
  57. #
  58. # resp_data = {
  59. # "code": 200,
  60. # "data": {
  61. # "price_data": df_daily_price,
  62. # "general_data": df_daily_general
  63. # },
  64. # "msg": "获取成功"
  65. # }
  66. # return json.dumps(resp_data, indent=2)
  67. bbg_down = bbg_schedule_run(ps_credential_path)
  68. df_daily = bbg_down.get_sched_data(daily_sched_key)
  69. # 写入文件留档
  70. write_data_to_file(df_daily, daily_data_dir)
  71. resp_data = {
  72. "code": 200,
  73. "data": df_daily,
  74. "msg": "获取成功"
  75. }
  76. return json.dumps(resp_data, indent=2)
  77. except Exception as e:
  78. err_msg = str(e)
  79. print(err_msg)
  80. return {"code": 403, "data": "", "error": err_msg}
  81. # 周度任务暂关闭
  82. # @app.route('/api/bloomberg/weekly_data', methods=['POST'])
  83. # def get_bloomberg_weekly_data():
  84. # try:
  85. # bbg_down = bbg_schedule_run(ps_credential_path)
  86. # df_weekly = bbg_down.get_sched_data(weekly_sched_key)
  87. #
  88. # # 写入文件留档
  89. # write_data_to_file(df_weekly, weekly_data_dir)
  90. #
  91. # resp_data = {
  92. # "code": 200,
  93. # "data": df_weekly,
  94. # "msg": "获取成功"
  95. # }
  96. # return json.dumps(resp_data, indent=2)
  97. # except Exception as e:
  98. # err_msg = str(e)
  99. # print(err_msg)
  100. # return {"code": 403, "data": "", "error": err_msg}
  101. @app.route('/api/bloomberg/monthly_data', methods=['POST'])
  102. def get_bloomberg_monthly_data():
  103. try:
  104. bbg_down = bbg_schedule_run(ps_credential_path)
  105. df_monthly = bbg_down.get_sched_data(month_sched_key)
  106. # 写入文件留档
  107. write_data_to_file(df_monthly, monthly_data_dir)
  108. resp_data = {
  109. "code": 200,
  110. "data": df_monthly,
  111. "msg": "获取成功"
  112. }
  113. return json.dumps(resp_data, indent=2)
  114. except Exception as e:
  115. err_msg = str(e)
  116. print(err_msg)
  117. return {"code": 403, "data": "", "error": err_msg}
  118. # write_data_to_file 数据写入文件
  119. def write_data_to_file(json_data, dir_path=None):
  120. # 获取当前日期并格式化为YYYY-MM-DD形式
  121. today_date_str = datetime.now().strftime('%Y-%m-%d')
  122. file_name = f"{today_date_str}.json"
  123. # 确定输出目录
  124. directory = dir_path if dir_path else os.path.join("output", "data")
  125. # 构建完整的文件路径
  126. file_path = os.path.join(directory, file_name)
  127. # 检查目录是否存在,如果不存在则创建
  128. if not os.path.exists(directory):
  129. os.makedirs(directory)
  130. print(f"目录 '{directory}' 已创建。")
  131. # 写入JSON数据到文件
  132. try:
  133. with open(file_path, 'w', encoding='utf-8') as json_file:
  134. json.dump(json_data, json_file, ensure_ascii=False, indent=4)
  135. print(f"JSON数据已成功写入/更新至 '{file_path}'。")
  136. except Exception as e:
  137. print(f"写入文件时发生错误:{e}")
  138. if __name__ == "__main__":
  139. app.run(host='0.0.0.0', port=server_port, debug=True)