我有一个即将到来的网页钩子,作为一个通知系统,在我的红宝石为基础的网络应用(使用西纳屈,而不是Rails)的变化。
下面是向web钩子发送数据的ruby方法的代码(来自webhook_url的敏感信息被编辑为.):
def notify_slack(text, user)
webhook_url = "https://hooks.slack.com/services/[...]/[...]/[...]"
payload = {
:channel => "#app-changelog",
:username => "Changelog Bot",
:attachments => [
{
:fields => [
{
:title => "Change Description",
:value => text
},
{
:title => "Changed By:",
:value => user,
:short => true
}
]
}
]
}.to_json
cmd = "curl -X POST --data-urlencode 'payload=#{payload}' #{webhook_url}"
system(cmd)
end
在该方法中,text
参数是保存更改描述的字符串,而user
参数是保存更改负责人的名称的字符串。
但是,如果text
参数中有一个撇号'
,那么它不会显示任何松弛的内容。
我尝试过在'
参数中转义text
,但这不起作用--我求助于移除撇号,但无法解释任何用户可能在任何情况下都包括撇号的情况。另外,根据slack的消息生成器,撇号应该是可能的。
知道我能做什么来解决这个问题吗?
发布于 2017-09-20 20:59:28
松弛的API调用没有什么问题。问题就在这条线上:
"curl -X POST --data-urlencode 'payload=#{payload}' #{webhook_url}"
请注意,您正在使用单引号来定义有效负载的限制。因此,在payload
中,如果有一个单引号,它将变成如下所示:
"curl -X POST --data-urlencode 'payload=david's new bike' #{webhook_url}"
现在,您可以观察到,有效负载应该以结束,但以david结尾,而额外的文本对于curl命令无效。
您可以尝试用\'
替换单引号,这应该有效。
payload=#{payload.gsub('\'', %q(\\\'))}
https://stackoverflow.com/questions/46335609
复制