2017-09-21 1 views
0

Ich habe einen eingehenden Webhook auf Slack, die als ein Benachrichtigungssystem für Änderungen in meiner Ruby-basierten Web-App (mit Sinatra, nicht Rails).Slack eingehende Webhook funktioniert nicht, wenn es Apostrophe in Text

Hier ist der Code für die Ruby-Methode, die die Daten an die Webhook sendet (sensible Informationen aus dem webhook_url ist geschwärzt wie [...]):

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 

Bei dem Verfahren wird das text Argument ist ein Zeichenfolge, die die Beschreibung der Änderung enthält und das user Argument ist eine Zeichenfolge, die den Namen der Person enthält, die für die Änderung verantwortlich ist.

Wenn jedoch das text Argument einen Apostroph ' hat, zeigt es nichts auf schlaff an.

Ich habe versucht, die ' Argument text zu entkommen, aber das hat nicht funktioniert - ich habe Zuflucht genommen, die Apostrophe zu entfernen, aber kann keine Situationen berücksichtigen, in denen Benutzer Apostrophe in etwas enthalten können. Laut dem Nachrichtengenerator von slack sollten Apostrophe möglich sein.

Irgendeine Idee, was ich tun kann, um das zu beheben?

+0

_Sidenote: _ sollte man den 'Kernel # system' Aufruf _return_ überprüfen. Wenn es falsch ist, stimmt etwas mit dem Befehl 'curl' nicht überein. – mudasobwa

+0

Warum verwenden Sie ein Befehlszeilenprogramm (curl), um die HTTP-Anfrage zu stellen? Ruby kommt mit 'Net :: HTTP' und es gibt mehrere HTTP-Edelsteine. – Stefan

Antwort

0

Es ist nichts falsch mit dem Slack API-Aufruf. Das Problem scheint in dieser Linie zu sein:

"curl -X POST --data-urlencode 'payload=#{payload}' #{webhook_url}" 

Beachten Sie, dass Sie verwenden Apostroph zu definieren Grenzwerte für Nutzlast. Also, in payload, wenn es ein Apostroph ist, wird es so etwas wie dieses werden:

"curl -X POST --data-urlencode 'payload=david's new bike' #{webhook_url}" 

Jetzt können Sie beobachten, dass die Nutzlast mit Fahrrad beendet haben sollte, endet aber mit david und Der zusätzliche Text ist nicht für den curl-Befehl gültig.

Sie können versuchen, einzelne Anführungszeichen durch \' zu ersetzen, und das sollte funktionieren.

payload=#{payload.gsub('\'', %q(\\\'))} 
+0

Danke! Ich weiß nicht, wie ich das vermisst habe! Ich werde es ausprobieren und Sie wissen lassen, wie es geht. Aber genau so verstehe ich, was macht die "tr" Methode hier? Ich kenne diese Methode nicht sehr gut. Auch das '% q'? das ist mir auch nicht so vertraut. –

+0

@UmarGhouse - Ich ersetzte "tr" durch "gsub" -Methode, die alle Instanzen einer Zeichenfolge durch eine neue Zeichenfolge ersetzt. '% q' bezeichnet eine einzelne in Anführungszeichen gesetzte Zeichenkette und ist sehr praktisch zu verwenden (andernfalls hätte ich' '\\\\\ '' stattdessen verwendet). – 31piy

+0

Oh OK. Danke dafür. Leider kann ich das für die nächsten Tage nicht testen (im Urlaub: P). Aber ich melde mich sobald ich es tue! –

Verwandte Themen