iT邦幫忙

2021 iThome 鐵人賽

DAY 28
0
Software Development

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

【PHP Telegram Bot】Day28 - 防雷機器人(2):儲存與查看原始訊息

https://ithelp.ithome.com.tw/upload/images/20211007/20132916bL5MZoFHe9.png

文字被隱藏了看不到,總要有個方法能看到原本的文字吧,所以今天要來把「原始字串」找回來

在訊息下方增加按鈕

首先我想知道使用者按了哪個選項,因為「隱藏部份文字」和「隱藏全部文字」要顯示的「原始字串」不一樣(安*安你好、安\*安*你*好),所以先到設定中把 Inline Feedback 設成 100%,如果忘記這是什麼的話可以回去看這篇文章 Day23 - Inline mode(內聯模式):在輸入框使用機器人
https://ithelp.ithome.com.tw/upload/images/20211007/201329169MZkOSmME6.png
設定完後就來到昨天寫的 $results,來把 reply_markup 加在下方,記得兩個 result 都要加按鈕
https://ithelp.ithome.com.tw/upload/images/20211007/20132916LUS7jBxrn5.png
https://ithelp.ithome.com.tw/upload/images/20211007/20132916s4jFNRmXVZ.png
加完就先來執行看看程式

查詢時
https://ithelp.ithome.com.tw/upload/images/20211007/201329167YceFLKdpJ.png
發送隱藏訊息
https://ithelp.ithome.com.tw/upload/images/20211007/20132916QYYYbnOvTK.png
按下按鈕
https://ithelp.ithome.com.tw/upload/images/20211007/20132916QKkZiWyOuR.png
看來 callback_query 裡是沒有「原始字串」的,而且 callback_data 最多只能放 64 Bytes,但是 inline_query 最多會有 256 characters,那就只好把「原始字串」儲存起來,按下按鈕時讀取啦

https://core.telegram.org/bots/api#inlinekeyboardbutton
https://ithelp.ithome.com.tw/upload/images/20211007/2013291668zZrMChyu.png
https://core.telegram.org/bots/api#inlinequery
https://ithelp.ithome.com.tw/upload/images/20211007/20132916T0gG7nOohy.png


把「原始字串」的 Hash 放進 callback_data

因為會有很多則的隱藏訊息和很多顆按鈕,為了在按下按鈕時能找回「原始字串」,我們必須在按鈕上做個記號,讓我們知道要去哪裡找「原始字串」,雜湊值 Hash 這個東東就非常適合,它就像是指紋一樣,每個字串都會有一個自己專屬的雜湊值,幾乎找不到不同字串有相同的雜湊值,而且 PHP 中的 hash() 函式剛好會把雜湊值裁成 64 Bytes,另外要注意的是雜湊算法並不是加密,它是無法解密的,無法從雜湊值反推回「原始字串」

像這樣取完 Hash 後填在 callback_data 就算是做好記號了
https://ithelp.ithome.com.tw/upload/images/20211007/20132916GXSFWCzRtv.png
另一個也是差不多,不過多了清理的動作,一開始也有說到我想顯示的字串
https://ithelp.ithome.com.tw/upload/images/20211007/20132916uKEsLXuAcq.png


儲存 Hash 與「原始字串」的對應

雖然說無法反推回去,但是可以將雜湊值當作是路標,沿著路標走就能找到儲存起來的字串

有兩個時機可以儲存,一是在查詢的時候就儲存,另一個是發送出去時。如果選第一種的話就會一直不斷儲存用不到的雜湊值(查詢時會回傳很多字串),第二種的話就要讓 Inline Feedback 一直是 100%(確保選擇的結果有儲存)。最後我是選了第二種

又來到熟悉的地方,這次要處理 chosen_inline_result,再新增一個 elseifprocessChosenInlineResult() 函式
https://ithelp.ithome.com.tw/upload/images/20211007/20132916B3GYpUw2GU.png
因為有兩種字串,如果剛剛把雜湊值填在 result_id 裡就不知道是要存哪種了,所以不管怎樣都要再算一次雜湊值,那不如就讓 result_id 保持原樣,然後用 result_id 來判斷要用哪個「原始字串」和雜湊值
https://ithelp.ithome.com.tw/upload/images/20211007/20132916XsrpL3QwWi.png
接著把雜湊值當作檔名、原始字串放在檔案中儲存起來,這樣就算是完成對應了
https://ithelp.ithome.com.tw/upload/images/20211007/20132916S2LsyfcqH0.png


從按鈕的 Hash 把「原始字串」找回來

首先來執行程式看看新的按鈕回傳的訊息長怎樣
https://ithelp.ithome.com.tw/upload/images/20211007/201329162X6hXlwBz4.png
來到 processCallbackQuery(),加上一個條件:如果 data 是個雜湊值的檔案,那就把檔案讀取的結果發送回去並且顯示成訊息框,否則就顯示「找不到資料」的快閃訊息
https://ithelp.ithome.com.tw/upload/images/20211007/20132916K0EyFmM3bc.png
最後重新執行程式就能用按鈕找回「原始字串」啦
https://ithelp.ithome.com.tw/upload/images/20211007/20132916aVqvNDCQw2.png
這個是按了之前沒存雜湊值的按鈕
https://ithelp.ithome.com.tw/upload/images/20211007/20132916Qs41IEYzHB.png


上一篇
【PHP Telegram Bot】Day27 - 防雷機器人(1):讓發出去的訊息隱藏吧
下一篇
【PHP Telegram Bot】Day29 - 社群按讚機器人(1):讓頻道出現按讚按鈕
系列文
用 PHP 打造專屬於自己的 Telegram 聊天機器人吧!30

尚未有邦友留言

立即登入留言