|
30精币
我用网页_取Cookies()发现取出来的Cookies不完整. 然后用InternetGetCookieA取出完整的Cookies;
使用网页_访问 网页_访问S 网页_访问_对象 提交Cookies发现都无法登录.
然后我用C语言把精易的移植过去发现可以登录
if (!HttpURL)return nullptr; void *pTmp = nullptr; //如果已申请过内存,则释放之前申请的内存防止内存泄漏; if (TmpAlloc) { free (TmpAlloc); TmpAlloc = nullptr; } Mod_Text Text; //是否Https访问; BOOL Https = FALSE; if (strstr (HttpURL, "https://"))Https = TRUE; if (!URLRuquesDataInfo.RequestHeader)URLRuquesDataInfo.RequestHeader = "user-agent: Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)"; //打开HTTP句柄; HINTERNET hInternetopen = InternetOpen (URLRuquesDataInfo.RequestHeader, INTERNET_OPEN_TYPE_DIRECT, nullptr, nullptr, NULL); if (!hInternetopen)return nullptr; //取URL服务器域名; char *pChar2 = HttpGetHostName (HttpURL); //访问端口; INTERNET_PORT InterPort = INTERNET_DEFAULT_HTTP_PORT; if (Https)InterPort = INTERNET_DEFAULT_HTTPS_PORT; //创建Internet连接; HINTERNET hInternetConnect = InternetConnect (hInternetopen, pChar2, InterPort, NULL, NULL, INTERNET_SERVICE_HTTP, NULL, NULL); if (!hInternetConnect) { InternetCloseHandle (hInternetopen); return nullptr; } //HTTP访问方式; char plverb[125] = { 0 }; switch (URLRuquesDataInfo.URLRequestType) { case Get: strcpy (plverb, "GET"); break; case Post: strcpy (plverb, "POST"); break; case Head: strcpy (plverb, "HEAD"); break; default: strcpy (plverb, "GET"); break; } char *pURLPage = HttpGetURLPage (HttpURL); DWORD RequestFlg = INTERNET_FLAG_RELOAD | INTERNET_COOKIE_THIRD_PARTY; if (!URLRuquesDataInfo.RequestCookies)RequestFlg = RequestFlg | INTERNET_FLAG_NO_COOKIES; if (Https)RequestFlg = RequestFlg | INTERNET_FLAG_SECURE; else RequestFlg = RequestFlg | INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS; HINTERNET hInternetRequest = HttpOpenRequest (hInternetConnect, plverb, pURLPage, "HTTP/1.1", NULL, NULL, RequestFlg, NULL); if (!hInternetRequest) { InternetCloseHandle (hInternetConnect); InternetCloseHandle (hInternetopen); return nullptr; } UINT slen = 1024 * 1024 * sizeof (char) + sizeof (char); char *pTmpRequestHeader = (char *)malloc (slen); if (!pTmpRequestHeader) { InternetCloseHandle (hInternetConnect); InternetCloseHandle (hInternetopen); InternetCloseHandle (hInternetRequest); return nullptr; } ZeroMemory (pTmpRequestHeader, slen); //设置协议头; if (URLRuquesDataInfo.RequestHeader)strcpy (pTmpRequestHeader, URLRuquesDataInfo.RequestHeader); if (strstr (pTmpRequestHeader, "Accept:") == nullptr)strcat (pTmpRequestHeader, "\r\nAccept: */*"); if (strstr (pTmpRequestHeader, "Referer:") == nullptr) { strcat (pTmpRequestHeader, "\r\nReferer: "); strcat (pTmpRequestHeader, HttpURL); } if (strstr (pTmpRequestHeader, "Accept-Language:") == nullptr)strcat (pTmpRequestHeader, "\r\nAccept-Language: zh-cn"); if (strstr (pTmpRequestHeader, "Content-Type:") == nullptr)strcat (pTmpRequestHeader, "\r\nContent-Type: application/x-www-form-urlencoded"); if (URLRuquesDataInfo.RequestCookies) { if (strstr (pTmpRequestHeader, "Cookie:") == nullptr)strcat (pTmpRequestHeader, "\r\nCookie: "); strcat (pTmpRequestHeader, URLRuquesDataInfo.RequestCookies); } strcat (pTmpRequestHeader, "\r\n"); //发送请求信息; UINT len = strlen (pTmpRequestHeader); if (URLRuquesDataInfo.URLRequestType == Get)HttpSendRequest (hInternetRequest, pTmpRequestHeader, strlen (pTmpRequestHeader), nullptr, NULL); else HttpSendRequest (hInternetRequest, pTmpRequestHeader, strlen (pTmpRequestHeader), (LPVOID)URLRuquesDataInfo.RequestData, strlen (URLRuquesDataInfo.RequestData) * sizeof (char) + sizeof (char)); //申请返回数据临时存储缓冲区; slen = 2048; char *ResultData = (char*)malloc (slen); if (!ResultData) { InternetCloseHandle (hInternetConnect); InternetCloseHandle (hInternetopen); InternetCloseHandle (hInternetRequest); free (pTmpRequestHeader); return nullptr; } //申请保存网页数据存储缓冲区; char *SaveData = (char*)malloc (slen); if (!SaveData) { InternetCloseHandle (hInternetConnect); InternetCloseHandle (hInternetopen); InternetCloseHandle (hInternetRequest); free (pTmpRequestHeader); free (ResultData); return nullptr; } DWORD ReturnLen = 0; UINT SaveLen = 0, AllocLen = slen; //循环读取网页数据; char *pTmpdat = SaveData; do { //将临时存储缓冲区内存块置零; ZeroMemory (ResultData, slen); //将网页数据读取到临时存储缓冲区; InternetReadFile (hInternetRequest, ResultData, slen, &ReturnLen); if (!ReturnLen)break; //复制临时存储的网页数据到网页数据存储缓冲区; CopyMemory (pTmpdat, ResultData, ReturnLen); //计算当前已读取的网页数据长度; SaveLen += ReturnLen; //计算需要申请网页缓冲区的长度; AllocLen += ReturnLen; //重新申请缓冲区大小; void *pvoid = realloc (SaveData, AllocLen); if (!pvoid)break; //保存缓冲区指针; else SaveData = (char*)pvoid; //移动缓冲区指针位置; pTmpdat = (char*)SaveData + SaveLen; //新申请的内存块置零; ZeroMemory (pTmpdat, ReturnLen); } while (ReturnLen); //释放并返回网页数据; TmpAlloc = SaveData; InternetCloseHandle (hInternetConnect); InternetCloseHandle (hInternetopen); InternetCloseHandle (hInternetRequest); free (pTmpRequestHeader); free (ResultData); return (char*)TmpAlloc;
|
|