static void ev_bomb(LwqqAsyncTimerHandle timer,void* data) { lwqq_puts("boom!!"); lwqq_async_timer_stop(timer); lwqq_async_timer_free(bomb); LWQQ__ASYNC_IMPL(loop_stop)(); }
static int process_login2(LwqqHttpRequest* req) { /* * {"retcode":0,"result":{"uin":2501542492,"cip":3396791469,"index":1075,"port":49648,"status":"online","vfwebqq":"8e6abfdb20f9436be07e652397a1197553f49fabd3e67fc88ad7ee4de763f337e120fdf7036176c9","psessionid":"8368046764001d636f6e6e7365727665725f77656271714031302e3133392e372e31363000003bce00000f8a026e04005c821a956d0000000a407646664c41737a42416d000000288e6abfdb20f9436be07e652397a1197553f49fabd3e67fc88ad7ee4de763f337e120fdf7036176c9","user_state":0,"f":0}} */ int err = 0; LwqqClient* lc = req->lc; json_t* root = NULL,*result; lwqq__jump_if_http_fail(req,err); lwqq__jump_if_json_fail(root,req->response,err); result = lwqq__parse_retcode_result(root, &err); switch(err){ case 0: lwqq_puts("[ReLinkSuccess]"); break; case 103: lwqq_puts("[Not Relogin]"); vp_do_repeat(lc->events->poll_lost, NULL); goto done; case 113: case 115: case 112: lwqq_puts("[RelinkFailure]"); vp_do_repeat(lc->events->poll_lost, NULL); goto done; default: lwqq_puts("[RelinkStop]"); vp_do_repeat(lc->events->poll_lost, NULL); goto done; } if(result){ lwqq_override(lc->cip,lwqq__json_get_value(result,"cip")); lwqq_override(lc->index,lwqq__json_get_value(result,"index")); lwqq_override(lc->port,lwqq__json_get_value(result,"port")); lwqq_override(lc->psessionid,lwqq__json_get_value(result,"psessionid")); lwqq_override(lc->vfwebqq,lwqq__json_get_value(result,"vfwebqq")); lc->stat = lwqq_status_from_str(json_parse_simple_value(result, "status")); } done: lwqq__log_if_error(err, req); lwqq__clean_json_and_req(root,req); return err; }
static void* _background_upload_file(void* d) { void **data = d; LwqqClient* lc = data[0]; LwqqMsgOffFile* file = data[1]; LWQQ_PROGRESS progress = data[2]; PurpleXfer* xfer = data[3]; s_free(d); lwqq_msg_upload_file(lc,file,progress,xfer); lwqq_puts("quit upload file"); return NULL; }
/** * WebQQ login function * Step: * 1. Get webqq version * 2. Get verify code * 3. Calculate password's md5 * 4. Do real login * 5. check whether logining successfully * * @param client Lwqq Client * @param err Error code */ void lwqq_login(LwqqClient *client, LwqqStatus status,LwqqErrorCode *err) { if (!client || !status) { lwqq_log(LOG_ERROR, "Invalid pointer\n"); return ; } client->stat = status; lwqq_puts("[login stage 1:get webqq version]\n"); /* First: get webqq version */ LwqqAsyncEvent* ev = get_version(client, err); lwqq_async_add_event_listener(ev,_C_(p,login_stage_2,ev)); }
/** * WebQQ login function * Step: * 1. Get webqq version * 2. Get verify code * 3. Calculate password's md5 * 4. Do real login * 5. check whether logining successfully * * @param client Lwqq Client * @param err Error code */ void lwqq_login(LwqqClient *client, LwqqStatus status,LwqqErrorCode *err) { if (!client || !status) { lwqq_log(LOG_ERROR, "Invalid pointer\n"); return ; } client->stat = status; lwqq_puts("[login stage 1:get webqq version]\n"); /* optional: get webqq version */ //get_version(client, err); login_stage_2(client); }
static void recv_file_init(PurpleXfer* xfer) { qq_account* ac = purple_connection_get_protocol_data(purple_account_get_connection(xfer->account)); LwqqClient* lc = ac->qq; LwqqMsgFileMessage* file = xfer->data; const char* filename = purple_xfer_get_local_filename(xfer); xfer->start_time = time(NULL); LwqqAsyncEvent* ev = lwqq_msg_accept_file(lc,file,filename); if(ev == NULL){ lwqq_puts("file trans error "); purple_xfer_error(PURPLE_XFER_RECEIVE, ac->account, purple_xfer_get_remote_user(xfer), "接受文件失败"); purple_xfer_cancel_local(xfer); return; } lwqq_async_event_set_progress(ev,file_trans_on_progress,xfer); lwqq_async_add_event_listener(ev,_C_(p,recv_file_complete,xfer)); }
LwqqAsyncEvent* lwqq__request_captcha(LwqqClient* lc,LwqqVerifyCode* c) { if(!lc||!c) return NULL; char url[512]; c->lc = lc; srand48(time(NULL)); double random = drand48(); snprintf(url,sizeof(url),"%s/getimage?" "aid=1003901&%.16lf", "http://captcha.qq.com",random); lwqq_puts(url); LwqqHttpRequest* req = lwqq_http_create_default_request(lc,url,NULL); req->set_header(req,"Referer","http://web2.qq.com/"); req->set_header(req,"Connection","keep-alive"); return req->do_request_async(req,0,NULL,_C_(2p_i,request_captcha_back,req,c)); }
static void recv_file_init(PurpleXfer* xfer) { qq_account* ac = purple_connection_get_protocol_data(purple_account_get_connection(xfer->account)); LwqqClient* lc = ac->qq; LwqqMsgFileMessage* file = xfer->data; const char* filename = purple_xfer_get_local_filename(xfer); xfer->start_time = time(NULL); LwqqAsyncEvent* ev = lwqq_msg_accept_file(lc,file,filename); if(ev == NULL){ lwqq_puts("file trans error "); purple_xfer_error(PURPLE_XFER_RECEIVE, ac->account, purple_xfer_get_remote_user(xfer), _("Receive file failed")); purple_xfer_cancel_local(xfer); return; } LwqqHttpRequest* req = lwqq_async_event_get_conn(ev); lwqq_http_on_progress(req, file_trans_on_progress, xfer); lwqq_http_set_option(req, LWQQ_HTTP_CANCELABLE,1L); lwqq_async_add_event_listener(ev,_C_(2p,recv_file_complete,xfer,ev)); }
/** * Set online status, this is the last step of login * * @param err * @param lc */ static LwqqAsyncEvent* set_online_status(LwqqClient *lc,const char *status) { char msg[1024] ={0}; char *buf; LwqqHttpRequest *req = NULL; if (!status) { return NULL; } lc->clientid = generate_clientid(); if (!lc->clientid) { lwqq_log(LOG_ERROR, "Generate clientid error\n"); return NULL; } snprintf(msg, sizeof(msg), "{\"status\":\"%s\",\"ptwebqq\":\"%s\"," "\"passwd_sig\":""\"\",\"clientid\":\"%s\"" ", \"psessionid\":null}" ,status, lc->cookies->ptwebqq ,lc->clientid); buf = url_encode(msg); snprintf(msg, sizeof(msg), "r=%s", buf); s_free(buf); /* Create a POST request */ req = lwqq_http_create_default_request(lc,WEBQQ_D_HOST"/channel/login2", NULL); lwqq_puts("[set online status]\n"); /* Set header needed by server */ req->set_header(req, "Cookie2", "$Version=1"); req->set_header(req, "Referer", WEBQQ_D_REF_URL); req->set_header(req, "Content-type", "application/x-www-form-urlencoded"); /* Set http cookie */ req->set_header(req, "Cookie", lwqq_get_cookies(lc)); return req->do_request_async(req, 1, msg,_C_(p_i,set_online_status_back,req)); }
static void ev_bomb(EV_P_ ev_timer * w,int revents) { lwqq_puts("boom!!"); ev_timer_stop(loop,w); ev_break(loop,EVBREAK_ALL); }
static int do_login_back(LwqqHttpRequest* req,LwqqAsyncEvent* event) { char refer[1024]; LwqqClient* lc = req->lc; int err = LWQQ_EC_OK; const char* response; //const char redirect_url[512]; if (req->http_code != 200) { err = LWQQ_EC_HTTP_ERROR; goto done; } if (strstr(req->response,"aq.qq.com")!=NULL){ err = LWQQ_EC_LOGIN_ABNORMAL; const char* beg = strstr(req->response,"http://aq.qq.com"); if(beg) sscanf(beg,"%[^']",lc->error_description); // beg may be null goto done; } if(req->response == NULL){ lwqq_puts("login no response\n"); err = LWQQ_EC_NETWORK_ERROR; goto done; } response = req->response; lwqq_verbose(3,"%s\n",response); char *p = strstr(response, "\'"); if (!p) { err = LWQQ_EC_ERROR; goto done; } int status,param2; char url[512]; int param4; char msg[512]; char user[64]; //void url is '' which makes sscanf failed //%*c is for eat a blank before 'user' sscanf(response,"ptuiCB('%d','%d','%[^,],'%d','%[^']',%*c'%[^']');", &status,¶m2,url,¶m4,msg,user); url[strlen(url)-1]=0; switch (status) { case 0: { err = LWQQ_EC_OK; LwqqHttpRequest* req = lwqq_http_create_default_request(lc, url, NULL); req->set_header(req,"Referer",WEBQQ_LOGIN_LONG_REF_URL(refer)); lwqq_http_set_option(req, LWQQ_HTTP_MAXREDIRS,1L); LwqqAsyncEvent* ev = req->do_request_async(req,lwqq__hasnot_post(),_C_(p_i,lwqq__process_empty,req)); lwqq_async_add_event_chain(ev, event); } break; case 1: lwqq_log(LOG_WARNING, "Server busy! Please try again\n"); lc->last_err = "Server busy! Please try again"; err = LWQQ_EC_ERROR; goto done; case 2: lwqq_log(LOG_ERROR, "Out of date QQ number\n"); lc->last_err = "Out of date QQ number"; err = LWQQ_EC_ERROR; goto done; case 3: lwqq_log(LOG_ERROR, "Wrong password\n"); err = LWQQ_EC_WRONG_PASS; lc->last_err = "Wrong username or password"; goto done; case 4: lwqq_log(LOG_ERROR, "Wrong verify code\n"); err = LWQQ_EC_WRONG_VERIFY; lc->last_err = "Wrong verify code"; goto done; case 5: lwqq_log(LOG_ERROR, "Verify failed\n"); lc->last_err = "Verify failed"; err = LWQQ_EC_FAILD_VERIFY; goto done; case 6: lwqq_log(LOG_WARNING, "You may need to try login again\n"); lc->last_err = "You may need to try login again"; err = LWQQ_EC_ERROR; goto done; case 7: lwqq_log(LOG_ERROR, "Wrong input\n"); lc->last_err = "Wrong input"; err = LWQQ_EC_ERROR; goto done; case 8: lwqq_log(LOG_ERROR, "Too many logins on this IP. Please try again\n"); lc->last_err = "Too many logins on this IP.Please try again"; err = LWQQ_EC_ERROR; goto done; case LWQQ_EC_LOGIN_NEED_BARCODE: lwqq_log(LOG_ERROR, "%s\n",msg); lc->error_description = s_strdup(msg); err = LWQQ_EC_LOGIN_NEED_BARCODE; goto done; default: err = LWQQ_EC_ERROR; lc->last_err = "Unknow error"; lwqq_log(LOG_ERROR, "Unknow error"); goto done; } done: lwqq_http_request_free(req); return err; }
static int do_login_back(LwqqHttpRequest* req) { LwqqClient* lc = req->lc; int err = LWQQ_EC_OK; const char* response; if (req->http_code != 200) { err = LWQQ_EC_HTTP_ERROR; goto done; } if (strstr(req->response,"aq.qq.com")!=NULL){ err = LWQQ_EC_LOGIN_ABNORMAL; const char* beg = strstr(req->response,"http://aq.qq.com"); sscanf(beg,"%[^']",lc->error_description); goto done; } if(req->response == NULL){ lwqq_puts("login no response\n"); err = LWQQ_EC_NETWORK_ERROR; goto done; } response = req->response; lwqq_verbose(3,"%s\n",response); char *p = strstr(response, "\'"); if (!p) { err = LWQQ_EC_ERROR; goto done; } char buf[4] = {0}; int status; strncpy(buf, p + 1, 1); status = atoi(buf); switch (status) { case 0: //sava_cookie(lc, req, NULL); err = LWQQ_EC_OK; break; case 1: lwqq_log(LOG_WARNING, "Server busy! Please try again\n"); lc->last_err = "Server busy! Please try again"; err = LWQQ_EC_ERROR; goto done; case 2: lwqq_log(LOG_ERROR, "Out of date QQ number\n"); lc->last_err = "Out of date QQ number"; err = LWQQ_EC_ERROR; goto done; case 3: lwqq_log(LOG_ERROR, "Wrong password\n"); err = LWQQ_EC_ERROR; lc->last_err = "Wrong username or password"; goto done; case 4: lwqq_log(LOG_ERROR, "Wrong verify code\n"); err = LWQQ_EC_ERROR; lc->last_err = "Wrong verify code"; goto done; case 5: lwqq_log(LOG_ERROR, "Verify failed\n"); lc->last_err = "Verify failed"; err = LWQQ_EC_ERROR; goto done; case 6: lwqq_log(LOG_WARNING, "You may need to try login again\n"); lc->last_err = "You may need to try login again"; err = LWQQ_EC_ERROR; goto done; case 7: lwqq_log(LOG_ERROR, "Wrong input\n"); lc->last_err = "Wrong input"; err = LWQQ_EC_ERROR; goto done; case 8: lwqq_log(LOG_ERROR, "Too many logins on this IP. Please try again\n"); lc->last_err = "Too many logins on this IP.Please try again"; err = LWQQ_EC_ERROR; goto done; default: err = LWQQ_EC_ERROR; lc->last_err = "Unknow error"; lwqq_log(LOG_ERROR, "Unknow error"); goto done; } done: lwqq_http_request_free(req); return err; }