import requests import json import os from requests_toolbelt.multipart.encoder import MultipartEncoder DINGTALK_APP_KEY = "ding4ursdp0l2giat4bj" DINGTALK_APP_SECRET = "J0gBicjKiIHoKla7WfKKhRs1Tv8L6Xd5UhW3EVQByF16G7Vn7UUcRhP6u-PBCQNo" ROBOT_CODE = "ding4ursdp0l2giat4bj" OPEN_CONVERSATION_ID = "cidcjYshXVtKck5LfOO9AqOJg==" FILE_PATH = r"C:\Users\ALC\.openclaw\workspace\前后端功能与开源可修改性分析报告.docx" FILE_NAME = "前后端功能与开源可修改性分析报告.docx" def get_token(): url = "https://oapi.dingtalk.com/gettoken" params = {'appkey': DINGTALK_APP_KEY, 'appsecret': DINGTALK_APP_SECRET} r = requests.get(url, params=params, timeout=10) result = r.json() if result.get('errcode') == 0: return result['access_token'] raise Exception(f"Get token failed: {result}") def upload_file(access_token, file_path): url = "https://oapi.dingtalk.com/media/upload" with open(file_path, 'rb') as f: fields = { 'access_token': access_token, 'type': 'file', 'media': (FILE_NAME, f, 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') } m = MultipartEncoder(fields=fields) headers = {'Content-Type': m.content_type} r = requests.post(url, headers=headers, data=m, timeout=30) return r.json() def send_message_v1(access_token, media_id): # 使用 v1 API 端点 url = "https://api.dingtalk.com/v1.0/robot/orgGroup/send" payload = { "openConversationId": OPEN_CONVERSATION_ID, "robotCode": ROBOT_CODE, "msgKey": "sampleFile", "msgParam": json.dumps({ "mediaId": media_id, "fileName": FILE_NAME }, ensure_ascii=False) } headers = {'x-acs-dingtalk-access-token': access_token, 'Content-Type': 'application/json'} r = requests.post(url, headers=headers, json=payload, timeout=30) return r.json() def main(): try: result_path = r"C:\Users\ALC\.openclaw\workspace\final_send_v1_api.txt" with open(result_path, "w", encoding="utf-8") as f: f.write("=== DingTalk v1 API + sampleFile ===\n\n") token = get_token() f.write(f"Token: {token}\n\n") f.write("Upload File:\n") upload_result = upload_file(token, FILE_PATH) f.write(f"{json.dumps(upload_result, ensure_ascii=False)}\n\n") if upload_result.get('errcode') == 0: media_id = upload_result['media_id'] f.write(f"Media ID: {media_id}\n\n") f.write("Send using v1 API:\n") send_result = send_message_v1(token, media_id) f.write(f"{json.dumps(send_result, ensure_ascii=False)}\n\n") if send_result.get('processQueryKey'): f.write("=== SUCCESS ===\n") f.write(f"ProcessQueryKey: {send_result['processQueryKey']}\n") else: f.write("=== FAILED ===\n") else: f.write("=== UPLOAD FAILED ===\n") print("Check final_send_v1_api.txt") except Exception as e: with open(r"C:\Users\ALC\.openclaw\workspace\final_send_error_v1.txt", "w", encoding="utf-8") as f: f.write(f"Error: {e}\n") import traceback f.write(traceback.format_exc()) print(f"Error: {e}") if __name__ == "__main__": main()