這裡故事的背景是這樣的,這裡主要實現一個ip138網站這樣的功能,這裡先看下ip138實現了說明樣的功能
這裡的您的IP和後面的來自,就是我們感興趣的信息了,你可以在你的軟件中加如這樣的信息來獲取自己的IP,並且獲取來自說明地方,當然你也能獲取到別人的信息,但是這樣做可能就會像彩虹QQ那樣是有風險的,閒話少說,這裡我也是參考了網上一些資源,大部分都是錯的,一個典型代表就是這篇http://bbs.csdn.net/topics/300170507文章中的代碼,不知道原始作者是誰,但可能是很久的帖子了,網站內部可能已經更換了運行機制,有人說是重定向了,這裡本人對這方面不是很了解,姑且認為是這樣的吧。這使得我們下載到的文件裡面是不包含我們需要的這些信息的,但是這些信息明明就在那裡,這麼近那麼遠有木有!
實際解決問題的方案很簡單,就是主動給網頁發請求,並將網頁返回的東西收集過來,並對收集的內容進行分析結果就出來了,這裡還是直接給出代碼,然後進行講解
QString getIpLocation() { //網頁地址 const QString URLSTR = QString::fromStdWString(IP138); QUrl url(URLSTR); QNetworkAccessManager manager; QEventLoop loop; //發出請求 QNetworkReply *reply = manager.get(QNetworkRequest(url)); //請求結束並下載完成後,退出子事件循環 QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); //開啟子事件循環 loop.exec(); //對得到的網頁文本code進行信息提取 QString code = reply->readAll(); QString lcenter = "<center>"; QString rcenter = "</center>"; int lIndex = code.indexOf(lcenter); QString left = code.left(lIndex + lcenter.length()); code.replace(left, ""); int rIndex = code.indexOf(rcenter); QString result = code.left(rIndex); return result; }
這個函數是對IP138這個網頁,這個網頁我寫在了宏裡面
#define IP138 L"http://iframe.ip138.com/ic.asp"
打開這個網頁你能看到這樣的東西
這裡就是網頁反饋給我們的東西了,我們使用QNetworkAccessManager這個類的get方法,這裡有必要對這個方法進行一個簡單的說明
QNetworkReply * QNetworkAccessManager::get ( const QNetworkRequest & request )
當准備好接收的時候給給目標發送一個readyRead()信號,並返回QNetworkReply類型的對象,簡單的說就是通過request發送信號給目標,並通過返回值取回網頁返回的信息,也包括這個網頁的信息頭。
這裡7-13行進行的是一個消息循環,這個循環的結束時reply發送了finish()信號,當然這個finish()信號是那邊服務器在發送完這個網頁的信息之後附帶發送的,不是程序員去觸發的,這個信號對應的槽quit()也是系統自動去執行,退出消息循環,這裡我覺得我們可以通過主動發送信號,不管是什麼信號,可以不是finish()信號,但把這個信號連接到quit()這個槽上,這裡就能實現我們自己的強制結束消息循環了。
QNetworkReply這個類包含一些發送的數據和頭,像QNetworkRequest包含的就是URL,頭,還有響應狀態和響應內容的本身,15行是講讀取到的數據全部讀出來存在code裡面,下面是對code內容的解析,這裡由於我們需要的信息在<center>和</center>之間,所以後面的處理都是針對我們需要的信息進行的特殊處理,這裡不做更多的說明了。
這裡應該都很好理解,想說的是後面的操作,這裡在用這些類的時候應該增加頭文件#include <QtNetwork>,但是你會發現,加了之後仍然編譯不過去,這裡就需要手動的去改下我們的pro文件,增加這樣的QT += network,把network這個庫包進來,這樣在編譯就可以過了。
這裡有必要對這個QNetworkRequest引起注意,這裡我們是對一個網頁發出簡單的請求,我們可以向這個網頁發出其它的請求要求它給我們做出一些反饋,比如一些抽獎類的網頁,我們就可以通過這樣的方法做成外掛,一鍵抽獎。
本文出自 “賣萌程序員” 博客,請務必保留此出處http://7677869.blog.51cto.com/7667869/1284519