Проверка сообщений на В Контакте [СИ]

Надоело проверять сообщения на этом ресурсе, решил написать приложение, написал функционал, но продумывая интерфейс пришел к выводу, что написать виджет на 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;
}
blog comments powered by Disqus
сюда туда