Soy un novato con esto (de todas formas por supuesto quiero aprender si queréis compartir conmigo apuntes de HTTP sobre esto será un placer estudiarlos xD), haber os paso mis objetivos antes que nada, quiero hacer un bot que inicie sesión en una web pasandole user y pass por teclado y comience a postear en temas automáticamente para obtener beneficios xD, soy casi nuevo en esto pero ganas no me faltan.
El código actual que uso para iniciar sesión es el siguiente:
La basura me salen tantos caracteres como los que sobran al definir datos[20000], que es la variable que envía la petición y que recibe la respuesta. A veces se sobrescribe parte de la respuesta, no se porqué.
El código admito puede ser engorroso pero al menos quiero ver si funciona en modo prueba, y luego ya lo perfeccionaría del todo. De todas formas eso de strcmp() no sé como sería, de todas formas si así distingue bien las cookies no se para que darle más vueltas xP.
También me llama la atención que en una web que tengo un simple POST me carga en la variable todo el código html con la cabecera de respuesta, en cambio aquí quiero descargar el html y no me sale nada, es un html público que no requiere iniciar sesión y pueden ver todos, lo necesito descargar para extrar de el los foros y subforos que tiene la web y desde ahí poder postear para cada uno de ellos.
Este es el código utilizado para "intentar" descargar el html desde donde extraería foros y subforos:
Bueno quizás eso de la basura sea clave porque quizás la basura nos cubra un link importante como el link del favicon desde el cual descargar todo lo demás no sé.
Pero aún así interesa el html del forum (foro publico y principal) allí buscaría los div con cierto identificador para aislar cada tema de foro y subforos...
Al ejecutar el descargador_foros() sin nada previo (sin cookies obtengo):
(Acabo de probarlo de nuevo, y oh lala me debe de enviar 23000 caracteres de respuesta es decir el html, pero no veo nada solo basura..)
Pero me sale basura nada de code aunque segun pone el content-length es de 23000.
He probado a reenviar la misma funcion una vez realizada la primera con las cookies de la primera que nos dió el server y el server nos envía la misma cadena con la distinción de que tenía 2 caracteres más el content-length, prueba de que es el html dinámico que buscamos. Pero sale basura.
Eso creo que es todo hasta ahora, un inicio de sesión fallido o no (pues lo desconozco xd, supongo que si porque no me da cookies que no sean las de nombre dsi), y un intento de descarga de un html generado en dominio.com/forum que me sale basura en su lugar.
Edito: He puesto 30000 de tamaño a datos y se me sobreescribe de basura ahora la cmd jajaja xD, y si solo de basura, antes tenia 20000 y no tenia espacio para recibir todo, ahora debería tener pero sale basura, puede ser o que algo tenga o haga mal, o que la web envíe un fake de basura aposta.
Si alguien quiere probar el código y se implica un poco más que me mande un privado que le mando mi proyecto en visual studio 13 haber que tal le va.
Si os habéis leido esto que lo dudo SOY FELIZ
Gracias por las respuestas sigo con ello, Saludos.
El código actual que uso para iniciar sesión es el siguiente:
Código (cpp) [Seleccionar]
int inicia_sesion(char* user, 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);
//action = login&ref = &email = usuariooo&password = jhjhjh&cap =
strcpy_s(variables, "action=");
strcat_s(variables, "login");
strcat_s(variables, "&ref=");
strcat_s(variables, "");
strcat_s(variables, "&email=");
strcat_s(variables, user);
strcat_s(variables, "&password=");
strcat_s(variables, contraseña);
strcat_s(variables, "&cap=");
strcat_s(variables, "");
tamaño = strlen(variables);
_itoa_s(tamaño, auxiliar, 10);
ifstream cookies("cookies.txt");
bool var = false;
strcpy_s(datos, "POST /login 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, "Accept-Encoding: gzip, deflate\r\n");
strcat_s(datos, "Referer: http ://dominio.com/login");
while (cookies.getline(cookie, 400) && strcmp(cookie, "") != 0)
{
var = true;
strcat_s(datos, "\r\nCookie: ");
strcat_s(datos, cookie);
strcat_s(datos, ";__insp_nv = true; __insp_ref = d; __insp_norec_sess = true; __insp_wid = 1437863939; _gat = 1; _gat_newTracker = 1; lfbs = f74842e072e54dff920fc7f53b775edf63a098e1%7E1");
}
if (var == false)
{
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);
cookies.close();
connect(sock, (struct sockaddr*)&directorio, sizeof(directorio));
send(sock, datos, strlen(datos), 0);
printf("mando: %s", datos); system("pause");
strcpy_s(datos, "");
recv(sock, datos, 10000, 0);
printf("recibo: %s", datos); system("pause");
closesocket(sock);
ofstream hookies("cookies.txt");
int tam = strlen(datos), i, j;
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] != ';')
{
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;
}
}
hookies << hookie << endl;
strcpy_s(cookie, "");
strcpy_s(hookie, "");
}
}
hookies.close();
}
return 1;//habría que comprobar si se inicio bien sino distinto de 1.
}
La basura me salen tantos caracteres como los que sobran al definir datos[20000], que es la variable que envía la petición y que recibe la respuesta. A veces se sobrescribe parte de la respuesta, no se porqué.
El código admito puede ser engorroso pero al menos quiero ver si funciona en modo prueba, y luego ya lo perfeccionaría del todo. De todas formas eso de strcmp() no sé como sería, de todas formas si así distingue bien las cookies no se para que darle más vueltas xP.
También me llama la atención que en una web que tengo un simple POST me carga en la variable todo el código html con la cabecera de respuesta, en cambio aquí quiero descargar el html y no me sale nada, es un html público que no requiere iniciar sesión y pueden ver todos, lo necesito descargar para extrar de el los foros y subforos que tiene la web y desde ahí poder postear para cada uno de ellos.
Este es el código utilizado para "intentar" descargar el html desde donde extraería foros y subforos:
Código (cpp) [Seleccionar]
void descarga_foros()
{
WSADATA wsa;
SOCKET sock;
unsigned short tamaño;
struct sockaddr_in directorio;
char datos[20000], auxiliar[50];
char cookie[1000];
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);
ifstream cookies("cookies.txt");
strcpy_s(datos, "POST /forum HTTP/1.1\r\n");
strcat_s(datos, "Host: dominio.com\r\n");
strcat_s(datos, "Content-type: application/x-www-form-urlencoded");
while (cookies.getline(cookie, 400) && strcmp(cookie, "") != 0)
{
strcat_s(datos, "\r\nCookie: ");
strcat_s(datos, cookie);
}
strcat_s(datos, "\r\n\r\n");
cookies.close();
connect(sock, (struct sockaddr*)&directorio, sizeof(directorio));
send(sock, datos, strlen(datos), 0);
printf("%s", datos);
strcpy_s(datos, "");
recv(sock, datos, 10000, 0);
closesocket(sock);
printf("Recibo: %s", datos); system("pause");
ofstream cookiez("cookies.txt",ios::ate);
int tam = strlen(datos), i, j;
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] != ';')
{
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;
}
}
cookiez << hookie << endl;
strcpy_s(cookie, "");
strcpy_s(hookie, "");
}
}
cookiez.close();
for (i = 0; i < tam; i++)//algoritmo para sacar, va a div class="col"> donde se encuentran los temas del foro principal, luego en otra funcion hago lo mismo para subforos y en otra para los temas de los subforos. <div class = "col"> Está sin hacer porque no consigo bajar el html, público quizás detecte que es un bot e impida su descarga tendremos que evitarlo pues.
}
}
Bueno quizás eso de la basura sea clave porque quizás la basura nos cubra un link importante como el link del favicon desde el cual descargar todo lo demás no sé.
Pero aún así interesa el html del forum (foro publico y principal) allí buscaría los div con cierto identificador para aislar cada tema de foro y subforos...
Al ejecutar el descargador_foros() sin nada previo (sin cookies obtengo):
(Acabo de probarlo de nuevo, y oh lala me debe de enviar 23000 caracteres de respuesta es decir el html, pero no veo nada solo basura..)
Código [Seleccionar]
POST /forum HTTP/1.1
Host: dominio.com
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://dominio.com/forum
Connection: keep-alive
Cache-Control: max-age=0
HTTP/1.0 200 OK
Server: nginx
Date: Mon, 27 Oct 2014 11:49:13 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 23068
Set-Cookie: dsi=0372200903e819a94eb7f81de8a194f34f9595e8%7ENA44FozKp0xVoOmhAupn2ZeFIqOoYQmrakZ%2FMcLMdaDeHvXFkgql9Kn%2BkhOgYFAkU5WeJTfVgy96Qfv7PkhuCCxV6eZ3kJyiNJT3DyRMYBMC7FvbrM%2B%2Fj54Eb4SnCBIHYLRCfQAlirlyHw%3D%3D; expires=Mon, 27-Oct-2014 23:49:13 GMT; Max-Age=43200; path=/; domain=dominio.com
Set-Cookie: dsi=aa77274477c182b15b8cf3ebf5954b33144cd0d4%7EWh2CtRrkLJfyjN7Rrm1WjXbM%2FVepKDzocfoU9kW8v8EAnzIeJxhlQuAStSAlQxTnT53oQNPnMRtVpUNxE%2BCufGHPNVTiGdWv2e1545JGOLCoE2WIX%2BcJV1jwMkgO6TWhEwdC3PE9Sug12Q%3D%3D; expires=Mon, 27-Oct-2014 23:49:13 GMT; Max-Age=43200; path=/; domain=dominio.com
Vary: Accept-Encoding
Content-Encoding: gzip
X-Cache: MISS from ubuntu
X-Cache-Lookup: MISS from ubuntu:3128
Via: 1.1 ubuntu:3128 (squid/2.7.STABLE9)
Connection: keep-alive
þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ(de esto 23000 cacas iguales xD)þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ
Pero me sale basura nada de code aunque segun pone el content-length es de 23000.
He probado a reenviar la misma funcion una vez realizada la primera con las cookies de la primera que nos dió el server y el server nos envía la misma cadena con la distinción de que tenía 2 caracteres más el content-length, prueba de que es el html dinámico que buscamos. Pero sale basura.
Eso creo que es todo hasta ahora, un inicio de sesión fallido o no (pues lo desconozco xd, supongo que si porque no me da cookies que no sean las de nombre dsi), y un intento de descarga de un html generado en dominio.com/forum que me sale basura en su lugar.
Edito: He puesto 30000 de tamaño a datos y se me sobreescribe de basura ahora la cmd jajaja xD, y si solo de basura, antes tenia 20000 y no tenia espacio para recibir todo, ahora debería tener pero sale basura, puede ser o que algo tenga o haga mal, o que la web envíe un fake de basura aposta.
Si alguien quiere probar el código y se implica un poco más que me mande un privado que le mando mi proyecto en visual studio 13 haber que tal le va.
Si os habéis leido esto que lo dudo SOY FELIZ
Gracias por las respuestas sigo con ello, Saludos.