1 line
3.2 KiB
JSON
1 line
3.2 KiB
JSON
{"repo": "cclmsy/nonebot-plugin-sparkapi", "files": {"src/nonebot_plugin_sparkapi/API/PPTGenApi.py": {"42ade501d457e102b7f571c2e482f2f2248b1023": {"t": 1785674332.9177408, "n": 2814, "h": "156808b4a255b38c", "c": "import base64\nimport hashlib\nimport hmac\nimport time\nfrom typing import Any\n\nimport httpx\nfrom nonebot.log import logger\n\nfrom nonebot_plugin_sparkapi.config import conf\n\napp_id = conf.sparkapi_app_id\napi_secret = conf.sparkapi_api_secret\n\n\ndef _md5(text: str) -> str:\n return hashlib.md5(text.encode(\"utf-8\")).hexdigest()\n\n\nclass AIPPT:\n def __init__(self, text: str):\n self.APPID = app_id\n self.APISecret = api_secret\n self.text = text\n self.headers = self.sign_headers()\n\n def hmac_sha1_encrypt(self, encrypt_text: str, encrypt_key: str) -> str:\n return base64.b64encode(\n hmac.new(\n encrypt_key.encode(\"utf-8\"),\n encrypt_text.encode(\"utf-8\"),\n digestmod=hashlib.sha1,\n ).digest()\n ).decode(\"utf-8\")\n\n def sign_headers(self) -> dict[str, str]:\n timestamp = str(int(time.time()))\n try:\n auth = _md5(self.APPID + timestamp)\n signature = self.hmac_sha1_encrypt(auth, self.APISecret)\n except Exception as e:\n logger.debug(f\"AIPPT 签名获取失败: {e}\")\n raise ValueError(\"AIPPT 签名获取失败\") from e\n return {\n \"appId\": self.APPID,\n \"timestamp\": timestamp,\n \"signature\": signature,\n \"Content-Type\": \"application/json; charset=utf-8\",\n }\n\n async def create_task(self) -> int:\n url = \"https://zwapi.xfyun.cn/api/aippt/create\"\n body = {\"query\": self.text}\n async with httpx.AsyncClient() as client:\n response = await client.post(\n url=url,\n json=body,\n headers=self.headers,\n )\n\n resp: dict[str, Any] = response.json()\n if resp[\"code\"] == 0:\n logger.success(\"创建PPT任务成功\")\n return resp[\"data\"][\"sid\"]\n else:\n logger.error(\"创建PPT任务失败\")\n # TODO: 抛出特定的错误类型\n raise Exception(\"创建PPT任务失败\")\n\n async def get_process(self, sid: int) -> dict[str, Any]:\n async with httpx.AsyncClient() as client:\n response = await client.get(\n f\"https://zwapi.xfyun.cn/api/aippt/progress?sid={sid}\",\n headers=self.headers,\n )\n # logger.debug(f\"AIPPT.get_process({sid=}): {response.text}\")\n return response.json()\n\n async def get_result(self) -> str:\n task_id = await self.create_task()\n while True:\n resp = await self.get_process(task_id)\n if resp[\"data\"][\"process\"] == 100:\n PPTurl = resp[\"data\"][\"pptUrl\"]\n break\n return PPTurl\n\n\n# ---------------------------API Request---------------------------\n\n\nasync def request_PPT(content: str) -> str:\n return await AIPPT(content).get_result()\n"}}}} |