Enviando o gist para o github via cURL e problemas com novas linhas dentro do arquivo

1

Então, digamos que eu tenha um arquivo index.php contendo isto:

 <?= "Hello" ?>

 <?= echo "WORLD" ?>

E eu queria enviar o conteúdo deste arquivo para o meu gists no github, o que estou fazendo via

gist_content=$(cat 'index.php')

curl --user "GITHUB_USER"  -H "Content-Type: application/json; charset=UTF-8" -X POST -d  "{ \"description\": \"Created via API\", \"public\": \"true\", \"files\":{ \"index.php \":{ \"content\": \"$gist_content\"}}\" " https://api.github.com/gists

Agora, esse script não funciona por algum motivo e recebo uma resposta de erro

{
  "message": "Problems parsing JSON",
  "documentation_url": "https://developer.github.com/v3/gists/#create-a-gist"
}

Se eu escrever tudo em uma linha sem tags, aspas como hello funcionam

    
por samayo 13.05.2016 / 16:33

2 respostas

1

Você tem algum erro de sintaxe na sua string JSON. Por favor, verifique e corrija. Por exemplo,

$ echo "{ \"description\": \"Created via API\", \"public\": \"true\", \"files\":{ \"index.php \":{ \"content\": \"$gist_content\"}}\" " | python -m json.tool
Expecting ',' delimiter: line 1 column 95 (char 94)

Então você está perdendo uma das chaves, você está abrindo 3, mas fechando 2.

A sintaxe simplificada deve ser como:

$ echo '{"description": "Created via API", "public": "true", "files": { "index.php": { "content": "foo" } } }' | python -m json.tool
{
    "description": "Created via API",
    "files": {
        "index.php": {
            "content": "foo"
        }
    },
    "public": "true"
}

Então é uma questão de escapar das citações, mas você está escapando da maneira errada, veja: Como escapar de aspas simples dentro de strings entre aspas simples? Por exemplo:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

Como você está importando arquivos externos que também incluem aspas duplas, você deve também citá-los usando ferramentas como sed , etc. Da mesma forma que as novas linhas, você deve alterá-las para os caracteres de controle apropriados ( <br> ou \n ) dependendo do formato esperado.

Assim, seu exemplo final seria:

gist_content=$(cat index.php | sed 's/"/\"/g' | paste -s -d '\n' -)
curl --user "GITHUB_USER" -H "Content-Type: application/json; charset=UTF-8" -X POST -d "{"\""description"\"": "\""Created via API"\"", "\""public"\"": "\""true"\"", "\""files"\"": { "\""index.php"\"": { "\""content"\"": "\""$gist_content"\"" } } }" https://api.github.com/gists
    
por 13.05.2016 / 16:55
1

Você pode usar esta solução para substituir novas linhas, você também tem que escapar de aspas duplas no content & description field:

#!/bin/bash

ACCESS_TOKEN="YOUR_ACCESSS_TOKEN"

description="the description for this gist. There are also some quotes 'here' and \"here\" in that description"
public="true"
filename="index.php"

desc=$(echo "$description" | sed 's/"/\"/g' | sed ':a;N;$!ba;s/\n/\n/g')
json=$(cat index.php | sed 's/"/\"/g' | sed ':a;N;$!ba;s/\n/\n/g')

curl -v -H "Content-Type: text/json; charset=utf-8" \
        -H "Authorization: Token $ACCESS_TOKEN" \
        -X POST https://api.github.com/gists -d @- << EOF
{ 
  "description": "$desc", 
  "public": "$public", 
  "files": { 
      "$filename" : { 
          "content": "$json"
       } 
   } 
}
EOF
    
por 25.02.2017 / 14:52

Tags