我正在开发ColdFusion(CFML)中的应用程序,以创建在Telegram消息传递平台上运行的通用,有状态的机器人。到目前为止,我发现PHP中有很多例子,其中一些用其他语言(Ruby,...),CFML中没有。所以,我在这里。
“getUpdates”(即轮询)方式运行得很轻松,但是以交互式使用(约30秒)的速率轮询电报服务器进行新更新是不可行的。所以,我转向了Webhooks。
我将查看自签名证书的webhook设置,这里的范围超出范围,但我已准备好解释我是如何克服这个问题的。 我的问题是:如何在发生更新时解码从Telegram服务器收到的帖子?
我的应用程序服务器(ColdFusion + Tomcat + Apache2)从Telegram获取的是一个带有如下标题的HTTP:
struct
accept-encoding: gzip, deflate
connection: keep-alive
content-length: 344
content-type: application/json
host: demo.bigopen.eu
和这样的内容部分:
binary
1233411711210097116101951..... (*cut*)
请注意,数据部分(ASCII)仅包含十进制数字,而不是十六进制数字。我一直在努力解决这些问题,我正在努力获得单个消息的JSON表示。
我一直在尝试使用我拥有的CFML工具,例如BinaryDecode()
,CharsetEncode()
,Java GZip库等,但到目前为止还没有成功。我在回复中期待一些序列化的JSON,但它以我无法解码的方式编码。我没有在文献中找到任何提示,因为只显示了对语言特定库(例如PHP的file_get_contents
)的调用。
我不希望给出实际的CFML代码,但希望Telegram方面执行什么样的编码。
答案 0 :(得分:2)
我想告诉我,经过一番努力,我可以解决这个问题。编码由ColdFusion本身处理。 Telegram在Webhook更新中返回的数据是二进制的,CF将它们视为ByteArray(实际上,它们被声明为"数组"但不能直接寻址)。尽管如此,ToString()
函数(如果应用)将返回一个完全有效的字符串。
所以,首先要做的是:
<cfset reply = DeserializeJSON(ToString(StructFind(GetHttpRequestData(), "content"))) >
BTW,StructFind()
只提取&#34;内容&#34;由GetHttpRequestData()
返回的结构的部分。
之后,回复是一个包含所需内容的结构,例如:
<cfset message_id = reply.message.message_id />
<cfset message_text = reply.message.text />
等等。 希望它对任何人都有用。