如果文本

时间:2017-09-21 04:40:56

标签: ruby webhooks slack

我有一个关于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,但这不起作用 - 我已经使用删除撇号,但可以'用户可以在任何事情中包含撇号的任何情况。另外,根据松弛的消息构建器,撇号应该是可能的。

知道我能做些什么来解决这个问题吗?

1 个答案:

答案 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(\\\'))}