[Tool] csdn客户端开发(非官方版)

偶尔间看到一篇博客【清山博客】里讲述了他自己开发的一个CSDN博客客户端,并去下载体验了一下,然后就自己手痒也要开发一下大笑

先看看结果图:

在文章列表里,鼠标右键可以操作【置顶、删除、评论权限】;

 

 

下面提一些开发过程中涉及到的技术:

【1】模拟POST/GET请求

try
{
    if (m_CC == null)
        m_CC = new CookieContainer();
    this.m_Request = (HttpWebRequest)WebRequest.Create(sRequestUrl);// sResultUrl 为请求的地址
    header.AssignRequest(ref this.m_Request);// 将 header 参数中的属性值赋值给 m_Request 对象
    m_Request.AllowAutoRedirect = false;
    m_Request.KeepAlive = true;
    m_Request.CookieContainer = m_CC;// 返回的 cookie 会附在这个容器里

    if (sPostData != null && (!sPostData.Equals("")))// 如果是 post 方法,则会带有 post 数据
    {
        Byte[] postdata = Encoding.UTF8.GetBytes(sPostData);
        m_Request.ContentLength = postdata.Length;
        Stream stream = m_Request.GetRequestStream();
        stream.Write(postdata, 0, postdata.Length);
        stream.Close();
    }

    // 接收响应
    m_Response = (HttpWebResponse)m_Request.GetResponse();
}
catch (Exception ex)
{
    CloseConnection();
    throw new Exception("发送请求异常," + ex.Message);
}
利用 C# 自带的 HttpWebRequest 和 HttpWebResponse 来模拟 POST/GET 操作

【2】Cookie获取

m_Response.Cookies = m_Request.CookieContainer.GetCookies(m_Request.RequestUri);// 根据请求的 URI 获取相应的cookie
CookieCollection cookies = m_Response.Cookies;
m_sCookiesStr = m_Request.CookieContainer.GetCookieHeader(m_Request.RequestUri);// Cookie 字符串

注意,如果需要遍历 Cookie,则需要根据指定的 URI 获得对应的 CookieCollection 对象才可以,在【1】中

m_Request.CookieContainer = m_CC;// 返回的 cookie 会附在这个容器里

只是将返回的 Cookie 放在 CookieContainer 对象容器中,是没有办法直接遍历 Cookie 的

【3】设置header,并发送请求和接收响应

HTTPHeader header = new HTTPHeader();
header.Method = "GET";
header.Host = "write.blog.csdn.net";// 可选,会根据 referer 自行设置
header.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";// 可选
header.Referer = "http://write.blog.csdn.net/category";

m_HtmlHelper.SendRequest("http://write.blog.csdn.net/category", null, header);// 如果是 POST,null 位置即为发送的数据
String sResponseContent = m_HtmlHelper.GetResponseContent();// 获取响应内容(响应 header 下面的内容)
m_HtmlHelper.CloseConnection();// 关闭 Request 请求以及 Response 响应

如果是POST操作的话,还需要设置

header.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";

【4】解析网页内容

可以利用 HtmlAgilityPack.HtmlDocument 来解析带有 HTML 标签的内容,举个例子如下:

HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(sWebHtmlContent);
HtmlNode rootNode = htmlDoc.DocumentNode;
userinfo.NickName = rootNode.SelectSingleNode("//div[@class='personal_homepage']/div[@class='per_info']/dl/dt/a").InnerText;
SelectSingleNode 或 SelectNodes 方法的参数是 XPath

【5】小细节总结

1:WebBrowser 获取 iframe 中的内容

HtmlDocument iframeDoc = wb_Content.Document.Window.Frames["xhe0_iframe"].Document;

2:默认窗口最大化

this.WindowState = FormWindowState.Maximized;// 初始化最大化窗口

3:ListView用法

// 消息队列初始化
lv_msg.View = View.Details;
lv_msg.BeginUpdate();
lv_msg.Columns.Add("Time");
lv_msg.Columns.Add("Message");
lv_msg.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
lv_msg.EndUpdate();

往 ListView 中添加项

lv_msg.BeginUpdate();
Int32 nRowCount = lv_msg.Items.Count;
lv_msg.Items.Add("no" + nRowCount, DateTime.Now.ToShortTimeString(), 0);
lv_msg.Items["no" + nRowCount].SubItems.Add(sMsg);
lv_msg.Items["no" + nRowCount].EnsureVisible();
lv_msg.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
lv_msg.EndUpdate();

4:C# Winform 路径

Application.ExecutablePath 表示可执行程序的路径,包括程序 .exe 名称
而 Application.ExecutablePath+"\..\" 即表示项目根路径,与bin同一级别(该路径发布后也生效,其他的路径有机会再尝试一下)

就这么多了,欢迎留言交流大笑

posted @ 2014-04-10 12:40  01码匠  阅读(268)  评论(0编辑  收藏  举报