|
沙发
楼主 |
发表于 2013-8-1 00:01:58
|
只看该作者
@站长苏飞
[code=csharp]using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DotNet.Utilities;
using System.Text.RegularExpressions;
namespace 论坛登录发帖
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/*
*
* 因刚学没几天,技术有限,一些功能还未实现
*
* 如果测试不成功,请重新抓包, 只需要 cookie的 WuXn_2132_saltkey和WuXn_2132_auth
*
* 各处url可能也需要更改,还有post的一些数据
*
* 测试本地论坛可以成功,但是换论坛之后出现cookie不能抓取 原因WuXn_2132_saltkey 前边的WuXn会发生改变不知道原因
*
* post的数据串是否会改变未测试,验证码部分因为找不到验证码地址没有添加,正在研究中
*
* 一些细节问题还需要处理,总体登陆流程大概就是这样 应该是...
*
*
* BY:受人之渔,还人之鱼!
*
* 论坛账号 QQ 970443232 一起交流!
*
*/
//cookie的值方便调用
string cookie = "";
//发帖时所需要的formhash值
string strFormHash = "";
private void btnLogin_Click(object sender, EventArgs e)
{
//上边工作都完成以后 这里就简单了 这里拼接连接字符串
string url = txtUrl.Text.Trim() + "member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1";
//有些参数可以用户设置,这里只是练习使用方法
string[] str = PostGetHtml(url, txtCoding.Text.Trim(), "post", "",
"fastloginfield=username&username=" + txtUserName.Text.Trim() + "&password=" + txtPassWord.Text.Trim() + "&quickforward=yes&handlekey=ls",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
"application/x-www-form-urlencoded");
//取出cookie的值
cookie = "WuXn_2132_saltkey=" + HttpCookieHelper.GetCookieValue("WuXn_2132_saltkey", str[1]) +
"; WuXn_2132_auth=" + HttpCookieHelper.GetCookieValue("WuXn_2132_auth", str[1]);
//取出html判断登陆是否成功
string html = str[0];
if (Regex.IsMatch(html, @"<root>"))
{
gbLogin.Text = "账号登录----登陆成功";
}
else
{
gbLogin.Text = "账号登录----登陆失败";
}
//get一次 取出formhash 登陆之后的代码没有
HttpHelper http = new HttpHelper();
HttpItem item = new HttpItem()
{
// 这里代码还可以精简 url使用的是个人短消息页面
URL = txtUrl.Text.Trim() + "home.php?mod=space&do=pm",//URL 必需项
Encoding = System.Text.Encoding.GetEncoding(txtCoding.Text.Trim()),//URL 可选项 默认为Get
Method = "get",//URL 可选项 默认为Get
Cookie = cookie,//字符串Cookie 可选项
Timeout = 100000,//连接超时时间 可选项默认为100000
ReadWriteTimeout = 30000,//写入Post数据超时时间 可选项默认为30000
UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",//用户的浏览器类型,版本,操作系统 可选项有默认值
ContentType = "application/x-www-form-urlencoded",//返回类型 可选项有默认值
};
HttpResult result = http.GetHtml(item);
//得到html
string strhtml = result.Html;
//正则提取 formhash 值 这段代码是网上复制的 可以调试看过程
Regex reg = new Regex("out&formhash=(.*)\"");//out&formhash=(.*)\">" (.*)中的值是需要的
MatchCollection mts = reg.Matches(strhtml);
foreach (Match itemformhash in mts)
{
//this.txtID.Text += item.Value.Replace("\"", "");
string lines = itemformhash.Value.Replace("\"", "");
string[] strs = lines.Split('=');
strFormHash = strs[1];
}
}
private void btnFaTie_Click(object sender, EventArgs e)
{
//上边工作都完成以后 这里就简单了 这里拼接连接字符串
string url = txtUrl.Text.Trim()+"forum.php?mod=post&action=newthread&fid="+txtId.Text.Trim()+"&extra=&topicsubmit=yes";
//拼接Post内容
string strPost = "formhash=" + strFormHash + "&posttime=1375173832&wysiwyg=1&subject=" + txtBiaoTi.Text + "&message=" + txtNeiRong.Text + "&save=&usesig=1&allownoticeauthor=1";
//使用方法进行操作
PostGetHtml(url, txtCoding.Text.Trim(), "post", cookie,strPost,
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
"application/x-www-form-urlencoded");
//发帖完毕 get发帖板块 查找是否发帖成功
//拼接url地址
url =txtUrl.Text.Trim()+"forum.php?mod=forumdisplay&fid="+txtId.Text.Trim();
string strHtml= GetHtml(url, txtCoding.Text.Trim(), cookie);
if (Regex.IsMatch(strHtml, txtBiaoTi.Text.Trim()))
{
label7.Text = "发布成功";
}
else
{
label7.Text = "发布失败";
}
}
/// <summary>
/// post get 方法 string数组[0]=thml,[1]=cookie
/// </summary>
/// <param name="url">传入一个url</param>
/// <param name="encoding">传入的编码</param>
/// <param name="method"> post或get方式</param>
/// <param name="cookie">传入的cookie值 可选登陆可以传入空</param>
/// <param name="postData">发送的数据</param>
/// <param name="userAgent">浏览器 版本 操作系统 </param>
/// <param name="contenType">返回的类型</param>
/// <returns></returns>
private static string[] PostGetHtml(string url, string encoding, string method, string cookie,
string postData, string userAgent, string contenType)
{
HttpHelper http = new HttpHelper();
HttpItem item = new HttpItem()
{
//根据编程助手生成代码,编写一个方法,方便调用 减少代码量
URL = url,//Url 必须
Encoding = System.Text.Encoding.GetEncoding(encoding), // 数据传输编码 默认gbk 应该是未测试
Method = method,// 数据方式,可选项默认Get
Cookie = cookie,//字符串cookie 可选
Postdata = postData,//Post数据
//考虑到网络问题这里添加连接和Post写入事件 --
Timeout = 100000,//连接超时时间 可选项默认为100000
ReadWriteTimeout = 30000,//写入Post数据超时时间 可选项默认为30000
UserAgent = userAgent,//用户的浏览器类型,版本,操作系统 可选项有默认值 默认值未查看
ContentType = contenType,//返回类型 可选项有默认值 默认值未查看
};
HttpResult result = http.GetHtml(item);
//根据传入cookie是否有值,返回html或cookie加html(问题 如果随便传入一个cookie值,将会造成登陆失败,也会
//返回两个失败值)
if (cookie == "")
{
//如果是登陆则返回html和cookie方便使用
string[] strHtmlCookie = { result.Html, result.Cookie };
return strHtmlCookie;
}
else
{
// 如果不是登陆则返回html
string[] strHtmlCookie = { result.Html };
return strHtmlCookie;
}
}
private static string GetHtml(string url,string encoding, string cookie)
{
HttpHelper http = new HttpHelper();
HttpItem item = new HttpItem()
{
// 这里代码还可以精简 url使用的是个人短消息页面
URL = url,//URL 必需项
Encoding = System.Text.Encoding.GetEncoding(encoding),//URL 可选项 默认为Get
Method = "get",//URL 可选项 默认为Get
Cookie = cookie,//字符串Cookie 可选项
Timeout = 100000,//连接超时时间 可选项默认为100000
ReadWriteTimeout = 30000,//写入Post数据超时时间 可选项默认为30000
UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",//用户的浏览器类型,版本,操作系统 可选项有默认值
ContentType = "application/x-www-form-urlencoded",//返回类型 可选项有默认值
};
HttpResult result = http.GetHtml(item);
//得到html
return result.Html;
}
}
}
[/code]
|
|