日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

模拟网页行为之实践篇三

發(fā)布時間:2024/7/23 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模拟网页行为之实践篇三 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

現(xiàn)在來談下驗證碼圖片的獲取方式,帶有驗證碼的地方都會附帶有個刷新按鈕,而刷新按鈕的地方就是獲取驗證碼網(wǎng)址代碼。如果看過前面寫的《模擬網(wǎng)頁行為之工具篇》就會很容易定位到代碼位置。定位到代碼位置后看下圖:


基本可以看到的是獲取驗證碼的網(wǎng)址是:https://ipin.siren24.com/stickyCaptcha。但這還不夠,因為前篇我們還講過關(guān)于cookie的概念,需要帶有cookie去刷新驗證碼才是有效的驗證碼,但如何獲取cookie,看下圖:


可見cookie類型是hostonly的,hostonly就是說只能在當(dāng)前網(wǎng)頁獲取cookie。有了上述抓包分析,那么對驗證碼的流程有了基本的了解。

那么接下來的步驟分為

1.獲取https://ipin.siren24.com/stickyCaptcha的cookie,。

2. 帶cookie刷新驗證碼獲取圖片數(shù)據(jù)。


獲取hostonly的cookie,c++代碼實現(xiàn)如下:

std::string CWebLoginDlg::GetCookie( std::string url ) {LPSTR lpszData = NULL;DWORD dwSize=0; lpszData= new char[1];memset(lpszData,0, 1);retry: if (!InternetGetCookieA(url.c_str(), "", lpszData, &dwSize)){DWORD er = GetLastError();if (er == ERROR_INSUFFICIENT_BUFFER){delete []lpszData;lpszData = new char[dwSize+1];memset(lpszData,0,dwSize+1);goto retry;}else{ATLTRACE("cookie is null");}}std::string strCookieContent = std::string(lpszData, dwSize);delete [] lpszData;return strCookieContent; }參數(shù)即為:https://ipin.siren24.com/stickyCaptcha


若cookie為httponly類型,獲取的方式也不一樣,C++代碼如下:

std::wstring CWebLoginDlg::GetCookieEx( std::wstring url ) {LPWSTR lpszData = NULL;DWORD dwSize=0; lpszData= new wchar_t[1];memset(lpszData,0, sizeof(wchar_t));retry: if (!InternetGetCookieEx(url.c_str(), L"JSESSIONID", lpszData, &dwSize, 0x00002000, NULL)){DWORD er = GetLastError();if (er == ERROR_INSUFFICIENT_BUFFER){delete []lpszData;lpszData = new wchar_t[dwSize+1];memset(lpszData,0,dwSize+1);goto retry;}else{ATLTRACE("cookie is null");}}std::wstring strCookieContent = std::wstring(lpszData, dwSize);delete [] lpszData;return strCookieContent; }

刷新驗證碼圖片數(shù)據(jù),我采用的方式是用curl庫,實際上所有網(wǎng)頁走網(wǎng)絡(luò)協(xié)議方式都可以借助curl來實現(xiàn),但這里只單純刷驗證碼圖片數(shù)據(jù)。上面步驟把cookie獲取到后,將其編輯成以下格式,然后將其作為參數(shù)cookie,傳入到獲取網(wǎng)頁返回數(shù)據(jù)函數(shù),c++代碼表示如下:

std::string cookie = GetCookie("https://ipin.siren24.com/stickyCaptcha"); char nline[1024]; sprintf_s(nline, sizeof(nline),"%s; domain=ipin.siren24.com; path=/; hostOnly", cookie.c_str()); m_pCurlClient->GetURLResource("https://ipin.siren24.com/stickyCaptcha", nline, ret);

GetURLResource實現(xiàn)如下:

struct MemoryStruct {char *memory;size_t size; };size_t CurlClient::WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) {size_t realsize = size * nmemb;if (userp == NULL){return realsize;}struct MemoryStruct *mem = (struct MemoryStruct *)userp;//ATLTRACE("222 chunk addr %x %d %d threaid %d", (DWORD)mem, mem->size, realsize, GetCurrentThreadId());mem->memory = (char*)realloc(mem->memory, mem->size + realsize + 1);if(mem->memory == NULL) {/* out of memory! */ printf("not enough memory (realloc returned NULL)\n");return 0;}memcpy(&(mem->memory[mem->size]), contents, realsize);mem->size += realsize;mem->memory[mem->size] = 0;return realsize; }bool CurlClient::GetURLResource( std::string url, std::string cookie, std::string &rev) {bool ssl = (url.find("https") != std::string::npos);struct MemoryStruct chunk;chunk.memory = (char*)malloc(1); chunk.size = 0; CURL *curl;CURLcode res;curl = curl_easy_init();if (curl){if (!cookie.empty()){char nline[1024];sprintf_s(nline, sizeof(nline),"Set-Cookie: ""%s", cookie.c_str());res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline);}curl_easy_setopt(curl, CURLOPT_URL, url.c_str());int agentIndex = m_Multi ? GetCurrentThreadId() % m_UserAgentList.size() : 0;curl_easy_setopt(curl, CURLOPT_USERAGENT, m_UserAgentList[agentIndex].c_str());if (ssl){curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);}curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &CurlClient::WriteMemoryCallback);curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&chunk);curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1); //多線程完成任務(wù)馬上斷開連接curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30);curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 15);curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);res = curl_easy_perform(curl);if (res != CURLE_OK){char curlerror[1024 * 5] = {0};sprintf_s(curlerror, _countof(curlerror), "返回的信息 %s",curl_easy_strerror(res));m_Error = curlerror;}rev = std::string(chunk.memory, chunk.size);free(chunk.memory);curl_easy_cleanup(curl);}return res == CURLE_OK; }
以上,驗證碼的圖片數(shù)據(jù)即可獲取。





總結(jié)

以上是生活随笔為你收集整理的模拟网页行为之实践篇三的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。