【PHP Telegram Bot】Day22 - ReplyKeyboardMarkup:让输入框下方出现按钮区域

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
所以机器人在收到讯息後还是要检查讯息是不是正确的格式


<<:  Re: 新手让网页 act 起来: Day16 - 探索 useState (2)

>>:  [DAY 26] 用google sheet 做简易UI介面(1/3)

番外篇 - NestJs - Guard

NestJs - Guard 验证分为两种,登入权限验证以及角色验证 举例说明:我们将 API 分为...

Day 3 - cheatSheet 小技巧与本机环境设定

CheatSheet 小技巧 因为大家其实不太会被指令 所以在网路上有一个小小的P5 cheatsh...

Day 26 - styled-components 笔记1

Q_Q .. styled.div 产生一个 div,写 css style,放进变数里变成 co...

Day27 简易小键盘小实作2

接续昨天 我们在按钮的action里加入这段程序码, 变数tag-1的部分就是按下1时呈现的数字是刚...

找LeetCode上简单的题目来撑过30天啦(DAY27)

今天上班搞一整天,只解出一个BUG,结果下班以後脑袋比较灵光? 总之今天是顺利解出来了 题号:129...