今天的東東是個超多層的陣列,足以讓腦袋死機,請做好心理準備再服用
又回到 apiRequestJson()
啦,昨天因為陣列只有一層,所以不需要 json_encode()
,但第兩層以上的陣列就需要自己轉成 JSON
foreach ($parameters as &$val) {
if (is_array($val)) {
$val = json_encode($val);
}
}
在中間加上這坨東東就能把第二層以上的陣列轉成 JSON 了
https://core.telegram.org/bots/api#replykeyboardmarkup
這個是一個用來裝按鈕的陣列,裡面有很多選項可以用,我來一個個介紹
keyboard
先看到 keyboard
這格,你可以發現是兩層的陣列再加上叫做 KeyboardButton 的東東
這兩層陣列分別代表著「列」跟「欄」,「列」可以填很多個陣列,「欄」也可以填很多個陣列
keyboard
裡裝著很多列,列裡面又有很多欄,最後欄裡面放著 KeyboardButton
如果你覺得擠在一起寫你會看不懂,你也可以寫成這樣
resize_keyboard
這個選項會調整這個裝按鈕的區域高度,原本預設這個區域是固定高度的,按鈕會去補滿高度變得很肥
設成 true 以後,就會是這個區域配合按鈕調整高度
不過按鈕多到了原本的高度,設定這個選項就沒用了
因為最高的高度就是這樣,這個區域會變成滑動的方式
one_time_keyboard
如果把這個選項設成 true,使用者按下按鈕後,這個區域就會自動收起來
input_field_placeholder
這個選項可以修改輸入框的浮水印文字
selective
這個比較有趣,設定為 true 之後可以指定某個人,讓整個群組裡只有某個人有按鈕可以按
有三種方式可以指定
使用 username 標記
我的畫面:
其他人的畫面:
回覆訊息
我的畫面:
其他人的畫面:
使用 Deep Link 標記
我的畫面:
其他人的畫面:
https://core.telegram.org/bots/api#replykeyboardremove
這個東東是 ReplyKeyboardMarkup 反面,把按鈕區域移除
而且也可以指定人,官方說明是說可以用在投票時,已投票的人就移除他的按紐區域
用回覆指定的話就像這樣:
不指定人的話,就是移除所有人的按鈕區域
https://core.telegram.org/bots/api#keyboardbutton
這個是按紐本體,也是一個陣列,而且又有一堆選項
這次就一次寫出來,然後每個都按按看吧
text
不用我解釋吧,就是按紐上的文字
request_contact
這個選項設成 true 的話,那顆按紐就會變成發送使用者的電話號碼
如果有需要用電話號碼驗證的話,用這個會很方便
但是要注意,使用者是可以不透過這顆按紐發送電話號碼的,而且可以發送別人的電話號碼
如果有需要限定只能發送那個帳號的號碼,那就要在機器人收到訊息後,檢查 uid 是否相符
request_location
設成 true 的話,按紐就會變成發送使用者的位置
這個不一定是真的位置,不適合做為驗證地區用
因為機器人無法分辨你是按下方按紐發送的,還是用發送位置發送的,而且位置也很好偽造
有需要請使用者填地址的話還是請他用輸入的比較好,用座標很容易變成別人家的地址
request_poll
這個選項裡面要放一個叫做 KeyboardButtonPollType 的陣列,如果直接填 quiz
regular
會出錯
Request has failed with error 400: Bad Request: can't parse keyboard button: Field "request_poll" must be of type Object
'request_poll' => 'quiz' // X
'request_poll' => ['type' => 'quiz'] // O
設定成 quiz 會限制使用者「透過這顆按紐」只能建立測驗
設定成 regular 會限制使用者「透過這顆按紐」只能建立投票
如果填其他東西或是空字串,就會兩個都可以建立
不過這個也是可以不透過按鈕發送的
所以機器人在收到訊息後還是要檢查訊息是不是正確的格式