InlineKeyboardButton 在 InlineKeyboardMarkup 中有限制吗?电报机器人 C#
InlineKeyboardButton are limited in InlineKeyboardMarkup ? telegram bot C#
我使用 C# 和 telegram.bot 并希望创建动态 InlineKeyboardMarkup
private static InlineKeyboardMarkup InlinePostsKeyboard;
private static List<string> PostsTitle;
...
PostsTitle = (from p in dba.BlogPosts select p.Subject).Take(4).ToList();
var inlineButtons = PostsTitle.Select(title => new[] { InlineKeyboardButton.WithCallbackData(title, title) }).ToArray();
InlinePostsKeyboard = new InlineKeyboardMarkup(inlineButtons);
...
Bot.SendTextMessageAsync(Chat.Id, e.Message.Text, replyMarkup: InlinePostsKeyboard);`
如您在上面的代码机器人中看到的,大多数显示 4 InlineKeyboardButton(每行),但不显示任何内容!
只需将 ....Take(4).ToList();
更改为 3 或小于 4(例如:3、2 或 1),您就会看到按钮将正确显示
我想知道这是什么原因
我哪里做错了?
如果内嵌键盘数量有限制rows/buttons肯定是3个以上
记录并检查您发送到 Telegram 的内容 API。我怀疑你的一篇博客 post p.Subject
return 空字符串或太长的字符串或 Telegram 不允许的内容。
还要确保您使用的库正确转义值(例如替换特殊字符,如 "
)
顺便问一下,为什么要将 post 主题作为 callback_data
传递?将 post ID 传递为 post?id=123
之类的东西不是更好吗?
一排按钮最多可以放置 8 个按钮。如果你有超过8个按钮,你必须把它们放在多行中。
我编写了一个 (TypeScript) 实用函数来拆分按钮数组:
evenlySplitArray<T>(arrayToSplit: T[]): T[][] {
if (!Array.isArray(arrayToSplit)) {
return [[]];
}
const length = arrayToSplit.length;
// Last row can contain one element more.
const maxElementsPerRow = 5;
const numberOfRows = Math.ceil(length / maxElementsPerRow);
const elementsPerRow = Math.round(length / numberOfRows);
const result = [];
for (let i = 0; i < numberOfRows; i++) {
// Add remainder to last row
const end = i === numberOfRows - 1 ? length : (i + 1) * elementsPerRow;
const split = arrayToSplit.slice(i * elementsPerRow, end);
result.push(split);
}
return result;
}
callback_data
的限制是 1-64 字节,例如JWT 不适合。
我使用 C# 和 telegram.bot 并希望创建动态 InlineKeyboardMarkup
private static InlineKeyboardMarkup InlinePostsKeyboard;
private static List<string> PostsTitle;
...
PostsTitle = (from p in dba.BlogPosts select p.Subject).Take(4).ToList();
var inlineButtons = PostsTitle.Select(title => new[] { InlineKeyboardButton.WithCallbackData(title, title) }).ToArray();
InlinePostsKeyboard = new InlineKeyboardMarkup(inlineButtons);
...
Bot.SendTextMessageAsync(Chat.Id, e.Message.Text, replyMarkup: InlinePostsKeyboard);`
如您在上面的代码机器人中看到的,大多数显示 4 InlineKeyboardButton(每行),但不显示任何内容!
只需将 ....Take(4).ToList();
更改为 3 或小于 4(例如:3、2 或 1),您就会看到按钮将正确显示
我想知道这是什么原因 我哪里做错了?
如果内嵌键盘数量有限制rows/buttons肯定是3个以上
记录并检查您发送到 Telegram 的内容 API。我怀疑你的一篇博客 post p.Subject
return 空字符串或太长的字符串或 Telegram 不允许的内容。
还要确保您使用的库正确转义值(例如替换特殊字符,如 "
)
顺便问一下,为什么要将 post 主题作为 callback_data
传递?将 post ID 传递为 post?id=123
之类的东西不是更好吗?
一排按钮最多可以放置 8 个按钮。如果你有超过8个按钮,你必须把它们放在多行中。
我编写了一个 (TypeScript) 实用函数来拆分按钮数组:
evenlySplitArray<T>(arrayToSplit: T[]): T[][] {
if (!Array.isArray(arrayToSplit)) {
return [[]];
}
const length = arrayToSplit.length;
// Last row can contain one element more.
const maxElementsPerRow = 5;
const numberOfRows = Math.ceil(length / maxElementsPerRow);
const elementsPerRow = Math.round(length / numberOfRows);
const result = [];
for (let i = 0; i < numberOfRows; i++) {
// Add remainder to last row
const end = i === numberOfRows - 1 ? length : (i + 1) * elementsPerRow;
const split = arrayToSplit.slice(i * elementsPerRow, end);
result.push(split);
}
return result;
}
callback_data
的限制是 1-64 字节,例如JWT 不适合。