InlineKeyboardButton在InlineKeyboardMarkup中有限制吗?电报机器人C#

时间:2017-09-24 10:27:15

标签: c# telegram telegram-bot

我使用C#和telegram.bot并希望创建动态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);`

....Take(4).ToList();

正如您在上面的代码中看到的那样,大多数显示4个InlineKeyboardButton(每行),但没有显示任何内容! 只需将from Django.db import models class Product(models.Model): barcode = models.CharField(max_length=200, primary_key=True) quantity = models.IntegerField() 更改为3或小于4(例如:3,2或1),您将看到按钮将正确显示

我想知道原因 我在哪里弄错了?

2 个答案:

答案 0 :(得分:3)

如果内联键盘行/按钮的数量有限制,则肯定超过3。

Log&amp;检查您发送给Telegram API的内容。我怀疑你的一篇博文p.Subject返回空字符串或太长的字符串或Telegram不允许的内容。

同时确保您正在使用的库正确转义值(例如替换" 等特殊字符)

顺便说一下,为什么你会将帖子主题传递给callback_data?将帖子ID传递给像post?id=123这样的东西不是更好吗?

答案 1 :(得分:1)

在一个按钮行中,您最多可以容纳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不适合。