就在昨晚,在本屌丝刚刚发布屌丝与女神的回忆史《C#外挂QQ找茬辅助源码,早期开发》后,在苏飞大哥的技术讨论群有个群友提出一个问题。使用http协议模拟工具可以登录成功Wordpress但是自己写代码死活登陆不上。本人玩Wordpress已经很多年了,在很多年前还没有女神的时候就开始有开发Wordpress客户端的冲动。最终都不了了之。今天群友提出的问题让我重拾以前的那份冲动….说多了,言归正传
本屌最开始也是使用苏飞大哥写的Httphelper类。也是死活登陆不上,取不到登陆之后的Cookie值。最后就在想,为什么Fiddler里面看到的报文跟我发过去的都差不多而不行呢。可能是在访问的时候某些参数不正确吧,那我把发送过去的报文做成一模一样的应该没有问题吧。所以下面用到了Socket访问80端口的形式发送报文..(下载地址在最后)

使用Socket方式发送报文以及提取Cookie并访问网站的代码:

 class loginwp
{
public string PostData(string postURL, string postString, string encoding)
{
string strHTML = "";//用来保存获得的HTML代码
Uri URI = new Uri(postURL);
string sendString;
sendString = "POST {0} HTTP/1.1\r\n";
sendString += "Host: {1}\r\n";
sendString += "User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.0\r\n";
sendString += "Content-Type:application/x-www-form-urlencoded\r\n";
sendString += "Content-Length:{2}\r\n";
sendString += "Connection:close\r\n";
sendString += "Cookie:wordpress_test_cookie=WP+Cookie+check\r\n\r\n";
sendString += "{3}\r\n";
sendString = string.Format(sendString, URI.PathAndQuery, URI.Host, postString.Length, postString);
Byte[] ByteGet = Encoding.GetEncoding(encoding).GetBytes(sendString);
IPAddress hostadd = Dns.GetHostEntry(URI.Host).AddressList[];
IPEndPoint EPhost = new IPEndPoint(hostadd, );
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Connect(EPhost);
if (!s.Connected)
{
strHTML = "链接主机失败";
}
s.Send(ByteGet, ByteGet.Length, SocketFlags.None);
strHTML = Recv(s, Encoding.GetEncoding(encoding));
return strHTML;
} public static String Recv(Socket sock, Encoding encode)
{
Byte[] buffer = new Byte[];
StringBuilder sb = new StringBuilder(); Thread.Sleep();//根据页面响应时间进行微调
Int32 len = sock.Receive(buffer);
sb.Append(encode.GetString(buffer, , len)); while (sock.Available > )
{
Thread.Sleep();//也可以视情况微调
Array.Clear(buffer, , buffer.Length);
len = sock.Receive(buffer);
sb.Append(encode.GetString(buffer, , len));
string ss = encode.GetString(buffer, , len);
}
sock.Close();
return sb.ToString();
} /// <summary>
/// 从返回的源代码中提取cookies 以及301或302跳转
/// </summary>
/// <param name="s"></param>
/// <param name="location"></param>
/// <returns></returns>
public string GetCookies(string html, out string location)
{
StringBuilder sbCookies = new StringBuilder();
location = string.Empty;
string[] arr = html.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
foreach (string str in arr)
{
if (str.StartsWith("Set-Cookie: "))
{
int intStart = str.IndexOf(";");
string strCookie = str.Substring(, intStart - );
sbCookies.Append(strCookie);
}
if (str.StartsWith("Location:"))
{
location = str.Substring();
}
}
return sbCookies.ToString();
} /// <summary>
/// 带上cookies 获取需要登录验证的页面
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="cookies">cookies字符串</param>
/// <param name="encoding">页面编码</param>
/// <returns></returns>
public string GetPage(string url, string cookies, string encoding)
{
Uri URI = new Uri(url);
string strHTML = string.Empty;//用来保存获得的HTML代码
IPHostEntry gist = Dns.GetHostEntry(URI.Host);//获得当前url的ip地址
IPAddress ip = gist.AddressList[];//提取IP地址
IPEndPoint ipEnd = new IPEndPoint(ip, );//封装IP地址和端口
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//实例化Stock
try
{
socket.Connect(ipEnd);
}//自动循环捕捉连接
catch
{ }
string sendString = "GET " + URI.PathAndQuery + " HTTP/1.1\r\n";
sendString += "Connection:close\r\n";
sendString += "Content-Type: application/x-www-form-urlencoded\r\n";
sendString += "Host:" + URI.Host + "\r\n";
if (!string.IsNullOrEmpty(cookies))
sendString += "Cookie:" + cookies + "\r\n\r\n";
byte[] ms = UTF8Encoding.GetEncoding(encoding).GetBytes(sendString);//将头部转换成byte形式
socket.Send(ms);//发送
int recv = -;//定义接受数据长度
byte[] data = new byte[];//用来保存接收数据
do
{
recv = socket.Receive(data);
strHTML += Encoding.GetEncoding(encoding).GetString(data, , recv);
} while (recv != );
return strHTML;
}
}

最后放上Demo:C#使用Socket登陆Wordpress.zip

本文来自放肆雷特 | 胖子的技术博客 欢迎关注胖子的新浪博客@大胖子蜀黍

C#使用Socket登陆WordPress源码的更多相关文章

  1. python_way day10 python和其他语言的作用域 、 python2.7多继承和3.5多继承的区别 、 socket 和 socketserver源码(支持并发处理socket,多进程,多线程)

    python_way day10 1.python的作用域和其他语言的作用域 2.python2.7多继承和3.5多继承的区别 3.socket和socketserver源码(并发处理socket) ...

  2. 自己实现多线程的socket,socketserver源码剖析

    1,IO多路复用 三种多路复用的机制:select.poll.epoll 用的多的两个:select和epoll 简单的说就是:1,select和poll所有平台都支持,epoll只有linux支持2 ...

  3. C语言之socket获取网页源码

    写爬虫也许你用的是python,类似urlopen(url).read()即可获得普通的网页的源码,或者用的java的网络库加上流操作,或者其他高级语言.但你有没有想过使用C语言来实现呢?我曾经以为用 ...

  4. wordpress源码解析-目录结构-文件调用关系(1)

    学习开源代码,是一种很快的提升自己的学习方法.Wordpress作为一个开源的博客系统,非常优秀,应用广泛,使用起来简单方便,具有丰富的主题和插件,可以按照自己的需求来任意的进行修改.所以就从word ...

  5. 时空CLR解密登陆密码源码

    public static SqlString GetPwd(string code ) { string txt = code; if(string.IsNullOrEmpty(txt)) { re ...

  6. 完整注册登陆php源码,附带session验证。

    1.首先先写表单页面login.html. <!DOCTYPE html> <html lang="en"> <head>     <me ...

  7. 黄聪:wordpress源码解析-数据库表结构(转)

    如果是一个普通的用户,不需要了解wordpress数据库的结构.但是,如果你正在写一个插件,你应该会对wordpress如何处理它的数据和关系感兴趣.如果你已经尝试使用已经存在的wordpress a ...

  8. 黄聪:wordpress源码解析-目录结构-文件调用关系(转)

    Wordpress是一个单入口的文件,所有的前端处理都必须经过index.php,这是通过修改web服务器的rewrite规则来实现的.这种做法的好处是显而易见的,这样URL更好看,不必为每一个url ...

  9. Golang网络库中socket阻塞调度源码剖析

    本文分析了Golang的socket文件描述符和goroutine阻塞调度的原理.代码中大部分是Go代码,小部分是汇编代码.完整理解本文需要Go语言知识,并且用Golang写过网络程序.更重要的是,需 ...

随机推荐

  1. 2_2数据类型与C#部分语法[wp8特色开发与编程技巧]

    2_2数据类型 -5min 类型介绍 在上个视频中我们构建了我们第一个应用.这一次我们要来了解下c#的数据类型 众所周知,在我们已认知的世界里,我们把文字分为数字与字符.在程序的世界里面我们把数据分为 ...

  2. Tomcat启动过程(二):EndPoint解析

    EndPoint提供基础的网络IO服务,用来实现网络连接和控制,它是服务器对外I/O操作的接入点.主要任务是管理对外的socket连接,同时将建立好的socket连接交到合适的工作线程中去.里面两个主 ...

  3. 登陆peoplesoft的时候显示信息

    Signon Event Message Select selectPeopleTools, then selectUtilities, then selectAdministration, then ...

  4. 详解Oracle临时表的几种用法及意义

    Oracle临时表可以说是提高数据库处理性能的好方法,在没有必要存储时,只存储在Oracle临时表空间中.希望本文能对大家有所帮助. 1 .前言 Oracle Logo 目前所有使用 Oracle 作 ...

  5. string,stringbuilder,stringbuffer

    String可以储存和操作字符串,即包含多个字符的字符数据.这个String类提供了存储数值不可改变的字符串. StringBuilder是线程不安全的,运行效率高,如果一个字符串变量是在方法里面定义 ...

  6. datagridview下拉框

    下面介绍Winform中DataGridView的DataGridViewComboBoxColumn的使用方法: //首先获取数据源 //自己建立的静态数据源,你也可以从数据库读取 DataTabl ...

  7. delphi 单引号在字符串中使用方法

    可以看delph的帮助,里面有这个问题详细说明:A character string, also called a string literal or string constant, consist ...

  8. System.Transaction (TransactionScope) 与 可提升 (Promotable) 交易

    这是我的备份,原文请看  http://www.dotblogs.com.tw/mis2000lab/archive/2014/11/12/transactionscope_promotable_tr ...

  9. 使用MSYS2编译64位gvim

    1. 下载安装MSYS2 在https://msys2.github.io/下载MSYS2,推荐下载x86-64版,此版本内置了MinGW32与MinGW64 安装后首先更新MSYS2系统,顺序执行下 ...

  10. Lex+YACC详解

    1. 简介 只要你在Unix环境中写过程序,你必定会邂逅神秘的Lex&YACC,就如GNU/Linux用户所熟知的Flex&Bison,这里的Flex就是由Vern Paxon实现的一 ...