动态按钮与参数

Inline 按钮不一定是静态的。GetMyBot 可以根据数据构建键盘——每个列表元素对应一个按钮——并为每个按钮附加发送时固定的独立参数集。这是"显示目录 → 用户选择具体商品 → 处理该商品"场景的基础。一切都在"发送消息"动作的消息块中配置。

从列表生成动态按钮

**"从列表生成动态按钮"**块将 ctx 中的数组展开为键盘:每个数组元素对应一个按钮。需配置四项内容:

  • 列表ctx 中数组的键(over),例如 ctx.products。数组通常由"查询数据源"、"Web 请求"或计算动作放入。
  • 元素别名 — 模板中访问元素所用的名称(as,默认 item)。
  • 每行按钮数 — 每行排列几个按钮(columns,默认 1)。
  • 按钮模板 — 普通按钮,但其文本和字段支持按别名替换:{{item.name}}{{item.price}} 等。

发送时,模板为每个元素渲染一次,产生与列表元素数量相同的按钮。这样可构建目录、集合记录列表和数据驱动的菜单。

示例

ctx.products 中存有带 idnameprice 字段的对象数组。在按钮模板中填写文本 {{item.name}} — {{item.price}} ₽,在 Carry 中添加键 product_id,值为 {{item.id}}。这样每个商品对应一个按钮,点击时机器人能精确知道选择了哪个商品。

点击时携带参数(Carry)

"Carry — 点击时的数据快照"块为按钮附加一组键 → 值对,在发送消息时计算并固定。点击时,这些值恢复到 ctx 中——因此每个按钮携带各自的参数(per-invocation),即使同一条消息发送了数十个按钮。

  • carry 键 — 点击时值在 ctx 中返回的名称。
  • carry 值 — 含替换的模板({{item.id}}{{param.order_id}}{{ctx.x}}),在发送时计算。
  • 一次性single_use)— payload 在第一次点击后失效。
  • payload 有效期ttl_seconds)— 快照的有效秒数(0 为默认值)。

这正是"绑定到特定按钮的参数"关键功能:值存储在按钮中,而非用户的公共状态中,因此并发点击不会互相覆盖。

通过按钮设置参数(set_params)

除 Carry 快照外,按钮还可以在点击时直接设置订阅者参数——字段**"参数"set_params)。与 Carry(ctx 中的临时值)不同,set_params 写入用户的永久参数**({{param.键}}),在多次触发之间保持。消息块上也有相同字段——那时参数在发送时设置,而非点击时。

按钮点击时还可以设置和取消标签——与消息块上的字段相同。

三种机制的区别

  • Carryctx 中的快照,持续到点击,绑定到特定按钮,支持 TTL 和一次性。
  • 按钮上的 set_params — 点击时写入订阅者永久参数。
  • 块上的 set_params — 发送消息时写入永久参数。

对于"选择商品 → 处理该商品"场景,请使用动态按钮 + Carry:商品列表展开为按钮,每个商品的 product_id 写入该按钮的 Carry。

下一步