From af3ff10ead2d9e86213df7a520ea2562b593a634 Mon Sep 17 00:00:00 2001 From: woni <320753691@qq.com> Date: Wed, 17 Jan 2024 17:26:28 +0800 Subject: [PATCH] add download message image --- app/demo.py | 20 +++++++++++ app/utils.py | 100 ++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 96 insertions(+), 24 deletions(-) diff --git a/app/demo.py b/app/demo.py index e36b65d..4ea628c 100644 --- a/app/demo.py +++ b/app/demo.py @@ -11,6 +11,9 @@ from lark_oapi.api.im.v1 import * from lark_oapi.api.bitable.v1 import * +from .utils import get_message_resource, upload_media + + load_dotenv() app_id = os.environ["APP_ID"] @@ -22,8 +25,16 @@ verification_token = os.environ["VERIFICATION_TOKEN"] bitable_token = os.environ["BITABLE_TOKEN"] table_id = os.environ["TABLE_ID"] + +current_dir = os.path.dirname(os.path.abspath(__file__)) + + # 创建client client = lark.Client.builder().app_id(app_id).app_secret(app_secret).build() +cache_dir = os.path.join(current_dir, "cache") + +if not os.path.exists(cache_dir): + os.makedirs(cache_dir) app = Flask(__name__) @@ -58,6 +69,15 @@ def do_p2_im_message_receive_v1(data: P2ImMessageReceiveV1) -> None: if images: record["附件"] = [{"file_token": image} for image in images] + # 对 image_key 处理并并上传至多维表格 + images_path = [] + for image in images: + image_path = get_message_resource(client, message_id, image, "image", cache_dir) + print("下载文件成功:", image) + images_path.append(image_path) + file_token = upload_media(client, image_path, "bitable_file", bitable_token) + print("上传文件成功:", file_token) + add_record(record) # content = {"text": "反馈的问题已经记录到多维表格, 稍后有小伙伴跟进"} diff --git a/app/utils.py b/app/utils.py index 3298385..b426be2 100644 --- a/app/utils.py +++ b/app/utils.py @@ -1,32 +1,84 @@ +import os +import json from itertools import chain +import lark_oapi as lark -message_content = "" -images = [] -data = [ - [ - { - "height": 756, - "image_key": "img_v3_0277_2c2fbab4-8b13-4a6a-a273-e0d1d47b4ecg", - "tag": "img", - "width": 529, - } - ], - [ - {"style": [], "tag": "text", "text": "11111111"}, - {"style": [], "tag": "at", "user_id": "@_user_1", "user_name": "官方应用指令"}, - {"style": [], "tag": "text", "text": ""}, - ], -] +from flask import Flask +from dotenv import load_dotenv +from lark_oapi.adapter.flask import * +from lark_oapi.api.im.v1 import * +from lark_oapi.api.bitable.v1 import * +import lark_oapi as lark +from lark_oapi.api.drive.v1 import * -for item in chain.from_iterable(data): - if item.get("tag") == "text": - message_content += item["text"] +def get_message_resource(client, message_id, file_key, file_type, save_dir): + request: GetMessageResourceRequest = ( + GetMessageResourceRequest.builder() + .message_id(message_id) + .file_key(file_key) + .type(file_type) + .build() + ) - if item.get("tag") == "img": - images.append(item["image_key"]) + # 发起请求 + response: GetMessageResourceResponse = client.im.v1.message_resource.get(request) + + # 处理失败返回 + if not response.success(): + lark.logger.error( + f"client.im.v1.message_resource.get failed, code: {response.code}, msg: {response.msg}, log_id: {response.get_log_id()}" + ) + return + + # 处理业务结果 + file_path = os.path.join(save_dir, response.file_name) + f = open(file_path, "wb") + f.write(response.file.read()) + f.close() + + return response.file_name -print(message_content) -print(images) +def upload_media(client, file_path, parent_type, parent_node): + # 构造请求对象 + _, filename = os.path.split(file_path) + file_size = os.path.getsize(file_path) + + file_bin = open(file_path) + request: UploadAllMediaRequest = ( + UploadAllMediaRequest.builder() + .request_body( + UploadAllMediaRequestBody.builder() + .file_name(filename) + .parent_type(parent_type) + .parent_node(parent_node) + .size(file_size) + .file(file_bin) + .build() + ) + .build() + ) + + file_bin.close() + + # 发起请求 + option = ( + lark.RequestOption.builder() + .user_access_token("u-dF0r5rD5BcUFhORI38zmlk1l61TBghPzry00gl.82Haz") + .build() + ) + response: UploadAllMediaResponse = client.drive.v1.media.upload_all(request, option) + + # 处理失败返回 + if not response.success(): + lark.logger.error( + f"client.drive.v1.media.upload_all failed, code: {response.code}, msg: {response.msg}, log_id: {response.get_log_id()}" + ) + return + + # 处理业务结果 + lark.logger.info(lark.JSON.marshal(response.data, indent=4)) + + return response.data.file_token