From 602a4da1ee3b1f4b507d90b1eb12d61af6add4d5 Mon Sep 17 00:00:00 2001 From: ElzorFox Date: Wed, 19 Feb 2025 15:30:38 +0500 Subject: VKontakte: work has been restored after the latest changes from the VK (!!! except for receiving a token) version bump --- protocols/VKontakte/src/version.h | 2 +- protocols/VKontakte/src/vk_captcha.cpp | 16 +++++++++++++++- protocols/VKontakte/src/vk_queue.cpp | 11 ++++++++--- protocols/VKontakte/src/vk_struct.cpp | 5 +++-- protocols/VKontakte/src/vk_thread.cpp | 12 ++++-------- 5 files changed, 31 insertions(+), 15 deletions(-) (limited to 'protocols') diff --git a/protocols/VKontakte/src/version.h b/protocols/VKontakte/src/version.h index 55fdea4fd7..7dd0a47a50 100644 --- a/protocols/VKontakte/src/version.h +++ b/protocols/VKontakte/src/version.h @@ -1,7 +1,7 @@ #define __MAJOR_VERSION 0 #define __MINOR_VERSION 1 #define __RELEASE_NUM 17 -#define __BUILD_NUM 5 +#define __BUILD_NUM 6 #include diff --git a/protocols/VKontakte/src/vk_captcha.cpp b/protocols/VKontakte/src/vk_captcha.cpp index fa3ff6b6e3..98a8624058 100644 --- a/protocols/VKontakte/src/vk_captcha.cpp +++ b/protocols/VKontakte/src/vk_captcha.cpp @@ -82,7 +82,21 @@ bool CVkProto::ApplyCaptcha(AsyncHttpRequest *pReq, const JSONNode &jnErrorNode) if (!RunCaptchaForm(szUrl, userReply)) return false; - pReq << CHAR_PARAM("captcha_sid", szSid) << CHAR_PARAM("captcha_key", userReply.GetString()); + + CMStringA szCapthaStr(FORMAT, "&captcha_sid=%s&captcha_key=%s", mir_urlEncode(szSid).c_str(), mir_urlEncode(userReply.GetString()).c_str()); + + int iCaptchaBeg = pReq->m_szUrl.Find("&captcha_sid=", 0); + int iCaptchaEnd = pReq->m_szUrl.Find("&v=", 0); + + if ((iCaptchaBeg > -1) && (iCaptchaEnd > iCaptchaBeg)) + pReq->m_szUrl.Replace(pReq->m_szUrl.Mid(iCaptchaBeg, iCaptchaEnd - iCaptchaBeg).c_str(), szCapthaStr); + else if (iCaptchaEnd > -1) + pReq->m_szUrl.Replace("&v=", szCapthaStr + "&v="); + else + pReq->m_szUrl += szCapthaStr; + pReq->bNeedsRestart = true; + debugLogA("CVkProto::ApplyCaptcha %s", pReq->m_szUrl); + return true; } \ No newline at end of file diff --git a/protocols/VKontakte/src/vk_queue.cpp b/protocols/VKontakte/src/vk_queue.cpp index 24b698af9c..eb9457e5e2 100644 --- a/protocols/VKontakte/src/vk_queue.cpp +++ b/protocols/VKontakte/src/vk_queue.cpp @@ -51,12 +51,17 @@ bool CVkProto::ExecuteRequest(AsyncHttpRequest *pReq) { mir_cslock lck(m_csWorkThreadTimer); tLocalWorkThreadTimer = m_tWorkThreadTimer = time(0); + if (pReq->m_bApiReq) + ApplyCookies(pReq); } debugLogA("CVkProto::ExecuteRequest \n====\n%s\n====\n", pReq->m_szUrl.c_str()); NLHR_PTR reply(Netlib_HttpTransaction(m_hNetlibUser, pReq)); { mir_cslock lck(m_csWorkThreadTimer); + if (pReq->m_bApiReq) + GrabCookies(reply, "api.vk.com"); + if (tLocalWorkThreadTimer != m_tWorkThreadTimer) { debugLogA("CVkProto::WorkerThread is living Dead => return"); delete pReq; @@ -141,7 +146,6 @@ void CVkProto::WorkerThread(void*) // Initialize new OAuth session extern char szBlankUrl[]; extern char szVKUserAgent[]; - extern char szVKUserAgentCH[]; AsyncHttpRequest *pReq = new AsyncHttpRequest(this, REQUEST_GET, "https://oauth.vk.com/authorize", false, &CVkProto::OnOAuthAuthorize); pReq @@ -153,11 +157,12 @@ void CVkProto::WorkerThread(void*) << VER_API; // Headers - pReq->AddHeader("User-agent", szVKUserAgent); + pReq->AddHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"); + pReq->AddHeader("Accept-language", "ru-RU,ru;q=0.9"); + pReq->AddHeader("User-Agent", szVKUserAgent); pReq->AddHeader("dht", "1"); pReq->AddHeader("origin", "https://oauth.vk.com"); pReq->AddHeader("referer", "https://oauth.vk.com/"); - pReq->AddHeader("sec-ch-ua", szVKUserAgentCH); pReq->AddHeader("sec-ch-ua-mobile", "?0"); pReq->AddHeader("sec-ch-ua-platform", "Windows"); pReq->AddHeader("sec-fetch-dest", "document"); diff --git a/protocols/VKontakte/src/vk_struct.cpp b/protocols/VKontakte/src/vk_struct.cpp index 08214a8089..7e23482d02 100644 --- a/protocols/VKontakte/src/vk_struct.cpp +++ b/protocols/VKontakte/src/vk_struct.cpp @@ -24,7 +24,8 @@ ULONG AsyncHttpRequest::m_uReqCount = 0; AsyncHttpRequest::AsyncHttpRequest() { m_bApiReq = true; - AddHeader("Connection", "keep-alive"); + AddHeader("Connection", "close"); + pUserInfo = nullptr; m_iRetry = MAX_RETRIES; m_iErrorCode = 0; @@ -39,7 +40,7 @@ AsyncHttpRequest::AsyncHttpRequest(CVkProto *ppro, int iRequestType, LPCSTR _url { m_bApiReq = true; bIsMainConn = false; - AddHeader("Connection", "keep-alive"); + AddHeader("Connection", "close"); if (ppro->bIint64IDCompatibility) AddHeader("X-Owner", "long"); diff --git a/protocols/VKontakte/src/vk_thread.cpp b/protocols/VKontakte/src/vk_thread.cpp index 01c66ab27c..951d64bd8a 100644 --- a/protocols/VKontakte/src/vk_thread.cpp +++ b/protocols/VKontakte/src/vk_thread.cpp @@ -23,7 +23,6 @@ mir_cs CVkProto::m_csTimer; char szBlankUrl[] = "https://oauth.vk.com/blank.html"; char szScore[] = "friends,photos,audio,docs,video,wall,messages,offline,status,notifications,groups"; char szVKUserAgent[] = "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko"; -char szVKUserAgentCH[] = "\"Microsoft Edge\";v =\"95\", \"Chromium\";v =\"95\", \";Not A Brand\";v = \"99\""; static char szVKTokenBeg[] = "access_token="; static char szVKLoginDomain[] = "https://m.vk.com"; @@ -223,7 +222,7 @@ void CVkProto::OnOAuthAuthorize(MHttpResponse *reply, AsyncHttpRequest*) pReq->m_bApiReq = false; pReq->bIsMainConn = true; ApplyCookies(pReq); - pReq->AddHeader("User-agent", szVKUserAgent); + pReq->AddHeader("User-Agent", szVKUserAgent); Push(pReq); return; } @@ -267,10 +266,8 @@ void CVkProto::OnOAuthAuthorize(MHttpResponse *reply, AsyncHttpRequest*) pRedirectReq->m_bApiReq = false; pRedirectReq->bIsMainConn = true; // Headers - pRedirectReq->AddHeader("User-agent", szVKUserAgent); + pRedirectReq->AddHeader("User-Agent", szVKUserAgent); pRedirectReq->AddHeader("dht", "1"); - pRedirectReq->AddHeader("sec-ch-ua", szVKUserAgentCH); - pRedirectReq->AddHeader("sec-ch-ua-mobile", "?0"); pRedirectReq->AddHeader("sec-ch-ua-platform", "Windows"); pRedirectReq->AddHeader("sec-fetch-dest", "document"); pRedirectReq->AddHeader("sec-fetch-mode", "navigate"); @@ -351,12 +348,11 @@ void CVkProto::OnOAuthAuthorize(MHttpResponse *reply, AsyncHttpRequest*) pReq->Redirect(reply); ApplyCookies(pReq); // Headers - pReq->AddHeader("User-agent", szVKUserAgent); + pReq->AddHeader("User-Agent", szVKUserAgent); pReq->AddHeader("dht", "1"); pReq->AddHeader("origin", "https://oauth.vk.com"); pReq->AddHeader("referer", "https://oauth.vk.com/"); - pReq->AddHeader("sec-ch-ua", szVKUserAgentCH); - pReq->AddHeader("sec-ch-ua-mobile", "?0"); + pReq->AddHeader("sec-ch-ua-platform", "Windows"); pReq->AddHeader("sec-fetch-dest", "document"); pReq->AddHeader("sec-fetch-mode", "navigate"); -- cgit v1.2.3