【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


<<:  Day23:今天来谈一下Azure Sentinel 中的查询记录

>>:  DAY22 - 将作品发布出去吧 - 前端篇 (firebase)

D22. 学习基础C、C++语言

D22. 题目练习UVA11565 #include <stdio.h> #includ...

Day7:K-means分析

  K-means的中文有人称作集群分析,但是主要都还是讲英文,比较容易懂。   这分析方法跟KNN...

Day17 Let's ODOO: Data Files

通常我们在写module的时候,会需要一些初始资料或是固定需要的资料,我们可以定义资料在创立Mode...

R语言-视觉化- 世界地图( map in r.studio )

废话不多说,直接附上code 影片含有程序码详细解说,若有误再烦请告知,谢谢 资料下载处 libra...

[Day 19] - 初探永丰银行线上收款API - 订单查询及其他(1)

继续昨天的内容,在建立订单後,如果是信用卡订单,api会回给一个付款页面, 在这个页面用测试资料付款...