WinInet + MFC 写vc驿站助手

春节期间,花了好几天的功夫编码与测试,才算勉强release......

利用WinInet + MFC编写,现在主要讲解一下原理:

备注信息: 论坛测试账号(username: cctry_good / uid: 22983),以下内容经Syc老大允许后才得以修改更正!

(可以用来挂论坛的在线时间!)

运行主界面:


签到提示:


回复贴子:





1、论坛WEB程序相关知识:

     A、MFC如何提交表单:
    这个之前在也有两贴子(含源码)介绍了利用WinInet如何模拟WEB提交表单,有兴趣的可以看看!
     VC POST表单模拟登录新浪邮箱      利用WinInet查询考生信息

    B、论坛WEB程序必备:
    username  用户名
    uid            用户名对应的唯一标示ID
    formhash  登录后唯一标示
     Omnipeek  网络抓包工具
     Fiddler2      Web调试工具 (推荐)

    C、会员信息获取办法:
    这里就用到了uid,当然你也可以换成 username-cctry_good 其实发现也可以!

    当然如果你是 正则表达式 方面的大师,取这个页中的数据就容易多了!反之,如果不熟悉正则的童鞋,你可以使用CString::Find、Mid等函数来获取。

    个人空间的页面如下:
     (1)  http://www.cctry.com/space-uid-22983.html  
     (2)  http://www.cctry.com/home-space-uid-22983-do-profile.html

2、WEB数据描述:

    关于 HTTP协议 ,我也不想多做解释,说简单一点,就是 本机事先组织一串有规律的Buffer通过系统网络模块,提交给WEB后台的IIS程序,然后IIS来解析这段HTTP数据包,再返回一个Buffer给你(一般这个Buffer[即网页源码],由IE等浏览器来解析成网页),然后就完成了一次通信 。下面这些都是由抓包工具得来:

     A、登录数据包格式:
  1. POST /member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&inajax=1 HTTP/1.1
  2. Content-Type: application/x-www-form-urlencoded
  3. User-Agent: Test
  4. Host: www.cctry.com
  5. Content-Length: 105
  6. Pragma: no-cache

  7. username=cctry_good&cookietime=2592000&password=123456&quickforward=yes&handlekey=ls&questionid=0&answer=
复制代码
“User-Agent” 就是 CInternetSession构造函数的第一个参数,默认为空(即为工程名)。

     B、退出论坛与清除痕迹的数据包格式:
         这里要提到的是formhash后面的一个字符串,我对WEB编程不了解,没法用专业的术语来形容,在此就这样描述吧:它是论坛会员登录后唯一的标示,以后退出、签到、发贴等等操作会用到它。

通过读取论坛首页,即可获取到formhash值:
  1. GET /forum.php HTTP/1.1
  2. User-Agent: Test
  3. Host: www.cctry.com
复制代码
退出论坛的数据包格式:
  1. GET /member-logging-action-logout-formhash-e9c11601.html HTTP/1.1
  2. User-Agent: Test
  3. Host: www.cctry.com
复制代码
清除痕迹的数据包格式:
  1. GET /member-clearcookies-formhash-e9c11601.html HTTP/1.1
  2. User-Agent: Test
  3. Host: www.cctry.com
复制代码
C、签到的数据包格式:
         以下为签到时的数据包格式,后面会用到formhash,及其他表单选项:
  1. POST/plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1&inajax=1 HTTP/1.1
  2. Content-Type: application/x-www-form-urlencoded
  3. User-Agent: Test
  4. Host: www.cctry.com
  5. Content-Length: 103
  6. Pragma: no-cache

  7. formhash=e9c11601&qdxq=kx&qdmode=1&todaysay=Hello+World+%21+By+%E6%E4%D5%BE%D6%FA%CA%D6v1.0&fastreply=1
复制代码
3、部分代码

    这里之所以不放Src,主要有两方面: 防止论坛水贴泛滥影响气氛 、根据以上笔记自行编写来同时 提高童鞋们动手能力

    OK,回正题吧!下面为部分代码,仅供参考:

A、全局变量:
  1. //
  2. // 用户权限 (这里根据用户组的ID来显示用户组,因为刚那是数组下标)
  3. const TCHAR *g_szGroupInfo[] = {
  4.         _T("无"),_T("管理员"),_T("超级版主"),_T("版主"),_T("禁止发言"),                          // 0-4
  5.         _T("禁止访问"),_T("禁止IP"),_T("游客"),_T("等待验证会员"),_T("乞丐"),                // 5-9
  6.         _T("新手上路"),_T("注册会员"),_T("中级会员"),_T("高级会员"),_T("金牌会员"),      // 10-14
  7.         _T("论坛元老"),_T("普通会员"),_T("银牌会员"),_T("铜牌会员")};                           // 15-18

  8. //
  9. // 线程同步
  10. CMutex g_Mutex;

  11. //
  12. // 模拟访问贴子ID
  13. int                g_nUID = 1;

  14. //
  15. // 宏定义
  16. #define TIMER_LEN        (60000 * 5)                // 5分钟刷新一次
  17. #define MAX_UID           14911                      // 最大贴子数量        
复制代码
B、其他数据类型、宏定义:
  1. //
  2. // 登录结果
  3. enum EnumResult
  4. {
  5.         ER_LOGIN_FAILED     = 0,        // 登录失败
  6.         ER_LOGIN_SUCCESS  = 1,        // 登录成功
  7.         ER_FIFTEEN_LATER    = 2,        // 15分钟后再试
  8.         ER_NETWORK_ERR    = 3,        // 其他网络错误
  9.         ER_NULL                   = 0xFF   // 无
  10. };

  11. #define WM_ICON_NOTIFY  WM_USER+10        // 托盘消息
复制代码
C、主窗口类的成员变量与成员函数:
  1. class CTestDlg : public CDialog
  2. {
  3. // Construction
  4. public:
  5.     CTestDlg(CWnd* pParent = NULL);    // standard constructor

  6.     // 以下函数用途:登录、注销、重新登录.
  7.     EnumResult    LoginServer(CString    strUser,CString strPass,CString & strErrMsg/* = _T("")*/);
  8.     void        LoginOff();
  9.     void        ReLogin();

  10.     // 以下函数用途:获取hash、遍历访问贴子、清空用户信息.
  11.     CString        GetFormHash();
  12.     BOOL        InitFromHomePage();
  13.     void        ClearInfo(CString strMsg = _T("--"));

  14.     //  以下函数用途:获取用户基本信息、在线时间、签到.
  15.     BOOL        GetUserInfo(CString strName);
  16.     BOOL        GetGroupANDTime(CString    strName);
  17.     BOOL        MemberSignIn();

  18.     // 以下函数用途:分别启动遍历贴子以提高在线时间、
  19.     //               登录、注销、签到线程.
  20.     //               <设置高优先级,线程同步处理>
  21.     void    StartThreadGetInfo();
  22.     void    StartLoginThread();
  23.     void    StartLoginOffThread();
  24.     void    StartSignInThread();

  25.     // 以下函数用途:对应上面四个线程的实线
  26.     static DWORD WINAPI ThreadToGetInfo(LPVOID);
  27.     static DWORD WINAPI ThreadToLogin(LPVOID);
  28.     static DWORD WINAPI ThreadToLoginOff(LPVOID);
  29.     static DWORD WINAPI ThreadToSignIn(LPVOID);

  30. public:
  31.     CInternetSession*     m_pSession;
  32.     CHttpConnection*    m_pConnection;
  33.     CHttpFile*                m_pFile;

  34.     HANDLE                m_hInitHomePage;      // 定时器线程 —— 刷新在线时间
  35.     HANDLE                m_hLoginThread;         // 登录线程 
  36.     HANDLE                m_hLoginOffThread;    // 注销线程
  37.     HANDLE                m_hSignInThread;       // 签到线程

  38.     int                       m_nLoginCount;           // 登录次数
  39.     CString                m_strUID;                     // 会员UID
  40.     CString                m_strUserName;          // 会员用户名
  41.     CString                m_strPassWord;           // 会员密码
  42.     CString                m_strErrMsg;               // 错误消息
  43.     CTrayIcon            m_TrayIcon;                // 托盘图标

  44.     LRESULT OnTrayNotification(WPARAM wParam,LPARAM lParam);// 任务栏菜单消息回调函数
  45.     // ......
  46. }
复制代码
OK,大家可以看到代码量并不多!具体也规划好了,有兴趣的可以自已参考一下编写试试!

当前版本:V1.0
更新内容:
1、增加手动回贴/定时回贴的功能,手动可回复论坛任意贴子,自动回贴仅仅tid=16196.
2、增加保存/加载上次成功登录的用户密码的功能.

当前版本:V2.0
更新内容:
1、修复登录及回贴相关数据包
2、修复CPU跑高的线程定时器代码
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC(Microsoft Foundation Class)是一个C++类库,用于在Windows操作系统上开发图形用户界面(GUI)应用程序。爬虫是一种程序,用于自动化地获取Web页面上的信息。在MFC中编一个简单的爬虫,可以使用WinINet API来访问Web页面。 以下是一个简单的MFC爬虫程序,它使用WinINet API来获取Web页面的HTML代码,并在控制台窗口中显示: ```cpp #include <afxinet.h> #include <iostream> int main() { CInternetSession internetSession; CHttpFile* httpFile = nullptr; try { httpFile = (CHttpFile*)internetSession.OpenURL(_T("https://www.example.com")); } catch (CInternetException* e) { std::cout << "Failed to open URL: " << e->m_dwError << std::endl; e->Delete(); return 1; } CString htmlCode; CString line; while (httpFile->ReadString(line)) { htmlCode += line; } std::cout << "HTML code:\n" << htmlCode << std::endl; internetSession.Close(); httpFile->Close(); return 0; } ``` 在上面的例子中,我们使用了 `CInternetSession` 类来创建一个Internet会话对象。然后,我们使用 `OpenURL()` 方法打开一个URL,并将返回的 `CHttpFile` 对象转换为指向 `CHttpFile` 类的指针。接下来,我们使用 `ReadString()` 方法从 `CHttpFile` 对象中读取每一行HTML代码,并将其添加到 `htmlCode` 字符串中。最后,我们在控制台窗口中显示获取到的HTML代码,并关闭Internet会话和 `CHttpFile` 对象。 需要注意的是,这只是一个简单的示例程序,不能处理所有的Web页面。对于更复杂的爬虫功能,您可能需要使用其他开源C++库,例如libcurl或Boost.Beast。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值