Add OpenClaw workspace configuration and tools
- Add agent configuration files (AGENTS.md, USER.md, IDENTITY.md, SOUL.md) - Add git configuration and skills management scripts - Add frontend/backend analysis tools and reports - Add DingTalk media sender utilities and documentation - Fix OpenClaw runtime environment (Node.js and Python) - Configure git remotes and push scripts
This commit is contained in:
115
send_dingtalk_file_v2.py
Normal file
115
send_dingtalk_file_v2.py
Normal file
@@ -0,0 +1,115 @@
|
||||
import requests
|
||||
import json
|
||||
import os
|
||||
|
||||
#钉钉配置
|
||||
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 upload_v2(access_token, file_path, file_type="file"):
|
||||
"""钉钉机器人V2文件上传"""
|
||||
url = "https://api.dingtalk.com/v2.0/media/upload"
|
||||
|
||||
if not os.path.exists(file_path):
|
||||
raise Exception(f"File not found: {file_path}")
|
||||
|
||||
files = {
|
||||
'media': (os.path.basename(file_path), open(file_path, 'rb'))
|
||||
}
|
||||
|
||||
params = {
|
||||
'type': file_type
|
||||
}
|
||||
|
||||
headers = {
|
||||
'x-acs-dingtalk-access-token': access_token
|
||||
}
|
||||
|
||||
response = requests.post(url, params=params, headers=headers, files=files, timeout=30)
|
||||
result = response.json()
|
||||
|
||||
if "mediaId" in result:
|
||||
print(f"Upload success! mediaId: {result['mediaId']}")
|
||||
return result["mediaId"]
|
||||
else:
|
||||
raise Exception(f"Failed to upload media: {result}")
|
||||
|
||||
def send_group_v2(access_token, open_conversation_id, robot_code, media_id, file_type="file", file_name=None):
|
||||
"""发送群聊媒体消息(V2)"""
|
||||
url = "https://api.dingtalk.com/v2.0/robot/orgGroup/send"
|
||||
|
||||
msg_key = "sampleFile"
|
||||
msg_param = json.dumps({
|
||||
"mediaId": media_id,
|
||||
"fileName": file_name or "file"
|
||||
}, ensure_ascii=False)
|
||||
|
||||
headers = {
|
||||
'x-acs-dingtalk-access-token': access_token,
|
||||
'Content-Type': 'application/json; charset=utf-8'
|
||||
}
|
||||
|
||||
payload = {
|
||||
"openConversationId": open_conversation_id,
|
||||
"robotCode": robot_code,
|
||||
"msgKey": msg_key,
|
||||
"msgParam": msg_param
|
||||
}
|
||||
|
||||
response = requests.post(url, headers=headers, json=payload, timeout=30)
|
||||
result = response.json()
|
||||
|
||||
print(f"Send result: {json.dumps(result, ensure_ascii=False)}")
|
||||
|
||||
if "processQueryKey" in result:
|
||||
print(f"Success! processQueryKey: {result['processQueryKey']}")
|
||||
return result['processQueryKey']
|
||||
else:
|
||||
raise Exception(f"Failed to send message: {result}")
|
||||
|
||||
def get_token_v2(app_key, app_secret):
|
||||
"""获取access token"""
|
||||
url = "https://api.dingtalk.com/v1.0/oauth2/getAccessToken"
|
||||
headers = {"Content-Type": "application/json"}
|
||||
data = {"appKey": app_key, "appSecret": app_secret}
|
||||
|
||||
response = requests.post(url, headers=headers, json=data, timeout=10)
|
||||
result = response.json()
|
||||
|
||||
if "accessToken" in result:
|
||||
return result["accessToken"]
|
||||
else:
|
||||
raise Exception(f"Failed to get token: {result}")
|
||||
|
||||
def main():
|
||||
try:
|
||||
print("=== DingTalk V2 File Sender ===")
|
||||
print(f"File: {FILE_PATH.encode('utf-8')}")
|
||||
print(f"Size: {os.path.getsize(FILE_PATH) / 1024:.2f} KB")
|
||||
|
||||
print("\nStep 1: Getting token...")
|
||||
access_token = get_token_v2(DINGTALK_APP_KEY, DINGTALK_APP_SECRET)
|
||||
print("Token obtained")
|
||||
|
||||
print("\nStep 2: Upload file...")
|
||||
media_id = upload_v2(access_token, FILE_PATH, "file")
|
||||
|
||||
print("\nStep 3: Send to group...")
|
||||
process_query_key = send_group_v2(access_token, OPEN_CONVERSATION_ID, ROBOT_CODE, media_id, "file", FILE_NAME)
|
||||
|
||||
print(f"\n=== Success! ===")
|
||||
print(f"File sent! processQueryKey: {process_query_key}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"\n=== Error ===")
|
||||
print(f"Error: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user