WinInet + MFC 写vc驿站助手
生活随笔
收集整理的這篇文章主要介紹了
WinInet + MFC 写vc驿站助手
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
春節(jié)期間,花了好幾天的功夫編碼與測試,才算勉強release......
利用WinInet + MFC編寫,現(xiàn)在主要講解一下原理:
備注信息: 論壇測試賬號(username: cctry_good / uid: 22983),以下內(nèi)容經(jīng)Syc老大允許后才得以修改更正!
(可以用來掛論壇的在線時間!)
運行主界面:
簽到提示:
回復(fù)貼子:
1、論壇WEB程序相關(guān)知識:
? ?? A、MFC如何提交表單:
? ? 這個之前在也有兩貼子(含源碼)介紹了利用WinInet如何模擬WEB提交表單,有興趣的可以看看!
? ?? VC POST表單模擬登錄新浪郵箱 ? ?? 利用WinInet查詢考生信息
? ? B、論壇WEB程序必備:
? ? username??用戶名
? ? uid? ?? ?? ?? ?用戶名對應(yīng)的唯一標示ID
? ? formhash??登錄后唯一標示
? ?? Omnipeek ?網(wǎng)絡(luò)抓包工具
? ?? Fiddler2 ? ???Web調(diào)試工具 (推薦)
? ? C、會員信息獲取辦法:
? ? 這里就用到了uid,當然你也可以換成 username-cctry_good 其實發(fā)現(xiàn)也可以!
? ? 當然如果你是 正則表達式 方面的大師,取這個頁中的數(shù)據(jù)就容易多了!反之,如果不熟悉正則的童鞋,你可以使用CString::Find、Mid等函數(shù)來獲取。
? ? 個人空間的頁面如下:
? ???(1)? http://www.cctry.com/space-uid-22983.html ?
? ???(2)? http://www.cctry.com/home-space-uid-22983-do-profile.html
2、WEB數(shù)據(jù)描述:
? ? 關(guān)于 HTTP協(xié)議 ,我也不想多做解釋,說簡單一點,就是 本機事先組織一串有規(guī)律的Buffer通過系統(tǒng)網(wǎng)絡(luò)模塊,提交給WEB后臺的IIS程序,然后IIS來解析這段HTTP數(shù)據(jù)包,再返回一個Buffer給你(一般這個Buffer[即網(wǎng)頁源碼],由IE等瀏覽器來解析成網(wǎng)頁),然后就完成了一次通信 。下面這些都是由抓包工具得來:
? ?? A、登錄數(shù)據(jù)包格式: POST /member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&inajax=1 HTTP/1.1
Content-Type: application/x-www-form-urlencoded
User-Agent: Test
Host: www.cctry.com
Content-Length: 105
Pragma: no-cache
username=cctry_good&cookietime=2592000&password=123456&quickforward=yes&handlekey=ls&questionid=0&answer= 復(fù)制代碼
“User-Agent”
就是 CInternetSession構(gòu)造函數(shù)的第一個參數(shù),默認為空(即為工程名)。
? ?? B、退出論壇與清除痕跡的數(shù)據(jù)包格式:
? ?? ?? ?這里要提到的是formhash后面的一個字符串,我對WEB編程不了解,沒法用專業(yè)的術(shù)語來形容,在此就這樣描述吧:它是論壇會員登錄后唯一的標示,以后退出、簽到、發(fā)貼等等操作會用到它。
通過讀取論壇首頁,即可獲取到formhash值: GET /forum.php HTTP/1.1
User-Agent: Test
Host: www.cctry.com
復(fù)制代碼
退出論壇的數(shù)據(jù)包格式:
GET /member-logging-action-logout-formhash-e9c11601.html HTTP/1.1
User-Agent: Test
Host: www.cctry.com
復(fù)制代碼
清除痕跡的數(shù)據(jù)包格式:
GET /member-clearcookies-formhash-e9c11601.html HTTP/1.1
User-Agent: Test
Host: www.cctry.com
復(fù)制代碼
C、簽到的數(shù)據(jù)包格式:
? ?? ?? ?以下為簽到時的數(shù)據(jù)包格式,后面會用到formhash,及其他表單選項: POST/plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1&inajax=1 HTTP/1.1
Content-Type: application/x-www-form-urlencoded
User-Agent: Test
Host: www.cctry.com
Content-Length: 103
Pragma: no-cache
formhash=e9c11601&qdxq=kx&qdmode=1&todaysay=Hello+World+%21+By+%E6%E4%D5%BE%D6%FA%CA%D6v1.0&fastreply=1 復(fù)制代碼
3、部分代碼
:
? ? 這里之所以不放Src,主要有兩方面: 防止論壇水貼泛濫影響氣氛 、根據(jù)以上筆記自行編寫來同時 提高童鞋們動手能力 !
? ? OK,回正題吧!下面為部分代碼,僅供參考:
A、全局變量: //
// 用戶權(quán)限 (這里根據(jù)用戶組的ID來顯示用戶組,因為剛那是數(shù)組下標)
const TCHAR *g_szGroupInfo[] = {
? ?? ???_T("無"),_T("管理員"),_T("超級版主"),_T("版主"),_T("禁止發(fā)言"),? ?? ?? ?? ?? ?? ?? ?? ???// 0-4
? ?? ???_T("禁止訪問"),_T("禁止IP"),_T("游客"),_T("等待驗證會員"),_T("乞丐"),? ?? ?? ?? ?? ? // 5-9
? ?? ???_T("新手上路"),_T("注冊會員"),_T("中級會員"),_T("高級會員"),_T("金牌會員"),? ?? ?// 10-14
? ?? ???_T("論壇元老"),_T("普通會員"),_T("銀牌會員"),_T("銅牌會員")};? ?? ?? ?? ?? ?? ?? ?? ?? ?// 15-18
//
// 線程同步
CMutex g_Mutex;
//
// 模擬訪問貼子ID
int? ?? ?? ?? ?? ? g_nUID = 1;
//
// 宏定義
#define TIMER_LEN? ?? ???(60000 * 5)? ?? ?? ?? ?? ? // 5分鐘刷新一次
#define MAX_UID? ?? ?? ???14911? ?? ?? ?? ?? ?? ?? ? // 最大貼子數(shù)量? ?? ??? 復(fù)制代碼
B、其他數(shù)據(jù)類型、宏定義:
//
// 登錄結(jié)果
enum EnumResult
{
? ?? ???ER_LOGIN_FAILED? ???= 0,? ?? ???// 登錄失敗
? ?? ???ER_LOGIN_SUCCESS??= 1,? ?? ???// 登錄成功
? ?? ???ER_FIFTEEN_LATER? ? = 2,? ?? ???// 15分鐘后再試
? ?? ???ER_NETWORK_ERR? ? = 3,? ?? ???// 其他網(wǎng)絡(luò)錯誤
? ?? ???ER_NULL? ?? ?? ?? ?? ?? ? = 0xFF? ?// 無
};
#define WM_ICON_NOTIFY??WM_USER+10? ?? ???// 托盤消息 復(fù)制代碼
C、主窗口類的成員變量與成員函數(shù):
class CTestDlg : public CDialog
{
// Construction
public:
? ? CTestDlg(CWnd* pParent = NULL);? ? // standard constructor
? ? // 以下函數(shù)用途:登錄、注銷、重新登錄.
? ? EnumResult? ? LoginServer(CString? ? strUser,CString strPass,CString & strErrMsg/* = _T("")*/);
? ? void? ?? ???LoginOff();
? ? void? ?? ???ReLogin();
? ? // 以下函數(shù)用途:獲取hash、遍歷訪問貼子、清空用戶信息.
? ? CString? ?? ???GetFormHash();
? ? BOOL? ?? ???InitFromHomePage();
? ? void? ?? ???ClearInfo(CString strMsg = _T("--"));
? ? //??以下函數(shù)用途:獲取用戶基本信息、在線時間、簽到.
? ? BOOL? ?? ???GetUserInfo(CString strName);
? ? BOOL? ?? ???GetGroupANDTime(CString? ? strName);
? ? BOOL? ?? ???MemberSignIn();
? ? // 以下函數(shù)用途:分別啟動遍歷貼子以提高在線時間、
? ? //? ?? ?? ?? ?? ?登錄、注銷、簽到線程.
? ? //? ?? ?? ?? ?? ?<設(shè)置高優(yōu)先級,線程同步處理>
? ? void? ? StartThreadGetInfo();
? ? void? ? StartLoginThread();
? ? void? ? StartLoginOffThread();
? ? void? ? StartSignInThread();
? ? // 以下函數(shù)用途:對應(yīng)上面四個線程的實線
? ? static DWORD WINAPI ThreadToGetInfo(LPVOID);
? ? static DWORD WINAPI ThreadToLogin(LPVOID);
? ? static DWORD WINAPI ThreadToLoginOff(LPVOID);
? ? static DWORD WINAPI ThreadToSignIn(LPVOID);
public:
? ? CInternetSession*? ???m_pSession;
? ? CHttpConnection*? ? m_pConnection;
? ? CHttpFile*? ?? ?? ?? ?? ? m_pFile;
? ? HANDLE? ?? ?? ?? ?? ? m_hInitHomePage;? ?? ?// 定時器線程 —— 刷新在線時間
? ? HANDLE? ?? ?? ?? ?? ? m_hLoginThread;? ?? ?? ?// 登錄線程?
? ? HANDLE? ?? ?? ?? ?? ? m_hLoginOffThread;? ? // 注銷線程
? ? HANDLE? ?? ?? ?? ?? ? m_hSignInThread;? ?? ? // 簽到線程
? ? int? ?? ?? ?? ?? ?? ?? ???m_nLoginCount;? ?? ?? ???// 登錄次數(shù)
? ? CString? ?? ?? ?? ?? ? m_strUID;? ?? ?? ?? ?? ?? ?? ?// 會員UID
? ? CString? ?? ?? ?? ?? ? m_strUserName;? ?? ?? ? // 會員用戶名
? ? CString? ?? ?? ?? ?? ? m_strPassWord;? ?? ?? ???// 會員密碼
? ? CString? ?? ?? ?? ?? ? m_strErrMsg;? ?? ?? ?? ?? ?// 錯誤消息
? ? CTrayIcon? ?? ?? ?? ?m_TrayIcon;? ?? ?? ?? ?? ? // 托盤圖標
? ? LRESULT OnTrayNotification(WPARAM wParam,LPARAM lParam);// 任務(wù)欄菜單消息回調(diào)函數(shù)
? ? // ......
} 復(fù)制代碼
OK,大家可以看到代碼量并不多!具體也規(guī)劃好了,有興趣的可以自已參考一下編寫試試!
當前版本:V1.0
更新內(nèi)容:
1、增加手動回貼/定時回貼的功能,手動可回復(fù)論壇任意貼子,自動回貼僅僅tid=16196.
2、增加保存/加載上次成功登錄的用戶密碼的功能.
當前版本:V2.0
更新內(nèi)容:
1、修復(fù)登錄及回貼相關(guān)數(shù)據(jù)包
2、修復(fù)CPU跑高的線程定時器代碼
利用WinInet + MFC編寫,現(xiàn)在主要講解一下原理:
備注信息: 論壇測試賬號(username: cctry_good / uid: 22983),以下內(nèi)容經(jīng)Syc老大允許后才得以修改更正!
(可以用來掛論壇的在線時間!)
運行主界面:
簽到提示:
回復(fù)貼子:
1、論壇WEB程序相關(guān)知識:
? ?? A、MFC如何提交表單:
? ? 這個之前在也有兩貼子(含源碼)介紹了利用WinInet如何模擬WEB提交表單,有興趣的可以看看!
? ?? VC POST表單模擬登錄新浪郵箱 ? ?? 利用WinInet查詢考生信息
? ? B、論壇WEB程序必備:
? ? username??用戶名
? ? uid? ?? ?? ?? ?用戶名對應(yīng)的唯一標示ID
? ? formhash??登錄后唯一標示
? ?? Omnipeek ?網(wǎng)絡(luò)抓包工具
? ?? Fiddler2 ? ???Web調(diào)試工具 (推薦)
? ? C、會員信息獲取辦法:
? ? 這里就用到了uid,當然你也可以換成 username-cctry_good 其實發(fā)現(xiàn)也可以!
? ? 當然如果你是 正則表達式 方面的大師,取這個頁中的數(shù)據(jù)就容易多了!反之,如果不熟悉正則的童鞋,你可以使用CString::Find、Mid等函數(shù)來獲取。
? ? 個人空間的頁面如下:
? ???(1)? http://www.cctry.com/space-uid-22983.html ?
? ???(2)? http://www.cctry.com/home-space-uid-22983-do-profile.html
2、WEB數(shù)據(jù)描述:
? ? 關(guān)于 HTTP協(xié)議 ,我也不想多做解釋,說簡單一點,就是 本機事先組織一串有規(guī)律的Buffer通過系統(tǒng)網(wǎng)絡(luò)模塊,提交給WEB后臺的IIS程序,然后IIS來解析這段HTTP數(shù)據(jù)包,再返回一個Buffer給你(一般這個Buffer[即網(wǎng)頁源碼],由IE等瀏覽器來解析成網(wǎng)頁),然后就完成了一次通信 。下面這些都是由抓包工具得來:
? ?? A、登錄數(shù)據(jù)包格式:
? ?? B、退出論壇與清除痕跡的數(shù)據(jù)包格式:
? ?? ?? ?這里要提到的是formhash后面的一個字符串,我對WEB編程不了解,沒法用專業(yè)的術(shù)語來形容,在此就這樣描述吧:它是論壇會員登錄后唯一的標示,以后退出、簽到、發(fā)貼等等操作會用到它。
通過讀取論壇首頁,即可獲取到formhash值:
? ?? ?? ?以下為簽到時的數(shù)據(jù)包格式,后面會用到formhash,及其他表單選項:
? ? 這里之所以不放Src,主要有兩方面: 防止論壇水貼泛濫影響氣氛 、根據(jù)以上筆記自行編寫來同時 提高童鞋們動手能力 !
? ? OK,回正題吧!下面為部分代碼,僅供參考:
A、全局變量:
當前版本:V1.0
更新內(nèi)容:
1、增加手動回貼/定時回貼的功能,手動可回復(fù)論壇任意貼子,自動回貼僅僅tid=16196.
2、增加保存/加載上次成功登錄的用戶密碼的功能.
當前版本:V2.0
更新內(nèi)容:
1、修復(fù)登錄及回貼相關(guān)數(shù)據(jù)包
2、修復(fù)CPU跑高的線程定時器代碼
總結(jié)
以上是生活随笔為你收集整理的WinInet + MFC 写vc驿站助手的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS7 UUID唯一标识
- 下一篇: ALSA子系统(七)------simp