Skip to content

API 调用

本项目存在的意义就是让 Fanbook OpenAPI 更易用

机器人实例

调用 API 之前,需要创建一个机器人实例:

ts
import { Bot } from 'fanbook-api-node-sdk';
const bot = new Bot('在此填入你的机器人令牌');

Bot的构造函数接受一个字符串,作为机器人令牌。在此实例上的 API 调用默认使用此令牌。

SDK 不校验令牌的有效性,但错误的令牌会在 API 调用时报错。

函数式调用 API

如果不使用 SDK,发送一条消息需要:

ts
import _jsonBigint from 'json-bigint';
const jsonBigint = _jsonBigint({ strict: true, useNativeBigInt: true });

const BOT_TOKEN = '在此填入你的机器人令牌';
const CHAT_ID = BigInt('在此填入发送到的聊天 ID');
const CONTENT = '在此填入消息内容';

const xhr = new XMLHttpRequest();
xhr.open('POST', `https://a1.fanbook.mobi/api/bot/${BOT_TOKEN}/sendMessage`);
xhr.onload = (e) => {
  if (xhr.readyState !== 4) return;
  const data = jsonBigint.parse(xhr.responseText);
  if (data.ok) console.log(data.result);
  else console.error(data);
};
xhr.send(jsonBigint.stringify({
  chat_id: CHAT_ID,
  text: CONTENT,
  desc: CONTENT,
}));
ts
import _jsonBigint from 'json-bigint';
const jsonBigint = _jsonBigint({ strict: true, useNativeBigInt: true });

const BOT_TOKEN = '在此填入你的机器人令牌';
const CHAT_ID = BigInt('在此填入发送到的聊天 ID');
const CONTENT = '在此填入消息内容';

const response = await fetch(`https://a1.fanbook.mobi/api/bot/${BOT_TOKEN}/sendMessage`, {
  method: 'POST',
  body: jsonBigint.stringify({
    chat_id: CHAT_ID,
    text: CONTENT,
    desc: CONTENT,
  }),
});
const data = jsonBigint.parse(await response.text());
if (data.ok) console.log(data.result);
else console.error(data);
ts
import axios from 'axios';
import _jsonBigint from 'json-bigint';
const jsonBigint = _jsonBigint({ strict: true, useNativeBigInt: true });

const BOT_TOKEN = '在此填入你的机器人令牌';
const CHAT_ID = BigInt('在此填入发送到的聊天 ID');
const CONTENT = '在此填入消息内容';

const response = await axios.post(`https://a1.fanbook.mobi/api/bot/${BOT_TOKEN}/sendMessage`, jsonBigint.stringify({
  chat_id: CHAT_ID,
  text: CONTENT,
  desc: CONTENT,
}), {
  transformResponse: (data) => jsonBigint.parse(data),
});
const data = response.data;
if (data.ok) console.log(data.result);
else console.error(data);

使用 SDK,发送一条消息只需:

ts
import { Bot } from 'fanbook-api-node-sdk';

const BOT_TOKEN = '在此填入你的机器人令牌';
const CHAT_ID = BigInt('在此填入发送到的聊天 ID');
const CONTENT = '在此填入消息内容';

const bot = new Bot(BOT_TOKEN);
console.log(await bot.sendMessage(CHAT_ID, CONTENT, CONTENT));

这就是函数化 API 调用的优点:将业务无关的代码抽离,使代码逻辑清晰、便于维护。

常用的 API 可用方法封装于 Bot 中,作为成员函数存在。详见 API 文档

自定义请求

Bot 类的函数化 API 被调用时,会对参数进行一些转换,并使用 Bot#axios 发起网络请求。

Bot#axios 支持解析请求、响应体中的 BigInt,你也可以在构造 Bot 实例时传入第二个参数,作为 axios 选项。

如果需要自定义 axios 选项,只需在构造时传入第 2 个参数作为 axios 选项,即可在请求使用的 axios 实例中加入自定义选项。

ts
import { Bot } from 'fanbook-api-node-sdk';

const BOT_TOKEN = '在此填入你的机器人令牌';
const bot = new Bot(BOT_TOKEN, {
  axios: { // axios 选项
    timeout: 3 * 1000,
    timeoutErrorMessage: 'Timeout 3000ms',
  },
});

对于 SDK 还未支持的 API,你可以直接使用 axios 实例:

ts
import { Bot } from 'fanbook-api-node-sdk';

const BOT_TOKEN = '在此填入你的机器人令牌';
const bot = new Bot(BOT_TOKEN);

// baseURL 是 `https://a1.fanbook.mobi/api/bot/${this.token}`
await bot.axios.post('/path/to/api');

这种方式同样支持解析请求、响应体中的 BigInt,但发生错误时抛出的是 axiosError 而不是 FanbookApiError

Released under the MIT License.