Пытаюсь авторизоваться с помощью си++ на сайте... Начну как бы с того что если запрос для авторизации я должен посылать такой: Code: POST /index.php HTTP/1.1 User-Agent: Opera/10.00 (Windows NT 6.0; U; en) Presto/2.2.0 Host: test2.ru Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */* Accept-Language: ru-RU,ru;q=0.9,en Accept-Charset: iso-8859-1, utf-8, utf-16, * Accept-Encoding: deflate, gzip, x-gzip, identity, * Referer: http://test2.ru/ Proxy-Connection: Keep-Alive Content-Type: application/x-www-form-urlencoded Content-Length: 74 referer=%2F&action=dologin&username=123&password=123 то если так и посылать то будет жаловаться на строчку referer=2F&action=dologin&username=123&password=123 и в ответ куки не придут... а если менять первую строчку на POST /index.php?action=dologin&username=123&password=123 HTTP/1.1\n и referer удалить то все пройдет норм и в ответ придет странчка из которой уже можно выцепить кукисы.... =) Так вот в чем вопрос так и надо или я вообще все не правильно делаю? И еще не мог бы кто ни будь привести примеры авторизации с помощью си на сайте... Просто именно с этим столкнулся впервые и что то не допонимаю... p.s. мой код не до конца доделанный... Code: #include "stdafx.h" #include "winsock2.h" #include <stdio.h> #include <fstream> #include <string.h> #pragma comment(lib, "WSOCK32.lib") using namespace std; //функция вывода ответа сервера в файл int recvtofile(char recvbuf[99999]) { ofstream outfile; outfile.open("recv_log.txt"); outfile.write(recvbuf,strlen(recvbuf)); return 0; } int _tmain(int argc, _TCHAR* argv[]) { WSADATA wsaData; if(WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR) { printf("Error at WSAStartup()\n"); getchar(); return 0; } SOCKET ConnectSocket; ConnectSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(ConnectSocket == INVALID_SOCKET) { printf("Error at socket(): %ld\n", WSAGetLastError()); WSACleanup(); getchar(); return 0; } sockaddr_in clientService; clientService.sin_family = AF_INET; clientService.sin_addr.s_addr = inet_addr("127.0.0.1"); clientService.sin_port = htons(80); if(connect(ConnectSocket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR) { printf("Failed to connect.\n"); WSACleanup(); getchar(); return 0; } else { printf("Conect to server... OK! \n"); } int bytesSent; int bytesRecv = 0; char sendbuf1[] = "POST /index.php?action=dologin&username=123&password=123 HTTP/1.1\n" "User-Agent: Opera/10.00 (Windows NT 6.0; U; en) Presto/2.2.0\n" "Host: test2.ru\n" "Proxy-Connection: Keep-Alive\n" "\n"; char recvbuf[99999] = ""; bytesSent = send(ConnectSocket, sendbuf1, strlen(sendbuf1), 0); printf("Bytes Sent: %ld\n", bytesSent); bytesRecv = recv(ConnectSocket, recvbuf, 99999, 0); printf( "Bytes Recv: %ld\n", bytesRecv ); closesocket(ConnectSocket); WSACleanup(); getchar(); return 0; } после этого в recvbuf можно выцепить те самые куки... Вопрос правильно ли? Неужели никто не знает ответ? =\
после Content-Length надо вроде строчку проспускать (\n\n) Можешь через WinInet делать - тогда даже выцеплять куки не надо будет - они сами приделаются и при следущем запросе к сайту ты уже будешь авторизован
Совершенно верно Code: POST /index.php HTTP/1.1 User-Agent: Opera/10.00 (Windows NT 6.0; U; en) Presto/2.2.0 Host: test2.ru Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */* Accept-Language: ru-RU,ru;q=0.9,en Accept-Charset: iso-8859-1, utf-8, utf-16, * Accept-Encoding: deflate, gzip, x-gzip, identity, * Referer: http://test2.ru/ Proxy-Connection: Keep-Alive Content-Type: application/x-www-form-urlencoded Content-Length: 74 referer=%2F&action=dologin&username=123&password=123 И необходимо следить за тем, чтобы Content-Length был равен длине тела пост-запроса (включая и непечатные символы). У меня такое впечатление, что ты не знаешь что такое кукисы и где они передаются... При чём тут "выцеплять из странички"? Кукисы передаются в заголовке ответа в поле Set-Cookie...