utils.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. # -*- coding:utf-8 -*-
  2. """
  3. @author: isaacqyang
  4. @time: 2023/12/28
  5. @desc:
  6. """
  7. import json
  8. import os
  9. import time
  10. from urllib.parse import unquote
  11. import lark_oapi as lark
  12. import tos
  13. from lark_oapi.api.drive.v1 import CreateExportTaskRequest, ExportTask, CreateExportTaskResponse, GetExportTaskRequest, \
  14. GetExportTaskResponse, DownloadExportTaskRequest, DownloadExportTaskResponse
  15. from tos import HttpMethodType
  16. from config import BaseConfig
  17. def f_upload_file(save_path) -> str:
  18. ak = BaseConfig.cos_access_key_id
  19. sk = BaseConfig.cos_secret_access_key
  20. endpoint = BaseConfig.endpoint
  21. region = BaseConfig.region
  22. bucket_name = BaseConfig.bucket_name
  23. try:
  24. # 创建 TosClientV2 对象,对桶和对象的操作都通过 TosClientV2 实现
  25. client = tos.TosClientV2(ak, sk, endpoint, region)
  26. object_key = os.path.basename(save_path)
  27. client.put_object_from_file(bucket_name, object_key, save_path)
  28. pre_signed_url_output = client.pre_signed_url(HttpMethodType.Http_Method_Get, bucket_name, object_key)
  29. return pre_signed_url_output.signed_url
  30. except tos.exceptions.TosClientError as e:
  31. # 操作失败,捕获客户端异常,一般情况为非法请求参数或网络异常
  32. print('fail with client error, message:{}, cause: {}'.format(e.message, e.cause))
  33. except tos.exceptions.TosServerError as e:
  34. # 操作失败,捕获服务端异常,可从返回信息中获取详细错误信息
  35. print('fail with server error, code: {}'.format(e.code))
  36. # request id 可定位具体问题,强烈建议日志中保存
  37. print('error with request id: {}'.format(e.request_id))
  38. print('error with message: {}'.format(e.message))
  39. print('error with http code: {}'.format(e.status_code))
  40. print('error with ec: {}'.format(e.ec))
  41. print('error with request url: {}'.format(e.request_url))
  42. except Exception as e:
  43. print('fail with unknown error: {}'.format(e))
  44. def f_doc_export(token: str) -> str:
  45. # 飞书在线文档转word
  46. app_id = BaseConfig.app_id
  47. app_secret = BaseConfig.app_secret
  48. word_save_dir = BaseConfig.word_save_dir
  49. client = lark.Client.builder() \
  50. .app_id(app_id) \
  51. .app_secret(app_secret) \
  52. .log_level(lark.LogLevel.DEBUG) \
  53. .build()
  54. # 构造请求对象
  55. request1: CreateExportTaskRequest = CreateExportTaskRequest.builder() \
  56. .request_body(ExportTask.builder()
  57. .file_extension("docx")
  58. .token(token)
  59. .type("docx")
  60. .build()) \
  61. .build()
  62. # 发起请求
  63. response1: CreateExportTaskResponse = client.drive.v1.export_task.create(request1)
  64. # 处理失败返回
  65. if not response1.success():
  66. lark.logger.error(
  67. f"client.drive.v1.export_task.create failed, code: {response1.code}, msg: {response1.msg}, log_id: {response1.get_log_id()}, resp: \n{json.dumps(json.loads(response1.raw.content), indent=4, ensure_ascii=False)}")
  68. return
  69. # 处理业务结果
  70. lark.logger.info(lark.JSON.marshal(response1.data, indent=4))
  71. ticket = response1.data.ticket
  72. time.sleep(5)
  73. # 构造请求对象
  74. request2: GetExportTaskRequest = GetExportTaskRequest.builder() \
  75. .ticket(ticket) \
  76. .token(token) \
  77. .build()
  78. # 发起请求
  79. response2: GetExportTaskResponse = client.drive.v1.export_task.get(request2)
  80. # 处理失败返回
  81. if not response2.success():
  82. lark.logger.error(
  83. f"client.drive.v1.export_task.get failed, code: {response2.code}, msg: {response2.msg}, log_id: {response2.get_log_id()}, resp: \n{json.dumps(json.loads(response2.raw.content), indent=4, ensure_ascii=False)}")
  84. return
  85. # 处理业务结果
  86. lark.logger.info(lark.JSON.marshal(response2.data, indent=4))
  87. file_token = response2.data.result.file_token
  88. # 构造请求对象
  89. request3: DownloadExportTaskRequest = DownloadExportTaskRequest.builder() \
  90. .file_token(file_token) \
  91. .build()
  92. # 发起请求
  93. response3: DownloadExportTaskResponse = client.drive.v1.export_task.download(request3)
  94. # 处理失败返回
  95. if not response3.success():
  96. lark.logger.error(
  97. f"client.drive.v1.export_task.download failed, code: {response3.code}, msg: {response3.msg}, log_id: {response3.get_log_id()}")
  98. return
  99. # 处理业务结果
  100. file_name = unquote(response3.file_name)
  101. save_path = os.path.join(word_save_dir, file_name)
  102. with open(save_path, "wb") as f:
  103. f.write(response3.file.read())
  104. word_download_url = f_upload_file(save_path)
  105. return word_download_url
  106. if __name__ == "__main__":
  107. f_doc_export('YKNBdbs10oA3pCxTdnAczcvOnxc')
  108. # f_upload_file("/root/project/coze_znjd/大模型企业调查报告/1.docx")