iT邦幫忙

2021 iThome 鐵人賽

DAY 22
1
Software Development

用 PHP 打造專屬於自己的 Telegram 聊天機器人吧!系列 第 22

【PHP Telegram Bot】Day22 - ReplyKeyboardMarkup:讓輸入框下方出現按鈕區域

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20211001/201329165C0dAW8snk.png

今天的東東是個超多層的陣列,足以讓腦袋死機,請做好心理準備再服用

前置作業

又回到 apiRequestJson() 啦,昨天因為陣列只有一層,所以不需要 json_encode(),但第兩層以上的陣列就需要自己轉成 JSON

foreach ($parameters as &$val) {
    if (is_array($val)) {
        $val = json_encode($val);
    }
}

在中間加上這坨東東就能把第二層以上的陣列轉成 JSON 了
https://ithelp.ithome.com.tw/upload/images/20211001/20132916COdXmInuym.png


ReplyKeyboardMarkup

https://core.telegram.org/bots/api#replykeyboardmarkup
https://ithelp.ithome.com.tw/upload/images/20211001/201329168jkvSJHkgy.png
這個是一個用來裝按鈕的陣列,裡面有很多選項可以用,我來一個個介紹
https://ithelp.ithome.com.tw/upload/images/20211001/20132916avVbDsTv4f.png

keyboard

先看到 keyboard 這格,你可以發現是兩層的陣列再加上叫做 KeyboardButton 的東東
https://ithelp.ithome.com.tw/upload/images/20211001/2013291680CCmEq8YV.png
這兩層陣列分別代表著「列」跟「欄」,「列」可以填很多個陣列,「欄」也可以填很多個陣列

keyboard 裡裝著很多列,列裡面又有很多欄,最後欄裡面放著 KeyboardButton
https://ithelp.ithome.com.tw/upload/images/20211001/20132916FGKaeWujp9.png
如果你覺得擠在一起寫你會看不懂,你也可以寫成這樣
https://ithelp.ithome.com.tw/upload/images/20211001/20132916xNNN7X63Vs.png

resize_keyboard

這個選項會調整這個裝按鈕的區域高度,原本預設這個區域是固定高度的,按鈕會去補滿高度變得很肥
https://ithelp.ithome.com.tw/upload/images/20211001/20132916wb43K67B6m.png
設成 true 以後,就會是這個區域配合按鈕調整高度
https://ithelp.ithome.com.tw/upload/images/20211001/20132916oNBoKP1tDx.png
https://ithelp.ithome.com.tw/upload/images/20211001/20132916e4Silq8qCu.png
不過按鈕多到了原本的高度,設定這個選項就沒用了

因為最高的高度就是這樣,這個區域會變成滑動的方式
https://ithelp.ithome.com.tw/upload/images/20211001/20132916IA4NimSQyR.png

one_time_keyboard

如果把這個選項設成 true,使用者按下按鈕後,這個區域就會自動收起來
https://ithelp.ithome.com.tw/upload/images/20211001/20132916dl7c3gn5PR.png
https://ithelp.ithome.com.tw/upload/images/20211001/20132916cu5sxXdoVP.png

input_field_placeholder

這個選項可以修改輸入框的浮水印文字
https://ithelp.ithome.com.tw/upload/images/20211001/201329164OMtPSr9lp.png
https://ithelp.ithome.com.tw/upload/images/20211001/20132916qksigXZZIG.png

selective

這個比較有趣,設定為 true 之後可以指定某個人,讓整個群組裡只有某個人有按鈕可以按

有三種方式可以指定

  1. 使用 username 標記
    https://ithelp.ithome.com.tw/upload/images/20211001/20132916aXhCRgxQDz.png
    我的畫面:
    https://ithelp.ithome.com.tw/upload/images/20211001/20132916ZS3UPPRTAw.png
    其他人的畫面:
    https://ithelp.ithome.com.tw/upload/images/20211001/201329166Ns7YUKH3Y.png

  2. 回覆訊息
    https://ithelp.ithome.com.tw/upload/images/20211001/20132916vOsxVnmOQP.png
    我的畫面:
    https://ithelp.ithome.com.tw/upload/images/20211001/20132916MmZBl341Ow.png
    其他人的畫面:
    https://ithelp.ithome.com.tw/upload/images/20211001/20132916t7s1DpotnO.png

  3. 使用 Deep Link 標記
    https://ithelp.ithome.com.tw/upload/images/20211003/20132916airopTXTRI.png
    我的畫面:
    https://ithelp.ithome.com.tw/upload/images/20211003/20132916EJr3eI7fMs.png
    其他人的畫面:
    https://ithelp.ithome.com.tw/upload/images/20211003/20132916983MewFmbt.png


ReplyKeyboardRemove

https://core.telegram.org/bots/api#replykeyboardremove
https://ithelp.ithome.com.tw/upload/images/20211001/20132916JAeNq3ps7y.png
這個東東是 ReplyKeyboardMarkup 反面,把按鈕區域移除

而且也可以指定人,官方說明是說可以用在投票時,已投票的人就移除他的按紐區域

用回覆指定的話就像這樣:
https://ithelp.ithome.com.tw/upload/images/20211001/20132916nmt8Xe4AYr.png
不指定人的話,就是移除所有人的按鈕區域


KeyboardButton

https://core.telegram.org/bots/api#keyboardbutton
https://ithelp.ithome.com.tw/upload/images/20211001/20132916R9xN9U2wnO.png
這個是按紐本體,也是一個陣列,而且又有一堆選項

這次就一次寫出來,然後每個都按按看吧
https://ithelp.ithome.com.tw/upload/images/20211001/20132916KkN67SRflU.png

text

不用我解釋吧,就是按紐上的文字

request_contact

這個選項設成 true 的話,那顆按紐就會變成發送使用者的電話號碼
https://ithelp.ithome.com.tw/upload/images/20211001/20132916M81SQYAgpz.png
如果有需要用電話號碼驗證的話,用這個會很方便

但是要注意,使用者是可以不透過這顆按紐發送電話號碼的,而且可以發送別人的電話號碼

如果有需要限定只能發送那個帳號的號碼,那就要在機器人收到訊息後,檢查 uid 是否相符
https://ithelp.ithome.com.tw/upload/images/20211001/20132916oj7sdFqmbS.png

request_location

設成 true 的話,按紐就會變成發送使用者的位置
https://ithelp.ithome.com.tw/upload/images/20211001/20132916KQ3cYFWxzx.png
這個不一定是真的位置,不適合做為驗證地區用

因為機器人無法分辨你是按下方按紐發送的,還是用發送位置發送的,而且位置也很好偽造

有需要請使用者填地址的話還是請他用輸入的比較好,用座標很容易變成別人家的地址

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 會限制使用者「透過這顆按紐」只能建立測驗
https://ithelp.ithome.com.tw/upload/images/20211001/20132916WxohFWhxMx.png
設定成 regular 會限制使用者「透過這顆按紐」只能建立投票
https://ithelp.ithome.com.tw/upload/images/20211001/201329169r5RgiqrzX.png
如果填其他東西或是空字串,就會兩個都可以建立
https://ithelp.ithome.com.tw/upload/images/20211001/201329160tFbFChrDk.png
不過這個也是可以不透過按鈕發送的
https://ithelp.ithome.com.tw/upload/images/20211001/20132916pOHxjPJ3hR.png
所以機器人在收到訊息後還是要檢查訊息是不是正確的格式


上一篇
【PHP Telegram Bot】Day21 - sendPhoto:三種發送圖片的方式
下一篇
【PHP Telegram Bot】Day23 - Inline mode(內聯模式):在輸入框使用機器人
系列文
用 PHP 打造專屬於自己的 Telegram 聊天機器人吧!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言