【问题标题】:Implementing Telegram bot webhooks in ColdFusion在 ColdFusion 中实现 Telegram bot webhook
【发布时间】:2017-09-25 18:12:22
【问题描述】:

我正在用 ColdFusion (CFML) 开发一个应用程序,以创建在 Telegram 消息传递平台上运行的通用、有状态的机器人。到目前为止,我在 PHP 中找到了很多示例,在其他语言中找到了一些示例(Ruby,...),在 CFML 中没有。所以,我来了。

“getUpdates”(即轮询)方式运行起来轻而易举,但以适合交互式使用的速度(大约 30 秒)轮询 Telegram 服务器以获取新更新是不可行的。所以,我转向了 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 端执行什么样的编码。

【问题讨论】:

    标签: coldfusion bots telegram cfml


    【解决方案1】:

    我想通知您,经过一番努力,我可以解决这个问题。编码由 ColdFusion 自己处理。 Telegram 在 Webhook 更新中返回的数据是二进制的,CF 将它们视为 ByteArray(实际上,它们被声明为“Array”,但不能直接寻址)。尽管如此,ToString() 函数(如果应用)返回一个完全有效的字符串。

    所以,首先要做的是:

    <cfset reply = DeserializeJSON(ToString(StructFind(GetHttpRequestData(), "content"))) >
    

    顺便说一句,StructFind() 只是通过GetHttpRequestData() 返回的结构提取“内容”部分。 之后,reply 是一个包含所需内容的结构,例如:

    <cfset message_id = reply.message.message_id />
    <cfset message_text = reply.message.text  />
    

    等等。 希望对大家有用。

    【讨论】:

    • 我无法包含CFML代码,发布后会自动剪切......
    • 添加代码时,需要在行首添加 4 个空格以进行 StackOverflow 格式设置。我已经编辑了你的答案
    猜你喜欢
    • 2017-08-03
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 2017-01-11
    • 2017-07-22
    • 2016-07-15
    • 1970-01-01
    相关资源
    最近更新 更多