[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同一级别(该路径发布后也生效,其他的路径有机会再尝试一下)
就这么多了,欢迎留言交流
[Tool] csdn客户端开发(非官方版)的更多相关文章
- CouchDB客户端开发—Java版
在Fedora上安装CouchDB: yum update yum install couchdb 修改/etc/couchdb下local.ini文件: port = 5984bind_addres ...
- 菜鸟在线教你用Unity3D开发VR版的Hello World
大家好,我是菜鸟在线的小编.这篇短文将告诉大家如何用Unity3D开发VR版的Hello World. 1开启SteamVR并连接Vive设备 (a)登录Steam客户端,并点击右上角的VR按钮,这时 ...
- 用Jersey为Android客户端开发Restful Web Service
平时在做Android客户端的时候经常要与服务器之间通信,客户端通过服务端提供的接口获取数据,然后再展示在客户端的界面上,作为Android开发者,我们平时更多的是关注客户端的开发,而对服务端开发的关 ...
- Navicat Premium for Mac 非官方版不能启动的解决方案
Ps:这篇有点杂记的感觉,就说点废话也没什么影响.废话主要有两点: 1.建议读者也开始写博客,为什么呢?其实我也没有这种写作的习惯,我最开始写博客的时候,感觉我写的东西网上都有,需要的时候找一下肯定能 ...
- 64位主机64位oracle下装32位客户端ODAC(NFPACS版)
64位主机64位oracle下装32位客户端ODAC(NFPACS版) by dd 1.下载Oracle Data Access Components(ODAC) Xcopy的两个版本: x86:(我 ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.0 版本 - 多系统开发接口 - 苹果客户端开发接口
最近工作上需要,给苹果客户端开发接口,实现集中统一的用户管理,下面是接口调用参考. 1: 获取OpenId? http://127.0.0.1/GetOpenId.ashx?username=Admi ...
- 在线教学、视频会议 Webus Fox(3) 客户端开发手册
本文主要介绍webus fox 客户端的配置及接口说明. 1. 文件列表和配置 1.1 文件列表 1.2 common.xml 配置 根据服务器端的部署, 替换[ServerUrl] , [RtmpP ...
- [原创]上海好买基金招高级Java技术经理/运维主管/高级无线客户端开发等职位(内推)
[原创]上海好买基金招高级Java技术经理/运维主管/高级无线客户端开发等职位(内推) 内部推荐职位 高级JAVA技术经理: 岗位职责: 负责项目管理(技术方向),按照产品开发流 ,带领研发团队,制定 ...
- 从零開始开发Android版2048 (一)初始化界面
自学Android一个月多了,一直在工作之余零零散散地看一些东西.感觉经常使用的东西都有些了解了,可是一開始写代码总会出各种奇葩的问题.感觉还是代码写得太少.这样继续杂乱地学习下去进度也太慢了,并且学 ...
随机推荐
- 剑指Offer面试题:17.树的子结构
一.题目:树的子结构 题目:输入两棵二叉树A和B,判断B是不是A的子结构.例如下图中的两棵二叉树,由于A中有一部分子树的结构和B是一样的,因此B是A的子结构. 该二叉树的节点定义如下,这里使用C#语言 ...
- .NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器
开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...
- [Unity3D]自己动手重制坦克舰队ArmadaTank(2)从碰撞说起
[Unity3D]自己动手重制坦克舰队ArmadaTank(2)从碰撞说起 在上一篇里我给出了重制的坦克舰队效果图和试玩程序.本篇介绍一下玩家坦克和敌方坦克碰撞问题. +BIT祝威+悄悄在此留下版了个 ...
- WCF Security基本概念(转载)
WCF Security 主要包括 "Transfer Security"."Access Control"."Auditing" 几个部分 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (34) ------ 第六章 继承与建模高级应用之多条件与QueryView
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-10 创建一个多条件过滤 问题 你想使用多个条件为实体过滤表中的行. 解决方案 ...
- jsp登入oracle
<body> <% Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn=null; ...
- LINQ系列:Linq to Object元素操作符
元素操作符从一个序列返回单个指定的元素. 1. DefaultIfEmpty DefaultIfEmpty操作符将一个空集合替换为包含默认的单个值的集合.在返回序列为空且又需要返回一些对象时,可以通过 ...
- bootstrap-modal 学习笔记 源码分析
Bootstrap是Twitter推出的一个开源的用于前端开发的工具包,怎么用直接官网 http://twitter.github.io/bootstrap/ 我博客的定位就是把这些年看过的源码给慢慢 ...
- 自用迷你版的Deferred
啥也不说贴代码,项目用 /** * 迷你版的deferred */ function Deferred(func) { if (this instanceof Deferred === false) ...
- OpenCASCADE Color Scale
OpenCASCADE Color Scale eryar@163.com Abstract. The color scale is a specialized label object that d ...