Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
/**
 * 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;
}
Example #4
0
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;
}
Example #5
0
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;
}
Example #6
0
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;
}
Example #7
0
File: login.c Project: yet/lwqq
/** 
 * 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);    
}
Example #8
0
File: login.c Project: yet/lwqq
/** 
 * 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);
}
Example #9
0
/** 
 * 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;
}