![4ee829358494d6033b8e066ce1220efc.png](https://i-blog.csdnimg.cn/blog_migrate/63cb93d0c8292813d19f439e01c47610.jpeg)
文章简介
WordPress是现在最受欢迎的博客系统。通过WordPress再配合模板,可以搭建出各式各样的网站。"断刀流技术博客"就是使用WordPress进行搭建的。今天主要是要讲解一下,如何通过代码 实现一个WordPress 博客登陆器。
![aa7fca5dce37e0852e41f5a3f45d7358.png](https://i-blog.csdnimg.cn/blog_migrate/70629cf1611ef5a640b22f3c1a0232b6.jpeg)
抓取登录接口
为不侵害他人网站的权益,接下来的抓包以及登录;将用"断刀流技术博客"来进行演示。首先来到博客的登录界面,按F12调出控制台。随意输入一个账号和密码按登录按钮,就会抓取到一个向服务器以POST方式提交的数据包。
admin和admin888是随意添写的账号和密码,按照以下格式。只需要在 WordPress 博客登陆器 中,把账号和密码替换掉。在重新发送数据包就能实现登录了。
![d2d3ef8f273a44c4eac541f973f7de1a.png](https://i-blog.csdnimg.cn/blog_migrate/59cfbde7a33d6b0200a383643b980a84.jpeg)
WordPress 博客登陆器界面设置
首先在界面上把登录框设计出来,接着在给账户和密码输入框添加绑定俩个变量(m_User,m_Paswd)。
其中m_Cookie这个变量是用于存,登录后网站返回的Cookie。m_Http的Spider类型的变量有点特殊,是"断刀流"封装的一个类。
里面定义了很多的函数,主要是为了方便和网站传递和接收数据。(稍后会给大家打包)
(开发语言:C++ 界面库:MFC 编程工具:Visual Studio)
CEdit m_User;
CEdit m_Paswd;
string m_Cookie;
Spider m_Http;
![7d6355ef18c516eab24d5c138012c32b.png](https://i-blog.csdnimg.cn/blog_migrate/71cf90ec5d411181ce45f2bf43de6b34.jpeg)
给登录添加响应事件
双击Login这个按钮,Visual Studio会自动跳到代码界面,并且为你自动添加 按钮被单击 的消息处理函数。
在 OnBnClickedButton1()的消息处理函数中,添加如下的代码。这段代码 会首先获取 程序账号框和密码框的内容,然后在组装到要向网站提交的数据中。
最后对网站返回的响应头进行查找,通过查找后台特有字符来判断是否登录成功;如果登录成功就把网站返回的Cookie提取出来。完成这些步骤以后,就可以弹出一个提示框,告诉用户已经登录成功了。
void CWordPressLoginDlg::OnBnClickedButton1()
{
CString User, Paswd;
m_User.GetWindowTextW(User);
m_Paswd.GetWindowTextW(Paswd);
if (User.IsEmpty())
{
MessageBox(L"小子! 请输入账号后在尝试!", L"账号登录", MB_OK | MB_ICONASTERISK);
return;
} if (Paswd.IsEmpty())
{
MessageBox(L"小子! 请输入密码后在尝试!", L"账号登录", MB_OK | MB_ICONASTERISK);
return;
}
string CodeUser, CodePaswd, SendStr;
//转换成string
CodeUser = CW2A(User);
CodePaswd = CW2A(Paswd);
//UrlEncode编码
CodeUser = m_Http.UrlEncode(CodeUser);
CodePaswd = m_Http.UrlEncode(CodePaswd);
//组装要向网站提交的数据,把账号和密码替换成编辑框内容
SendStr = "log=" + CodeUser + "&pwd=" + CodePaswd + "&wp-submit=%E7%99%BB%E5%BD%95&redirect_to=http%3A%2F%2Faddcmd.com%2Fwp-admin%2F&testcookie=1";
CString strHead;
//POST方式提交到以下的地址
string Text = m_Http.PostRequest("http://addcmd.com/wp-login.php", SendStr);
//对返回的网页内容进行编码转换
CString ReturnText = m_Http.UTF82WCS(Text.c_str(), &strHead);
CString Cookie, Cookie1, Cookie2;
//查找响应头,是否还包含302状态码以及后台路径,如果存在说明登录成功
if (strHead.Find(_T("HTTP/1.1 302 Found")) != -1 && strHead.Find(_T("/wp-admin/")) != -1)
{
//提取Coolie
int begin = strHead.Find(_T("HttpOnly")) + strlen("HttpOnly");
strHead = strHead.Mid(begin);
Cookie1 = m_Http.GetTextMiddle(strHead, _T("Cookie: "), _T(";"));
strHead = strHead.Mid(strHead.Find(_T("wp-admin")));
Cookie2 = m_Http.GetTextMiddle(strHead, _T("Cookie: "), _T("; path"));
Cookie.Format(_T("Cookie: %s; %s"), Cookie1, Cookie2);
m_Cookie = CW2A(Cookie);
MessageBox(L"恭喜你登录成功!", L"账号登录", MB_OK | MB_ICONASTERISK);
}
else
{
MessageBox(L"账号或密码错误!", L"账号登录", MB_OK | MB_ICONASTERISK);
}
// TODO: 在此添加控件通知处理程序代码
}
效果演示
界面没有美化看着怪别扭的,为了提升一下图片的逼格。特意运行了一下,之前写的一个博客后台管理程序。代码都是一样的代码,可以看到输入正确的账号密码后提示登录成功,反之则登录失败。
通过返回的Cookie就可以进行后台的操作了,Cookie就好比是你登录成功的一个证明。(界面美化请看《MFC窗口美化之背景自绘》这篇文章)
![f35bf1a0a89ca549c356a625f4068898.png](https://i-blog.csdnimg.cn/blog_migrate/ca0896e0a2f43c0a30ae6d4701a1119f.jpeg)
请求头
之前抓到的包请求头都是很多参数的,为啥刚才在程序中提交数据时;都没看到请求头的踪影?难道只需要修改组装提交的数据就行了?
其实还是需要请求头的,不然网站服务器都识别不了提交过来的数据。
不知道你们还记不记得,在文章开头的时候;就定义了一个Spider类型的m_Http变量。因为像请求头之类的这些东西,都被我封装进去了。
需要访问网站时,只需要调用相关的函数就好了。(当然啦!有利就有弊,如果你想知道它的一个原理,那么就需要跟着代码一步一步走了)
![85d4cb78b6a55a2dc130014d4d3a5189.png](https://i-blog.csdnimg.cn/blog_migrate/138edb7706129f5db12a33977a2b230e.jpeg)
本来想在文章结尾,把 Spider 这个类的文件打包给你们的。但是刚才在写代码的时候,还发现存在许多的问题。
看类的名字Spider(蜘蛛),就知道是用来写爬虫的。没错之前就是用来写爬虫的,硬是被我糊改乱改硬生生改过来的。里面的代码非常的乱,不容易阅读和理解。
改天有时间在封装一个专门用于Http访问的类,到时候在给你们打包。