int shell(struct params *params) { PcsRes pcsres; const char *cookie_file; Pcs pcs; if (params->cookie) cookie_file = params->cookie; else cookie_file = get_default_cookie_file(params->username); printf("COOKIE FILE: %s\n", cookie_file); /* 创建一个Pcs对象 */ pcs = pcs_create(cookie_file); /* 设定如何获取验证码 */ if (params->use_urlc) { pcs_setopt(pcs, PCS_OPTION_CAPTCHA_FUNCTION, cb_get_verify_code_byurlc); } else { pcs_setopt(pcs, PCS_OPTION_CAPTCHA_FUNCTION, cb_get_verify_code); } if (params->is_verbose) { pcs_setopt(pcs, PCS_OPTION_HTTP_RESPONSE_FUNCTION, cb_pcs_http_response); } pcs_setopts(pcs, PCS_OPTION_PROGRESS_FUNCTION, cb_upload_progress, PCS_OPTION_PROGRESS, PcsFalse, PCS_OPTION_END); if ((pcsres = pcs_islogin(pcs)) != PCS_LOGIN) { if (!params->username) { printf("Your session is time out, please restart with -u option\n"); pcs_destroy(pcs); return -1; } pcs_setopt(pcs, PCS_OPTION_USERNAME, params->username); if (!params->password) { char password[50]; printf("Password: "******"Login Failed: %s\n", pcs_strerror(pcs)); pcs_destroy(pcs); return -1; } } else { if (params->username && pcs_utils_strcmpi(pcs_sysUID(pcs), params->username) != 0) { char flag[8] = {0}; printf("You have been logged in with %s, but you specified %s,\ncontinue?(yes|no): \n", pcs_sysUID(pcs), params->username); get_string_from_std_input(flag, 4); if (pcs_utils_strcmpi(flag, "yes") && pcs_utils_strcmpi(flag, "y")) { pcs_destroy(pcs); return -1; } } } printf("UID: %s\n", pcs_sysUID(pcs)); show_quota(pcs); exec_cmd(pcs, params); pcs_destroy(pcs); return 0; }
PCS_API PcsRes pcs_login(Pcs handle) { struct pcs *pcs = (struct pcs *)handle; PcsRes res; char *p, *html, *url, *token, *code_string, captch[8], *post_data, *tt; cJSON *json, *root, *item; int error = -1, i; pcs_clear_errmsg(handle); html = pcs_http_get(pcs->http, URL_HOME, PcsTrue); if (!html) { pcs_set_errmsg(handle, "Can't get response from the server."); return PCS_NETWORK_ERROR; } html = pcs_http_get(pcs->http, URL_PASSPORT_API "login", PcsTrue); if (!html) { pcs_set_errmsg(handle, "Can't get response from the server."); return PCS_NETWORK_ERROR; } url = pcs_utils_sprintf(URL_PASSPORT_API "getapi" "&tpl=ik" "&apiver=v3" "&class=login" "&tt=%d", (int)time(0)); html = pcs_http_get(pcs->http, url, PcsTrue); pcs_free(url); if (!html) { pcs_set_errmsg(handle, "Can't get response from the server."); return PCS_NETWORK_ERROR; } json = cJSON_Parse(html); if (!json){ pcs_set_errmsg(handle, "Can't parse the response as object. Response: %s", html); return PCS_WRONG_RESPONSE; } root = cJSON_GetObjectItem(json, "data"); if (!root) { pcs_set_errmsg(handle, "Can't read res.data. Response: %s", html); cJSON_Delete(json); return PCS_WRONG_RESPONSE; } item = cJSON_GetObjectItem(root, "token"); if (!item) { pcs_set_errmsg(handle, "Can't read res.token. Response: %s", html); cJSON_Delete(json); return PCS_WRONG_RESPONSE; } token = pcs_utils_strdup(item->valuestring); item = cJSON_GetObjectItem(root, "codeString"); if (!item) { pcs_set_errmsg(handle, "Can't read res.codeString. Response: %s", html); pcs_free(token); cJSON_Delete(json); return PCS_WRONG_RESPONSE; } code_string = pcs_utils_strdup(item->valuestring); cJSON_Delete(json); p = token; while (*p) { if (!((*p >= '0' && *p <= '9') || (*p >= 'a' && *p <= 'f') || (*p >= 'A' && *p <= 'F'))) { pcs_set_errmsg(handle, "Invalid token. Token: %s", token); pcs_free(token); pcs_free(code_string); return PCS_WRONG_RESPONSE; } p++; } i = 0; try_login: if (code_string[0]) { res = pcs_get_captcha(pcs, code_string, captch, sizeof(captch)); if (res != PCS_OK) { pcs_free(token); pcs_free(code_string); return res; } } tt = pcs_utils_sprintf("%d", (int)time(0)); post_data = pcs_http_build_post_data(pcs->http, "ppui_logintime", "6852", "charset", "UTF-8", "codestring", code_string, "token", token, "isPhone", "false", "index", "0", "u", "", "safeflg", "0", "staticpage", "http://www.baidu.com/cache/user/html/jump.html", "loginType", "1", "tpl", "mn", "callback", "parent.bdPass.api.login._postCallback", "username", pcs->username, "password", pcs->password, "verifycode", captch, "mem_pass", "on", "tt", tt, NULL); pcs_free(tt); if (!post_data) { pcs_set_errmsg(handle, "Can't build the post data."); pcs_free(token); pcs_free(code_string); return PCS_BUILD_POST_DATA; } html = pcs_http_post(pcs->http, URL_PASSPORT_API "login", post_data, PcsTrue); pcs_free(post_data); if (!html) { pcs_set_errmsg(handle, "Can't get the response from the server."); pcs_free(token); pcs_free(code_string); return PCS_NETWORK_ERROR; } else { char *errorStr = pcs_get_embed_query_int_value_by_key(html, "&error"); if (!errorStr) { pcs_set_errmsg(handle, "Can't read the error from the response. Response: %s", html); pcs_free(token); pcs_free(code_string); return PCS_NETWORK_ERROR; } error = atoi(errorStr); pcs_free(errorStr); } if (error == 0) { if (pcs_islogin(pcs) == PCS_LOGIN) { pcs_free(token); pcs_free(code_string); return PCS_OK; } else { pcs_set_errmsg(handle, "Unknown Error"); pcs_free(token); pcs_free(code_string); return PCS_FAIL; } } else { if (code_string) pcs_free(code_string); code_string = pcs_get_embed_query_token_by_key(html, "&codestring"); if (!code_string) { pcs_set_errmsg(handle, "Can't read the codestring from the response. Response: %s", html); pcs_free(token); pcs_free(code_string); return PCS_FAIL; } } if (i < 1 && code_string[0]) { i++; goto try_login; } pcs_free(token); pcs_free(code_string); pcs_set_errmsg(handle, "Unknown Error"); return PCS_FAIL; }