偶尔间看到一篇博客【清山博客】里讲述了他自己开发的一个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一个月多了,一直在工作之余零零散散地看一些东西.感觉经常使用的东西都有些了解了,可是一開始写代码总会出各种奇葩的问题.感觉还是代码写得太少.这样继续杂乱地学习下去进度也太慢了,并且学 ...
随机推荐
-
Leetcode 60. Permutation Sequence
The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
-
uva 10934(dp)
题意:k个水球,现在在一个n层建筑物上,水球可能在某一层层以上扔下去会破掉,现在求一个最少的次数使得用这k个水球能确定出哪一层. 思路:假设有i个小球,还可以实验j次时,第一个小球从x处扔下去,如果破 ...
-
layer
一款实用的web提示框架!下面是实用这款框架的实例 html代码 <p class='layer_notice'>我们是否是好惹的</p> <input type=&qu ...
-
jquery的each()函数用法
each()方法能使DOM循环结构简洁,不容易出错.each()函数封装了十分强大的遍历功能,使用也很方便,它可以遍历一维数组.多维数组.DOM, JSON 等等 在javaScript开发过程中使用 ...
-
ollydbg z
通达信l2密码器方法: 1:使用Ollydbg,点文件,打开,选择通达信的可执行文件(或者把通达信的执行文件直接拖进Ollydbg的窗口),按F9运行程序. 2:正常使用通达信,进入到K线图后,在k线 ...
-
unittest中更高效的执行测试用例一个类只需要打开一次浏览器
示例代码 baidu.py # _*_ coding:utf-8 _*_ import csv,unittest #导入csv模块 from time import sleep from seleni ...
-
C++中find()函数和rfind()函数的用法
本文转载自http://blog.csdn.net/youxin2012/article/details/9162415 string中 find()的应用 (rfind() 类似,只是从反向查找) ...
-
windows安装go-sqlite3失败,提示找不到gcc
windows安装go-sqlite3失败,提示找不到gcc go get github.com/mattn/go-sqlite3时失败,提示exec: “gcc”: executable file ...
-
【eclipse】点Clean后没反应
问题:点击Clean重新编译class后没反应 解决:
-
django 增删改查操作 数据库Mysql
下面介绍一下django增删改查操作: 1.view.py # -*- coding: utf-8 -*-from __future__ import unicode_literalsfrom dja ...