我有一个关于slack的传入webhook,它充当我基于ruby的web-app中更改的通知系统(使用Sinatra,而不是Rails)。
这里是将数据发送到webhook的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
,但这不起作用 - 我已经使用删除撇号,但可以'用户可以在任何事情中包含撇号的任何情况。另外,根据松弛的消息构建器,撇号应该是可能的。
知道我能做些什么来解决这个问题吗?
答案 0 :(得分:0)
松弛的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(\\\'))}