Надоело проверять сообщения на этом ресурсе, решил написать приложение, написал функционал, но продумывая интерфейс пришел к выводу, что написать виджет на HTML + JavaScript будет куда проще и красивее (щас мучаюсь)
Вот код приложения с использованием библеотеки PCRE, который получает и парсит страницу.
#include "stdafx.h" #include "config.h" #include "pcre.h" #include#include #include #pragma comment(lib,"Ws2_32.lib") #include #include "sqlite3.h" #include "sqlite3.c" //-----КОНФИГ-------------------------------------------------- #define PORT 80 #define SERVERADDR "vkontakte.ru" #define COOKIE "cookie.txt" //файл куки #define TEMP_BUFF "~tmp_buff" //названия файла временого буфера #define vecsize 50 // размер массива векторов pcre для поиска #define BASE "base.s3db" // //-------ФУНКЦИОНАЛ--------------------------------------------- // отослать ВСЕ ... - правильная функция int sendall(SOCKET s, char *buf, int len, int flags); // принять ВСЕ ... - правильная функция int recvall(SOCKET s, char *buf, int len, int flags); //функция читает файл имя которого передано в первой переменной //во второй переменной передается ссылку куда будет помещен размер выделенного буфера - размер файла //функция возвращает указатель на выделенную область памяти char* get_file(char *szfile,int *bufsize); // освобождает буффер выделенный под файл просто макрос #define free_file(buffer) free(buffer); //возвращает сокет созданного подключения //в случае ошибки возвращает INVALID_SOCKET SOCKET http_client(char *host,int port); //функция записывает файл TEMP_BUFF ответ от сервера //не стремился к универсальности заточено под контакт //в переменную path передается путь GET запроса //в переменную cookie ссылка на буффер куки - с завершающим 0 int http_get(SOCKET s,char *path,char *cookie); //универсальной парсекки не вышло //id - действие парса // 0 - выдерает все ники и даты из /mail.php // 1 - выдерает все сообщени и линки на них из /mail.php int parse(char id,char *buf,size_t buflen); //------------------------------------------------------------- // отослать ВСЕ ... - правильная функция int sendall(SOCKET s, char *buf, int len, int flags) { int total = 0; int n; while(total < len) { n = send(s, buf+total, len-total, flags); if(n == -1) { break; } total += n; } return (n==-1 ? -1 : total); } // принять ВСЕ ... - правильная функция int recvall(SOCKET s, char *buf, int len, int flags) { int total = 0; int n; while(total < len) { n = recv(s, buf+total, len-total, flags); if(n == -1) { break; } total += n; } return (n==-1 ? -1 : total); } char* get_file(char *szfile,int *bufsize) { size_t buflen; FILE *f; int junk; char *cookie; f = fopen(szfile,"rb"); if(f==NULL){printf("Error open %s file!",szfile); return NULL;} fseek (f , 0 , SEEK_END); buflen = ftell (f); rewind (f); cookie=(char *) malloc ( buflen+1 ); cookie[buflen]=0x00; if (cookie == NULL) {printf("Memory Error\n"); return NULL;} junk = fread ((void *)cookie,1,buflen,f); if (junk != buflen) {printf ("Reading error %s\n",szfile); return NULL;} fclose(f); *bufsize=(int)buflen; return cookie; } SOCKET http_client(char *host,int port) { SOCKET my_sock; struct sockaddr_in dest_addr; HOSTENT *hst; my_sock = socket(AF_INET, SOCK_STREAM, 0); if (my_sock < 0) { printf("Socket() error %d\n", WSAGetLastError()); return INVALID_SOCKET; } // Шаг 3 - установка соединения // заполнение структуры sockaddr_in - указание адреса и порта сервера dest_addr.sin_family = AF_INET; dest_addr.sin_port = htons(port); // преобразование IP адреса из символьного в сетевой формат if (inet_addr(host) != INADDR_NONE) dest_addr.sin_addr.s_addr = inet_addr(host); else { // попытка получить IP адрес по доменному имени сервера if (hst = gethostbyname(host)) // hst->h_addr_list содержит не массив адресов, // а массив указателей на адреса ((unsigned long *)&dest_addr.sin_addr)[0] = ((unsigned long **)hst->h_addr_list)[0][0]; else { printf("Invalid address %s\n", host); closesocket(my_sock); //WSACleanup(); return INVALID_SOCKET; } } // адрес сервера получен - пытаемся установить соединение if (connect(my_sock, &dest_addr, sizeof(dest_addr))) { printf("Connect error %d\n", WSAGetLastError()); closesocket(my_sock); return INVALID_SOCKET; } return my_sock; } int http_get(SOCKET s,char *path,char *cookie) { FILE *f; char res_buf[1024*32]; int rc; char GET[]="GET %s HTTP/1.1\n\ User-Agent: Opera/9.80 (Windows NT 5.1; U; MRA 5.5 (build 02842); ru) Presto/2.2.15 Version/10.00\n\ Host: vkontakte.ru\n\ Accept: text/html, application/xml;q=0.9, application/xhtml+xml;q=0.1\n\ Accept-Language: ru-RU,ru;q=0.9,en;q=0.8\n\ Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\n\ Cookie: %s\n\ Cookie2: $Version=1\n\ Connection: Close\n\n"; sprintf(res_buf,GET,path,cookie); if(sendall(s,res_buf,strlen(res_buf),0)==SOCKET_ERROR){ printf("Error send GET request\n");return -1;} f=fopen(TEMP_BUFF,"w"); for(;;) { rc = recv(s, res_buf, sizeof(res_buf)-1, 0); if(rc<=0) break; fwrite(res_buf,rc,1,f); } fclose(f); return 0; } int parse(char id,char *buf,size_t buflen){ pcre *re; char pattern[][82] = {"< a href=\".*\">(.*?)<\/a>\r\n <\/div>\r\n \r\n < div class=\"date\"> (.*?)<\/div>", "< a href=\"(.*?)\" class=\"new messageBody\">(.*?)<\/a>"}; const char *error; int erroffset; int pairs; /* количество найденных пар */ int vector[vecsize]; /* массив для результатов */ int i,j=0; if((re=pcre_compile ((char *) pattern[id], PCRE_CASELESS|PCRE_MULTILINE, &error, &erroffset, NULL))==NULL){ printf("Error: %s\nSymbol N%i\nPattern:%s\n",error,erroffset,pattern); return -1; } else { while((pairs=pcre_exec(re,NULL,buf,buflen,j,PCRE_NOTEMPTY,vector,vecsize))>0) { printf("find! %i podstrok:\n",pairs); for(i=1;i < pairs;i++) { printf("%i-podstroka - ",i); for(j=vector[i*2];j < vector[i*2+1];j++) putchar(buf[j]); putchar('\n'); } putchar('\n'); } } return 1; } int _tmain(int argc, _TCHAR* argv[]) { SOCKET my_sock; char buff[512]; char *cookie,*http_buf; int bufsize; sqlite3 *db; char *zErrMsg = 0; int rc; // Шаг 1 - инициализация библиотеки Winsock if (WSAStartup(0x202, (WSADATA *)&buff[0])) { printf("WSAStart error %d\n", WSAGetLastError()); return -1; } rc = sqlite3_open(BASE, &db); if( rc ){ printf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return -3; } if((my_sock=http_client(SERVERADDR,PORT))==INVALID_SOCKET){ WSACleanup(); return -1; } printf("Connecting to %s successfully installed\n", SERVERADDR); //cook=NULL; cookie=get_file(COOKIE,&bufsize); if(cookie==NULL){return -2;} if(http_get(my_sock,"/mail.php",cookie)==-1) {return -3;} printf("ok"); free_file(cookie); http_buf=get_file(TEMP_BUFF,&bufsize); parse(1,http_buf,bufsize); free_file(http_buf); sqlite3_close(db); closesocket(my_sock); WSACleanup(); getchar(); return 0; }