C#使用Socket登陆WordPress源码

  C#使用Socket登陆WordPress源码

  1 class loginwp

  2 {

  3 public string PostData(string postURL, string postString, string encoding)

  4 {

  5 string strHTML = "";//用来保存获得的HTML代码

  6 Uri URI = new Uri(postURL);

  7 string sendString;

  8 sendString = "POST {0} HTTP/1.1\r\n";

  9 sendString += "Host: {1}\r\n";

  10 sendString += "User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.0\r\n";

  11 sendString += "Content-Type:application/x-www-form-urlencoded\r\n";

  12 sendString += "Content-Length:{2}\r\n";

  13 sendString += "Connection:close\r\n";

  14 sendString += "Cookie:wordpress_test_cookie=WP+Cookie+check\r\n\r\n";

  15 sendString += "{3}\r\n";

  16 sendString = string.Format(sendString, URI.PathAndQuery, URI.Host, postString.Length, postString);

  17 Byte[] ByteGet = Encoding.GetEncoding(encoding)。GetBytes(sendString);

  18 IPAddress hostadd = Dns.GetHostEntry(URI.Host)。AddressList[0];

  19 IPEndPoint EPhost = new IPEndPoint(hostadd, 80);

  20 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

  21 s.Connect(EPhost);

  22 if (!s.Connected)

  23 {

  24 strHTML = "链接主机失败";

  25 }

  26 s.Send(ByteGet, ByteGet.Length, SocketFlags.None);

  27 strHTML = Recv(s, Encoding.GetEncoding(encoding));

  28 return strHTML;

  29 }

  30

  31 public static String Recv(Socket sock, Encoding encode)

  32 {

  33 Byte[] buffer = new Byte[1024];

  34 StringBuilder sb = new StringBuilder();

  35

  36 Thread.Sleep(50);//根据页面响应时间进行微调

  37 Int32 len = sock.Receive(buffer);

  38 sb.Append(encode.GetString(buffer, 0, len));

  39

  40 while (sock.Available > 0)

  41 {

  42 Thread.Sleep(300);//也可以视情况微调

  43 Array.Clear(buffer, 0, buffer.Length);

  44 len = sock.Receive(buffer);

  45 sb.Append(encode.GetString(buffer, 0, len));

  46 string ss = encode.GetString(buffer, 0, len);

  47 }

  48 sock.Close();

  49 return sb.ToString();

  50 }

  51

  52 /// <summary>

  53 /// 从返回的源代码中提取cookies 以及301或302跳转

  54 /// </summary>

  55 /// <param name="s"></param>

  56 /// <param name="location"></param>

  57 /// <returns></returns>

  58 public string GetCookies(string html, out string location)

  59 {

  60 StringBuilder sbCookies = new StringBuilder();

  61 location = string.Empty;

  62 string[] arr = html.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

  63 foreach (string str in arr)

  64 {

  65 if (str.StartsWith("Set-Cookie: "))

  66 {

  67 int intStart = str.IndexOf(";");

  68 string strCookie = str.Substring(12, intStart - 11);

  69 sbCookies.Append(strCookie);

  70 }

  71 if (str.StartsWith("Location:"))

  72 {

  73 location = str.Substring(10);

  74 }

  75 }

  76 return sbCookies.ToString();

  77 }

  78

  79 /// <summary>

  80 /// 带上cookies 获取需要登录验证的页面

  81 /// </summary>

  82 /// <param name="url">请求的URL</param>

  83 /// <param name="cookies">cookies字符串</param>

  84 /// <param name="encoding">页面编码</param>

  85 /// <returns></returns>

  86 public string GetPage(string url, string cookies, string encoding)

  87 {

  88 Uri URI = new Uri(url);

  89 string strHTML = string.Empty;//用来保存获得的HTML代码

  90 IPHostEntry gist = Dns.GetHostEntry(URI.Host);//获得当前url的ip地址

  91 IPAddress ip = gist.AddressList[0];//提取IP地址 www.yztrans.com

  92 IPEndPoint ipEnd = new IPEndPoint(ip, 80);//封装IP地址和端口

  93 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//实例化Stock

  94 try

  95 {

  96 socket.Connect(ipEnd);

  97 }//自动循环捕捉连接

  98 catch

  99 { }

  100 string sendString = "GET " + URI.PathAndQuery + " HTTP/1.1\r\n";

  101 sendString += "Connection:close\r\n";

  102 sendString += "Content-Type: application/x-www-form-urlencoded\r\n";

  103 sendString += "Host:" + URI.Host + "\r\n";

  104 if (!string.IsNullOrEmpty(cookies))

  105 sendString += "Cookie:" + cookies + "\r\n\r\n";

  106 byte[] ms = UTF8Encoding.GetEncoding(encoding)。GetBytes(sendString);//将头部转换成byte形式

  107 socket.Send(ms);//发送 www.lefeng123.com

  108 int recv = -1;//定义接受数据长度

  109 byte[] data = new byte[1024];//用来保存接收数据

  110 do

  111 {

  112 recv = socket.Receive(data);

  113 strHTML += Encoding.GetEncoding(encoding)。GetString(data, 0, recv);

  114 } while (recv != 0);

  115 return strHTML;

  116 }

  117 }
 

posted on 2014-02-15 12:06  haosola  阅读(296)  评论(0编辑  收藏  举报

toeflacttoeflieltstoefltoeflact