transformer-throttler
)
流量控制(这个插件通过 Bottleneck 对传出的 API 请求实例进行排队,以防止你的 bot 被 限流,正如在 这个高级部分 的文档中描述的那样。
不存在文档中的 API 限制
Telegram 实现了一些未指定的和无文档的 API 调用的限制。 这些无文档的限制不被限流器计算。 如果你在某些 API 调用出现 floodwait 错误,例如 api
,请考虑将 auto-retry 插件 和这个插件一起使用。
使用方法
这里是使用默认选项的一个示例。 请注意,默认选项与 Telegram 所实现的限制率一致,因此它们应该可以正常使用。
import { Bot } from "grammy";
import { run } from "@grammyjs/runner";
import { apiThrottler } from "@grammyjs/transformer-throttler";
const botToken = process.env.BOT_TOKEN;
if (!botToken) {
throw Error("BOT_TOKEN is required");
}
const bot = new Bot(botToken);
const throttler = apiThrottler();
bot.api.config.use(throttler);
bot.command("/example", (ctx) => ctx.reply("I am throttled"));
// 如果你使用了限流器,你可能想要使用一个 runner 来并发处理 update。
run(bot);
const { Bot } = require("grammy");
const { run } = require("@grammyjs/runner");
const { apiThrottler } = require("@grammyjs/transformer-throttler");
const botToken = process.env.BOT_TOKEN;
if (!botToken) {
throw Error("BOT_TOKEN is required");
}
const bot = new Bot(botToken);
const throttler = apiThrottler();
bot.api.config.use(throttler);
bot.command("/example", (ctx) => ctx.reply("I am throttled"));
// 如果你使用了限流器,你可能想要使用一个 runner 来并发处理 update。
run(bot);
import { Bot } from "https://deno.land/x/grammy/mod.ts";
import { run } from "https://deno.land/x/grammy_runner/mod.ts";
import { apiThrottler } from "https://deno.land/x/grammy_transformer_throttler/mod.ts";
const botToken = Deno.env.get("BOT_TOKEN");
if (!botToken) {
throw Error("BOT_TOKEN is required");
}
const bot = new Bot(botToken);
const throttler = apiThrottler();
bot.api.config.use(throttler);
bot.command("/example", (ctx) => ctx.reply("I am throttled"));
// 如果你使用了限流器,你可能想要使用一个 runner 来并发处理 update。
run(bot);
配置
限流器接受一个可选的参数,其形式如下:
type ThrottlerOptions = {
global?: Bottleneck.ConstructorOptions; // 限制所有 API 调用
group?: Bottleneck.ConstructorOptions; // 限制传出群组消息
out?: Bottleneck.ConstructorOptions; // 限制传出私人消息
};
Bottleneck
可用的所有属性可以在 Bottleneck 中找到。
如果没有传入参数,限流器创建时将使用默认配置,这些配置应该适用于大多数情况。 默认配置如下:
// 传出的全局限流器
const globalConfig = {
reservoir: 30, // 限流器开始时可以接受的新任务数
reservoirRefreshAmount: 30, // 限流器刷新后可以接受的新任务数
reservoirRefreshInterval: 1000, // 限流器刷新的间隔时间(毫秒)
};
// 传出的群组限流器
const groupConfig = {
maxConcurrent: 1, // 一次只能执行一个任务
minTime: 1000, // 任务执行完成后等待的时间(毫秒)
reservoir: 20, // 任务开始时可以接受的新任务数
reservoirRefreshAmount: 20, // 任务刷新后可以接受的新任务数
reservoirRefreshInterval: 60000, // 任务刷新的间隔时间(毫秒)
};
// 传出的私聊限流器
const outConfig = {
maxConcurrent: 1, // 一次只能执行一个任务
minTime: 1000, // 任务执行完成后等待的时间(毫秒)
};