[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一个月多了,一直在工作之余零零散散地看一些东西.感觉经常使用的东西都有些了解了,可是一開始写代码总会出各种奇葩的问题.感觉还是代码写得太少.这样继续杂乱地学习下去进度也太慢了,并且学 ...
随机推荐
- Mina入门教程(二)----Spring4 集成Mina
在spring和mina集成的时候,要十分注意一个问题:版本. 这是一个非常严重的问题,mina官网的demo没错,网上很多网友总结的代码也是对的,但是很多人将mina集成到spring中的时候,总是 ...
- 内存提取SWF,破解doswf方法概述
参考文献: http://blog.ceflash.com/%E5%86%99%E7%82%B9swf%E4%BA%8C%E8%BF%9B%E5%88%B6%E7%9A%84%E4%B8%9C%E8% ...
- 《Entity Framework 6 Recipes》中文翻译系列 (12) -----第三章 查询之使用SQL语句
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-2使用原生SQL语句更新 问题 你想在实体框架中使用原生的SQL语句,来更新底层 ...
- ionic中关于ionicView 的生命周期
当我们来回切换页面时候,视图被缓存下来,不用每次再去new一个新的视图,可以大大地提高性能.当跳出一个视图后,视图的元素被保存在DOM中,它的作用域也就不在$watch的作用域内,当我们访问一个已经被 ...
- salesforce 零基础学习(四十九)自定义列表分页之使用Pagination实现分页效果 ※※※
上篇内容为Pagination基类的封装,此篇接上篇内容描述如何调用Pagination基类. 首先先创建一个sObject,起名Company info,此object字段信息如下: 为了国际化考虑 ...
- 每天多一点(2016.12.04)》Javascript隐式转换
乱想 javascript为什么需要隐式转换?如果没有会出现什么情况? 找了一圈没有看到关于这个的讨论,只好自己研究了,可能不一定正确,自行辨知. 郁闷就是郁闷在好好的,为什么要搞个隐式转换,一般来讲 ...
- Windows下搭建MySQL Master Slave
一.背景 服务器上放了很多MySQL数据库,为了安全,现在需要做Master/Slave方案,因为操作系统是Window的,所以没有办法使用keepalived这个HA工具,但是我们可以接受人工进行切 ...
- UGUI 之获取当前控件的高度
当Canvas Scaler选择Constant Pixel Size 当前的分辨率会被被固定,可以用RectTransform类里面的.rect变量值获取 height或Width. 在次情况下获取 ...
- 一起学微软Power BI系列-官方文档-入门指南(4)Power BI的可视化
在前面的系列文章中,我们介绍了官方有关获取数据,以及建模的原始文档和基本介绍.今天继续给大家介绍官方文档中,有关可视化的内容.实际上获获取数据和建模更注重业务关系的处理,而可视化则关注对数据的解读.这 ...
- Android数据存储之SharedPreferences及如何安全存储
前言: 最近一直在学习ios的数据存储,当学习到NSUserDefaults的时候让我回想起了SharedPreferences,今天闲来无事,想着总结一下SharedPreferences的使用. ...