2017-09-21 11 views
0

Rails가 아닌 Sinatra를 사용하여 내 루비 기반 웹 응용 프로그램의 변경 사항에 대한 알림 시스템 역할을하는 들어오는 webhook이 있습니다. 여기 텍스트에 아포스트로피가있는 경우 들어오는 웹 훅이 느려지지 않습니다.

은은 webhook로 데이터를 전송 루비 방법에 대한 코드이다 (AS 검열 된 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

_Sidenote : _ 커널 _ 시스템 _ 호출 _return_을 확인해야합니다. 거짓이라면, curl 명령 자체에 뭔가 잘못된 것이 있습니다. – mudasobwa

+0

왜 명령 줄 도구 (컬)를 사용하여 HTTP 요청을 만드십니까? Ruby는'Net :: HTTP'와 함께 제공되며 몇몇 HTTP 젬이 있습니다. – Stefan

답변

0

슬랙 API 호출에는 아무런 문제가 없습니다. 문제는이 줄 것으로 보인다 : 당신이 페이로드에 대한 제한 사항을 정의하는 작은 따옴표를 사용하는

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

참고. 당신은 페이로드 자전거으로 종료해야 관찰하지만, 데이비드로 끝나는, 수,

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

자 : 작은 따옴표가있는 경우 그래서, payload에서,이 같은 될 것입니다 curl 명령에는 추가 텍스트가 유효하지 않습니다.

작은 따옴표를 \' (으)로 바꾸어보세요. 제대로 작동해야합니다.

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

감사! 어떻게 내가 그것을 놓쳤는 지 모르겠다! 나는 그것을 밖으로 시도하고 어떻게되는지 알려주지. 하지만 그냥 이해할 수 있습니다. 여기서'tr' 메서드는 무엇을합니까? 나는 그 방법에 익숙하지 않다. 또한,'% q'? 그것도 익숙하지 않다. –

+0

@UmarGhouse -'tr'을'gsub' 메서드로 대체했습니다.이 메서드는 문자열의 모든 인스턴스를 새로운 문자열로 바꿉니다. '% q'은 작은 따옴표로 묶은 문자열을 나타내므로 사용하기가 훨씬 편리합니다 (그렇지 않으면'\\\\\ ''를 사용했을 것입니다). – 31piy

+0

오 OK. 고마워. 불행히도, 나는 며칠 동안 이것을 시험 할 수 없을 것이다 (휴가 중 : P). 하지만 곧 내가 다시보고 할게! –