import os import requests import json import time class IFindClient: def __init__(self, refresh_token: str): self.refresh_token = refresh_token self.access_token = None self.token_expiry = 0 self.base_url = "https://quantapi.51ifind.com/api/v1" def _get_access_token(self): """获取当前的 access_token,如果过期则刷新""" # 简单判断,手册说有效期 7 天,我们这里如果没 token 就去换一个 if self.access_token and time.time() < self.token_expiry: return self.access_token url = f"{self.base_url}/get_access_token" headers = { "Content-Type": "application/json", "refresh_token": self.refresh_token } try: response = requests.post(url, headers=headers) data = response.json() if data.get("errorcode") == 0: self.access_token = data["data"]["access_token"] # 设个保守的有效期,比如 6 天 self.token_expiry = time.time() + (6 * 24 * 3600) return self.access_token else: raise Exception(f"iFinD login failed: {data.get('errmsg')}") except Exception as e: print(f"Error getting iFinD access token: {e}") return None def post(self, endpoint, params): token = self._get_access_token() if not token: return None url = f"{self.base_url}/{endpoint}" headers = { "Content-Type": "application/json", "access_token": token } try: response = requests.post(url, headers=headers, json=params) return response.json() except Exception as e: print(f"iFinD request error on {endpoint}: {e}") return None if __name__ == "__main__": # 简单测试代码 from dotenv import load_dotenv load_dotenv() token = os.getenv("IFIND_REFRESH_TOKEN") if token: client = IFindClient(token) code = "7203.T" print(f"--- Testing date_sequence Global indicators for {code} ---") params = { "codes": code, "startdate": "2024-12-01", "enddate": "2024-12-10", "functionpara": {"Interval": "D", "Days": "Alldays", "Fill": "Blank"}, "indipara": [ {"indicator": "pe_ttm", "indiparams": ["1", "BB"]}, {"indicator": "pb", "indiparams": ["1", "BB"]}, {"indicator": "total_mv", "indiparams": ["1", "BB"]} ] } res = client.post("date_sequence", params) if res and res.get('errorcode') == 0: tables = res.get('tables', []) if tables: print(json.dumps(tables[0]['table'], indent=2)) else: print("Empty tables") else: print("Failed") else: print("No IFIND_REFRESH_TOKEN found in .env")