我用httpwebrequest写过登陆没有验证码的网站,不知道有验证码的网站是否会有些不同。登陆不成功。
下面是我写的代码,请大神们指教,谢谢!using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Web;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml;
namespace JiuXian
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
XmlDoc.Load("option.xml");
OptionInfo info=GetOptionInfo(XmlDoc);
userText.Text=info.user;
pswText.Text=info.psw;
urlText.Text=info.url;
intervalUpDown.Value=info.interval;
priceUpDown.Value=info.price;
string url=OpenLoginPage();
VerificationImg.Image=GetVerification(url);
}
XmlDocument XmlDoc=new XmlDocument();
Encoding UTF8=Encoding.UTF8;
Encoding GB2312=Encoding.GetEncoding("gb2312");
CookieContainer cookies=new CookieContainer();
void LoginBtnClick(object sender, EventArgs e)
{
Login(userText.Text,pswText.Text,VerificationText.Text);
OptionInfo info=new OptionInfo();
info.user=userText.Text;
info.psw=pswText.Text;
info.interval=intervalUpDown.Value;
info.price=priceUpDown.Value;
info.url=urlText.Text;
SaveOption(XmlDoc,info);
}
/// <summary>
/// 打开登陆页面
/// </summary>
/// <returns>返回验证码URL</returns>
string OpenLoginPage(){
HttpWebRequest request=WebRequest.Create("http://www.jiuxian.com/user.php?act=login") as HttpWebRequest;
request.Method="GET";
request.UserAgent="Mozilla/4.0";
request.Accept="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.KeepAlive=true;
request.CookieContainer=cookies;
HttpWebResponse response=request.GetResponse() as HttpWebResponse;
Stream stream=response.GetResponseStream();
StreamReader reader=new StreamReader(stream,UTF8);
string html=reader.ReadToEnd();
reader.Close();
stream.Close();
Regex regex=new Regex("captcha.php\\?is_login=1&[0-9]+");
return regex.Match(html).Value;
}
/// <summary>
/// 获取验证码
/// </summary>
/// <returns>返回验证码图片</returns>
Image GetVerification(){
Random random=new Random();
int count=random.Next(16,20);
string r=GetRamdom(count);
HttpWebRequest request=WebRequest.Create("http://www.jiuxian.com/captcha.php?is_login=1&"+r) as HttpWebRequest;
request.Method="GET";
request.UserAgent="Mozilla/4.0";
request.KeepAlive=true;
request.Accept="*/*";
request.CookieContainer=cookies;
request.Referer="http://www.jiuxian.com/user.php?act=login";
HttpWebResponse response=request.GetResponse() as HttpWebResponse;
Stream stream=response.GetResponseStream();
Image img=new Bitmap(stream);
stream.Close();
return img;
}
/// <summary>
/// 获取验证码
/// </summary>
/// <param name="url">验证码URL</param>
/// <returns>返回验证码图片</returns>
Image GetVerification(string url){
HttpWebRequest request=WebRequest.Create("http://www.jiuxian.com/"+url) as HttpWebRequest;
request.Method="GET";
request.UserAgent="Mozilla/4.0";
request.KeepAlive=true;
request.Accept="*/*";
request.CookieContainer=cookies;
request.Referer="http://www.jiuxian.com/user.php?act=login";
HttpWebResponse response=request.GetResponse() as HttpWebResponse;
Stream stream=response.GetResponseStream();
Image img=new Bitmap(stream);
stream.Close();
return img;
}
/// <summary>
/// 获取指定小数位数的随机小数
/// </summary>
/// <param name="count">小数位数</param>
/// <returns>返回一个字符串形式的小数</returns>
string GetRamdom(int count){
Random random=new Random();
string str=".";
for(int i=0;i<count;i++){
str+=random.Next(0,10);
}
return str;
}
/// <summary>
/// 登陆
/// </summary>
/// <param name="user">用户名</param>
/// <param name="psw">密码</param>
/// <param name="Verification">验证码</param>
/// <returns>返回登陆后的HTML代码</returns>
string Login(string user,string psw,string verification){
HttpWebRequest request=WebRequest.Create("http://www.jiuxian.com/user.php") as HttpWebRequest;
request.Method="POST";
request.CookieContainer=cookies;
request.UserAgent="Mozilla/4.0";
request.Accept="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.Referer="http://www.jiuxian.com/user.php?act=login";
string text="username={0}&password={1}&captcha={2}&act=act_login&back_act=http%3A%2F%2Fwww.jiuxian.com%2Findex.php&submit.x=24&submit.y=15";
string formatText=string.Format(text,user,psw,verification);
byte[] buffer=Encoding.ASCII.GetBytes(formatText);
Stream stream=request.GetRequestStream();
stream.Write(buffer,0,buffer.Length);
stream.Close();
HttpWebResponse response=request.GetResponse() as HttpWebResponse;
stream=response.GetResponseStream();
StreamReader reader=new StreamReader(stream,UTF8);
string html=reader.ReadToEnd();
reader.Close();
stream.Close();
// AcceptPage("http://www.jiuxian.com/user.php");
return html;
}
string AcceptPage(string url){
HttpWebRequest request=WebRequest.Create(url) as HttpWebRequest;
request.Method="GET";
request.CookieContainer=cookies;
HttpWebResponse response=request.GetResponse() as HttpWebResponse;
Stream stream=response.GetResponseStream();
StreamReader reader=new StreamReader(stream,UTF8);
string html=reader.ReadToEnd();
reader.Close();
stream.Close();
return html;
}
/// <summary>
/// 获取设置信息
/// </summary>
/// <param name="URL">存储设置信息的xml文档</param>
/// <returns>返回OptionInfo结构体</returns>
OptionInfo GetOptionInfo(XmlDocument doc){
OptionInfo info=new OptionInfo();
info.user=doc["root"]["user"].InnerText;
info.psw=doc["root"]["psw"].InnerText;
info.interval=Convert.ToInt32(doc["root"]["interval"].InnerText);
info.price=Convert.ToDecimal(doc["root"]["price"].InnerText);
info.url=doc["root"]["url"].InnerText;
return info;
}
/// <summary>
/// 保存设置信息
/// </summary>
/// <param name="doc">保存到的xml文档</param>
/// <param name="info">新的设置信息</param>
void SaveOption(XmlDocument doc,OptionInfo info){
doc["root"]["user"].InnerText=info.user;
doc["root"]["psw"].InnerText=info.psw;
doc["root"]["interval"].InnerText=info.interval.ToString();
doc["root"]["price"].InnerText=info.price.ToString();
doc["root"]["url"].InnerText=info.url;
doc.Save("option.xml");
}
/// <summary>
/// 设置信息的结构体
/// </summary>
public struct OptionInfo{
/// <summary>
/// 用户名
/// </summary>
public string user;
/// <summary>
/// 密码
/// </summary>
public string psw;
/// <summary>
/// 刷新频率
/// </summary>
public decimal interval;
/// <summary>
/// 价格小于
/// </summary>
public decimal price;
/// <summary>
/// 产品网址
/// </summary>
public string url;
}

void VerificationImgClick(object sender, EventArgs e)
{
VerificationImg.Image=GetVerification();
}
}
}