Escape strings a serem postadas via curl

2

Estou tentando criar um script que use alguns feeds atom e publique-os para liberar a API do Slack via% código%. O que eu tenho agora funciona para textos simples, mas alguns deles têm aspas duplas ou curl caracteres neles e isso parece incomodar a API slack, já que recebo um erro & . Aqui está meu script:

#!/bin/bash
rsstail -i 3 -u "http://MY_FEED_URL" -n 0 | while read line;
do
    # This is just a sample text, it should be ${line}
    data='Something "&" and something do " "';
    payload="payload={\"channel\": \"#my_channel\", \"username\": \"Bot\", \"text\": \"${data}\", \"icon_emoji\": \":ghost:\"}";
    echo ${payload};
    curl \
        -H "Accept: application/json" \
        -X POST \
        -d '${payload}' \
        https://hooks.slack.com/services/xxxx

A saída do "echo" é:

payload={"channel": "#my_channel", "username": "Bot", "text": "Something "&" and something do " "", "icon_emoji": ":ghost:"}

Eu não sou avançado no bash scripting e preciso de um pouco de ajuda. O que estou fazendo errado?

Obrigado!

    
por Comforse 28.04.2016 / 17:48

1 resposta

4

Você precisa codificar os dados em url, e a maneira mais fácil de fazer isso é obter curl , substituindo a opção -d por --data-urlencode . Além disso, você precisa usar aspas duplas ou o shell não expandirá a variável, então temos

curl \
    -H "Accept: application/json" \
    -X POST \
    --data-urlencode "${payload}" \
    https://hooks.slack.com/services/xxxx

Você também pode simplificar a configuração de payload= tendo parte da string entre aspas simples e parte entre aspas duplas, desde que não haja espaço entre aspas as partes, como em '...'"..."'...' . Então, nós conseguimos

payload='payload={"channel": "#my_channel", "username": "Bot", "text": "'"${data}"'", "icon_emoji": ":ghost:"}'

Provavelmente você precisa escapar das aspas duplas em data , talvez com \ , pois elas estarão dentro de "" em uma cadeia json.

data='Something \"&\" and something do \" \"'

Se você leu seus dados da entrada na variável line , você pode fazer essa substituição com o bash:

line=${line//\"/\\"}
    
por 28.04.2016 / 19:08