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跑高的线程定时器代码
1、VC++编程环境介绍 ①、编程环境、编译器; ②、名词解释; ③、一个简单的MFC对话框工程; ④、个人认为在学习过程中可以看的不错书籍; ⑤、VC编译EXE在没装VC的电脑上运行出错问题解决! 2、ANSI与UNICODE ①、ANSI与UNICODE; ②、不同编码格式下的字符串处理及相互转化; ③、CString常用操作讲解。 3、模态对话框与非模态对话框 ①、模态与非模态对话框的创建; ②、新对话框的初始化工作; ③、两个对话框之间数据传递的几种方法。 4、对话框控件不同类型成员变量的绑定 ①、控件各种类型变量的绑定、最大值及最小值问题; ②、对话框数据交换与验证机制; ③、各种开源控件类的使用; ④、MFC与SDK API中同名函数问题。 5、VC中常用控件的用法讲解 ①、VC中常用控件的用法讲解见:http://www.cctry.com/thread-106-1-1.html ②、VS2008中新增控件的用法讲解。 6、定时器讲解 ①、定时器相关函数讲解:SetTimer、OnTimer、KillTimer; ②、利用定时器实现动态显示时间; ③、改变CStatic控件的文字颜色。 7、MFC对话框程序响应鼠标及键盘消息 ①、MFC对话框程序响应鼠标点击消息; ②、MFC对话框程序响应键盘按键消息; ③、MFC对话框程序响应组合键。 8、MFC对话框注册全局系统热键 9、控件自定义消息的响应: ①、响应按钮控件的右键消息; ②、响应Static控件的双击消息。 ③、自定义编辑框控件只读、颜色不变灰 10、再论“逃跑”按钮的实现 ①、MoveWindow、SetWindowPos、GetWindowRect函数讲解; ②、坐标系的变换。 11、通用对话框讲解 ①、文件选择对话框; ②、目录选择对话框; ③、让对话框程序支持拖拽。 12、菜单操作 ①、对话框程序添加菜单; ②、右键弹出式菜单; ③、菜单项的启用与禁用。 13、对话框的工具栏操作 ①、工具栏的创建; ②、工具栏按钮的响应。 14、对话框的状态栏操作 ①、状态栏的创建; ②、状态栏显示时钟、鼠标位置、鼠标点的颜色信息等。 15、一个简单计算器软件的编 ①、计算功能的实现; ②、剪贴板操作:将计算结果保存到剪贴板。 16、文件的基本操作之CFile[Ⅰ] ①、文件的创建、打开、关闭; ②、文件的读、何时读取完毕、读取一行数据; ③、文件指针位置的设置; ④、刷新缓存数据到文件; 17、文件的基本操作[Ⅱ] ①、文件的复制[适用于文件夹]; ②、文件的重命名或移动[适用于文件夹]; ③、文件的删除[只读属性]; 18、文件属性信息的获取与设置 ①、属性信息的获取:大小、时间、隐藏属性等; ②、属性信息的设置 [删除只读属性文件]; ③、判断文件是否存在以及是否为目录; 19、文件夹操作 ①、文件夹的创建与删除; ②、文件夹的属性信息的获取:时间、隐藏属性等; ③、文件夹大小的获取:遍历文件方法[下节课讲解]; 20、文件的遍历与查找小软件的编[包括文件的各种属性信息] 21、系统各种路径信息的获取 ①、Windows、System32、temp、桌面目录、我的文档等目录的获取; ②、应用程序当前目录的获取与设置及存在的问题讲解; ③、可执行文件所在目录[包括EXE和DLL]; ④、工程当前目录与Debug调试目录的不同。 22、系统信息的获取 ①、当前用户名称、计算机名称的获取; ②、CPU、内存、硬盘信息的获取。 23、进程的相关操作 ①、进程创建的三种方法及CreateProcess参数存在的问题; ②、进程的结束; 进程的枚举 一个简单任务管理器的实现 MFC中动态数组、动态链表、映射表的讲解 ClistCtrl 的自绘操作!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值