// 尝试所有可能的钉钉机器人 API endpoint 来发送图片 const axios = require('axios'); const FormData = require('form-data'); const ACCESS_TOKEN_URL = "https://oapi.dingtalk.com/gettoken"; const UPLOAD_URL = "https://oapi.dingtalk.com/media/upload"; const APP_KEY = "ding4ursdp0l2giat4bj"; const APP_SECRET = "J0gBicjKiIHoKla7WfKKhRs1Tv8L6Xd5UhW3EVQByF16G7Vn7UUcRhP6u-PBCQNo"; const OPEN_CONVERSATION_ID = "cidcjYshXVtKck5LfOO9AqOJg=="; const ROBOT_CODE = "ding4ursdp0l2giat4bj"; const IMAGE_PATH = "C:/Users/ALC/.openclaw/workspace/yahoo_japan_screenshot.jpg"; // 已知的机器人 API endpoints const ROBOT_APIS = [ { name: "send_to_conversation", url: (token) => `https://oapi.dingtalk.com/message/send_to_conversation?access_token=${token}` }, { name: "sendgroupmessage", url: (token) => `https://oapi.dingtalk.com/message/sendgroupmessage?access_token=${token}` }, { name: "group_send", url: (token) => `https://oapi.dingtalk.com/group/send?access_token=${token}` }, { name: "app_send", url: (token) => `https://oapi.dingtalk.com/topapi/message/send?access_token=${token}` }, { name: "corpconversation_asyncsend", url: (token) => `https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2?access_token=${token}` }, { name: "conversation_send", url: (token) => `https://oapi.dingtalk.com/topapi/message/conversation/send?access_token=${token}` } ]; async function getAccessToken() { const response = await axios.get(ACCESS_TOKEN_URL, { params: { appkey: APP_KEY, appsecret: APP_SECRET } }); return response.data.access_token; } async function uploadMedia(accessToken, filePath, type) { const form = new FormData(); form.append('media', require('fs').createReadStream(filePath)); form.append('type', type); const response = await axios.post(`${UPLOAD_URL}?access_token=${accessToken}`, form, { headers: form.getHeaders() }); return response.data.media_id; } async function trySend(accessToken, apiConfig, mediaId) { const { name, url } = apiConfig; const apiUrl = url(accessToken); try { console.log(`\n\n尝试 API: ${name}`); console.log(`URL: ${apiUrl}\n`); const body = { msg: { msgtype: "image", image: { media_id: mediaId } }, agent_id: ROBOT_CODE, userid_list: OPEN_CONVERSATION_ID }; // 调整 body 参数 if (name === "sendgroupmessage") { delete body.agent_id; delete body.userid_list; body.chatid = OPEN_CONVERSATION_ID; } else if (name === "conversation_send") { body.sender = ROBOT_CODE; body.msg.conversation = OPEN_CONVERSATION_ID; } else if (name === "corpconversation_asyncsend") { body.msg.conversation = OPEN_CONVERSATION_ID; body.msg.sender = ROBOT_CODE; } else if (name === "app_send") { body.msg.agent_id = ROBOT_CODE; body.msg.userid_list = OPEN_CONVERSATION_ID; } console.log(`Body: ${JSON.stringify(body, null, 2)}\n`); const response = await axios.post(apiUrl, body); if (response.data.errcode === 0) { console.log(`✅ ${name} 成功!`); console.log(`响应: ${JSON.stringify(response.data, null, 2)}\n`); return true; } else { console.log(`❌ ${name} 失败: ${response.data.errmsg}\n`); return false; } } catch (err) { console.log(`❌ ${name} 异常: ${err.response?.data?.errmsg || err.message}\n`); if (err.response?.data) { console.log(`详情: ${JSON.stringify(err.response.data, null, 2)}\n`); } return false; } } async function main() { try { const accessToken = await getAccessToken(); console.log('✓ Access Token 获取成功\n'); const media_id = await uploadMedia(accessToken, IMAGE_PATH, "image"); console.log(`✓ 媒体上传成功: ${media_id}\n`); // 尝试所有可能的 API let success = false; for (const api of ROBOT_APIS) { success = await trySend(accessToken, api, media_id); if (success) { console.log('\n🎉 找到可用的 API!'); break; } console.log('---'); } if (!success) { console.log('\n❌ 所有尝试的 API 都失败了。'); console.log('\n建议:'); console.log('1. 检查钉钉开放平台应用配置,确认机器人权限'); console.log('2. 手动发送本地截图到群聊'); console.log(` 文件路径: ${IMAGE_PATH}`); } } catch (err) { console.error('错误:', err.message); process.exit(1); } } main();