static int set_online_status_back(LwqqHttpRequest* req) { int err = LWQQ_EC_OK; int ret; char* response; char* value; json_t * json = NULL; LwqqClient* lc = req->lc; if(!lwqq_client_valid(lc)){ err = LWQQ_EC_ERROR; goto done; } if (req->http_code != 200) { err = LWQQ_EC_HTTP_ERROR; goto done; } /** * Here, we got a json object like this: * {"retcode":0,"result":{"uin":1421032531,"cip":2013211875,"index":1060,"port":43415,"status":"online","vfwebqq":"e7ce7913336ad0d28de9cdb9b46a57e4a6127161e35b87d09486001870226ec1fca4c2ba31c025c7","psessionid":"8368046764001e636f6e6e7365727665725f77656271714031302e3133332e34312e32303200006b2900001544016e0400533cb3546d0000000a4046674d4652585136496d00000028e7ce7913336ad0d28de9cdb9b46a57e4a6127161e35b87d09486001870226ec1fca4c2ba31c025c7","user_state":0,"f":0}} * */ response = req->response; lwqq_verbose(3,"%s\n",response); ret = json_parse_document(&json, response); if (ret != JSON_OK) { err = LWQQ_EC_ERROR; goto done; } if (!(value = json_parse_simple_value(json, "retcode"))) { err = LWQQ_EC_ERROR; goto done; } /** * Do we need parse "seskey? from kernelhcy's code, we need it, * but from the response we got like above, we dont need * */ lwqq__override(lc->seskey,lwqq__json_get_value(json,"seskey")); lwqq__override(lc->cip,lwqq__json_get_value(json,"cip")); lwqq__override(lc->myself->uin,lwqq__json_get_value(json,"uin")); lwqq__override(lc->index,lwqq__json_get_value(json,"index")); lwqq__override(lc->port,lwqq__json_get_value(json,"port")); lwqq__override(lc->vfwebqq,lwqq__json_get_value(json,"vfwebqq")); lwqq__override(lc->psessionid,lwqq__json_get_value(json,"psessionid")); lc->stat = lwqq_status_from_str( json_parse_simple_value(json, "status")); err = LWQQ_EC_OK; done: if (json) json_free_value(&json); lwqq_http_request_free(req); return err; }
json_t *lwqq__parse_retcode_result(json_t *json,int* retcode) { //{"retcode":0,"result":......} /** * Frist, we parse retcode that indicate whether we get * correct response from server */ char* value = json_parse_simple_value(json, "retcode"); if(!value){ *retcode = LWQQ_EC_ERROR; return NULL; } *retcode = s_atoi(value,LWQQ_EC_ERROR); /** * Second, Check whether there is a "result" key in json object * if success it would return result; * if failed it would return NULL; */ json_t* result = json_find_first_label_all(json, "result"); if(result == NULL) return NULL; return result->child; }
/** * this process simple result; */ int lwqq__process_simple_response(LwqqHttpRequest* req) { //{"retcode":0,"result":{"ret":0}} int err = 0; json_t *root = NULL; lwqq__jump_if_http_fail(req,err); lwqq__jump_if_json_fail(root,req->response,err); int retcode = s_atoi(json_parse_simple_value(root, "retcode"),LWQQ_EC_ERROR); if(retcode != LWQQ_EC_OK){ err = retcode; } done: lwqq__log_if_error(err, req); lwqq__clean_json_and_req(root,req); return err; }
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 int set_online_status_back(LwqqHttpRequest* req) { 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); if(err) goto done; if(result){ lwqq_override(lc->seskey,lwqq__json_get_value(result,"seskey")); lwqq_override(lc->cip,lwqq__json_get_value(result,"cip")); lwqq_override(lc->myself->uin,lwqq__json_get_value(result,"uin")); 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 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); if(err!=WEBQQ_OK) 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")); lc->stat = lwqq_status_from_str(json_parse_simple_value(result, "status")); lwqq__override(lc->vfwebqq,lwqq__json_get_value(result,"vfwebqq")); } done: lwqq__clean_json_and_req(root,req); return err; }
/** * WebQQ logout function * * @param client Lwqq Client * @param err Error code */ void lwqq_logout(LwqqClient *client, LwqqErrorCode *err) { char url[512]; LwqqHttpRequest *req = NULL; int ret; json_t *json = NULL; char *value; struct timeval tv; char *cookies; long int re; if (!client) { lwqq_log(LOG_ERROR, "Invalid pointer\n"); return ; } /* Get the milliseconds of now */ if (gettimeofday(&tv, NULL)) { if (err) *err = LWQQ_EC_ERROR; return ; } re = tv.tv_usec / 1000; re += tv.tv_sec; snprintf(url, sizeof(url), "%s/channel/logout2?clientid=%s&psessionid=%s&t=%ld", "http://d.web2.qq.com", client->clientid, client->psessionid, re); /* Create a GET request */ req = lwqq_http_create_default_request(url, err); if (!req) { goto done; } /* Set header needed by server */ req->set_header(req, "Referer", "http://ptlogin2.qq.com/proxy.html?v=20101025002"); /* Set http cookie */ cookies = lwqq_get_cookies(client); if (cookies) { req->set_header(req, "Cookie", cookies); s_free(cookies); } ret = req->do_request(req, 0, NULL); if (ret) { lwqq_log(LOG_ERROR, "Send logout request failed\n"); if (err) *err = LWQQ_EC_NETWORK_ERROR; goto done; } if (req->http_code != 200) { if (err) *err = LWQQ_EC_HTTP_ERROR; goto done; } ret = json_parse_document(&json, req->response); if (ret != JSON_OK) { if (err) *err = LWQQ_EC_ERROR; goto done; } /* Check whether logout correctly */ value = json_parse_simple_value(json, "retcode"); if (!value || strcmp(value, "0")) { if (err) *err = LWQQ_EC_ERROR; goto done; } value = json_parse_simple_value(json, "result"); if (!value || strcmp(value, "ok")) { if (err) *err = LWQQ_EC_ERROR; goto done; } /* Ok, seems like all thing is ok */ if (err) *err = LWQQ_EC_OK; done: if (json) json_free_value(&json); lwqq_http_request_free(req); }
/** * Set online status, this is the last step of login * * @param err * @param lc */ static void set_online_status(LwqqClient *lc, char *status, LwqqErrorCode *err) { char msg[1024] ={0}; char *buf; LwqqHttpRequest *req = NULL; char *response = NULL; char *cookies; int ret; json_t *json = NULL; char *value; if (!status || !err) { goto done ; } lc->clientid = generate_clientid(); if (!lc->clientid) { lwqq_log(LOG_ERROR, "Generate clientid error\n"); *err = LWQQ_EC_ERROR; goto done ; } 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(LWQQ_URL_SET_STATUS, err); if (!req) { goto done; } /* Set header needed by server */ req->set_header(req, "Cookie2", "$Version=1"); req->set_header(req, "Referer", "http://d.web2.qq.com/proxy.html?v=20101025002"); req->set_header(req, "Content-type", "application/x-www-form-urlencoded"); /* Set http cookie */ cookies = lwqq_get_cookies(lc); if (cookies) { req->set_header(req, "Cookie", cookies); s_free(cookies); } ret = req->do_request(req, 1, msg); if (ret) { *err = LWQQ_EC_NETWORK_ERROR; goto done; } if (req->http_code != 200) { *err = LWQQ_EC_HTTP_ERROR; goto done; } /** * Here, we got a json object like this: * {"retcode":0,"result":{"uin":1421032531,"cip":2013211875,"index":1060,"port":43415,"status":"online","vfwebqq":"e7ce7913336ad0d28de9cdb9b46a57e4a6127161e35b87d09486001870226ec1fca4c2ba31c025c7","psessionid":"8368046764001e636f6e6e7365727665725f77656271714031302e3133332e34312e32303200006b2900001544016e0400533cb3546d0000000a4046674d4652585136496d00000028e7ce7913336ad0d28de9cdb9b46a57e4a6127161e35b87d09486001870226ec1fca4c2ba31c025c7","user_state":0,"f":0}} * */ response = req->response; ret = json_parse_document(&json, response); if (ret != JSON_OK) { *err = LWQQ_EC_ERROR; goto done; } if (!(value = json_parse_simple_value(json, "retcode"))) { *err = LWQQ_EC_ERROR; goto done; } /** * Do we need parse "seskey? from kernelhcy's code, we need it, * but from the response we got like above, we dont need * */ if ((value = json_parse_simple_value(json, "seskey"))) { lc->seskey = s_strdup(value); } if ((value = json_parse_simple_value(json, "cip"))) { lc->cip = s_strdup(value); } if ((value = json_parse_simple_value(json, "index"))) { lc->index = s_strdup(value); } if ((value = json_parse_simple_value(json, "port"))) { lc->port = s_strdup(value); } if ((value = json_parse_simple_value(json, "status"))) { /* This really need? */ lc->status = s_strdup(value); } if ((value = json_parse_simple_value(json, "vfwebqq"))) { lc->vfwebqq = s_strdup(value); } if ((value = json_parse_simple_value(json, "psessionid"))) { lc->psessionid = s_strdup(value); } *err = LWQQ_EC_OK; done: if (json) json_free_value(&json); lwqq_http_request_free(req); }
/** * WebQQ logout function * * @param client Lwqq Client * @param err Error code */ LWQQ_EXPORT void lwqq_logout(LwqqClient *client, LwqqErrorCode *err) { LwqqClient* lc = client; char url[512]; LwqqHttpRequest *req = NULL; int ret; json_t *json = NULL; char *value; struct timeval tv; long int re; if (!client) { lwqq_log(LOG_ERROR, "Invalid pointer\n"); return ; } /* Get the milliseconds of now */ if (gettimeofday(&tv, NULL)) { if (err) *err = LWQQ_EC_ERROR; return ; } re = tv.tv_usec / 1000; re += tv.tv_sec; snprintf(url, sizeof(url), "%s/channel/logout2" "?clientid=%s&psessionid=%s&t=%ld", WEBQQ_D_HOST, client->clientid, client->psessionid, re); /* Create a GET request */ req = lwqq_http_create_default_request(client,url, err); if (!req) { goto done; } /* Set header needed by server */ req->set_header(req, "Referer", WEBQQ_LOGIN_REF_URL); lwqq_http_set_option(req, LWQQ_HTTP_ALL_TIMEOUT,5L); req->retry = 0; ret = req->do_request(req, 0, NULL); if (ret) { lwqq_log(LOG_ERROR, "Send logout request failed\n"); if (err) *err = LWQQ_EC_NETWORK_ERROR; goto done; } if (req->http_code != 200) { if (err) *err = LWQQ_EC_HTTP_ERROR; goto done; } ret = json_parse_document(&json, req->response); if (ret != JSON_OK) { if (err) *err = LWQQ_EC_ERROR; goto done; } /* Check whether logout correctly */ value = json_parse_simple_value(json, "retcode"); if (!value || strcmp(value, "0")) { if (err) *err = LWQQ_EC_ERROR; goto done; } value = json_parse_simple_value(json, "result"); if (!value || strcmp(value, "ok")) { if (err) *err = LWQQ_EC_ERROR; goto done; } /* Ok, seems like all thing is ok */ if (err) *err = LWQQ_EC_OK; done: if (json) json_free_value(&json); lwqq_http_request_free(req); client->stat = LWQQ_STATUS_LOGOUT; }