xLauchaz / API

la API dolor de cabeza
0 stars 0 forks source link

Problemas en la URL con ilegal characters #1

Closed MartinNievas closed 1 year ago

MartinNievas commented 1 year ago

Hola @xLauchaz escribo lo que encontré abajo:

En esta parte no se puede enviar diréctamente lo que viene en la respuesta:

https://github.com/xLauchaz/API/blob/81bf34b0fc44ad4a78d319fce8c3e4d0ce4c8ab7/comprobando2.c#L152-167

Hay que buscar el campo puntual en la respuesta. Que cambios haría:

  1. Buscar el campo explanation y el campo url en la respuesta
  2. Utilizar eso para armar la nueva url
  3. En explanation hay que:
    • convertir los espacios en %20
    • convertir los caracteres especiales o utf-8 en otra cosa, acá en _
    • convertir las comas en %2C, lo mismo para los \n

Cambiando las líneas 152 a 167 quedaría:


// Buscar el campo explanation en la respuesta
cJSON *json2 = cJSON_Parse(strbuf2.ptr);
cJSON *explanation_json = cJSON_GetObjectItemCaseSensitive(json2, "explanation");
const char *explanation = cJSON_GetStringValue(explanation_json);
// Buscar el campo url en la respuesta
cJSON *url_json = cJSON_GetObjectItemCaseSensitive(json2, "url");
const char *url = cJSON_GetStringValue(url_json);

// Lo de acá abajo comentado ya no haría falta
//str_cambio(strbuf2.ptr, '"', ' ');
//str_cambio(strbuf2.ptr, '{', ' ');
//str_cambio(strbuf2.ptr, '}', ' ');
//str_cambio(strbuf2.ptr, ',', ' ');

// Enviar la respuesta de la API de la NASA a través de Telegram
const char *telegram_api_url = "https://api.telegram.org/bot<token>/sendMessage?";
// CURL *curl_telegram = curl_easy_init();
if (curl)
{
char message[2048] = {0};
snprintf(message, sizeof(message), "%schat_id=%ld&text=%s%s %s", telegram_api_url, chat_id, "LA EFEMERIDE DEL DIA ES:", explanation, url);
char message_clean[2048] = {0};
int j = 0;
for (int i = 0; message[i]!='\0' ; i++)
{
  if (message[i] == ' ')
  {
    message_clean[j++] = '%';
    message_clean[j++] = '2';
    message_clean[j++] = '0';
  }
  else if (message[i] < 0 || message[i] > 127)
  {
    message_clean[j++] = '_';
  }
  else if (message[i] == ',' || message[i] == '\\')
  {
    message_clean[j++] = '%';
    message_clean[j++] = '2';
    message_clean[j++] = 'C';
    i++;
  }
  else
  {
    message_clean[j++] = message[i];
  }
}
printf("Enviando mensaje a Telegram: %s\n", message_clean);
xLauchaz commented 1 year ago

Hola @MartinNievas te comento lo que sucede cuando reemplazo las lineas de codigo:

  1. convierte los caracteres y los espacios entregando el siguiente formato en la terminal: Consultando a la API de Telegram El chat id es: 5032349360 El mensaje es: perro Enviando mensaje a Telegram: https://api.telegram.org/bot/sendMessage?chat_id=5032349360&text=LA%20EFEMERIDE%20DEL%20DIA%20ES:What%20was%20that%20red%20glow%20on%20the%20horizon%20last%20night?%20Aurora.%20Our%20unusually%20active%20Sun%20produced%20a%20surface%20explosion%20a%20few%20days%20ago%20that%20sent%20out%20a%20burst%20of%20electrons%2Cprotons%2Cand%20more%20massive%20charged%20nuclei.%20This%20coronal%20mass%20ejection%20(CME)%20triggered%20auroras%20here%20on%20Earth%20that%20are%20being%20reported%20unusually%20far%20south%20in%20Earth's%20northern%20hemisphere.%20%20For%20example%2Cthis%20was%20the%20first%20time%20that%20the%20astrophotographer%20captured%20aurora%20from%20her%20home%20country%20of%20Italy.%20Additionally%2Cmany%20images%20from%20these%20auroras%20appear%20quite%20red%20in%20color.%20%20In%20the%20featured%20image%2Cthe%20town%20of%20Comelico%20Superiore%20in%20the%20Italian%20Alps%20is%20visible%20in%20the%20foreground%2Cwith%20the%20central%20band%20of%20our%20Milky%20Way%20galaxy%20seen%20rising%20from%20the%20lower%20left.%20What%20draws%20the%20eye%20the%20most%2Cthough%2Cis%20the%20bright%20red%20aurora%20on%20the%20far%20right.%20The%20featured%20image%20is%20a%20composite%20with%20the%20foreground%20and%20background%20images%20taken%20consecutively%20with%20the%20same%20camera%20and%20from%20the%20same%20location.%20%20%20Aurora%20Album:%20Selected%20images%20sent%20in%20to%20APOD%20https://apod.nasa.gov/apod/image/2311/RedAuroraItaly_Hofer_1080.jpg

  2. El problema que hayo es que el programa no esta pudiendo mandar el mensaje a Telegram, revisé el código y no encuentro el error.

  3. Cuando ingreso manualmente la URL en cualquier navegador el bot de telegram me devuelve el mensaje.

MartinNievas commented 1 year ago

Hola, unas consultas:

  1. El token de Telegram está bien puesto? Probaste copiar y pegar https://api.telegram.org/bot/sendMessage... hasta el final en un navegador? funciona?
  2. Parece que hay unos \n en el mensaje, por los saltos de linea. No estoy seguro si curl puede manejar esos enters desde C. Habría que eliminar los '\n' o reemplazarlos por otra cosa.
  3. Subiste el código modificado?
xLauchaz commented 1 year ago

solucion : NO BORRAR LAS SIGUIENTES LINEAS curl_easy_setopt(curl, CURLOPT_URL, message_clean); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &strbuf3); res = curl_easy_perform(curl);