在ColdFusion中实现Telegram bot webhooks

时间:2017-09-25 18:12:23

标签: coldfusion bots telegram cfml

我正在开发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方面执行什么样的编码。

1 个答案:

答案 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  />

等等。 希望它对任何人都有用。