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 不适合。