@clawhub-justoneapi-256daef3f1
Call GET /api/douyin-xingtu/get-author-commerce-seed-base-info/v1 for Douyin Creator Marketplace (Xingtu) Author Commerce Seeding Base Info through JustOneAP...
---
name: Douyin Creator Marketplace (Xingtu) Author Commerce Seeding Base Info API
description: Call GET /api/douyin-xingtu/get-author-commerce-seed-base-info/v1 for Douyin Creator Marketplace (Xingtu) Author Commerce Seeding Base Info through JustOneAPI with kolId and range.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_douyin_xingtu_get_author_commerce_seed_base_info"}}
---
# Douyin Creator Marketplace (Xingtu) Author Commerce Seeding Base Info
Use this focused JustOneAPI skill for author Commerce Seeding Base Info in Douyin Creator Marketplace (Xingtu). It targets `GET /api/douyin-xingtu/get-author-commerce-seed-base-info/v1`. Required non-token inputs are `kolId` and `range`. OpenAPI describes it as: Get Douyin Creator Marketplace (Xingtu) author Commerce Seeding Base Info data, including baseline metrics, commercial signals, and seeding indicators, for product seeding analysis, creator vetting, and campaign planning.
## Endpoint Scope
- Platform key: `douyin-xingtu`
- Endpoint key: `get-author-commerce-seed-base-info`
- Platform family: Douyin Creator Marketplace (Xingtu)
- Skill slug: `justoneapi-douyin-xingtu-get-author-commerce-seed-base-info`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `getAuthorCommerceSeedingBaseInfoV1` | `v1` | `GET` | `/api/douyin-xingtu/get-author-commerce-seed-base-info/v1` | Author Commerce Seeding Base Info |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `acceptCache` | `query` | n/a | all | `boolean` | Enable cache |
| `kolId` | `query` | all | n/a | `string` | KOL ID |
| `range` | `query` | all | n/a | `string` | Time range |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `getAuthorCommerceSeedingBaseInfoV1` for the documented `v1` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `getAuthorCommerceSeedingBaseInfoV1`.
```bash
node {baseDir}/bin/run.mjs --operation "getAuthorCommerceSeedingBaseInfoV1" --token "$JUST_ONE_API_TOKEN" --params-json '{"kolId":"<kolId>","range":"<range>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_xingtu_get_author_commerce_seed_base_info&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_xingtu_get_author_commerce_seed_base_info&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `getAuthorCommerceSeedingBaseInfoV1` on `/api/douyin-xingtu/get-author-commerce-seed-base-info/v1`.
- Echo the required lookup scope (`kolId` and `range`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Douyin Creator Marketplace (Xingtu) author Commerce Seeding Base Info data, including baseline metrics, commercial signals, and seeding indicators, for product seeding analysis, creator vetting, and campaign planning.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin-xingtu/get-author-commerce-seed-base-info/v1 for Douyin Creator Marketplace (Xingtu) Author Commerce Seeding Base Info through JustOneAPI with kolId and range.",
"displayName": "Douyin Creator Marketplace (Xingtu) Author Commerce Seeding Base Info",
"openapi": "3.1.0",
"platformKey": "douyin-xingtu",
"primaryTag": "Douyin Creator Marketplace (Xingtu)",
"skillName": "justoneapi_douyin_xingtu_get_author_commerce_seed_base_info",
"slug": "justoneapi-douyin-xingtu-get-author-commerce-seed-base-info",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Douyin Creator Marketplace (Xingtu) author Commerce Seeding Base Info data, including baseline metrics, commercial signals, and seeding indicators, for product seeding analysis, creator vetting, and campaign planning.",
"method": "GET",
"operationId": "getAuthorCommerceSeedingBaseInfoV1",
"parameters": [
{
"defaultValue": null,
"description": "User authentication token.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "KOL ID.",
"enumValues": [],
"location": "query",
"name": "kolId",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Time range.",
"enumValues": [],
"location": "query",
"name": "range",
"required": true,
"schemaType": "string"
},
{
"defaultValue": false,
"description": "Enable cache.",
"enumValues": [],
"location": "query",
"name": "acceptCache",
"required": false,
"schemaType": "boolean"
}
],
"path": "/api/douyin-xingtu/get-author-commerce-seed-base-info/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Author Commerce Seeding Base Info",
"tags": [
"Douyin Creator Marketplace (Xingtu)"
]
}
],
"endpointPath": "get-author-commerce-seed-base-info",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin-xingtu/get-author-commerce-seed-base-info/v1 for Douyin Creator Marketplace (Xingtu) Author Commerce Seeding Base Info through JustOneAPI with kolId and range.",
"displayName": "Douyin Creator Marketplace (Xingtu) Author Commerce Seeding Base Info",
"endpointPath": "get-author-commerce-seed-base-info",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Douyin Creator Marketplace (Xingtu) author Commerce Seeding Base Info data, including baseline metrics, commercial signals, and seeding indicators, for product seeding analysis, creator vetting, and campaign planning.",
"method": "GET",
"operationId": "getAuthorCommerceSeedingBaseInfoV1",
"parameters": [
{
"defaultValue": null,
"description": "User authentication token.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "KOL ID.",
"enumValues": [],
"location": "query",
"name": "kolId",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Time range.",
"enumValues": [],
"location": "query",
"name": "range",
"required": true,
"schemaType": "string"
},
{
"defaultValue": false,
"description": "Enable cache.",
"enumValues": [],
"location": "query",
"name": "acceptCache",
"required": false,
"schemaType": "boolean"
}
],
"path": "/api/douyin-xingtu/get-author-commerce-seed-base-info/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Author Commerce Seeding Base Info",
"tags": [
"Douyin Creator Marketplace (Xingtu)"
]
}
],
"platformKey": "douyin-xingtu",
"primaryTag": "Douyin Creator Marketplace (Xingtu)",
"skillName": "justoneapi_douyin_xingtu_get_author_commerce_seed_base_info",
"skillType": "interface",
"slug": "justoneapi-douyin-xingtu-get-author-commerce-seed-base-info",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Douyin Creator Marketplace (Xingtu) Author Commerce Seeding Base Info operations
Generated from JustOneAPI OpenAPI for platform key `douyin-xingtu`.
Endpoint group: `get-author-commerce-seed-base-info`.
## `getAuthorCommerceSeedingBaseInfoV1`
- Method: `GET`
- Path: `/api/douyin-xingtu/get-author-commerce-seed-base-info/v1`
- Summary: Author Commerce Seeding Base Info
- Description: Get Douyin Creator Marketplace (Xingtu) author Commerce Seeding Base Info data, including baseline metrics, commercial signals, and seeding indicators, for product seeding analysis, creator vetting, and campaign planning.
- Tags: `Douyin Creator Marketplace (Xingtu)`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | User authentication token. |
| `kolId` | `query` | yes | `string` | n/a | KOL ID. |
| `range` | `query` | yes | `string` | n/a | Time range. |
| `acceptCache` | `query` | no | `boolean` | `false` | Enable cache. |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/douyin/share-url-transfer/v1 for Douyin (TikTok China) Share Link Resolution through JustOneAPI with shareUrl.
---
name: Douyin (TikTok China) Share Link Resolution API
description: Call GET /api/douyin/share-url-transfer/v1 for Douyin (TikTok China) Share Link Resolution through JustOneAPI with shareUrl.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_douyin_share_url_transfer"}}
---
# Douyin (TikTok China) Share Link Resolution
Use this focused JustOneAPI skill for share Link Resolution in Douyin (TikTok China). It targets `GET /api/douyin/share-url-transfer/v1`. Required non-token inputs are `shareUrl`. OpenAPI describes it as: Get Douyin (TikTok China) share Link Resolution data, including helping extract canonical IDs, for downstream video and comment workflows.
## Endpoint Scope
- Platform key: `douyin`
- Endpoint key: `share-url-transfer`
- Platform family: Douyin (TikTok China)
- Skill slug: `justoneapi-douyin-share-url-transfer`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `shareDouyinUrlTransferV1` | `v1` | `GET` | `/api/douyin/share-url-transfer/v1` | Share Link Resolution |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `shareUrl` | `query` | all | n/a | `string` | The Douyin short share URL |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `shareDouyinUrlTransferV1` for the documented `v1` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `shareDouyinUrlTransferV1`.
```bash
node {baseDir}/bin/run.mjs --operation "shareDouyinUrlTransferV1" --token "$JUST_ONE_API_TOKEN" --params-json '{"shareUrl":"<shareUrl>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_share_url_transfer&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_share_url_transfer&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `shareDouyinUrlTransferV1` on `/api/douyin/share-url-transfer/v1`.
- Echo the required lookup scope (`shareUrl`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Douyin (TikTok China) share Link Resolution data, including helping extract canonical IDs, for downstream video and comment workflows.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin/share-url-transfer/v1 for Douyin (TikTok China) Share Link Resolution through JustOneAPI with shareUrl.",
"displayName": "Douyin (TikTok China) Share Link Resolution",
"openapi": "3.1.0",
"platformKey": "douyin",
"primaryTag": "Douyin (TikTok China)",
"skillName": "justoneapi_douyin_share_url_transfer",
"slug": "justoneapi-douyin-share-url-transfer",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Douyin (TikTok China) share Link Resolution data, including helping extract canonical IDs, for downstream video and comment workflows.",
"method": "GET",
"operationId": "shareDouyinUrlTransferV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The Douyin short share URL.",
"enumValues": [],
"location": "query",
"name": "shareUrl",
"required": true,
"schemaType": "string"
}
],
"path": "/api/douyin/share-url-transfer/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Share Link Resolution",
"tags": [
"Douyin (TikTok China)"
]
}
],
"endpointPath": "share-url-transfer",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin/share-url-transfer/v1 for Douyin (TikTok China) Share Link Resolution through JustOneAPI with shareUrl.",
"displayName": "Douyin (TikTok China) Share Link Resolution",
"endpointPath": "share-url-transfer",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Douyin (TikTok China) share Link Resolution data, including helping extract canonical IDs, for downstream video and comment workflows.",
"method": "GET",
"operationId": "shareDouyinUrlTransferV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The Douyin short share URL.",
"enumValues": [],
"location": "query",
"name": "shareUrl",
"required": true,
"schemaType": "string"
}
],
"path": "/api/douyin/share-url-transfer/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Share Link Resolution",
"tags": [
"Douyin (TikTok China)"
]
}
],
"platformKey": "douyin",
"primaryTag": "Douyin (TikTok China)",
"skillName": "justoneapi_douyin_share_url_transfer",
"skillType": "interface",
"slug": "justoneapi-douyin-share-url-transfer",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Douyin (TikTok China) Share Link Resolution operations
Generated from JustOneAPI OpenAPI for platform key `douyin`.
Endpoint group: `share-url-transfer`.
## `shareDouyinUrlTransferV1`
- Method: `GET`
- Path: `/api/douyin/share-url-transfer/v1`
- Summary: Share Link Resolution
- Description: Get Douyin (TikTok China) share Link Resolution data, including helping extract canonical IDs, for downstream video and comment workflows.
- Tags: `Douyin (TikTok China)`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for this API service. |
| `shareUrl` | `query` | yes | `string` | n/a | The Douyin short share URL. |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/douyin/search-video/v4 for Douyin (TikTok China) Video Search through JustOneAPI with keyword.
---
name: Douyin (TikTok China) Video Search API
description: Call GET /api/douyin/search-video/v4 for Douyin (TikTok China) Video Search through JustOneAPI with keyword.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_douyin_search_video"}}
---
# Douyin (TikTok China) Video Search
Use this focused JustOneAPI skill for video Search in Douyin (TikTok China). It targets `GET /api/douyin/search-video/v4`. Required non-token inputs are `keyword`. OpenAPI describes it as: Get Douyin (TikTok China) video Search data, including metadata and engagement signals, for content discovery, trend research, and competitive monitoring.
## Endpoint Scope
- Platform key: `douyin`
- Endpoint key: `search-video`
- Platform family: Douyin (TikTok China)
- Skill slug: `justoneapi-douyin-search-video`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `searchVideoV4` | `v4` | `GET` | `/api/douyin/search-video/v4` | Video Search |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `duration` | `query` | n/a | all | `string` | Filter by video duration. Available Values: - `_0`: No Limit - `_1`: Under 1 Minute - `_2`: 1-5 Minutes - `_3`: Over 5 Minutes |
| `duration` enum | values | n/a | n/a | n/a | `_0`, `_1`, `_2`, `_3` |
| `keyword` | `query` | all | n/a | `string` | The search keyword |
| `page` | `query` | n/a | all | `integer` | Page number (starting from 1) |
| `publishTime` | `query` | n/a | all | `string` | Filter by video publish time range. Available Values: - `_0`: No Limit - `_1`: Last 24 Hours - `_7`: Last 7 Days - `_180`: Last 6 Months |
| `publishTime` enum | values | n/a | n/a | n/a | `_0`, `_1`, `_180`, `_7` |
| `searchId` | `query` | n/a | all | `string` | Search ID; required for pages > 1 (use the search_id value returned by the last response) |
| `sortType` | `query` | n/a | all | `string` | Sorting criteria for search results. Available Values: - `_0`: General - `_1`: More likes - `_2`: Newest |
| `sortType` enum | values | n/a | n/a | n/a | `_0`, `_1`, `_2` |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `searchVideoV4` for the documented `v4` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `searchVideoV4`.
```bash
node {baseDir}/bin/run.mjs --operation "searchVideoV4" --token "$JUST_ONE_API_TOKEN" --params-json '{"keyword":"<keyword>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_search_video&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_search_video&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `searchVideoV4` on `/api/douyin/search-video/v4`.
- Echo the required lookup scope (`keyword`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Douyin (TikTok China) video Search data, including metadata and engagement signals, for content discovery, trend research, and competitive monitoring.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin/search-video/v4 for Douyin (TikTok China) Video Search through JustOneAPI with keyword.",
"displayName": "Douyin (TikTok China) Video Search",
"openapi": "3.1.0",
"platformKey": "douyin",
"primaryTag": "Douyin (TikTok China)",
"skillName": "justoneapi_douyin_search_video",
"slug": "justoneapi-douyin-search-video",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Douyin (TikTok China) video Search data, including metadata and engagement signals, for content discovery, trend research, and competitive monitoring.",
"method": "GET",
"operationId": "searchVideoV4",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The search keyword.",
"enumValues": [],
"location": "query",
"name": "keyword",
"required": true,
"schemaType": "string"
},
{
"defaultValue": "_0",
"description": "Sorting criteria for search results.\n\nAvailable Values:\n- `_0`: General\n- `_1`: More likes\n- `_2`: Newest",
"enumValues": [
"_0",
"_1",
"_2"
],
"location": "query",
"name": "sortType",
"required": false,
"schemaType": "string"
},
{
"defaultValue": "_0",
"description": "Filter by video publish time range.\n\nAvailable Values:\n- `_0`: No Limit\n- `_1`: Last 24 Hours\n- `_7`: Last 7 Days\n- `_180`: Last 6 Months",
"enumValues": [
"_0",
"_1",
"_7",
"_180"
],
"location": "query",
"name": "publishTime",
"required": false,
"schemaType": "string"
},
{
"defaultValue": "_0",
"description": "Filter by video duration.\n\nAvailable Values:\n- `_0`: No Limit\n- `_1`: Under 1 Minute\n- `_2`: 1-5 Minutes\n- `_3`: Over 5 Minutes",
"enumValues": [
"_0",
"_1",
"_2",
"_3"
],
"location": "query",
"name": "duration",
"required": false,
"schemaType": "string"
},
{
"defaultValue": 1,
"description": "Page number (starting from 1).",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "integer"
},
{
"defaultValue": null,
"description": "Search ID; required for pages > 1 (use the search_id value returned by the last response).",
"enumValues": [],
"location": "query",
"name": "searchId",
"required": false,
"schemaType": "string"
}
],
"path": "/api/douyin/search-video/v4",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Video Search",
"tags": [
"Douyin (TikTok China)"
]
}
],
"endpointPath": "search-video",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin/search-video/v4 for Douyin (TikTok China) Video Search through JustOneAPI with keyword.",
"displayName": "Douyin (TikTok China) Video Search",
"endpointPath": "search-video",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Douyin (TikTok China) video Search data, including metadata and engagement signals, for content discovery, trend research, and competitive monitoring.",
"method": "GET",
"operationId": "searchVideoV4",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The search keyword.",
"enumValues": [],
"location": "query",
"name": "keyword",
"required": true,
"schemaType": "string"
},
{
"defaultValue": "_0",
"description": "Sorting criteria for search results.\n\nAvailable Values:\n- `_0`: General\n- `_1`: More likes\n- `_2`: Newest",
"enumValues": [
"_0",
"_1",
"_2"
],
"location": "query",
"name": "sortType",
"required": false,
"schemaType": "string"
},
{
"defaultValue": "_0",
"description": "Filter by video publish time range.\n\nAvailable Values:\n- `_0`: No Limit\n- `_1`: Last 24 Hours\n- `_7`: Last 7 Days\n- `_180`: Last 6 Months",
"enumValues": [
"_0",
"_1",
"_7",
"_180"
],
"location": "query",
"name": "publishTime",
"required": false,
"schemaType": "string"
},
{
"defaultValue": "_0",
"description": "Filter by video duration.\n\nAvailable Values:\n- `_0`: No Limit\n- `_1`: Under 1 Minute\n- `_2`: 1-5 Minutes\n- `_3`: Over 5 Minutes",
"enumValues": [
"_0",
"_1",
"_2",
"_3"
],
"location": "query",
"name": "duration",
"required": false,
"schemaType": "string"
},
{
"defaultValue": 1,
"description": "Page number (starting from 1).",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "integer"
},
{
"defaultValue": null,
"description": "Search ID; required for pages > 1 (use the search_id value returned by the last response).",
"enumValues": [],
"location": "query",
"name": "searchId",
"required": false,
"schemaType": "string"
}
],
"path": "/api/douyin/search-video/v4",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Video Search",
"tags": [
"Douyin (TikTok China)"
]
}
],
"platformKey": "douyin",
"primaryTag": "Douyin (TikTok China)",
"skillName": "justoneapi_douyin_search_video",
"skillType": "interface",
"slug": "justoneapi-douyin-search-video",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Douyin (TikTok China) Video Search operations
Generated from JustOneAPI OpenAPI for platform key `douyin`.
Endpoint group: `search-video`.
## `searchVideoV4`
- Method: `GET`
- Path: `/api/douyin/search-video/v4`
- Summary: Video Search
- Description: Get Douyin (TikTok China) video Search data, including metadata and engagement signals, for content discovery, trend research, and competitive monitoring.
- Tags: `Douyin (TikTok China)`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for this API service. |
| `keyword` | `query` | yes | `string` | n/a | The search keyword. |
| `sortType` | `query` | no | `string` | `_0` | Sorting criteria for search results.
Available Values:
- `_0`: General
- `_1`: More likes
- `_2`: Newest |
| enum | values | no | n/a | n/a | `_0`, `_1`, `_2` |
| `publishTime` | `query` | no | `string` | `_0` | Filter by video publish time range.
Available Values:
- `_0`: No Limit
- `_1`: Last 24 Hours
- `_7`: Last 7 Days
- `_180`: Last 6 Months |
| enum | values | no | n/a | n/a | `_0`, `_1`, `_7`, `_180` |
| `duration` | `query` | no | `string` | `_0` | Filter by video duration.
Available Values:
- `_0`: No Limit
- `_1`: Under 1 Minute
- `_2`: 1-5 Minutes
- `_3`: Over 5 Minutes |
| enum | values | no | n/a | n/a | `_0`, `_1`, `_2`, `_3` |
| `page` | `query` | no | `integer` | `1` | Page number (starting from 1). |
| `searchId` | `query` | no | `string` | n/a | Search ID; required for pages > 1 (use the search_id value returned by the last response). |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/douyin/search-user/v2 for Douyin (TikTok China) User Search through JustOneAPI with keyword.
---
name: Douyin (TikTok China) User Search API
description: Call GET /api/douyin/search-user/v2 for Douyin (TikTok China) User Search through JustOneAPI with keyword.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_douyin_search_user"}}
---
# Douyin (TikTok China) User Search
Use this focused JustOneAPI skill for user Search in Douyin (TikTok China). It targets `GET /api/douyin/search-user/v2`. Required non-token inputs are `keyword`. OpenAPI describes it as: Get Douyin (TikTok China) user Search data, including profile metadata and follower signals, for creator discovery and account research.
## Endpoint Scope
- Platform key: `douyin`
- Endpoint key: `search-user`
- Platform family: Douyin (TikTok China)
- Skill slug: `justoneapi-douyin-search-user`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `searchDouyinUserV2` | `v2` | `GET` | `/api/douyin/search-user/v2` | User Search |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `keyword` | `query` | all | n/a | `string` | The search keyword |
| `page` | `query` | n/a | all | `integer` | Page number (starting from 1) |
| `userType` | `query` | n/a | all | `string` | Filter by user type. Available Values: - `common_user`: Common User - `enterprise_user`: Enterprise User - `personal_user`: Verified Individual User |
| `userType` enum | values | n/a | n/a | n/a | `common_user`, `enterprise_user`, `personal_user` |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `searchDouyinUserV2` for the documented `v2` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `searchDouyinUserV2`.
```bash
node {baseDir}/bin/run.mjs --operation "searchDouyinUserV2" --token "$JUST_ONE_API_TOKEN" --params-json '{"keyword":"<keyword>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_search_user&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_search_user&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `searchDouyinUserV2` on `/api/douyin/search-user/v2`.
- Echo the required lookup scope (`keyword`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Douyin (TikTok China) user Search data, including profile metadata and follower signals, for creator discovery and account research.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin/search-user/v2 for Douyin (TikTok China) User Search through JustOneAPI with keyword.",
"displayName": "Douyin (TikTok China) User Search",
"openapi": "3.1.0",
"platformKey": "douyin",
"primaryTag": "Douyin (TikTok China)",
"skillName": "justoneapi_douyin_search_user",
"slug": "justoneapi-douyin-search-user",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Douyin (TikTok China) user Search data, including profile metadata and follower signals, for creator discovery and account research.",
"method": "GET",
"operationId": "searchDouyinUserV2",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The search keyword.",
"enumValues": [],
"location": "query",
"name": "keyword",
"required": true,
"schemaType": "string"
},
{
"defaultValue": 1,
"description": "Page number (starting from 1).",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "integer"
},
{
"defaultValue": null,
"description": "Filter by user type.\n\nAvailable Values:\n- `common_user`: Common User\n- `enterprise_user`: Enterprise User\n- `personal_user`: Verified Individual User",
"enumValues": [
"common_user",
"enterprise_user",
"personal_user"
],
"location": "query",
"name": "userType",
"required": false,
"schemaType": "string"
}
],
"path": "/api/douyin/search-user/v2",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "User Search",
"tags": [
"Douyin (TikTok China)"
]
}
],
"endpointPath": "search-user",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin/search-user/v2 for Douyin (TikTok China) User Search through JustOneAPI with keyword.",
"displayName": "Douyin (TikTok China) User Search",
"endpointPath": "search-user",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Douyin (TikTok China) user Search data, including profile metadata and follower signals, for creator discovery and account research.",
"method": "GET",
"operationId": "searchDouyinUserV2",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The search keyword.",
"enumValues": [],
"location": "query",
"name": "keyword",
"required": true,
"schemaType": "string"
},
{
"defaultValue": 1,
"description": "Page number (starting from 1).",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "integer"
},
{
"defaultValue": null,
"description": "Filter by user type.\n\nAvailable Values:\n- `common_user`: Common User\n- `enterprise_user`: Enterprise User\n- `personal_user`: Verified Individual User",
"enumValues": [
"common_user",
"enterprise_user",
"personal_user"
],
"location": "query",
"name": "userType",
"required": false,
"schemaType": "string"
}
],
"path": "/api/douyin/search-user/v2",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "User Search",
"tags": [
"Douyin (TikTok China)"
]
}
],
"platformKey": "douyin",
"primaryTag": "Douyin (TikTok China)",
"skillName": "justoneapi_douyin_search_user",
"skillType": "interface",
"slug": "justoneapi-douyin-search-user",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Douyin (TikTok China) User Search operations
Generated from JustOneAPI OpenAPI for platform key `douyin`.
Endpoint group: `search-user`.
## `searchDouyinUserV2`
- Method: `GET`
- Path: `/api/douyin/search-user/v2`
- Summary: User Search
- Description: Get Douyin (TikTok China) user Search data, including profile metadata and follower signals, for creator discovery and account research.
- Tags: `Douyin (TikTok China)`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for this API service. |
| `keyword` | `query` | yes | `string` | n/a | The search keyword. |
| `page` | `query` | no | `integer` | `1` | Page number (starting from 1). |
| `userType` | `query` | no | `string` | n/a | Filter by user type.
Available Values:
- `common_user`: Common User
- `enterprise_user`: Enterprise User
- `personal_user`: Verified Individual User |
| enum | values | no | n/a | n/a | `common_user`, `enterprise_user`, `personal_user` |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/douyin/get-video-sub-comment/v1 for Douyin (TikTok China) Comment Replies through JustOneAPI with commentId.
---
name: Douyin (TikTok China) Comment Replies API
description: Call GET /api/douyin/get-video-sub-comment/v1 for Douyin (TikTok China) Comment Replies through JustOneAPI with commentId.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_douyin_get_video_sub_comment"}}
---
# Douyin (TikTok China) Comment Replies
Use this focused JustOneAPI skill for comment Replies in Douyin (TikTok China). It targets `GET /api/douyin/get-video-sub-comment/v1`. Required non-token inputs are `commentId`. OpenAPI describes it as: Get Douyin (TikTok China) comment Replies data, including text, authors, and timestamps, for thread analysis and feedback research.
## Endpoint Scope
- Platform key: `douyin`
- Endpoint key: `get-video-sub-comment`
- Platform family: Douyin (TikTok China)
- Skill slug: `justoneapi-douyin-get-video-sub-comment`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `getVideoSubCommentV1` | `v1` | `GET` | `/api/douyin/get-video-sub-comment/v1` | Comment Replies |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `commentId` | `query` | all | n/a | `string` | The unique identifier of the top-level comment |
| `page` | `query` | n/a | all | `integer` | Page number (starting from 1) |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `getVideoSubCommentV1` for the documented `v1` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `getVideoSubCommentV1`.
```bash
node {baseDir}/bin/run.mjs --operation "getVideoSubCommentV1" --token "$JUST_ONE_API_TOKEN" --params-json '{"commentId":"<commentId>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_get_video_sub_comment&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_get_video_sub_comment&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `getVideoSubCommentV1` on `/api/douyin/get-video-sub-comment/v1`.
- Echo the required lookup scope (`commentId`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Douyin (TikTok China) comment Replies data, including text, authors, and timestamps, for thread analysis and feedback research.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin/get-video-sub-comment/v1 for Douyin (TikTok China) Comment Replies through JustOneAPI with commentId.",
"displayName": "Douyin (TikTok China) Comment Replies",
"openapi": "3.1.0",
"platformKey": "douyin",
"primaryTag": "Douyin (TikTok China)",
"skillName": "justoneapi_douyin_get_video_sub_comment",
"slug": "justoneapi-douyin-get-video-sub-comment",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Douyin (TikTok China) comment Replies data, including text, authors, and timestamps, for thread analysis and feedback research.",
"method": "GET",
"operationId": "getVideoSubCommentV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique identifier of the top-level comment.",
"enumValues": [],
"location": "query",
"name": "commentId",
"required": true,
"schemaType": "string"
},
{
"defaultValue": 1,
"description": "Page number (starting from 1).",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "integer"
}
],
"path": "/api/douyin/get-video-sub-comment/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Comment Replies",
"tags": [
"Douyin (TikTok China)"
]
}
],
"endpointPath": "get-video-sub-comment",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin/get-video-sub-comment/v1 for Douyin (TikTok China) Comment Replies through JustOneAPI with commentId.",
"displayName": "Douyin (TikTok China) Comment Replies",
"endpointPath": "get-video-sub-comment",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Douyin (TikTok China) comment Replies data, including text, authors, and timestamps, for thread analysis and feedback research.",
"method": "GET",
"operationId": "getVideoSubCommentV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique identifier of the top-level comment.",
"enumValues": [],
"location": "query",
"name": "commentId",
"required": true,
"schemaType": "string"
},
{
"defaultValue": 1,
"description": "Page number (starting from 1).",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "integer"
}
],
"path": "/api/douyin/get-video-sub-comment/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Comment Replies",
"tags": [
"Douyin (TikTok China)"
]
}
],
"platformKey": "douyin",
"primaryTag": "Douyin (TikTok China)",
"skillName": "justoneapi_douyin_get_video_sub_comment",
"skillType": "interface",
"slug": "justoneapi-douyin-get-video-sub-comment",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Douyin (TikTok China) Comment Replies operations
Generated from JustOneAPI OpenAPI for platform key `douyin`.
Endpoint group: `get-video-sub-comment`.
## `getVideoSubCommentV1`
- Method: `GET`
- Path: `/api/douyin/get-video-sub-comment/v1`
- Summary: Comment Replies
- Description: Get Douyin (TikTok China) comment Replies data, including text, authors, and timestamps, for thread analysis and feedback research.
- Tags: `Douyin (TikTok China)`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for this API service. |
| `commentId` | `query` | yes | `string` | n/a | The unique identifier of the top-level comment. |
| `page` | `query` | no | `integer` | `1` | Page number (starting from 1). |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/douyin/get-video-detail/v2 for Douyin (TikTok China) Video Details through JustOneAPI with videoId.
---
name: Douyin (TikTok China) Video Details API
description: Call GET /api/douyin/get-video-detail/v2 for Douyin (TikTok China) Video Details through JustOneAPI with videoId.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_douyin_get_video_detail"}}
---
# Douyin (TikTok China) Video Details
Use this focused JustOneAPI skill for video Details in Douyin (TikTok China). It targets `GET /api/douyin/get-video-detail/v2`. Required non-token inputs are `videoId`. OpenAPI describes it as: Get Douyin (TikTok China) video Details data, including author details, publish time, and engagement counts, for video research, archiving, and performance analysis.
## Endpoint Scope
- Platform key: `douyin`
- Endpoint key: `get-video-detail`
- Platform family: Douyin (TikTok China)
- Skill slug: `justoneapi-douyin-get-video-detail`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `getDouyinVideoDetailV2` | `v2` | `GET` | `/api/douyin/get-video-detail/v2` | Video Details |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `videoId` | `query` | all | n/a | `string` | The unique video identifier (aweme_id or model_id) |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `getDouyinVideoDetailV2` for the documented `v2` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `getDouyinVideoDetailV2`.
```bash
node {baseDir}/bin/run.mjs --operation "getDouyinVideoDetailV2" --token "$JUST_ONE_API_TOKEN" --params-json '{"videoId":"<videoId>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_get_video_detail&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_get_video_detail&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `getDouyinVideoDetailV2` on `/api/douyin/get-video-detail/v2`.
- Echo the required lookup scope (`videoId`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Douyin (TikTok China) video Details data, including author details, publish time, and engagement counts, for video research, archiving, and performance analysis.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin/get-video-detail/v2 for Douyin (TikTok China) Video Details through JustOneAPI with videoId.",
"displayName": "Douyin (TikTok China) Video Details",
"openapi": "3.1.0",
"platformKey": "douyin",
"primaryTag": "Douyin (TikTok China)",
"skillName": "justoneapi_douyin_get_video_detail",
"slug": "justoneapi-douyin-get-video-detail",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Douyin (TikTok China) video Details data, including author details, publish time, and engagement counts, for video research, archiving, and performance analysis.",
"method": "GET",
"operationId": "getDouyinVideoDetailV2",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique video identifier (aweme_id or model_id).",
"enumValues": [],
"location": "query",
"name": "videoId",
"required": true,
"schemaType": "string"
}
],
"path": "/api/douyin/get-video-detail/v2",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Video Details",
"tags": [
"Douyin (TikTok China)"
]
}
],
"endpointPath": "get-video-detail",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin/get-video-detail/v2 for Douyin (TikTok China) Video Details through JustOneAPI with videoId.",
"displayName": "Douyin (TikTok China) Video Details",
"endpointPath": "get-video-detail",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Douyin (TikTok China) video Details data, including author details, publish time, and engagement counts, for video research, archiving, and performance analysis.",
"method": "GET",
"operationId": "getDouyinVideoDetailV2",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique video identifier (aweme_id or model_id).",
"enumValues": [],
"location": "query",
"name": "videoId",
"required": true,
"schemaType": "string"
}
],
"path": "/api/douyin/get-video-detail/v2",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Video Details",
"tags": [
"Douyin (TikTok China)"
]
}
],
"platformKey": "douyin",
"primaryTag": "Douyin (TikTok China)",
"skillName": "justoneapi_douyin_get_video_detail",
"skillType": "interface",
"slug": "justoneapi-douyin-get-video-detail",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Douyin (TikTok China) Video Details operations
Generated from JustOneAPI OpenAPI for platform key `douyin`.
Endpoint group: `get-video-detail`.
## `getDouyinVideoDetailV2`
- Method: `GET`
- Path: `/api/douyin/get-video-detail/v2`
- Summary: Video Details
- Description: Get Douyin (TikTok China) video Details data, including author details, publish time, and engagement counts, for video research, archiving, and performance analysis.
- Tags: `Douyin (TikTok China)`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for this API service. |
| `videoId` | `query` | yes | `string` | n/a | The unique video identifier (aweme_id or model_id). |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/douyin/get-video-comment/v1 for Douyin (TikTok China) Video Comments through JustOneAPI with awemeId.
---
name: Douyin (TikTok China) Video Comments API
description: Call GET /api/douyin/get-video-comment/v1 for Douyin (TikTok China) Video Comments through JustOneAPI with awemeId.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_douyin_get_video_comment"}}
---
# Douyin (TikTok China) Video Comments
Use this focused JustOneAPI skill for video Comments in Douyin (TikTok China). It targets `GET /api/douyin/get-video-comment/v1`. Required non-token inputs are `awemeId`. OpenAPI describes it as: Get Douyin (TikTok China) video Comments data, including authors, text, and likes, for sentiment analysis and engagement review.
## Endpoint Scope
- Platform key: `douyin`
- Endpoint key: `get-video-comment`
- Platform family: Douyin (TikTok China)
- Skill slug: `justoneapi-douyin-get-video-comment`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `getVideoCommentV1` | `v1` | `GET` | `/api/douyin/get-video-comment/v1` | Video Comments |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `awemeId` | `query` | all | n/a | `string` | The unique video identifier (aweme_id) |
| `page` | `query` | n/a | all | `integer` | Page number (starting from 1) |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `getVideoCommentV1` for the documented `v1` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `getVideoCommentV1`.
```bash
node {baseDir}/bin/run.mjs --operation "getVideoCommentV1" --token "$JUST_ONE_API_TOKEN" --params-json '{"awemeId":"<awemeId>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_get_video_comment&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_get_video_comment&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `getVideoCommentV1` on `/api/douyin/get-video-comment/v1`.
- Echo the required lookup scope (`awemeId`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Douyin (TikTok China) video Comments data, including authors, text, and likes, for sentiment analysis and engagement review.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin/get-video-comment/v1 for Douyin (TikTok China) Video Comments through JustOneAPI with awemeId.",
"displayName": "Douyin (TikTok China) Video Comments",
"openapi": "3.1.0",
"platformKey": "douyin",
"primaryTag": "Douyin (TikTok China)",
"skillName": "justoneapi_douyin_get_video_comment",
"slug": "justoneapi-douyin-get-video-comment",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Douyin (TikTok China) video Comments data, including authors, text, and likes, for sentiment analysis and engagement review.",
"method": "GET",
"operationId": "getVideoCommentV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique video identifier (aweme_id).",
"enumValues": [],
"location": "query",
"name": "awemeId",
"required": true,
"schemaType": "string"
},
{
"defaultValue": 1,
"description": "Page number (starting from 1).",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "integer"
}
],
"path": "/api/douyin/get-video-comment/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Video Comments",
"tags": [
"Douyin (TikTok China)"
]
}
],
"endpointPath": "get-video-comment",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin/get-video-comment/v1 for Douyin (TikTok China) Video Comments through JustOneAPI with awemeId.",
"displayName": "Douyin (TikTok China) Video Comments",
"endpointPath": "get-video-comment",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Douyin (TikTok China) video Comments data, including authors, text, and likes, for sentiment analysis and engagement review.",
"method": "GET",
"operationId": "getVideoCommentV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique video identifier (aweme_id).",
"enumValues": [],
"location": "query",
"name": "awemeId",
"required": true,
"schemaType": "string"
},
{
"defaultValue": 1,
"description": "Page number (starting from 1).",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "integer"
}
],
"path": "/api/douyin/get-video-comment/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Video Comments",
"tags": [
"Douyin (TikTok China)"
]
}
],
"platformKey": "douyin",
"primaryTag": "Douyin (TikTok China)",
"skillName": "justoneapi_douyin_get_video_comment",
"skillType": "interface",
"slug": "justoneapi-douyin-get-video-comment",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Douyin (TikTok China) Video Comments operations
Generated from JustOneAPI OpenAPI for platform key `douyin`.
Endpoint group: `get-video-comment`.
## `getVideoCommentV1`
- Method: `GET`
- Path: `/api/douyin/get-video-comment/v1`
- Summary: Video Comments
- Description: Get Douyin (TikTok China) video Comments data, including authors, text, and likes, for sentiment analysis and engagement review.
- Tags: `Douyin (TikTok China)`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for this API service. |
| `awemeId` | `query` | yes | `string` | n/a | The unique video identifier (aweme_id). |
| `page` | `query` | no | `integer` | `1` | Page number (starting from 1). |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/douyin/get-user-video-list/v3 for Douyin (TikTok China) User Published Videos through JustOneAPI with secUid.
---
name: Douyin (TikTok China) User Published Videos API
description: Call GET /api/douyin/get-user-video-list/v3 for Douyin (TikTok China) User Published Videos through JustOneAPI with secUid.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_douyin_get_user_video_list"}}
---
# Douyin (TikTok China) User Published Videos
Use this focused JustOneAPI skill for user Published Videos in Douyin (TikTok China). It targets `GET /api/douyin/get-user-video-list/v3`. Required non-token inputs are `secUid`. OpenAPI describes it as: Get Douyin (TikTok China) user Published Videos data, including captions, covers, and publish times, for account monitoring.
## Endpoint Scope
- Platform key: `douyin`
- Endpoint key: `get-user-video-list`
- Platform family: Douyin (TikTok China)
- Skill slug: `justoneapi-douyin-get-user-video-list`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `getUserVideoListV3` | `v3` | `GET` | `/api/douyin/get-user-video-list/v3` | User Published Videos |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `maxCursor` | `query` | n/a | all | `integer` | Pagination cursor; use 0 for the first page, and the `max_cursor` from the previous response for subsequent pages |
| `secUid` | `query` | all | n/a | `string` | The unique user ID (sec_uid) on Douyin |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `getUserVideoListV3` for the documented `v3` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `getUserVideoListV3`.
```bash
node {baseDir}/bin/run.mjs --operation "getUserVideoListV3" --token "$JUST_ONE_API_TOKEN" --params-json '{"secUid":"<secUid>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_get_user_video_list&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_get_user_video_list&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `getUserVideoListV3` on `/api/douyin/get-user-video-list/v3`.
- Echo the required lookup scope (`secUid`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Douyin (TikTok China) user Published Videos data, including captions, covers, and publish times, for account monitoring.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin/get-user-video-list/v3 for Douyin (TikTok China) User Published Videos through JustOneAPI with secUid.",
"displayName": "Douyin (TikTok China) User Published Videos",
"openapi": "3.1.0",
"platformKey": "douyin",
"primaryTag": "Douyin (TikTok China)",
"skillName": "justoneapi_douyin_get_user_video_list",
"slug": "justoneapi-douyin-get-user-video-list",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Douyin (TikTok China) user Published Videos data, including captions, covers, and publish times, for account monitoring.",
"method": "GET",
"operationId": "getUserVideoListV3",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique user ID (sec_uid) on Douyin.",
"enumValues": [],
"location": "query",
"name": "secUid",
"required": true,
"schemaType": "string"
},
{
"defaultValue": 0,
"description": "Pagination cursor; use 0 for the first page, and the `max_cursor` from the previous response for subsequent pages.",
"enumValues": [],
"location": "query",
"name": "maxCursor",
"required": false,
"schemaType": "integer"
}
],
"path": "/api/douyin/get-user-video-list/v3",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "User Published Videos",
"tags": [
"Douyin (TikTok China)"
]
}
],
"endpointPath": "get-user-video-list",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin/get-user-video-list/v3 for Douyin (TikTok China) User Published Videos through JustOneAPI with secUid.",
"displayName": "Douyin (TikTok China) User Published Videos",
"endpointPath": "get-user-video-list",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Douyin (TikTok China) user Published Videos data, including captions, covers, and publish times, for account monitoring.",
"method": "GET",
"operationId": "getUserVideoListV3",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique user ID (sec_uid) on Douyin.",
"enumValues": [],
"location": "query",
"name": "secUid",
"required": true,
"schemaType": "string"
},
{
"defaultValue": 0,
"description": "Pagination cursor; use 0 for the first page, and the `max_cursor` from the previous response for subsequent pages.",
"enumValues": [],
"location": "query",
"name": "maxCursor",
"required": false,
"schemaType": "integer"
}
],
"path": "/api/douyin/get-user-video-list/v3",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "User Published Videos",
"tags": [
"Douyin (TikTok China)"
]
}
],
"platformKey": "douyin",
"primaryTag": "Douyin (TikTok China)",
"skillName": "justoneapi_douyin_get_user_video_list",
"skillType": "interface",
"slug": "justoneapi-douyin-get-user-video-list",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Douyin (TikTok China) User Published Videos operations
Generated from JustOneAPI OpenAPI for platform key `douyin`.
Endpoint group: `get-user-video-list`.
## `getUserVideoListV3`
- Method: `GET`
- Path: `/api/douyin/get-user-video-list/v3`
- Summary: User Published Videos
- Description: Get Douyin (TikTok China) user Published Videos data, including captions, covers, and publish times, for account monitoring.
- Tags: `Douyin (TikTok China)`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for this API service. |
| `secUid` | `query` | yes | `string` | n/a | The unique user ID (sec_uid) on Douyin. |
| `maxCursor` | `query` | no | `integer` | `0` | Pagination cursor; use 0 for the first page, and the `max_cursor` from the previous response for subsequent pages. |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/douyin/get-user-detail/v3 for Douyin (TikTok China) User Profile through JustOneAPI with secUid.
---
name: Douyin (TikTok China) User Profile API
description: Call GET /api/douyin/get-user-detail/v3 for Douyin (TikTok China) User Profile through JustOneAPI with secUid.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_douyin_get_user_detail"}}
---
# Douyin (TikTok China) User Profile
Use this focused JustOneAPI skill for user Profile in Douyin (TikTok China). It targets `GET /api/douyin/get-user-detail/v3`. Required non-token inputs are `secUid`. OpenAPI describes it as: Get Douyin (TikTok China) user Profile data, including follower counts, verification status, and bio details, for creator research and account analysis.
## Endpoint Scope
- Platform key: `douyin`
- Endpoint key: `get-user-detail`
- Platform family: Douyin (TikTok China)
- Skill slug: `justoneapi-douyin-get-user-detail`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `getUserDetailV3` | `v3` | `GET` | `/api/douyin/get-user-detail/v3` | User Profile |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `secUid` | `query` | all | n/a | `string` | The unique user ID (sec_uid) on Douyin |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `getUserDetailV3` for the documented `v3` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `getUserDetailV3`.
```bash
node {baseDir}/bin/run.mjs --operation "getUserDetailV3" --token "$JUST_ONE_API_TOKEN" --params-json '{"secUid":"<secUid>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_get_user_detail&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_get_user_detail&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `getUserDetailV3` on `/api/douyin/get-user-detail/v3`.
- Echo the required lookup scope (`secUid`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Douyin (TikTok China) user Profile data, including follower counts, verification status, and bio details, for creator research and account analysis.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin/get-user-detail/v3 for Douyin (TikTok China) User Profile through JustOneAPI with secUid.",
"displayName": "Douyin (TikTok China) User Profile",
"openapi": "3.1.0",
"platformKey": "douyin",
"primaryTag": "Douyin (TikTok China)",
"skillName": "justoneapi_douyin_get_user_detail",
"slug": "justoneapi-douyin-get-user-detail",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Douyin (TikTok China) user Profile data, including follower counts, verification status, and bio details, for creator research and account analysis.",
"method": "GET",
"operationId": "getUserDetailV3",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique user ID (sec_uid) on Douyin.",
"enumValues": [],
"location": "query",
"name": "secUid",
"required": true,
"schemaType": "string"
}
],
"path": "/api/douyin/get-user-detail/v3",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "User Profile",
"tags": [
"Douyin (TikTok China)"
]
}
],
"endpointPath": "get-user-detail",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin/get-user-detail/v3 for Douyin (TikTok China) User Profile through JustOneAPI with secUid.",
"displayName": "Douyin (TikTok China) User Profile",
"endpointPath": "get-user-detail",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Douyin (TikTok China) user Profile data, including follower counts, verification status, and bio details, for creator research and account analysis.",
"method": "GET",
"operationId": "getUserDetailV3",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique user ID (sec_uid) on Douyin.",
"enumValues": [],
"location": "query",
"name": "secUid",
"required": true,
"schemaType": "string"
}
],
"path": "/api/douyin/get-user-detail/v3",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "User Profile",
"tags": [
"Douyin (TikTok China)"
]
}
],
"platformKey": "douyin",
"primaryTag": "Douyin (TikTok China)",
"skillName": "justoneapi_douyin_get_user_detail",
"skillType": "interface",
"slug": "justoneapi-douyin-get-user-detail",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Douyin (TikTok China) User Profile operations
Generated from JustOneAPI OpenAPI for platform key `douyin`.
Endpoint group: `get-user-detail`.
## `getUserDetailV3`
- Method: `GET`
- Path: `/api/douyin/get-user-detail/v3`
- Summary: User Profile
- Description: Get Douyin (TikTok China) user Profile data, including follower counts, verification status, and bio details, for creator research and account analysis.
- Tags: `Douyin (TikTok China)`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for this API service. |
| `secUid` | `query` | yes | `string` | n/a | The unique user ID (sec_uid) on Douyin. |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/douyin-ec/get-item-detail/v1 for Douyin E-commerce Item Details through JustOneAPI with itemId.
---
name: Douyin E-commerce Item Details API
description: Call GET /api/douyin-ec/get-item-detail/v1 for Douyin E-commerce Item Details through JustOneAPI with itemId.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_douyin_ec_get_item_detail"}}
---
# Douyin E-commerce Item Details
Use this focused JustOneAPI skill for item Details in Douyin E-commerce. It targets `GET /api/douyin-ec/get-item-detail/v1`. Required non-token inputs are `itemId`. OpenAPI describes it as: Get Douyin E-commerce item details, including price, title, and stock, for product monitoring and competitive analysis.
## Endpoint Scope
- Platform key: `douyin-ec`
- Endpoint key: `get-item-detail`
- Platform family: Douyin E-commerce
- Skill slug: `justoneapi-douyin-ec-get-item-detail`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `getDouyinEcItemDetailV1` | `v1` | `GET` | `/api/douyin-ec/get-item-detail/v1` | Item Details |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `itemId` | `query` | all | n/a | `string` | The unique ID of the item on Douyin E-commerce |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `getDouyinEcItemDetailV1` for the documented `v1` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `getDouyinEcItemDetailV1`.
```bash
node {baseDir}/bin/run.mjs --operation "getDouyinEcItemDetailV1" --token "$JUST_ONE_API_TOKEN" --params-json '{"itemId":"<itemId>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_ec_get_item_detail&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douyin_ec_get_item_detail&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `getDouyinEcItemDetailV1` on `/api/douyin-ec/get-item-detail/v1`.
- Echo the required lookup scope (`itemId`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Douyin E-commerce item details, including price, title, and stock, for product monitoring and competitive analysis.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin-ec/get-item-detail/v1 for Douyin E-commerce Item Details through JustOneAPI with itemId.",
"displayName": "Douyin E-commerce Item Details",
"openapi": "3.1.0",
"platformKey": "douyin-ec",
"primaryTag": "Douyin E-commerce",
"skillName": "justoneapi_douyin_ec_get_item_detail",
"slug": "justoneapi-douyin-ec-get-item-detail",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Douyin E-commerce item details, including price, title, and stock, for product monitoring and competitive analysis.",
"method": "GET",
"operationId": "getDouyinEcItemDetailV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique ID of the item on Douyin E-commerce.",
"enumValues": [],
"location": "query",
"name": "itemId",
"required": true,
"schemaType": "string"
}
],
"path": "/api/douyin-ec/get-item-detail/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Item Details",
"tags": [
"Douyin E-commerce"
]
}
],
"endpointPath": "get-item-detail",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douyin-ec/get-item-detail/v1 for Douyin E-commerce Item Details through JustOneAPI with itemId.",
"displayName": "Douyin E-commerce Item Details",
"endpointPath": "get-item-detail",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Douyin E-commerce item details, including price, title, and stock, for product monitoring and competitive analysis.",
"method": "GET",
"operationId": "getDouyinEcItemDetailV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique ID of the item on Douyin E-commerce.",
"enumValues": [],
"location": "query",
"name": "itemId",
"required": true,
"schemaType": "string"
}
],
"path": "/api/douyin-ec/get-item-detail/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Item Details",
"tags": [
"Douyin E-commerce"
]
}
],
"platformKey": "douyin-ec",
"primaryTag": "Douyin E-commerce",
"skillName": "justoneapi_douyin_ec_get_item_detail",
"skillType": "interface",
"slug": "justoneapi-douyin-ec-get-item-detail",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Douyin E-commerce Item Details operations
Generated from JustOneAPI OpenAPI for platform key `douyin-ec`.
Endpoint group: `get-item-detail`.
## `getDouyinEcItemDetailV1`
- Method: `GET`
- Path: `/api/douyin-ec/get-item-detail/v1`
- Summary: Item Details
- Description: Get Douyin E-commerce item details, including price, title, and stock, for product monitoring and competitive analysis.
- Tags: `Douyin E-commerce`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for this API service. |
| `itemId` | `query` | yes | `string` | n/a | The unique ID of the item on Douyin E-commerce. |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/douban/get-subject-detail/v1 for Douban Movie Subject Details through JustOneAPI with subjectId.
---
name: Douban Movie Subject Details API
description: Call GET /api/douban/get-subject-detail/v1 for Douban Movie Subject Details through JustOneAPI with subjectId.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_douban_get_subject_detail"}}
---
# Douban Movie Subject Details
Use this focused JustOneAPI skill for subject Details in Douban Movie. It targets `GET /api/douban/get-subject-detail/v1`. Required non-token inputs are `subjectId`. OpenAPI describes it as: Get Douban subject Details data, including title, rating, and cast, for title enrichment and catalog research.
## Endpoint Scope
- Platform key: `douban`
- Endpoint key: `get-subject-detail`
- Platform family: Douban Movie
- Skill slug: `justoneapi-douban-get-subject-detail`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `getSubjectDetailV1` | `v1` | `GET` | `/api/douban/get-subject-detail/v1` | Subject Details |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `subjectId` | `query` | all | n/a | `string` | The unique ID for a movie or TV subject on Douban |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `getSubjectDetailV1` for the documented `v1` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `getSubjectDetailV1`.
```bash
node {baseDir}/bin/run.mjs --operation "getSubjectDetailV1" --token "$JUST_ONE_API_TOKEN" --params-json '{"subjectId":"<subjectId>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douban_get_subject_detail&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douban_get_subject_detail&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `getSubjectDetailV1` on `/api/douban/get-subject-detail/v1`.
- Echo the required lookup scope (`subjectId`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Douban subject Details data, including title, rating, and cast, for title enrichment and catalog research.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douban/get-subject-detail/v1 for Douban Movie Subject Details through JustOneAPI with subjectId.",
"displayName": "Douban Movie Subject Details",
"openapi": "3.1.0",
"platformKey": "douban",
"primaryTag": "Douban Movie",
"skillName": "justoneapi_douban_get_subject_detail",
"slug": "justoneapi-douban-get-subject-detail",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Douban subject Details data, including title, rating, and cast, for title enrichment and catalog research.",
"method": "GET",
"operationId": "getSubjectDetailV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique ID for a movie or TV subject on Douban.",
"enumValues": [],
"location": "query",
"name": "subjectId",
"required": true,
"schemaType": "string"
}
],
"path": "/api/douban/get-subject-detail/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Subject Details",
"tags": [
"Douban Movie"
]
}
],
"endpointPath": "get-subject-detail",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douban/get-subject-detail/v1 for Douban Movie Subject Details through JustOneAPI with subjectId.",
"displayName": "Douban Movie Subject Details",
"endpointPath": "get-subject-detail",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Douban subject Details data, including title, rating, and cast, for title enrichment and catalog research.",
"method": "GET",
"operationId": "getSubjectDetailV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique ID for a movie or TV subject on Douban.",
"enumValues": [],
"location": "query",
"name": "subjectId",
"required": true,
"schemaType": "string"
}
],
"path": "/api/douban/get-subject-detail/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Subject Details",
"tags": [
"Douban Movie"
]
}
],
"platformKey": "douban",
"primaryTag": "Douban Movie",
"skillName": "justoneapi_douban_get_subject_detail",
"skillType": "interface",
"slug": "justoneapi-douban-get-subject-detail",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Douban Movie Subject Details operations
Generated from JustOneAPI OpenAPI for platform key `douban`.
Endpoint group: `get-subject-detail`.
## `getSubjectDetailV1`
- Method: `GET`
- Path: `/api/douban/get-subject-detail/v1`
- Summary: Subject Details
- Description: Get Douban subject Details data, including title, rating, and cast, for title enrichment and catalog research.
- Tags: `Douban Movie`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for this API service. |
| `subjectId` | `query` | yes | `string` | n/a | The unique ID for a movie or TV subject on Douban. |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/douban/get-recent-hot-tv/v1 for Douban Movie Recent Hot Tv through JustOneAPI.
---
name: Douban Movie Recent Hot Tv API
description: Call GET /api/douban/get-recent-hot-tv/v1 for Douban Movie Recent Hot Tv through JustOneAPI.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_douban_get_recent_hot_tv"}}
---
# Douban Movie Recent Hot Tv
Use this focused JustOneAPI skill for recent Hot Tv in Douban Movie. It targets `GET /api/douban/get-recent-hot-tv/v1`. It has no required non-token parameters. OpenAPI describes it as: Get Douban recent Hot Tv data, including ratings, posters, and subject metadata, for series discovery and trend monitoring.
## Endpoint Scope
- Platform key: `douban`
- Endpoint key: `get-recent-hot-tv`
- Platform family: Douban Movie
- Skill slug: `justoneapi-douban-get-recent-hot-tv`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `getRecentHotTvV1` | `v1` | `GET` | `/api/douban/get-recent-hot-tv/v1` | Recent Hot Tv |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `page` | `query` | n/a | all | `integer` | Page number for pagination |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `getRecentHotTvV1` for the documented `v1` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `getRecentHotTvV1`.
```bash
node {baseDir}/bin/run.mjs --operation "getRecentHotTvV1" --token "$JUST_ONE_API_TOKEN" --params-json '{"key":"value"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douban_get_recent_hot_tv&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douban_get_recent_hot_tv&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `getRecentHotTvV1` on `/api/douban/get-recent-hot-tv/v1`.
- Prioritize fields that support this endpoint purpose: Get Douban recent Hot Tv data, including ratings, posters, and subject metadata, for series discovery and trend monitoring.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douban/get-recent-hot-tv/v1 for Douban Movie Recent Hot Tv through JustOneAPI.",
"displayName": "Douban Movie Recent Hot Tv",
"openapi": "3.1.0",
"platformKey": "douban",
"primaryTag": "Douban Movie",
"skillName": "justoneapi_douban_get_recent_hot_tv",
"slug": "justoneapi-douban-get-recent-hot-tv",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Douban recent Hot Tv data, including ratings, posters, and subject metadata, for series discovery and trend monitoring.",
"method": "GET",
"operationId": "getRecentHotTvV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": 1,
"description": "Page number for pagination.",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "integer"
}
],
"path": "/api/douban/get-recent-hot-tv/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Recent Hot Tv",
"tags": [
"Douban Movie"
]
}
],
"endpointPath": "get-recent-hot-tv",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douban/get-recent-hot-tv/v1 for Douban Movie Recent Hot Tv through JustOneAPI.",
"displayName": "Douban Movie Recent Hot Tv",
"endpointPath": "get-recent-hot-tv",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Douban recent Hot Tv data, including ratings, posters, and subject metadata, for series discovery and trend monitoring.",
"method": "GET",
"operationId": "getRecentHotTvV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": 1,
"description": "Page number for pagination.",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "integer"
}
],
"path": "/api/douban/get-recent-hot-tv/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Recent Hot Tv",
"tags": [
"Douban Movie"
]
}
],
"platformKey": "douban",
"primaryTag": "Douban Movie",
"skillName": "justoneapi_douban_get_recent_hot_tv",
"skillType": "interface",
"slug": "justoneapi-douban-get-recent-hot-tv",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Douban Movie Recent Hot Tv operations
Generated from JustOneAPI OpenAPI for platform key `douban`.
Endpoint group: `get-recent-hot-tv`.
## `getRecentHotTvV1`
- Method: `GET`
- Path: `/api/douban/get-recent-hot-tv/v1`
- Summary: Recent Hot Tv
- Description: Get Douban recent Hot Tv data, including ratings, posters, and subject metadata, for series discovery and trend monitoring.
- Tags: `Douban Movie`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for this API service. |
| `page` | `query` | no | `integer` | `1` | Page number for pagination. |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/douban/get-recent-hot-movie/v1 for Douban Movie Recent Hot Movie through JustOneAPI.
---
name: Douban Movie Recent Hot Movie API
description: Call GET /api/douban/get-recent-hot-movie/v1 for Douban Movie Recent Hot Movie through JustOneAPI.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_douban_get_recent_hot_movie"}}
---
# Douban Movie Recent Hot Movie
Use this focused JustOneAPI skill for recent Hot Movie in Douban Movie. It targets `GET /api/douban/get-recent-hot-movie/v1`. It has no required non-token parameters. OpenAPI describes it as: Get Douban recent Hot Movie data, including ratings, posters, and subject metadata, for movie discovery and trend monitoring.
## Endpoint Scope
- Platform key: `douban`
- Endpoint key: `get-recent-hot-movie`
- Platform family: Douban Movie
- Skill slug: `justoneapi-douban-get-recent-hot-movie`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `getRecentHotMovieV1` | `v1` | `GET` | `/api/douban/get-recent-hot-movie/v1` | Recent Hot Movie |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `page` | `query` | n/a | all | `integer` | Page number for pagination |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `getRecentHotMovieV1` for the documented `v1` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `getRecentHotMovieV1`.
```bash
node {baseDir}/bin/run.mjs --operation "getRecentHotMovieV1" --token "$JUST_ONE_API_TOKEN" --params-json '{"key":"value"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douban_get_recent_hot_movie&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douban_get_recent_hot_movie&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `getRecentHotMovieV1` on `/api/douban/get-recent-hot-movie/v1`.
- Prioritize fields that support this endpoint purpose: Get Douban recent Hot Movie data, including ratings, posters, and subject metadata, for movie discovery and trend monitoring.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douban/get-recent-hot-movie/v1 for Douban Movie Recent Hot Movie through JustOneAPI.",
"displayName": "Douban Movie Recent Hot Movie",
"openapi": "3.1.0",
"platformKey": "douban",
"primaryTag": "Douban Movie",
"skillName": "justoneapi_douban_get_recent_hot_movie",
"slug": "justoneapi-douban-get-recent-hot-movie",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Douban recent Hot Movie data, including ratings, posters, and subject metadata, for movie discovery and trend monitoring.",
"method": "GET",
"operationId": "getRecentHotMovieV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": 1,
"description": "Page number for pagination.",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "integer"
}
],
"path": "/api/douban/get-recent-hot-movie/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Recent Hot Movie",
"tags": [
"Douban Movie"
]
}
],
"endpointPath": "get-recent-hot-movie",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douban/get-recent-hot-movie/v1 for Douban Movie Recent Hot Movie through JustOneAPI.",
"displayName": "Douban Movie Recent Hot Movie",
"endpointPath": "get-recent-hot-movie",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Douban recent Hot Movie data, including ratings, posters, and subject metadata, for movie discovery and trend monitoring.",
"method": "GET",
"operationId": "getRecentHotMovieV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": 1,
"description": "Page number for pagination.",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "integer"
}
],
"path": "/api/douban/get-recent-hot-movie/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Recent Hot Movie",
"tags": [
"Douban Movie"
]
}
],
"platformKey": "douban",
"primaryTag": "Douban Movie",
"skillName": "justoneapi_douban_get_recent_hot_movie",
"skillType": "interface",
"slug": "justoneapi-douban-get-recent-hot-movie",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Douban Movie Recent Hot Movie operations
Generated from JustOneAPI OpenAPI for platform key `douban`.
Endpoint group: `get-recent-hot-movie`.
## `getRecentHotMovieV1`
- Method: `GET`
- Path: `/api/douban/get-recent-hot-movie/v1`
- Summary: Recent Hot Movie
- Description: Get Douban recent Hot Movie data, including ratings, posters, and subject metadata, for movie discovery and trend monitoring.
- Tags: `Douban Movie`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for this API service. |
| `page` | `query` | no | `integer` | `1` | Page number for pagination. |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/douban/get-movie-reviews/v1 for Douban Movie Movie Reviews through JustOneAPI with subjectId.
---
name: Douban Movie Movie Reviews API
description: Call GET /api/douban/get-movie-reviews/v1 for Douban Movie Movie Reviews through JustOneAPI with subjectId.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_douban_get_movie_reviews"}}
---
# Douban Movie Movie Reviews
Use this focused JustOneAPI skill for movie Reviews in Douban Movie. It targets `GET /api/douban/get-movie-reviews/v1`. Required non-token inputs are `subjectId`. OpenAPI describes it as: Get Douban movie Reviews data, including review titles, ratings, and snippets, for audience sentiment analysis and review research.
## Endpoint Scope
- Platform key: `douban`
- Endpoint key: `get-movie-reviews`
- Platform family: Douban Movie
- Skill slug: `justoneapi-douban-get-movie-reviews`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `getMovieReviewsV1` | `v1` | `GET` | `/api/douban/get-movie-reviews/v1` | Movie Reviews |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `page` | `query` | n/a | all | `integer` | Page number for pagination |
| `sort` | `query` | n/a | all | `string` | Sort order for the result set. Available Values: - `time`: Time - `hotest`: Hotest |
| `sort` enum | values | n/a | n/a | n/a | `hotest`, `time` |
| `subjectId` | `query` | all | n/a | `string` | The unique ID for a movie or TV subject on Douban |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `getMovieReviewsV1` for the documented `v1` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `getMovieReviewsV1`.
```bash
node {baseDir}/bin/run.mjs --operation "getMovieReviewsV1" --token "$JUST_ONE_API_TOKEN" --params-json '{"subjectId":"<subjectId>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douban_get_movie_reviews&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douban_get_movie_reviews&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `getMovieReviewsV1` on `/api/douban/get-movie-reviews/v1`.
- Echo the required lookup scope (`subjectId`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Douban movie Reviews data, including review titles, ratings, and snippets, for audience sentiment analysis and review research.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douban/get-movie-reviews/v1 for Douban Movie Movie Reviews through JustOneAPI with subjectId.",
"displayName": "Douban Movie Movie Reviews",
"openapi": "3.1.0",
"platformKey": "douban",
"primaryTag": "Douban Movie",
"skillName": "justoneapi_douban_get_movie_reviews",
"slug": "justoneapi-douban-get-movie-reviews",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Douban movie Reviews data, including review titles, ratings, and snippets, for audience sentiment analysis and review research.",
"method": "GET",
"operationId": "getMovieReviewsV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique ID for a movie or TV subject on Douban.",
"enumValues": [],
"location": "query",
"name": "subjectId",
"required": true,
"schemaType": "string"
},
{
"defaultValue": "time",
"description": "Sort order for the result set.\n\nAvailable Values:\n- `time`: Time\n- `hotest`: Hotest",
"enumValues": [
"time",
"hotest"
],
"location": "query",
"name": "sort",
"required": false,
"schemaType": "string"
},
{
"defaultValue": 1,
"description": "Page number for pagination.",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "integer"
}
],
"path": "/api/douban/get-movie-reviews/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Movie Reviews",
"tags": [
"Douban Movie"
]
}
],
"endpointPath": "get-movie-reviews",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douban/get-movie-reviews/v1 for Douban Movie Movie Reviews through JustOneAPI with subjectId.",
"displayName": "Douban Movie Movie Reviews",
"endpointPath": "get-movie-reviews",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Douban movie Reviews data, including review titles, ratings, and snippets, for audience sentiment analysis and review research.",
"method": "GET",
"operationId": "getMovieReviewsV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique ID for a movie or TV subject on Douban.",
"enumValues": [],
"location": "query",
"name": "subjectId",
"required": true,
"schemaType": "string"
},
{
"defaultValue": "time",
"description": "Sort order for the result set.\n\nAvailable Values:\n- `time`: Time\n- `hotest`: Hotest",
"enumValues": [
"time",
"hotest"
],
"location": "query",
"name": "sort",
"required": false,
"schemaType": "string"
},
{
"defaultValue": 1,
"description": "Page number for pagination.",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "integer"
}
],
"path": "/api/douban/get-movie-reviews/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Movie Reviews",
"tags": [
"Douban Movie"
]
}
],
"platformKey": "douban",
"primaryTag": "Douban Movie",
"skillName": "justoneapi_douban_get_movie_reviews",
"skillType": "interface",
"slug": "justoneapi-douban-get-movie-reviews",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Douban Movie Movie Reviews operations
Generated from JustOneAPI OpenAPI for platform key `douban`.
Endpoint group: `get-movie-reviews`.
## `getMovieReviewsV1`
- Method: `GET`
- Path: `/api/douban/get-movie-reviews/v1`
- Summary: Movie Reviews
- Description: Get Douban movie Reviews data, including review titles, ratings, and snippets, for audience sentiment analysis and review research.
- Tags: `Douban Movie`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for this API service. |
| `subjectId` | `query` | yes | `string` | n/a | The unique ID for a movie or TV subject on Douban. |
| `sort` | `query` | no | `string` | `time` | Sort order for the result set.
Available Values:
- `time`: Time
- `hotest`: Hotest |
| enum | values | no | n/a | n/a | `time`, `hotest` |
| `page` | `query` | no | `integer` | `1` | Page number for pagination. |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/douban/get-movie-review-detail/v1 for Douban Movie Review Details through JustOneAPI with reviewId.
---
name: Douban Movie Review Details API
description: Call GET /api/douban/get-movie-review-detail/v1 for Douban Movie Review Details through JustOneAPI with reviewId.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_douban_get_movie_review_detail"}}
---
# Douban Movie Review Details
Use this focused JustOneAPI skill for review Details in Douban Movie. It targets `GET /api/douban/get-movie-review-detail/v1`. Required non-token inputs are `reviewId`. OpenAPI describes it as: Get Douban movie Review Details data, including metadata, content fields, and engagement signals, for review archiving and detailed opinion analysis.
## Endpoint Scope
- Platform key: `douban`
- Endpoint key: `get-movie-review-detail`
- Platform family: Douban Movie
- Skill slug: `justoneapi-douban-get-movie-review-detail`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `getMovieReviewDetailsV1` | `v1` | `GET` | `/api/douban/get-movie-review-detail/v1` | Review Details |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `reviewId` | `query` | all | n/a | `string` | The unique ID for a specific review on Douban |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `getMovieReviewDetailsV1` for the documented `v1` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `getMovieReviewDetailsV1`.
```bash
node {baseDir}/bin/run.mjs --operation "getMovieReviewDetailsV1" --token "$JUST_ONE_API_TOKEN" --params-json '{"reviewId":"<reviewId>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douban_get_movie_review_detail&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douban_get_movie_review_detail&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `getMovieReviewDetailsV1` on `/api/douban/get-movie-review-detail/v1`.
- Echo the required lookup scope (`reviewId`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Douban movie Review Details data, including metadata, content fields, and engagement signals, for review archiving and detailed opinion analysis.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douban/get-movie-review-detail/v1 for Douban Movie Review Details through JustOneAPI with reviewId.",
"displayName": "Douban Movie Review Details",
"openapi": "3.1.0",
"platformKey": "douban",
"primaryTag": "Douban Movie",
"skillName": "justoneapi_douban_get_movie_review_detail",
"slug": "justoneapi-douban-get-movie-review-detail",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Douban movie Review Details data, including metadata, content fields, and engagement signals, for review archiving and detailed opinion analysis.",
"method": "GET",
"operationId": "getMovieReviewDetailsV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique ID for a specific review on Douban.",
"enumValues": [],
"location": "query",
"name": "reviewId",
"required": true,
"schemaType": "string"
}
],
"path": "/api/douban/get-movie-review-detail/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Review Details",
"tags": [
"Douban Movie"
]
}
],
"endpointPath": "get-movie-review-detail",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douban/get-movie-review-detail/v1 for Douban Movie Review Details through JustOneAPI with reviewId.",
"displayName": "Douban Movie Review Details",
"endpointPath": "get-movie-review-detail",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Douban movie Review Details data, including metadata, content fields, and engagement signals, for review archiving and detailed opinion analysis.",
"method": "GET",
"operationId": "getMovieReviewDetailsV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique ID for a specific review on Douban.",
"enumValues": [],
"location": "query",
"name": "reviewId",
"required": true,
"schemaType": "string"
}
],
"path": "/api/douban/get-movie-review-detail/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Review Details",
"tags": [
"Douban Movie"
]
}
],
"platformKey": "douban",
"primaryTag": "Douban Movie",
"skillName": "justoneapi_douban_get_movie_review_detail",
"skillType": "interface",
"slug": "justoneapi-douban-get-movie-review-detail",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Douban Movie Review Details operations
Generated from JustOneAPI OpenAPI for platform key `douban`.
Endpoint group: `get-movie-review-detail`.
## `getMovieReviewDetailsV1`
- Method: `GET`
- Path: `/api/douban/get-movie-review-detail/v1`
- Summary: Review Details
- Description: Get Douban movie Review Details data, including metadata, content fields, and engagement signals, for review archiving and detailed opinion analysis.
- Tags: `Douban Movie`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for this API service. |
| `reviewId` | `query` | yes | `string` | n/a | The unique ID for a specific review on Douban. |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/douban/get-movie-comments/v1 for Douban Movie Comments through JustOneAPI with subjectId.
---
name: Douban Movie Comments API
description: Call GET /api/douban/get-movie-comments/v1 for Douban Movie Comments through JustOneAPI with subjectId.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_douban_get_movie_comments"}}
---
# Douban Movie Comments
Use this focused JustOneAPI skill for comments in Douban Movie. It targets `GET /api/douban/get-movie-comments/v1`. Required non-token inputs are `subjectId`. OpenAPI describes it as: Get Douban movie Comments data, including ratings, snippets, and interaction counts, for quick sentiment sampling and review monitoring.
## Endpoint Scope
- Platform key: `douban`
- Endpoint key: `get-movie-comments`
- Platform family: Douban Movie
- Skill slug: `justoneapi-douban-get-movie-comments`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `getMovieCommentsV1` | `v1` | `GET` | `/api/douban/get-movie-comments/v1` | Comments |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `page` | `query` | n/a | all | `integer` | Page number for pagination |
| `sort` | `query` | n/a | all | `string` | Sort order for the result set. Available Values: - `time`: Time - `new_score`: New Score |
| `sort` enum | values | n/a | n/a | n/a | `new_score`, `time` |
| `subjectId` | `query` | all | n/a | `string` | The unique ID for a movie or TV subject on Douban |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `getMovieCommentsV1` for the documented `v1` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `getMovieCommentsV1`.
```bash
node {baseDir}/bin/run.mjs --operation "getMovieCommentsV1" --token "$JUST_ONE_API_TOKEN" --params-json '{"subjectId":"<subjectId>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douban_get_movie_comments&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_douban_get_movie_comments&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `getMovieCommentsV1` on `/api/douban/get-movie-comments/v1`.
- Echo the required lookup scope (`subjectId`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Douban movie Comments data, including ratings, snippets, and interaction counts, for quick sentiment sampling and review monitoring.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douban/get-movie-comments/v1 for Douban Movie Comments through JustOneAPI with subjectId.",
"displayName": "Douban Movie Comments",
"openapi": "3.1.0",
"platformKey": "douban",
"primaryTag": "Douban Movie",
"skillName": "justoneapi_douban_get_movie_comments",
"slug": "justoneapi-douban-get-movie-comments",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Douban movie Comments data, including ratings, snippets, and interaction counts, for quick sentiment sampling and review monitoring.",
"method": "GET",
"operationId": "getMovieCommentsV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique ID for a movie or TV subject on Douban.",
"enumValues": [],
"location": "query",
"name": "subjectId",
"required": true,
"schemaType": "string"
},
{
"defaultValue": "time",
"description": "Sort order for the result set.\n\nAvailable Values:\n- `time`: Time\n- `new_score`: New Score",
"enumValues": [
"time",
"new_score"
],
"location": "query",
"name": "sort",
"required": false,
"schemaType": "string"
},
{
"defaultValue": 1,
"description": "Page number for pagination.",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "integer"
}
],
"path": "/api/douban/get-movie-comments/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Comments",
"tags": [
"Douban Movie"
]
}
],
"endpointPath": "get-movie-comments",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/douban/get-movie-comments/v1 for Douban Movie Comments through JustOneAPI with subjectId.",
"displayName": "Douban Movie Comments",
"endpointPath": "get-movie-comments",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Douban movie Comments data, including ratings, snippets, and interaction counts, for quick sentiment sampling and review monitoring.",
"method": "GET",
"operationId": "getMovieCommentsV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for this API service.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "The unique ID for a movie or TV subject on Douban.",
"enumValues": [],
"location": "query",
"name": "subjectId",
"required": true,
"schemaType": "string"
},
{
"defaultValue": "time",
"description": "Sort order for the result set.\n\nAvailable Values:\n- `time`: Time\n- `new_score`: New Score",
"enumValues": [
"time",
"new_score"
],
"location": "query",
"name": "sort",
"required": false,
"schemaType": "string"
},
{
"defaultValue": 1,
"description": "Page number for pagination.",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "integer"
}
],
"path": "/api/douban/get-movie-comments/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Comments",
"tags": [
"Douban Movie"
]
}
],
"platformKey": "douban",
"primaryTag": "Douban Movie",
"skillName": "justoneapi_douban_get_movie_comments",
"skillType": "interface",
"slug": "justoneapi-douban-get-movie-comments",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Douban Movie Comments operations
Generated from JustOneAPI OpenAPI for platform key `douban`.
Endpoint group: `get-movie-comments`.
## `getMovieCommentsV1`
- Method: `GET`
- Path: `/api/douban/get-movie-comments/v1`
- Summary: Comments
- Description: Get Douban movie Comments data, including ratings, snippets, and interaction counts, for quick sentiment sampling and review monitoring.
- Tags: `Douban Movie`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for this API service. |
| `subjectId` | `query` | yes | `string` | n/a | The unique ID for a movie or TV subject on Douban. |
| `sort` | `query` | no | `string` | `time` | Sort order for the result set.
Available Values:
- `time`: Time
- `new_score`: New Score |
| enum | values | no | n/a | n/a | `time`, `new_score` |
| `page` | `query` | no | `integer` | `1` | Page number for pagination. |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/bilibili/share-url-transfer/v1 for Bilibili Share Link Resolution through JustOneAPI with shareUrl.
---
name: Bilibili Share Link Resolution API
description: Call GET /api/bilibili/share-url-transfer/v1 for Bilibili Share Link Resolution through JustOneAPI with shareUrl.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_bilibili_share_url_transfer"}}
---
# Bilibili Share Link Resolution
Use this focused JustOneAPI skill for share Link Resolution in Bilibili. It targets `GET /api/bilibili/share-url-transfer/v1`. Required non-token inputs are `shareUrl`. OpenAPI describes it as: Get Bilibili share Link Resolution data, including resolved video and page identifier, for converting shortened mobile share links to standard bvid/metadata and automating content extraction from shared social media links.
## Endpoint Scope
- Platform key: `bilibili`
- Endpoint key: `share-url-transfer`
- Platform family: Bilibili
- Skill slug: `justoneapi-bilibili-share-url-transfer`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `shareBilibiliUrlTransferV1` | `v1` | `GET` | `/api/bilibili/share-url-transfer/v1` | Share Link Resolution |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `shareUrl` | `query` | all | n/a | `string` | Bilibili share URL (must start with https://b23.tv/) |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `shareBilibiliUrlTransferV1` for the documented `v1` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `shareBilibiliUrlTransferV1`.
```bash
node {baseDir}/bin/run.mjs --operation "shareBilibiliUrlTransferV1" --token "$JUST_ONE_API_TOKEN" --params-json '{"shareUrl":"<shareUrl>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_bilibili_share_url_transfer&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_bilibili_share_url_transfer&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `shareBilibiliUrlTransferV1` on `/api/bilibili/share-url-transfer/v1`.
- Echo the required lookup scope (`shareUrl`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Bilibili share Link Resolution data, including resolved video and page identifier, for converting shortened mobile share links to standard bvid/metadata and automating content extraction from shared social media links.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/bilibili/share-url-transfer/v1 for Bilibili Share Link Resolution through JustOneAPI with shareUrl.",
"displayName": "Bilibili Share Link Resolution",
"openapi": "3.1.0",
"platformKey": "bilibili",
"primaryTag": "Bilibili",
"skillName": "justoneapi_bilibili_share_url_transfer",
"slug": "justoneapi-bilibili-share-url-transfer",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Bilibili share Link Resolution data, including resolved video and page identifier, for converting shortened mobile share links to standard bvid/metadata and automating content extraction from shared social media links.",
"method": "GET",
"operationId": "shareBilibiliUrlTransferV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for the API.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili share URL (must start with https://b23.tv/).",
"enumValues": [],
"location": "query",
"name": "shareUrl",
"required": true,
"schemaType": "string"
}
],
"path": "/api/bilibili/share-url-transfer/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Share Link Resolution",
"tags": [
"Bilibili"
]
}
],
"endpointPath": "share-url-transfer",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/bilibili/share-url-transfer/v1 for Bilibili Share Link Resolution through JustOneAPI with shareUrl.",
"displayName": "Bilibili Share Link Resolution",
"endpointPath": "share-url-transfer",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Bilibili share Link Resolution data, including resolved video and page identifier, for converting shortened mobile share links to standard bvid/metadata and automating content extraction from shared social media links.",
"method": "GET",
"operationId": "shareBilibiliUrlTransferV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for the API.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili share URL (must start with https://b23.tv/).",
"enumValues": [],
"location": "query",
"name": "shareUrl",
"required": true,
"schemaType": "string"
}
],
"path": "/api/bilibili/share-url-transfer/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Share Link Resolution",
"tags": [
"Bilibili"
]
}
],
"platformKey": "bilibili",
"primaryTag": "Bilibili",
"skillName": "justoneapi_bilibili_share_url_transfer",
"skillType": "interface",
"slug": "justoneapi-bilibili-share-url-transfer",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Bilibili Share Link Resolution operations
Generated from JustOneAPI OpenAPI for platform key `bilibili`.
Endpoint group: `share-url-transfer`.
## `shareBilibiliUrlTransferV1`
- Method: `GET`
- Path: `/api/bilibili/share-url-transfer/v1`
- Summary: Share Link Resolution
- Description: Get Bilibili share Link Resolution data, including resolved video and page identifier, for converting shortened mobile share links to standard bvid/metadata and automating content extraction from shared social media links.
- Tags: `Bilibili`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for the API. |
| `shareUrl` | `query` | yes | `string` | n/a | Bilibili share URL (must start with https://b23.tv/). |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/bilibili/search-video/v2 for Bilibili Video Search through JustOneAPI with keyword.
---
name: Bilibili Video Search API
description: Call GET /api/bilibili/search-video/v2 for Bilibili Video Search through JustOneAPI with keyword.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_bilibili_search_video"}}
---
# Bilibili Video Search
Use this focused JustOneAPI skill for video Search in Bilibili. It targets `GET /api/bilibili/search-video/v2`. Required non-token inputs are `keyword`. OpenAPI describes it as: Get Bilibili video Search data, including matched videos, creators, and engagement metrics, for topic research and content discovery.
## Endpoint Scope
- Platform key: `bilibili`
- Endpoint key: `search-video`
- Platform family: Bilibili
- Skill slug: `justoneapi-bilibili-search-video`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `searchBilibiliVideoV2` | `v2` | `GET` | `/api/bilibili/search-video/v2` | Video Search |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `keyword` | `query` | all | n/a | `string` | Search keyword |
| `order` | `query` | n/a | all | `string` | Sorting criteria for search results. Available Values: - `general`: General - `click`: Most Played - `pubdate`: Latest - `dm`: Most Danmaku - `stow`: Most Favorite |
| `order` enum | values | n/a | n/a | n/a | `click`, `dm`, `general`, `pubdate`, `stow` |
| `page` | `query` | n/a | all | `string` | Page number for pagination |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `searchBilibiliVideoV2` for the documented `v2` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `searchBilibiliVideoV2`.
```bash
node {baseDir}/bin/run.mjs --operation "searchBilibiliVideoV2" --token "$JUST_ONE_API_TOKEN" --params-json '{"keyword":"<keyword>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_bilibili_search_video&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_bilibili_search_video&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `searchBilibiliVideoV2` on `/api/bilibili/search-video/v2`.
- Echo the required lookup scope (`keyword`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Bilibili video Search data, including matched videos, creators, and engagement metrics, for topic research and content discovery.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/bilibili/search-video/v2 for Bilibili Video Search through JustOneAPI with keyword.",
"displayName": "Bilibili Video Search",
"openapi": "3.1.0",
"platformKey": "bilibili",
"primaryTag": "Bilibili",
"skillName": "justoneapi_bilibili_search_video",
"slug": "justoneapi-bilibili-search-video",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Bilibili video Search data, including matched videos, creators, and engagement metrics, for topic research and content discovery.",
"method": "GET",
"operationId": "searchBilibiliVideoV2",
"parameters": [
{
"defaultValue": null,
"description": "Access token for the API.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Search keyword.",
"enumValues": [],
"location": "query",
"name": "keyword",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Page number for pagination.",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "string"
},
{
"defaultValue": "general",
"description": "Sorting criteria for search results.\n\nAvailable Values:\n- `general`: General\n- `click`: Most Played\n- `pubdate`: Latest\n- `dm`: Most Danmaku\n- `stow`: Most Favorite",
"enumValues": [
"general",
"click",
"pubdate",
"dm",
"stow"
],
"location": "query",
"name": "order",
"required": false,
"schemaType": "string"
}
],
"path": "/api/bilibili/search-video/v2",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Video Search",
"tags": [
"Bilibili"
]
}
],
"endpointPath": "search-video",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/bilibili/search-video/v2 for Bilibili Video Search through JustOneAPI with keyword.",
"displayName": "Bilibili Video Search",
"endpointPath": "search-video",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Bilibili video Search data, including matched videos, creators, and engagement metrics, for topic research and content discovery.",
"method": "GET",
"operationId": "searchBilibiliVideoV2",
"parameters": [
{
"defaultValue": null,
"description": "Access token for the API.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Search keyword.",
"enumValues": [],
"location": "query",
"name": "keyword",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Page number for pagination.",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "string"
},
{
"defaultValue": "general",
"description": "Sorting criteria for search results.\n\nAvailable Values:\n- `general`: General\n- `click`: Most Played\n- `pubdate`: Latest\n- `dm`: Most Danmaku\n- `stow`: Most Favorite",
"enumValues": [
"general",
"click",
"pubdate",
"dm",
"stow"
],
"location": "query",
"name": "order",
"required": false,
"schemaType": "string"
}
],
"path": "/api/bilibili/search-video/v2",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Video Search",
"tags": [
"Bilibili"
]
}
],
"platformKey": "bilibili",
"primaryTag": "Bilibili",
"skillName": "justoneapi_bilibili_search_video",
"skillType": "interface",
"slug": "justoneapi-bilibili-search-video",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Bilibili Video Search operations
Generated from JustOneAPI OpenAPI for platform key `bilibili`.
Endpoint group: `search-video`.
## `searchBilibiliVideoV2`
- Method: `GET`
- Path: `/api/bilibili/search-video/v2`
- Summary: Video Search
- Description: Get Bilibili video Search data, including matched videos, creators, and engagement metrics, for topic research and content discovery.
- Tags: `Bilibili`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for the API. |
| `keyword` | `query` | yes | `string` | n/a | Search keyword. |
| `page` | `query` | no | `string` | n/a | Page number for pagination. |
| `order` | `query` | no | `string` | `general` | Sorting criteria for search results.
Available Values:
- `general`: General
- `click`: Most Played
- `pubdate`: Latest
- `dm`: Most Danmaku
- `stow`: Most Favorite |
| enum | values | no | n/a | n/a | `general`, `click`, `pubdate`, `dm`, `stow` |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/bilibili/get-video-detail/v2 for Bilibili Video Details through JustOneAPI with bvid.
---
name: Bilibili Video Details API
description: Call GET /api/bilibili/get-video-detail/v2 for Bilibili Video Details through JustOneAPI with bvid.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_bilibili_get_video_detail"}}
---
# Bilibili Video Details
Use this focused JustOneAPI skill for video Details in Bilibili. It targets `GET /api/bilibili/get-video-detail/v2`. Required non-token inputs are `bvid`. OpenAPI describes it as: Get Bilibili video Details data, including metadata (title, tags, and publishing time), for tracking video performance and engagement metrics and analyzing content metadata and uploader information.
## Endpoint Scope
- Platform key: `bilibili`
- Endpoint key: `get-video-detail`
- Platform family: Bilibili
- Skill slug: `justoneapi-bilibili-get-video-detail`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `getBilibiliVideoDetailV2` | `v2` | `GET` | `/api/bilibili/get-video-detail/v2` | Video Details |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `bvid` | `query` | all | n/a | `string` | Bilibili Video ID (BVID) |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `getBilibiliVideoDetailV2` for the documented `v2` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `getBilibiliVideoDetailV2`.
```bash
node {baseDir}/bin/run.mjs --operation "getBilibiliVideoDetailV2" --token "$JUST_ONE_API_TOKEN" --params-json '{"bvid":"<bvid>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_bilibili_get_video_detail&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_bilibili_get_video_detail&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `getBilibiliVideoDetailV2` on `/api/bilibili/get-video-detail/v2`.
- Echo the required lookup scope (`bvid`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Bilibili video Details data, including metadata (title, tags, and publishing time), for tracking video performance and engagement metrics and analyzing content metadata and uploader information.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/bilibili/get-video-detail/v2 for Bilibili Video Details through JustOneAPI with bvid.",
"displayName": "Bilibili Video Details",
"openapi": "3.1.0",
"platformKey": "bilibili",
"primaryTag": "Bilibili",
"skillName": "justoneapi_bilibili_get_video_detail",
"slug": "justoneapi-bilibili-get-video-detail",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Bilibili video Details data, including metadata (title, tags, and publishing time), for tracking video performance and engagement metrics and analyzing content metadata and uploader information.",
"method": "GET",
"operationId": "getBilibiliVideoDetailV2",
"parameters": [
{
"defaultValue": null,
"description": "Access token for the API.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili Video ID (BVID).",
"enumValues": [],
"location": "query",
"name": "bvid",
"required": true,
"schemaType": "string"
}
],
"path": "/api/bilibili/get-video-detail/v2",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Video Details",
"tags": [
"Bilibili"
]
}
],
"endpointPath": "get-video-detail",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/bilibili/get-video-detail/v2 for Bilibili Video Details through JustOneAPI with bvid.",
"displayName": "Bilibili Video Details",
"endpointPath": "get-video-detail",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Bilibili video Details data, including metadata (title, tags, and publishing time), for tracking video performance and engagement metrics and analyzing content metadata and uploader information.",
"method": "GET",
"operationId": "getBilibiliVideoDetailV2",
"parameters": [
{
"defaultValue": null,
"description": "Access token for the API.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili Video ID (BVID).",
"enumValues": [],
"location": "query",
"name": "bvid",
"required": true,
"schemaType": "string"
}
],
"path": "/api/bilibili/get-video-detail/v2",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Video Details",
"tags": [
"Bilibili"
]
}
],
"platformKey": "bilibili",
"primaryTag": "Bilibili",
"skillName": "justoneapi_bilibili_get_video_detail",
"skillType": "interface",
"slug": "justoneapi-bilibili-get-video-detail",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Bilibili Video Details operations
Generated from JustOneAPI OpenAPI for platform key `bilibili`.
Endpoint group: `get-video-detail`.
## `getBilibiliVideoDetailV2`
- Method: `GET`
- Path: `/api/bilibili/get-video-detail/v2`
- Summary: Video Details
- Description: Get Bilibili video Details data, including metadata (title, tags, and publishing time), for tracking video performance and engagement metrics and analyzing content metadata and uploader information.
- Tags: `Bilibili`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for the API. |
| `bvid` | `query` | yes | `string` | n/a | Bilibili Video ID (BVID). |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/bilibili/get-video-danmu/v2 for Bilibili Video Danmaku through JustOneAPI with aid and cid.
---
name: Bilibili Video Danmaku API
description: Call GET /api/bilibili/get-video-danmu/v2 for Bilibili Video Danmaku through JustOneAPI with aid and cid.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_bilibili_get_video_danmu"}}
---
# Bilibili Video Danmaku
Use this focused JustOneAPI skill for video Danmaku in Bilibili. It targets `GET /api/bilibili/get-video-danmu/v2`. Required non-token inputs are `aid` and `cid`. OpenAPI describes it as: Get Bilibili video Danmaku data, including timeline positions and comment text, for audience reaction analysis and subtitle-style comment review.
## Endpoint Scope
- Platform key: `bilibili`
- Endpoint key: `get-video-danmu`
- Platform family: Bilibili
- Skill slug: `justoneapi-bilibili-get-video-danmu`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `getVideoDanmuV2` | `v2` | `GET` | `/api/bilibili/get-video-danmu/v2` | Video Danmaku |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `aid` | `query` | all | n/a | `string` | Bilibili Archive ID (AID) |
| `cid` | `query` | all | n/a | `string` | Bilibili Chat ID (CID) |
| `page` | `query` | n/a | all | `string` | Page number for pagination |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `getVideoDanmuV2` for the documented `v2` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `getVideoDanmuV2`.
```bash
node {baseDir}/bin/run.mjs --operation "getVideoDanmuV2" --token "$JUST_ONE_API_TOKEN" --params-json '{"aid":"<aid>","cid":"<cid>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_bilibili_get_video_danmu&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_bilibili_get_video_danmu&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `getVideoDanmuV2` on `/api/bilibili/get-video-danmu/v2`.
- Echo the required lookup scope (`aid` and `cid`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Bilibili video Danmaku data, including timeline positions and comment text, for audience reaction analysis and subtitle-style comment review.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/bilibili/get-video-danmu/v2 for Bilibili Video Danmaku through JustOneAPI with aid and cid.",
"displayName": "Bilibili Video Danmaku",
"openapi": "3.1.0",
"platformKey": "bilibili",
"primaryTag": "Bilibili",
"skillName": "justoneapi_bilibili_get_video_danmu",
"slug": "justoneapi-bilibili-get-video-danmu",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Bilibili video Danmaku data, including timeline positions and comment text, for audience reaction analysis and subtitle-style comment review.",
"method": "GET",
"operationId": "getVideoDanmuV2",
"parameters": [
{
"defaultValue": null,
"description": "Access token for the API.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili Archive ID (AID).",
"enumValues": [],
"location": "query",
"name": "aid",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili Chat ID (CID).",
"enumValues": [],
"location": "query",
"name": "cid",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Page number for pagination.",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "string"
}
],
"path": "/api/bilibili/get-video-danmu/v2",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Video Danmaku",
"tags": [
"Bilibili"
]
}
],
"endpointPath": "get-video-danmu",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/bilibili/get-video-danmu/v2 for Bilibili Video Danmaku through JustOneAPI with aid and cid.",
"displayName": "Bilibili Video Danmaku",
"endpointPath": "get-video-danmu",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Bilibili video Danmaku data, including timeline positions and comment text, for audience reaction analysis and subtitle-style comment review.",
"method": "GET",
"operationId": "getVideoDanmuV2",
"parameters": [
{
"defaultValue": null,
"description": "Access token for the API.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili Archive ID (AID).",
"enumValues": [],
"location": "query",
"name": "aid",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili Chat ID (CID).",
"enumValues": [],
"location": "query",
"name": "cid",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Page number for pagination.",
"enumValues": [],
"location": "query",
"name": "page",
"required": false,
"schemaType": "string"
}
],
"path": "/api/bilibili/get-video-danmu/v2",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Video Danmaku",
"tags": [
"Bilibili"
]
}
],
"platformKey": "bilibili",
"primaryTag": "Bilibili",
"skillName": "justoneapi_bilibili_get_video_danmu",
"skillType": "interface",
"slug": "justoneapi-bilibili-get-video-danmu",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Bilibili Video Danmaku operations
Generated from JustOneAPI OpenAPI for platform key `bilibili`.
Endpoint group: `get-video-danmu`.
## `getVideoDanmuV2`
- Method: `GET`
- Path: `/api/bilibili/get-video-danmu/v2`
- Summary: Video Danmaku
- Description: Get Bilibili video Danmaku data, including timeline positions and comment text, for audience reaction analysis and subtitle-style comment review.
- Tags: `Bilibili`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for the API. |
| `aid` | `query` | yes | `string` | n/a | Bilibili Archive ID (AID). |
| `cid` | `query` | yes | `string` | n/a | Bilibili Chat ID (CID). |
| `page` | `query` | no | `string` | n/a | Page number for pagination. |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/bilibili/get-video-comment/v2 for Bilibili Video Comments through JustOneAPI with aid.
---
name: Bilibili Video Comments API
description: Call GET /api/bilibili/get-video-comment/v2 for Bilibili Video Comments through JustOneAPI with aid.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_bilibili_get_video_comment"}}
---
# Bilibili Video Comments
Use this focused JustOneAPI skill for video Comments in Bilibili. It targets `GET /api/bilibili/get-video-comment/v2`. Required non-token inputs are `aid`. OpenAPI describes it as: Get Bilibili video Comments data, including commenter profiles, text, and likes, for sentiment analysis and comment moderation workflows.
## Endpoint Scope
- Platform key: `bilibili`
- Endpoint key: `get-video-comment`
- Platform family: Bilibili
- Skill slug: `justoneapi-bilibili-get-video-comment`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `getVideoCommentV2` | `v2` | `GET` | `/api/bilibili/get-video-comment/v2` | Video Comments |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `aid` | `query` | all | n/a | `string` | Bilibili Archive ID (AID) |
| `cursor` | `query` | n/a | all | `string` | Pagination cursor |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `getVideoCommentV2` for the documented `v2` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `getVideoCommentV2`.
```bash
node {baseDir}/bin/run.mjs --operation "getVideoCommentV2" --token "$JUST_ONE_API_TOKEN" --params-json '{"aid":"<aid>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_bilibili_get_video_comment&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_bilibili_get_video_comment&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `getVideoCommentV2` on `/api/bilibili/get-video-comment/v2`.
- Echo the required lookup scope (`aid`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Bilibili video Comments data, including commenter profiles, text, and likes, for sentiment analysis and comment moderation workflows.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/bilibili/get-video-comment/v2 for Bilibili Video Comments through JustOneAPI with aid.",
"displayName": "Bilibili Video Comments",
"openapi": "3.1.0",
"platformKey": "bilibili",
"primaryTag": "Bilibili",
"skillName": "justoneapi_bilibili_get_video_comment",
"slug": "justoneapi-bilibili-get-video-comment",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Bilibili video Comments data, including commenter profiles, text, and likes, for sentiment analysis and comment moderation workflows.",
"method": "GET",
"operationId": "getVideoCommentV2",
"parameters": [
{
"defaultValue": null,
"description": "Access token for the API.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili Archive ID (AID).",
"enumValues": [],
"location": "query",
"name": "aid",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Pagination cursor.",
"enumValues": [],
"location": "query",
"name": "cursor",
"required": false,
"schemaType": "string"
}
],
"path": "/api/bilibili/get-video-comment/v2",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Video Comments",
"tags": [
"Bilibili"
]
}
],
"endpointPath": "get-video-comment",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/bilibili/get-video-comment/v2 for Bilibili Video Comments through JustOneAPI with aid.",
"displayName": "Bilibili Video Comments",
"endpointPath": "get-video-comment",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Bilibili video Comments data, including commenter profiles, text, and likes, for sentiment analysis and comment moderation workflows.",
"method": "GET",
"operationId": "getVideoCommentV2",
"parameters": [
{
"defaultValue": null,
"description": "Access token for the API.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili Archive ID (AID).",
"enumValues": [],
"location": "query",
"name": "aid",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Pagination cursor.",
"enumValues": [],
"location": "query",
"name": "cursor",
"required": false,
"schemaType": "string"
}
],
"path": "/api/bilibili/get-video-comment/v2",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Video Comments",
"tags": [
"Bilibili"
]
}
],
"platformKey": "bilibili",
"primaryTag": "Bilibili",
"skillName": "justoneapi_bilibili_get_video_comment",
"skillType": "interface",
"slug": "justoneapi-bilibili-get-video-comment",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Bilibili Video Comments operations
Generated from JustOneAPI OpenAPI for platform key `bilibili`.
Endpoint group: `get-video-comment`.
## `getVideoCommentV2`
- Method: `GET`
- Path: `/api/bilibili/get-video-comment/v2`
- Summary: Video Comments
- Description: Get Bilibili video Comments data, including commenter profiles, text, and likes, for sentiment analysis and comment moderation workflows.
- Tags: `Bilibili`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for the API. |
| `aid` | `query` | yes | `string` | n/a | Bilibili Archive ID (AID). |
| `cursor` | `query` | no | `string` | n/a | Pagination cursor. |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/bilibili/get-video-caption/v2 for Bilibili Video Captions through JustOneAPI with aid, bvid, and cid.
---
name: Bilibili Video Captions API
description: Call GET /api/bilibili/get-video-caption/v2 for Bilibili Video Captions through JustOneAPI with aid, bvid, and cid.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_bilibili_get_video_caption"}}
---
# Bilibili Video Captions
Use this focused JustOneAPI skill for video Captions in Bilibili. It targets `GET /api/bilibili/get-video-caption/v2`. Required non-token inputs are `aid`, `bvid`, and `cid`. OpenAPI describes it as: Get Bilibili video Captions data, including caption data, for transcript extraction and multilingual content analysis.
## Endpoint Scope
- Platform key: `bilibili`
- Endpoint key: `get-video-caption`
- Platform family: Bilibili
- Skill slug: `justoneapi-bilibili-get-video-caption`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `getVideoCaptionV1` | `v2` | `GET` | `/api/bilibili/get-video-caption/v2` | Video Captions |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `aid` | `query` | all | n/a | `string` | Bilibili AID |
| `bvid` | `query` | all | n/a | `string` | Bilibili Video ID (BVID) |
| `cid` | `query` | all | n/a | `string` | Bilibili CID |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `getVideoCaptionV1` for the documented `v2` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `getVideoCaptionV1`.
```bash
node {baseDir}/bin/run.mjs --operation "getVideoCaptionV1" --token "$JUST_ONE_API_TOKEN" --params-json '{"bvid":"<bvid>","aid":"<aid>","cid":"<cid>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_bilibili_get_video_caption&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_bilibili_get_video_caption&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `getVideoCaptionV1` on `/api/bilibili/get-video-caption/v2`.
- Echo the required lookup scope (`aid`, `bvid`, and `cid`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Bilibili video Captions data, including caption data, for transcript extraction and multilingual content analysis.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/bilibili/get-video-caption/v2 for Bilibili Video Captions through JustOneAPI with aid, bvid, and cid.",
"displayName": "Bilibili Video Captions",
"openapi": "3.1.0",
"platformKey": "bilibili",
"primaryTag": "Bilibili",
"skillName": "justoneapi_bilibili_get_video_caption",
"slug": "justoneapi-bilibili-get-video-caption",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Bilibili video Captions data, including caption data, for transcript extraction and multilingual content analysis.",
"method": "GET",
"operationId": "getVideoCaptionV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for the API.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili Video ID (BVID).",
"enumValues": [],
"location": "query",
"name": "bvid",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili AID.",
"enumValues": [],
"location": "query",
"name": "aid",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili CID.",
"enumValues": [],
"location": "query",
"name": "cid",
"required": true,
"schemaType": "string"
}
],
"path": "/api/bilibili/get-video-caption/v2",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Video Captions",
"tags": [
"Bilibili"
]
}
],
"endpointPath": "get-video-caption",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/bilibili/get-video-caption/v2 for Bilibili Video Captions through JustOneAPI with aid, bvid, and cid.",
"displayName": "Bilibili Video Captions",
"endpointPath": "get-video-caption",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Bilibili video Captions data, including caption data, for transcript extraction and multilingual content analysis.",
"method": "GET",
"operationId": "getVideoCaptionV1",
"parameters": [
{
"defaultValue": null,
"description": "Access token for the API.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili Video ID (BVID).",
"enumValues": [],
"location": "query",
"name": "bvid",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili AID.",
"enumValues": [],
"location": "query",
"name": "aid",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili CID.",
"enumValues": [],
"location": "query",
"name": "cid",
"required": true,
"schemaType": "string"
}
],
"path": "/api/bilibili/get-video-caption/v2",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "Video Captions",
"tags": [
"Bilibili"
]
}
],
"platformKey": "bilibili",
"primaryTag": "Bilibili",
"skillName": "justoneapi_bilibili_get_video_caption",
"skillType": "interface",
"slug": "justoneapi-bilibili-get-video-caption",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Bilibili Video Captions operations
Generated from JustOneAPI OpenAPI for platform key `bilibili`.
Endpoint group: `get-video-caption`.
## `getVideoCaptionV1`
- Method: `GET`
- Path: `/api/bilibili/get-video-caption/v2`
- Summary: Video Captions
- Description: Get Bilibili video Captions data, including caption data, for transcript extraction and multilingual content analysis.
- Tags: `Bilibili`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for the API. |
| `bvid` | `query` | yes | `string` | n/a | Bilibili Video ID (BVID). |
| `aid` | `query` | yes | `string` | n/a | Bilibili AID. |
| `cid` | `query` | yes | `string` | n/a | Bilibili CID. |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/bilibili/get-user-video-list/v2 for Bilibili User Published Videos through JustOneAPI with uid.
---
name: Bilibili User Published Videos API
description: Call GET /api/bilibili/get-user-video-list/v2 for Bilibili User Published Videos through JustOneAPI with uid.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_bilibili_get_user_video_list"}}
---
# Bilibili User Published Videos
Use this focused JustOneAPI skill for user Published Videos in Bilibili. It targets `GET /api/bilibili/get-user-video-list/v2`. Required non-token inputs are `uid`. OpenAPI describes it as: Get Bilibili user Published Videos data, including titles, covers, and publish times, for creator monitoring and content performance analysis.
## Endpoint Scope
- Platform key: `bilibili`
- Endpoint key: `get-user-video-list`
- Platform family: Bilibili
- Skill slug: `justoneapi-bilibili-get-user-video-list`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `getBilibiliUserVideoListV2` | `v2` | `GET` | `/api/bilibili/get-user-video-list/v2` | User Published Videos |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `param` | `query` | n/a | all | `string` | Pagination parameter from previous response |
| `uid` | `query` | all | n/a | `string` | Bilibili User ID (UID) |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `getBilibiliUserVideoListV2` for the documented `v2` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `getBilibiliUserVideoListV2`.
```bash
node {baseDir}/bin/run.mjs --operation "getBilibiliUserVideoListV2" --token "$JUST_ONE_API_TOKEN" --params-json '{"uid":"<uid>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_bilibili_get_user_video_list&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_bilibili_get_user_video_list&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `getBilibiliUserVideoListV2` on `/api/bilibili/get-user-video-list/v2`.
- Echo the required lookup scope (`uid`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Bilibili user Published Videos data, including titles, covers, and publish times, for creator monitoring and content performance analysis.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/bilibili/get-user-video-list/v2 for Bilibili User Published Videos through JustOneAPI with uid.",
"displayName": "Bilibili User Published Videos",
"openapi": "3.1.0",
"platformKey": "bilibili",
"primaryTag": "Bilibili",
"skillName": "justoneapi_bilibili_get_user_video_list",
"slug": "justoneapi-bilibili-get-user-video-list",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Bilibili user Published Videos data, including titles, covers, and publish times, for creator monitoring and content performance analysis.",
"method": "GET",
"operationId": "getBilibiliUserVideoListV2",
"parameters": [
{
"defaultValue": null,
"description": "Access token for the API.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili User ID (UID).",
"enumValues": [],
"location": "query",
"name": "uid",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Pagination parameter from previous response.",
"enumValues": [],
"location": "query",
"name": "param",
"required": false,
"schemaType": "string"
}
],
"path": "/api/bilibili/get-user-video-list/v2",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "User Published Videos",
"tags": [
"Bilibili"
]
}
],
"endpointPath": "get-user-video-list",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/bilibili/get-user-video-list/v2 for Bilibili User Published Videos through JustOneAPI with uid.",
"displayName": "Bilibili User Published Videos",
"endpointPath": "get-user-video-list",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Bilibili user Published Videos data, including titles, covers, and publish times, for creator monitoring and content performance analysis.",
"method": "GET",
"operationId": "getBilibiliUserVideoListV2",
"parameters": [
{
"defaultValue": null,
"description": "Access token for the API.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili User ID (UID).",
"enumValues": [],
"location": "query",
"name": "uid",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Pagination parameter from previous response.",
"enumValues": [],
"location": "query",
"name": "param",
"required": false,
"schemaType": "string"
}
],
"path": "/api/bilibili/get-user-video-list/v2",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "User Published Videos",
"tags": [
"Bilibili"
]
}
],
"platformKey": "bilibili",
"primaryTag": "Bilibili",
"skillName": "justoneapi_bilibili_get_user_video_list",
"skillType": "interface",
"slug": "justoneapi-bilibili-get-user-video-list",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Bilibili User Published Videos operations
Generated from JustOneAPI OpenAPI for platform key `bilibili`.
Endpoint group: `get-user-video-list`.
## `getBilibiliUserVideoListV2`
- Method: `GET`
- Path: `/api/bilibili/get-user-video-list/v2`
- Summary: User Published Videos
- Description: Get Bilibili user Published Videos data, including titles, covers, and publish times, for creator monitoring and content performance analysis.
- Tags: `Bilibili`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for the API. |
| `uid` | `query` | yes | `string` | n/a | Bilibili User ID (UID). |
| `param` | `query` | no | `string` | n/a | Pagination parameter from previous response. |
### Request body
No request body.
### Responses
- `200`: OK
Call GET /api/bilibili/get-user-relation-stat/v1 for Bilibili User Relation Stats through JustOneAPI with wmid.
---
name: Bilibili User Relation Stats API
description: Call GET /api/bilibili/get-user-relation-stat/v1 for Bilibili User Relation Stats through JustOneAPI with wmid.
author: JustOneAPI
homepage: https://api.justoneapi.com
metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":"justoneapi_bilibili_get_user_relation_stat"}}
---
# Bilibili User Relation Stats
Use this focused JustOneAPI skill for user Relation Stats in Bilibili. It targets `GET /api/bilibili/get-user-relation-stat/v1`. Required non-token inputs are `wmid`. OpenAPI describes it as: Get Bilibili user Relation Stats data, including following counts, for creator benchmarking and audience growth tracking.
## Endpoint Scope
- Platform key: `bilibili`
- Endpoint key: `get-user-relation-stat`
- Platform family: Bilibili
- Skill slug: `justoneapi-bilibili-get-user-relation-stat`
| Operation | Version | Method | Path | OpenAPI summary |
| --- | --- | --- | --- | --- |
| `getUserRelationStat` | `v1` | `GET` | `/api/bilibili/get-user-relation-stat/v1` | User Relation Stats |
## Inputs
| Parameter | In | Required by | Optional by | Type | Notes |
| --- | --- | --- | --- | --- | --- |
| `wmid` | `query` | all | n/a | `string` | Bilibili User ID (WMID) |
Request body: none documented; send parameters through path or query arguments.
## Version Choice
Use `getUserRelationStat` for the documented `v1` endpoint. There are no alternate versions grouped in this skill.
## Run This Endpoint
Supported operation IDs in this skill: `getUserRelationStat`.
```bash
node {baseDir}/bin/run.mjs --operation "getUserRelationStat" --token "$JUST_ONE_API_TOKEN" --params-json '{"wmid":"<wmid>"}'
```
Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged.
## Environment
- Required: `JUST_ONE_API_TOKEN`
- Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs.
- Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_bilibili_get_user_relation_stat&utm_content=project_link).
- Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_bilibili_get_user_relation_stat&utm_content=project_link).
## Output Focus
- State the operation ID and endpoint path used, for example `getUserRelationStat` on `/api/bilibili/get-user-relation-stat/v1`.
- Echo the required lookup scope (`wmid`) before summarizing results.
- Prioritize fields that support this endpoint purpose: Get Bilibili user Relation Stats data, including following counts, for creator benchmarking and audience growth tracking.
- Return raw JSON only after the short, endpoint-specific summary.
- If the backend errors, include the backend payload and the exact operation ID.
FILE:bin/run.mjs
#!/usr/bin/env node
const manifest = {
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/bilibili/get-user-relation-stat/v1 for Bilibili User Relation Stats through JustOneAPI with wmid.",
"displayName": "Bilibili User Relation Stats",
"openapi": "3.1.0",
"platformKey": "bilibili",
"primaryTag": "Bilibili",
"skillName": "justoneapi_bilibili_get_user_relation_stat",
"slug": "justoneapi-bilibili-get-user-relation-stat",
"sourceTitle": "OpenAPI definition",
"operations": [
{
"description": "Get Bilibili user Relation Stats data, including following counts, for creator benchmarking and audience growth tracking.",
"method": "GET",
"operationId": "getUserRelationStat",
"parameters": [
{
"defaultValue": null,
"description": "Access token for the API.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili User ID (WMID).",
"enumValues": [],
"location": "query",
"name": "wmid",
"required": true,
"schemaType": "string"
}
],
"path": "/api/bilibili/get-user-relation-stat/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "User Relation Stats",
"tags": [
"Bilibili"
]
}
],
"endpointPath": "get-user-relation-stat",
"skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));
if (!args.operation) {
fail("Missing required --operation argument.");
}
const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
fail(`Unknown operation "args.operation".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}
const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);
const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);
const requestInit = {
headers: {
"accept": "application/json",
},
method: operation.method,
};
if (operation.requestBody && params.body !== undefined) {
requestInit.body = JSON.stringify(params.body);
requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}
let response;
try {
response = await fetch(url, requestInit);
} catch (error) {
fail("Network request failed.", {
cause: error instanceof Error ? error.message : String(error),
operationId: operation.operationId,
});
}
const rawBody = await response.text();
let parsedBody;
try {
parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
if (!response.ok) {
fail("Backend returned a non-JSON error response.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
fail("Backend returned invalid JSON.", {
body: rawBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
if (!response.ok) {
fail("Backend request failed.", {
body: parsedBody,
operationId: operation.operationId,
status: response.status,
statusText: response.statusText,
});
}
process.stdout.write(`JSON.stringify(parsedBody, null, 2)\n`);
function parseArgs(argv) {
const parsed = { operation: null, paramsJson: "{}", token: null };
for (let index = 0; index < argv.length; index += 1) {
const flag = argv[index];
const value = argv[index + 1];
if (flag === "--operation") {
parsed.operation = value;
index += 1;
continue;
}
if (flag === "--params-json") {
parsed.paramsJson = value;
index += 1;
continue;
}
if (flag === "--token") {
parsed.token = value;
index += 1;
continue;
}
fail(`Unknown argument "flag".`);
}
return parsed;
}
function parseParams(input) {
try {
const parsed = JSON.parse(input || "{}");
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
fail("--params-json must decode to a JSON object.");
}
return parsed;
} catch (error) {
fail("Failed to parse --params-json.", {
cause: error instanceof Error ? error.message : String(error),
});
}
}
function applyDefaults(operation, params) {
for (const parameter of operation.parameters) {
if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
params[parameter.name] = parameter.defaultValue;
}
}
}
function injectToken(operation, params, cliToken) {
const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
if (!tokenParam || params.token !== undefined) {
return;
}
if (!cliToken) {
fail("--token is required for this operation.", {
operationId: operation.operationId,
});
}
params.token = cliToken;
}
function validateRequired(operation, params) {
const missing = [];
for (const parameter of operation.parameters) {
if (parameter.required && params[parameter.name] === undefined) {
missing.push(parameter.name);
}
}
if (operation.requestBody?.required && params.body === undefined) {
missing.push("body");
}
if (missing.length) {
fail("Missing required parameters.", {
missing,
operationId: operation.operationId,
});
}
}
function applyPathParams(operation, params, url) {
let pathname = url.pathname;
for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
pathname = pathname.replace(`{parameter.name}`, encodeURIComponent(String(value)));
}
url.pathname = pathname;
}
function applyQueryParams(operation, params, url) {
for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
const value = params[parameter.name];
if (value === undefined) {
continue;
}
appendValue(url.searchParams, parameter.name, value);
}
}
function appendValue(searchParams, name, value) {
if (Array.isArray(value)) {
for (const item of value) {
appendValue(searchParams, name, item);
}
return;
}
if (value && typeof value === "object") {
searchParams.append(name, JSON.stringify(value));
return;
}
searchParams.append(name, String(value));
}
function ensureBaseUrl(value) {
return value.endsWith("/") ? value : `value/`;
}
function fail(message, details = null) {
const payload = { message };
if (details) {
payload.details = details;
}
process.stderr.write(`JSON.stringify(payload, null, 2)\n`);
process.exit(1);
}
FILE:generated/operations.json
{
"baseUrl": "https://api.justoneapi.com",
"description": "Call GET /api/bilibili/get-user-relation-stat/v1 for Bilibili User Relation Stats through JustOneAPI with wmid.",
"displayName": "Bilibili User Relation Stats",
"endpointPath": "get-user-relation-stat",
"openapi": "3.1.0",
"operations": [
{
"description": "Get Bilibili user Relation Stats data, including following counts, for creator benchmarking and audience growth tracking.",
"method": "GET",
"operationId": "getUserRelationStat",
"parameters": [
{
"defaultValue": null,
"description": "Access token for the API.",
"enumValues": [],
"location": "query",
"name": "token",
"required": true,
"schemaType": "string"
},
{
"defaultValue": null,
"description": "Bilibili User ID (WMID).",
"enumValues": [],
"location": "query",
"name": "wmid",
"required": true,
"schemaType": "string"
}
],
"path": "/api/bilibili/get-user-relation-stat/v1",
"requestBody": null,
"responses": [
{
"description": "OK",
"statusCode": "200"
}
],
"summary": "User Relation Stats",
"tags": [
"Bilibili"
]
}
],
"platformKey": "bilibili",
"primaryTag": "Bilibili",
"skillName": "justoneapi_bilibili_get_user_relation_stat",
"skillType": "interface",
"slug": "justoneapi-bilibili-get-user-relation-stat",
"sourceTitle": "OpenAPI definition"
}
FILE:generated/operations.md
# Bilibili User Relation Stats operations
Generated from JustOneAPI OpenAPI for platform key `bilibili`.
Endpoint group: `get-user-relation-stat`.
## `getUserRelationStat`
- Method: `GET`
- Path: `/api/bilibili/get-user-relation-stat/v1`
- Summary: User Relation Stats
- Description: Get Bilibili user Relation Stats data, including following counts, for creator benchmarking and audience growth tracking.
- Tags: `Bilibili`
### Parameters
| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for the API. |
| `wmid` | `query` | yes | `string` | n/a | Bilibili User ID (WMID). |
### Request body
No request body.
### Responses
- `200`: OK