Enviar datos por POST a un FORM usando cURL

Iniciado por mester, 13 Septiembre 2016, 17:43 PM

0 Miembros y 1 Visitante están viendo este tema.

mester

Hola.

Estoy haciendo un programa que usa cURL para autenticarse en la UA, pero no consigo hacer que envíe los datos por POST. El codigo es el siguiente:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <curl/curl.h>

int main (int argc, char **argv) {
  if (argc < 2)
    return fprintf (stderr, "%s <ua mail>\n", argv[0]);

  char *user = argv[1];
  char *pass = getpass ("Contraseña de la UA: ");
  CURL *cSession;
  FILE *sf = fopen ("res.html", "at");
  struct curl_httppost *pData = NULL;
  struct curl_httppost *last = NULL;

  curl_formadd (&pData, &last,
    CURLFORM_COPYNAME, "username",
    CURLFORM_COPYCONTENTS, argv[1],
    CURLFORM_END);
  curl_formadd (&pData, &last,
    CURLFORM_COPYNAME, "password",
    CURLFORM_COPYCONTENTS, pass,
    CURLFORM_END);

  cSession = curl_easy_init ();
  if ( !cSession ) {
    fprintf (stderr, "Error iniciando cURL\n");
  } else {
    curl_easy_setopt (cSession, CURLOPT_VERBOSE, 1);
    curl_easy_setopt (cSession, CURLOPT_URL, "https://autentica.cpd.ua.es/cas/login?service=https://cvnet.cpd.ua.es/uacloud/home/indexVerificado");
    curl_easy_setopt (cSession, CURLOPT_HTTPPOST, pData);
    curl_easy_setopt (cSession, CURLOPT_FOLLOWLOCATION, 1);
    curl_easy_setopt (cSession, CURLOPT_WRITEDATA, (FILE *)sf);
    curl_easy_setopt (cSession, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31");

    if (curl_easy_perform (cSession) != 0) {
      fprintf (stderr, "Error executing cURL session\n");
    } else {
      printf ("Done!\n");
    }
  }

  curl_easy_cleanup (cSession);

  return 0;
}


Lo que quiero saber es por qué no envía los datos al FORM. También he probado quitando la estructura curl_httppost y añadiendo simplemente curl_easy_setopt (cSession, CURLOPT_POSTFIELDS.

Espero que me puedan ayudar.

Y antes de que algun listillo (y vago) diga: "No hacemos tareas aquí". No, no es una tarea, sino se lo preguntaría al profesor, porque el codigo ya está medio hecho.

Gracias de antemano.
Justicia es dar a cada uno lo que se merece

AlbertoBSD

#1
Hola excelente codigo, realmente no veo el problema hace tiempo hice un trabajo similar y en mi casi preferi construir mamualmente las variables para el parametro CURLOPT_POSTFIELDS

En mi caso es un pequeño bot para telegram que deje en github.

https://github.com/albertobsd/libtelegrambot/blob/master/telegram.c

El codigo donde realizo mi peticion POST es:

File* telegram_getFile(char *file_id) {
CURL *curl;
CURLcode res;
Response *response = NULL;
File *file = NULL;
char *url = NULL;
char *postdata = NULL;
char *variables[] = {"file_id",NULL};
char *values[] = {file_id,NULL};
int i;
if(file_id){
curl = telegram_curl_init();
url = telegram_makeurl("/getFile");
curl_easy_setopt(curl, CURLOPT_URL, url);
postdata = telegram_build_post(variables,values);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata);
res = curl_easy_perform(curl);
free(url);
if(res == CURLE_OK) {
response = telegram_parse_response(telegram_buffer,&i);
if(!telegram_error) {
file = telegram_parse_file(response->result,&i);
}
telegram_free_response(response);
telegram_reset_buffer();
}
else {
telegram_set_error("curl_easy_perform() failed!",-1000);
}
free(postdata);
curl_easy_cleanup(curl);
}
else {
telegram_set_error("NULL file_id",-10);
}
return file;
}


Basicamente realizo lo mismo que tu haces pero con menos variables:

curl = telegram_curl_init();
url = telegram_makeurl("/getFile");
curl_easy_setopt(curl, CURLOPT_URL, url);
postdata = telegram_build_post(variables,values);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata);
res = curl_easy_perform(curl);
free(url);
if(res == CURLE_OK) {


Intenta colocar los CURLOPT_POSTFIELDS como ultima llamada a curl_easy_setopt a ver si es solo cuestion del orden.

Mira el ejemplo del la documentacion oficial:

https://curl.haxx.se/libcurl/c/http-post.html
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Kaxperday

#2
Hola mester, pues verás te faltan más variables a enviar en el FORM aparte de username y password, en la url te recomiendo usar https://autentica.cpd.ua.es/cas/login que vale por igual y quizás evites futuros errores.

Respecto a que no consigues que envie los datos por el POST ¿a qué te refieres? ¿a que no recibes respuesta? ¿que te da error al enviar los datos al server? ¿o que la respuesta que recibes no es la esperada (que no consigues iniciar sesión vaya)?.

Saludos
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

mester

Cita de: Kaxperday en 13 Septiembre 2016, 19:39 PM
Hola mester, pues verás te faltan más variables a enviar en el FORM aparte de username y password, en la url te recomiendo usar https://autentica.cpd.ua.es/cas/login que vale por igual y quizás evites futuros errores.

Respecto a que no consigues que envie los datos por el POST ¿a qué te refieres? ¿a que no recibes respuesta o da error al enviar los datos al server o que la respuesta que recibes no es la esperada (que no consigues iniciar sesión vaya)?.

Saludos

¡Hola Kaxperday! Gracias por la respuesta.

Me refiero a que tiene que descargar el HTML cuando ya estas loggeado, es decir, el HTML del UA Cloud, pero se descarga el HTML del login, además de que despues de autenticarse, la cabezera debería de devolver un ID de ASP, y no lo hace. Es por ello que creo que o falta codigo para terminar el login, o no funciona correctamente, supongo que porque no envía bien los datos.

Lo que quiero saber es qué debo hacer para que envíe los datos al login y poder autenticarme desde este cliente.

Gracias.
Justicia es dar a cada uno lo que se merece

Kaxperday

#4
No es que no envíe bien los datos, es que estás mandando los datos que te pide de manera incompleta, como dije te falta enviar parametros al post que son explícitamente "lt", "execution", "_eventId", y "submit" además de "username" y "password".

Además debes enviarlos con el contenido que tienen en su campo value como "lt", "execution" y "_eventId", que en el caso de los 2 primeros el valor no es siempre el mismo por lo que deberás de cargar la página recoger el valor y las cookies que te envía (aunque puede que no sean necesarias pero lo más probable es que sí) y ya con todo eso lanzarte a iniciar sesión con el POST una vez tengas todos esos datos de los que te hablo listos.

Saludos y suerte.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.