forked from EduCraft/curriculum-project-hub
28 lines
1.4 KiB
JavaScript
Executable File
28 lines
1.4 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
|
|
const chunks = [];
|
|
for await (const chunk of process.stdin) chunks.push(chunk);
|
|
const [appId, appSecret] = Buffer.concat(chunks).toString("utf8").split("\0");
|
|
if (!appId || !appSecret) throw new Error("Feishu App ID and App Secret are required on stdin");
|
|
|
|
const tokenResponse = await fetch("https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal", {
|
|
method: "POST",
|
|
headers: { "content-type": "application/json; charset=utf-8" },
|
|
body: JSON.stringify({ app_id: appId, app_secret: appSecret }),
|
|
});
|
|
if (!tokenResponse.ok) throw new Error(`Feishu token request failed: HTTP ${tokenResponse.status}`);
|
|
const tokenPayload = await tokenResponse.json();
|
|
if (tokenPayload.code !== 0 || typeof tokenPayload.tenant_access_token !== "string") {
|
|
throw new Error(`Feishu token request failed: ${JSON.stringify(tokenPayload)}`);
|
|
}
|
|
|
|
const botResponse = await fetch("https://open.feishu.cn/open-apis/bot/v3/info", {
|
|
headers: { authorization: `Bearer ${tokenPayload.tenant_access_token}` },
|
|
});
|
|
if (!botResponse.ok) throw new Error(`Feishu bot info request failed: HTTP ${botResponse.status}`);
|
|
const botPayload = await botResponse.json();
|
|
if (botPayload.code !== 0 || typeof botPayload.bot?.open_id !== "string" || !botPayload.bot.open_id) {
|
|
throw new Error(`Feishu bot info request failed: ${JSON.stringify(botPayload)}`);
|
|
}
|
|
process.stdout.write(botPayload.bot.open_id);
|