Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Как залогинится вконтакт через сокет? (https://forum.antichat.xyz/showthread.php?t=95248)

_nic 07.12.2008 20:11

Как залогинится вконтакт через сокет?
 
Пытаюсь делать вот так
Код:

char *data=new char[1024*1024];
char *acce=new char[1024*1024];
char *par=new char[1024*5];
char host[100]="vkontakte.ru";
char user[100]="";
char pass[100]="";
SOCKET s;char *Ip=new char[150];
SOCKADDR_IN adr;
WSADATA wsd;
WSAStartup(MAKEWORD(2,0),&wsd);
hostent *h;
h=gethostbyname(host);
sprintf(Ip,"%d.%d.%d.%d",(unsigned char)h->h_addr_list[0][0],(unsigned char)h->h_addr_list[0][1],(unsigned char)h->h_addr_list[0][2],(unsigned char)h->h_addr_list[0][3]);
adr.sin_family=AF_INET;
adr.sin_addr.s_addr =inet_addr(Ip);
adr.sin_port = htons(80);
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(s,(sockaddr*)&adr,sizeof(adr));
strcpy(par,"success_url=&fail_url=&try_to_login=1&email=");
strcat(par,user);strcat(par,"&pass=");strcat(par,pass);
strcpy(data,"POST /login.php HTTP/1.1\r\n");
strcat(data,"Accept: */*\r\n");
strcat(data,"Referer: http://vkontakte.ru/login.php?u=1\r\n");
strcat(data,"Accept-Language: ru\r\n");
strcat(data,"Content-Type: text/html\r\n");
strcat(data,"User-Agent: Mozilla/4.0");
strcat(data,"Host: vkontakte.ru\r\n");
strcat(data,"Content-Length: ");strcat(data,AnsiString(strlen(par)).c_str());
strcat(data,"\r\n");strcat(data,"Connection: Keep-Alive\r\n");
strcat(data,"Cache-Control: no-cache\r\n");strcat(data,par);
strcat(data,"\r\nConnection: Close\r\n\r\n");
send(s,data,strlen(data),0);
recv(s,acce,1024*1024,0);

В ответ получаю
Код:

HTTP/1.1 400 Bad Request
Server: nginx/0.6.31
Date: Sun, 07 Dec 2008 16:10:38 GMT
Content-Type: text/html
Content-Length: 173
Connection: close

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/0.6.31</center>
</body>
</html>

Возможно я неправильно составил запрос :( Может кто то подскажет как его правильно составить?

furang 07.12.2008 20:22

Пост параметры кажется передаются в конце http-запроса после \r\n
то есть
Код:

strcpy(par,"success_url=&fail_url=&try_to_login=1&email=");
strcat(par,user);strcat(par,"&pass=");strcat(par,pass);

это в самый конец после
Код:

strcat(data,"\r\nConnection: Close\r\n\r\n");
UPD
А еще надо указывать сервер
то есть
Код:

POST /login.php HTTP/1.1\r\n
не конает. надо
Код:

POST http://vkontakte.ru/login.php HTTP/1.1\r\n

_nic 07.12.2008 20:30

Цитата:

Сообщение от furang
Пост параметры кажется передаются в конце http-запроса после \r\n
то есть
Код:

strcpy(par,"success_url=&fail_url=&try_to_login=1&email=");
strcat(par,user);strcat(par,"&pass=");strcat(par,pass);

это в самый конец после
Код:

strcat(data,"\r\nConnection: Close\r\n\r\n");
UPD
А еще надо указывать сервер
то есть
Код:

POST /login.php HTTP/1.1\r\n
не конает. надо
Код:

POST http://vkontakte.ru/login.php HTTP/1.1\r\n

Тоесть запрос должен выглядеть примерно так
Код:

POST /login.php HTTP/1.1
Accept: */*
Referer: http://vkontakte.ru/login.php?u=1
Accept-Language: ru
Content-Type: text/html
User-Agent: Mozilla/4.0Host: vkontakte.ru
Content-Length: 70
Connection: Keep-Alive
Cache-Control: no-cache
Connection: Close
success_url=&fail_url=&try_to_login=1&email=lalala@mail.ru&pass=lalala

?
Все равно "Bad Request" :(

furang 07.12.2008 20:48

точнее так
Код:

POST http://vkontakte.ru/login.php HTTP/1.1
Accept: */*
Referer: http://vkontakte.ru/login.php?u=1
Accept-Language: ru
Content-Type: text/html
User-Agent: Mozilla/4.0
Host: vkontakte.ru
Content-Length: 70
Connection: Keep-Alive
Cache-Control: no-cache
Connection: Close

success_url=&fail_url=&try_to_login=1&email=lalala@mail.ru&pass=lalala

кстати прошу обратить внимание что надо следить за Content-Length. он должен равнятся sizeof(str) где str длина строки с переменными и параметрами. Content-Length должно быть не более (иначе дополнится пробелами) и не менее (иначе не все переменные влезут).
А вобще когда я писал подобные проги на сокетах то делал вот как. ставил naviscope, настраивал браузер на работу через него, делал в браузере что надо, а в naviscope перехватывал пакет и уже на его основании писал проги.

Delimiter 07.12.2008 21:04

согласен с предыдущим, что нормально писать с сетевым снифером и геморой теоретически предполагая!

[dei] 08.12.2008 02:18

Код:

POST http://vkontakte.ru/login.php HTTP/1.1
Нафига?
Достаточно
Код:

POST /login.php HTTP/1.1
...
Host: vkontakte.ru

это ж HTTP/1.1 , учите матчасть.

_nic 08.12.2008 02:45

Да что так что сяк, всеравно Bad Request

furang 08.12.2008 03:03

Цитата:

Сообщение от [dei]
Код:

POST http://vkontakte.ru/login.php HTTP/1.1
Нафига?
Достаточно
Код:

POST /login.php HTTP/1.1
...
Host: vkontakte.ru

это ж HTTP/1.1 , учите матчасть.

Работает и так, и так. так с чего шум то подымать? ты выпендрится сюда пришел или человеку помочь?

В конце запроса должно быть \r\n\r\n то есть еще одна пустая строка. не может не работать.

_nic 08.12.2008 03:27

Незнаю у кого что там работает.Но у меня такой код
Код:

char *data=new char[1024*1024];
char *acce=new char[1024*1024];
char *par=new char[1024*5];
char host[100]="vkontakte.ru";
char user[100]="lalalalal@mail.ru";
char pass[100]="lalalala";
SOCKET s;char *Ip=new char[150];
SOCKADDR_IN adr;
WSADATA wsd;
WSAStartup(MAKEWORD(2,0),&wsd);
hostent *h;
h=gethostbyname(host);
sprintf(Ip,"%d.%d.%d.%d",(unsigned char)h->h_addr_list[0][0],(unsigned char)h->h_addr_list[0][1],(unsigned char)h->h_addr_list[0][2],(unsigned char)h->h_addr_list[0][3]);
adr.sin_family=AF_INET;
adr.sin_addr.s_addr =inet_addr(Ip);
adr.sin_port = htons(80);
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(s,(sockaddr*)&adr,sizeof(adr));
strcpy(par,"success_url=&fail_url=&try_to_login=1&email=");
strcat(par,user);strcat(par,"&pass=");strcat(par,pass);
strcpy(data,"POST http://vkontakte.ru/login.php HTTP/1.1\r\n");
strcat(data,"Accept: */*\r\n");
strcat(data,"Referer: http://vkontakte.ru/login.php?u=1\r\n");
strcat(data,"Accept-Language: ru\r\n");
strcat(data,"Content-Type: text/html\r\n");
strcat(data,"User-Agent: Mozilla/4.0");
strcat(data,"Host: vkontakte.ru\r\n");
strcat(data,"Content-Length: ");strcat(data,AnsiString(strlen(par)).c_str());
strcat(data,"\r\n");strcat(data,"Connection: Keep-Alive\r\n");
strcat(data,"Cache-Control: no-cache");//strcat(data,par);
strcat(data,"\r\nConnection: Close\r\n\r\n");
strcat(data,par);strcat(data,"\r\n\r\n");
send(s,data,strlen(data),0);
recv(s,acce,1024*1024,0);
Memo1->Text=AnsiString(acce);

В ответ получает только HTTP/1.1 400 Bad Request :(

furang 08.12.2008 03:56

Видишь ли в чем дело. То у тебя Connection: Keep-Alive, то Connection: Close. и это в одном запросе.....
Ок. чтоб ты и дальше не мучался специально выкладываю шаблон запроса, который браузер шлет контакту)))

Код:

POST http://vkontakte.ru/login.php HTTP/1.0
User-Agent: Opera/9.62 (Windows NT 5.1; U; ru) Presto/2.1.1
Host: vkontakte.ru
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer: http://vkontakte.ru/index.php
Proxy-Connection: Keep-Alive
Content-Length: 38
Content-Type: application/x-www-form-urlencoded

email=<email>&pass=<pass>



Время: 02:09