動態按鈕與參數

Inline 按鈕不只能是靜態的。GetMyBot 能夠從資料生成鍵盤——每個列表元素對應一個按鈕——並為每個按鈕附加各自的參數集合,在傳送訊息時固定下來。這是「顯示目錄 → 使用者選擇特定商品 → 就為該商品下單」流程的基礎。所有設定都在**「傳送訊息」**動作的訊息區塊中進行。

從列表動態生成按鈕

**「從列表動態生成按鈕」**區塊將 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 中。

延伸閱讀