文字被隱藏了看不到,總要有個方法能看到原本的文字吧,所以今天要來把「原始字串」找回來
首先我想知道使用者按了哪個選項,因為「隱藏部份文字」和「隱藏全部文字」要顯示的「原始字串」不一樣(安*安你好、安\*安*你*好),所以先到設定中把 Inline Feedback
設成 100%,如果忘記這是什麼的話可以回去看這篇文章 Day23 - Inline mode(內聯模式):在輸入框使用機器人
設定完後就來到昨天寫的 $results
,來把 reply_markup
加在下方,記得兩個 result 都要加按鈕
加完就先來執行看看程式
查詢時
發送隱藏訊息
按下按鈕
看來 callback_query
裡是沒有「原始字串」的,而且 callback_data
最多只能放 64 Bytes,但是 inline_query
最多會有 256 characters,那就只好把「原始字串」儲存起來,按下按鈕時讀取啦
https://core.telegram.org/bots/api#inlinekeyboardbutton
https://core.telegram.org/bots/api#inlinequery
因為會有很多則的隱藏訊息和很多顆按鈕,為了在按下按鈕時能找回「原始字串」,我們必須在按鈕上做個記號,讓我們知道要去哪裡找「原始字串」,雜湊值 Hash 這個東東就非常適合,它就像是指紋一樣,每個字串都會有一個自己專屬的雜湊值,幾乎找不到不同字串有相同的雜湊值,而且 PHP 中的 hash()
函式剛好會把雜湊值裁成 64 Bytes,另外要注意的是雜湊算法並不是加密,它是無法解密的,無法從雜湊值反推回「原始字串」
像這樣取完 Hash 後填在 callback_data 就算是做好記號了
另一個也是差不多,不過多了清理的動作,一開始也有說到我想顯示的字串
雖然說無法反推回去,但是可以將雜湊值當作是路標,沿著路標走就能找到儲存起來的字串
有兩個時機可以儲存,一是在查詢的時候就儲存,另一個是發送出去時。如果選第一種的話就會一直不斷儲存用不到的雜湊值(查詢時會回傳很多字串),第二種的話就要讓 Inline Feedback
一直是 100%(確保選擇的結果有儲存)。最後我是選了第二種
又來到熟悉的地方,這次要處理 chosen_inline_result
,再新增一個 elseif
和 processChosenInlineResult()
函式
因為有兩種字串,如果剛剛把雜湊值填在 result_id
裡就不知道是要存哪種了,所以不管怎樣都要再算一次雜湊值,那不如就讓 result_id
保持原樣,然後用 result_id
來判斷要用哪個「原始字串」和雜湊值
接著把雜湊值當作檔名、原始字串放在檔案中儲存起來,這樣就算是完成對應了
首先來執行程式看看新的按鈕回傳的訊息長怎樣
來到 processCallbackQuery()
,加上一個條件:如果 data
是個雜湊值的檔案,那就把檔案讀取的結果發送回去並且顯示成訊息框,否則就顯示「找不到資料」的快閃訊息
最後重新執行程式就能用按鈕找回「原始字串」啦
這個是按了之前沒存雜湊值的按鈕