DIY गुमनाम ब्राउज़र या अपने गधे को स्वयं छिपाएं

प्रविष्टि


यह छोटा विषय इस बारे में बात करेगा कि वेब पर गुमनाम रहने में हमारी सहायता करने के लिए छोटे परिवर्धन के साथ कैसे जल्दी और आसानी से अपना ब्राउज़र बनाएं। हमारे लिए सभी काले कार्य Qt द्वारा किए जाएंगे, अर्थात इसका QtWebKit मॉड्यूल। हम केवल हमारे http- अनुरोधों के http- हेडर को सही स्थानों पर पहुंचाने वाली लाइनों को जोड़ेंगे। जब आप HTTP अनुरोधों का विश्लेषण कर रहे हों तो यह आपको गुमनाम रहने देगा। हम नाविक को भी फिर से परिभाषित करेंगे, जो हमें सक्रिय पहचान के साथ जावास्क्रिप्ट के लिए गुमनाम रहने की अनुमति देता है। निश्चितता के लिए, आइए हम उन मुख्य मापदंडों को निरूपित करते हैं जिनके द्वारा हम नेटवर्क में पहचाने जा सकते हैं - यही हम उनकी जगह लेंगे। पहला एक आईपी पते का है, सब कुछ सरल है - हम एक प्रॉक्सी का उपयोग करते हैं। दूसरा कोई भी http-request हेडर है (उपयोगकर्ता-एजेंट सबसे दिलचस्प होगा: इसका मान HTTP-रिक्वेस्ट के हेडर और जावास्क्रिप्ट चेकिंग दोनों में बदलना होगा)। हमें कुछ साइटों के लिए अपने कुकीज़ को संपादित करने और स्थानापन्न करने की क्षमता का भी एहसास है, क्योंकि ऐसा अवसर है। और हम बाद के उपयोग के लिए उन्हें बचाने की संभावना के साथ बदली मापदंडों के लिए अंतर्निहित संपादक के साथ यह सब जोड़ते हैं।



अपने ब्राउज़र के आधार पर, हम QWebView क्लास लेते हैं, जो किसी भी वेब पेज को लोड करने और प्रदर्शित करने का काम करेगा।



QWebView* pView = new QWebView;

pView->load(url);








PView द्वारा किए गए सभी अनुरोधों तक पहुंच प्राप्त करने के लिए, हम अपने QBotNetworkAccessManager वर्ग को QNetworkAccessManager से विरासत में मिला, परिभाषित करेंगे कि इस वर्ग की एक वस्तु बनाएं और इसे pView के लिए NetworkManager के रूप में सेट करें।



m_NetManage = new QBotNetworkAccessManager;

pView->page()->setNetworkAccessManager(m_NetManage);








प्रॉक्सी स्थापित करें जिसके माध्यम से NetworkManager काम करेगा और, तदनुसार, हमारा ब्राउज़र:



//pProxiEdit – IP:Port

QRegExp rx("^\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3}:\\d{2,}$")

QString sProxiIP, sPRoxiPort, sTmp;

sTmp = pProxiEdit->text();

if(rx.indexIn(sTmp, 0) != -1) {

int pos = sTmp.indexOf(":");

sProxiIP = sTmp.mid(0, pos);

sPRoxiPort = sTmp.mid(pos + 1, sTmp.size() - pos - 1);

QNetworkProxy* proxy = new QNetworkProxy(QNetworkProxy::HttpProxy, sProxiIP, sPRoxiPort.toUInt());

m_NetManage->setProxy(*proxy);

}








HTTP अनुरोध हेडर बदलें


हमारे ब्राउज़र द्वारा उत्पन्न HTTP- रिक्वेस्ट तक पहुँच फंक्शन में है



QNetworkReply * QNetworkAccessManager::createRequest ( Operation op, const QNetworkRequest & req, QIODevice * outgoingData = 0 ) [virtual protected]







जिसे हमें अपनी कक्षा QBotNetworkAccessManager में ओवरराइड करने की आवश्यकता है।

हम इसे इस तरह पुनर्परिभाषित करते हैं:



QNetworkReply * QBotNetworkAccessManager::createRequest ( Operation op, const QNetworkRequest & req, QIODevice * outgoingData) {

QNetworkRequest myReq(req);// QNetworkRequest & req

// http-

myReq.setRawHeader("User-Agent", sUA.toUtf8());

// ...

return QNetworkAccessManager::createRequest( op, myReq, outgoingData);

}








इस तरह, आप हमारे ब्राउज़र द्वारा भेजे गए http-request के किसी भी हेडर के प्रतिस्थापन को कार्यान्वित कर सकते हैं जिसकी हमें आवश्यकता है हेडर के साथ।

अब, जावास्क्रिप्ट के साथ, हमें अपने ब्राउज़र को सही तरीके से परिभाषित करने की आवश्यकता है। ऐसा करने के लिए, अगले पृष्ठ को लोड करने से पहले, इसे बदलते हुए जावास्क्रिप्ट को संपादित करें ताकि यह सर्वर को हमें आवश्यक जानकारी भेज सके। ऐसा करने के लिए, पृष्ठ दृश्य बदलते समय, नाविक को नीचे चलाकर जावास्क्रिप्ट को फिर से दिखाना चाहिए:



QString sUA = "MY_USER_AGENT";

...

connect(pView, SIGNAL(urlChanged(const QUrl&)), this, SLOT(OnUrlChanged(const QUrl&)));

...

void MainWindow::OnUrlChanged(const QUrl& url) {

QString jScript = QString("var navigator = new Object; navigator.appName = '%1';").arg(sUA);

pUrlEdit->setText(url.toString());

pView->page()->mainFrame()->evaluateJavaScript(jScript);

}








पृष्ठ लोड करने से पहले हम एक ही कार्य करते हैं:



...

OnUrlChanged(url);

pView->load(url);

...








अब जावास्क्रिप्ट के साथ, हम एक-दूसरे को उसी तरह से देखते हैं जैसे http-headers के विश्लेषण में।

छवि



कुकी संभालना


हम कुकीज़ और अन्य जानकारी सहेजेंगे (इस मामले में, केवल कुकीज़ और उपयोगकर्ता-एजेंट) नीचे परिभाषित संरचनाओं के वेक्टर के रूप में होंगे:



struct SDataArhive {

QByteArray BaseItemText;

QMap<QByteArray, QByteArray> ChItemText;

};

QVector vDataArhive;



cookie user-agent- :



QList ListCookies;

// cookie

ListCookies = pView->page()->networkAccessManager()->cookieJar()->cookiesForUrl(pView->url());

QByteArray sByteAr = "";

SDataArhive strTmp

// cookie QByteArray,

//

for(int i = 0; i < ListCookies.size(); i++) {

sByteAr += ListCookies[i].name();

sByteAr += "=";

sByteAr += ListCookies[i].value();

if(i < (ListCookies.size() - 1)){

sByteAr += "\n";

}

}

strTmp.ChItemText.insert("cookie", sByteAr);

//----------------------------------------

// User-Aget

sByteAr = sUA.toUtf8();

strTmp.ChItemText.insert("user-agent", sByteAr);

//--------------------------------------

vDataArhive.append(strTmp);



cookie . , .

छवि



, cookie, :



// QByteArray cookie

QByteArray tmp = vDataArhive[IdxTop].ChItemText[dataIdx];

// QByteArray cookie

QList ListData = tmp.split('\n');

QList ListCookies;

if(!ListData.isEmpty()) {

for(int i = 0; i < ListData.size(); i++) {

QList cooka = ListData[i].split('=');

if(cooka.size() == 2) {

ListCookies.push_back(QNetworkCookie(cooka[0], cooka[1]));

}

}

if(!ListCookies.isEmpty()){

// cookie

pView->page()->networkAccessManager()->cookieJar()->setCookiesFromUrl(ListCookies ,pView->url());

}

}

// user-agent

sUA = vDataArhive[IdxTop].ChItemText["user-agent"];



: .



PS www.free-lance.ru
, Qt www.prog.org.ru .















All Articles