No uso curl, uso cpp al natural. De lo que se trata es de iniciar una sesión en una página web, conseguirme loguear dentro de ella. Para ello debo usar HTPP y realizar varias peticiones hasta conseguir la cookie que dentifica mi sesión, una cookie llamada JESESSID: 89u328fi3hf...
Pero no se a qué páginas debo de hacer la petición (por ejemplo voy al /login) y hago un POST con las variables usuario y contraseña, de ahí me redirige a la página principal mando las cookiesde la anterior y no pasa nada, en LIVE HEADERS ocurría lo mismo pero luego firefox empezaba a descargar cosas y mandaba peticiones que no sabía de dónde salían.
Mi código actual para intentar iniciar la sesión:
#include "Peticiones.h"
int inicia_sesion(char* usuario, char *contraseña)
{
WSADATA wsa;
SOCKET sock;
unsigned short tamaño;
struct sockaddr_in directorio;
char datos[20000], variables[500];
char cookie[1000], auxiliar[50];
WSAStartup(MAKEWORD(2, 0), &wsa);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("Se ha producido un error al inicializar el socket.");
exit(0);
}
else
{
directorio.sin_family = AF_INET;
directorio.sin_port = htons(PUERTO);
directorio.sin_addr.s_addr = inet_addr(IP);
connect(sock, (struct sockaddr*)&directorio, sizeof(directorio));
strcpy_s(variables, "email=");
strcat_s(variables, usuario);
strcat_s(variables, "&password=");
strcat_s(variables, contraseña);
tamaño = strlen(variables);
_itoa_s(tamaño, auxiliar, 10);
strcpy_s(datos, "POST / HTTP/1.1\r\n");
strcat_s(datos, "Host: dominio.com\r\n");
strcat_s(datos, "User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0\r\n");
strcat_s(datos, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n");
strcat_s(datos, "Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3\r\n");
strcat_s(datos, "Referer: http://dominio.com/\r\n");
strcat_s(datos, "Connection: keep-alive\r\n");
strcat_s(datos, "Cache-Control: max-age=0\r\n");
strcat_s(datos, "Content-type: application/x-www-form-urlencoded\r\n");
strcat_s(datos, "Content-length: ");
strcat_s(datos, auxiliar);
strcat_s(datos, "\r\n\r\n");
strcat_s(datos, variables);
send(sock, datos, strlen(datos), 0);
printf("mando: %s", datos); system("pause");
strcpy_s(datos, "");
recv(sock, datos, 20000, 0);
printf("recibo: %s", datos); system("pause");
FILE *cookies, *caakies;
int tam = strlen(datos), i, j;
caakies = fopen("Caakies.txt", "wt");
char hookie[500];
for (i = 0; i < tam; i++)
{
if ((datos[i] == 'S') &&
(datos[i + 1] == 'e') &&
(datos[i + 2] == 't') &&
(datos[i + 3] == '-') &&
(datos[i + 4] == 'C') &&
(datos[i + 5] == 'o') &&
(datos[i + 6] == 'o') &&
(datos[i + 7] == 'k') &&
(datos[i + 8] == 'i') &&
(datos[i + 9] == 'e') &&
(datos[i + 10] == ':') &&
(datos[i + 11] == ' '))
{
i = i + 12;
j = 0;
while (datos[i] != '\n')
{
cookie[j] = datos[i];
i++;
j++;
}
cookie[j] = '*';
j = 0;
for (int k = 0; k < strlen(cookie); k++)
{
if (cookie[k] != '*')
{
hookie[j] = cookie[k];
j++;
}
else
{
hookie[j] = '\0';
break;
}
}
fprintf(caakies,"%s\n",hookie);
strcpy_s(cookie, "");
strcpy_s(hookie, "");
}
}
fclose(caakies);
caakies = fopen("Caakies.txt","rt");
cookies = fopen("Cookies.txt", "wt");
char almacena[10][500];
int coincidencia = 0;
i = 0;
printf("entro");
while (fgets(cookie, 400, caakies) && strcmp(cookie, "") != 0)
{//falta poner que se quede con la ultima cookie.
coincidencia = 0;
strcpy_s(almacena[i], cookie);
i++;
for (int j = 0; j < i; j++)
{
if (strcmp(almacena[j], cookie) == 0)
{
coincidencia = 1;
}
}
if (coincidencia != 1)
{
fprintf(cookies, "%s", cookie);
}
}
printf("salgo");
system("pause");
cookies = fopen("Cookies.txt", "rt");
strcpy_s(datos, "POST / HTTP/1.1\r\n");
strcat_s(datos, "Host: dominio.com\r\n");
strcat_s(datos, "User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0\r\n");
strcat_s(datos, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n");
strcat_s(datos, "Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3\r\n");
strcat_s(datos, "Referer: http://dominio.com/\r\n");
while (fgets(cookie,400,cookies) && strcmp(cookie, "") != 0)
{//fscanf(cookies,"%s\n",cookie)>0
cookie[strlen(cookie)-1] = '\0';
strcat_s(datos, "Cookie: ");
strcat_s(datos, cookie);
strcat_s(datos, "\r\n");
}
strcat_s(datos, "Connection: keep-alive\r\n");
strcat_s(datos, "Cache-Control: max-age=0\r\n");
strcat_s(datos, "Content-type: application/x-www-form-urlencoded\r\n");
strcat_s(datos, "Content-length: ");
strcat_s(datos, auxiliar);
strcat_s(datos, "\r\n\r\n");
strcat_s(datos, variables);
fclose(cookies);
send(sock, datos, strlen(datos), 0);
printf("mando: %s", datos); system("pause");
strcpy_s(datos, "");
recv(sock, datos, 20000, 0);
printf("recibo: %s", datos); system("pause");
cookies = fopen("Cookies.txt", "wt");
tam = strlen(datos);
strcpy(hookie,"");
for (i = 0; i < tam; i++)
{
if ((datos[i] == 'S') &&
(datos[i + 1] == 'e') &&
(datos[i + 2] == 't') &&
(datos[i + 3] == '-') &&
(datos[i + 4] == 'C') &&
(datos[i + 5] == 'o') &&
(datos[i + 6] == 'o') &&
(datos[i + 7] == 'k') &&
(datos[i + 8] == 'i') &&
(datos[i + 9] == 'e') &&
(datos[i + 10] == ':') &&
(datos[i + 11] == ' '))
{
i = i + 12;
j = 0;
while (datos[i] != ';')
{
cookie[j] = datos[i];
i++;
j++;
}
cookie[j] = '*';
j = 0;
for (int k = 0; k < strlen(cookie); k++)
{
if (cookie[k] != '*')
{
hookie[j] = cookie[k];
j++;
}
else
{
hookie[j] = '\0';
break;
}
}
fprintf(cookies, "%s\n", hookie);
strcpy_s(cookie, "");
strcpy_s(hookie, "");
}
}
fclose(cookies);
closesocket(sock);
}
return 1;
}
Hago un POST la página de login subiendo usuario y contraseña, una vez recogidas las cookies que me devuelve hago otro POST a la principal pues al mandar el POST del login me hace un MOVED TEMPORALY a la principal, así que voy a la principal mando cookies de la anterior que por cierto me manda 2 cookies que se llaman igual (en este caso debería quedarme con la última enviada, por cierto estaba haciendo ese código ahora y los archivos de cookies pueden fallar).
De todo esto me gustaría saber si para iniciar sesión en qué me tengo que fijar. Oí que en los javascript, en ese caso sería descargar el HTML, buscar document.cookie(...) habría que hacer eso, ¿qué más métodos pueden usar para meterme una cookie, y cómo yo debo hacer para interpretarla?. Gracias y saludos, subiré más cuando vuelva a ello, interesados en probar con la página que me manden MP.