最近兴趣使然尝试了一下使用DotNet技术实现新浪微博PC客户端,几天时间,目前实现登录、微博列表、发布纯文本微博功能,新浪API调用基本没什么难度,在微博列表形式处理上着实让我烦躁了一阵子,Windows Form使用不多,这次开发也感觉有些捉襟见肘。

环境:

操作系统:Windows 7 Ultimate

集成开发环境:Visual Studio 2010 Ultimate

.NET Framework:3.5

先看一下截图:

1、登录界面

2、 登录

3、第一次运行主界面加载

4、主页面

5、翻页

6)如果博文中有图,点击小图可以查看大图

新浪微博API返回的数据类型有两种:XML和JSON。在登录时,我直接用DataSet读的XML数据存储到一个静态用户信息类中;而博客列表数据我读取的是JSON格式的数据,并将JSON格式的数据反序列化为泛型对象(类)集合,这里的类是嵌套类。

然后绘制列表,显示数据的控件全部是动态添加的,这里最烦的是位置,可能也是这个原因导致每页20条数据加载比较慢(接口默认一页返回20条),最快也要2秒,经常要4-6秒,后面提供下载,大家可以试试。另外,影响速度的原因可能还有:1)网速;2)输出图片,有的是直接输出大图,在回复的源微博中如果有图片,总是获取不到缩略图,只好依次判断小图、中图、大图,先有哪个输出哪个。 用Label显示文本行间距没法调,只好做了个自定义控件,主要是根据字体大小了增大行距。

界面虽然使用皮肤(ssk),比Window Form原始的界面好看的多,但是比起Adobe的那个AIR还是有差距,或许可以尝试使用WPF。

后续要实现的功能(还没全部看API,有的功能不一定提供API):

1)转发、收藏、回复

2)发帖可以使用表情、可以上传图片

3)关注、粉丝列表

4)查看自己微博、他人微博列表

5)个人的一些配置信息

6)主界面左边想放新浪微博登录后,个人首页右边的内容

... ...

工作量还挺大:(的。

目前经过处理,程序运行后占用的内存在4M-25M这样的一个范围 ,如果不处理会一直攀升,100M、200M、... ... 。

在翻页时,加载显示瞬时CPU占用率能够达到30%左右,一般比较低,5%以下。

滚屏时,CPU占用率一般18%以下,都是瞬时的。

大家看到的数据异步加载使用了多线程,主要是使用了BackgroundWorker。

除了上面的问题,在滚屏时,滚动的内容有点闪,还没找到好的解决办法。

欢迎有兴趣的人一起讨论,提宝贵意见。有经验的人做个指导:)。

最后附上读取新浪微博API的部分代码:

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.IO;
using  System.Net;
using  MBClient.Entities;
using  System.Runtime.Serialization.Json;
using  System.Data;
using  System.Drawing;

namespace  MBClient.API
{
     internal   class  ReadDataBySinaAPI
    {
         internal  ReadDataBySinaAPI() { }

///   <summary>
         ///  根据用户登录信息登录并读取用户信息到DataSet
         ///  如果用户新浪通行证身份验证成功且用户已经开通微博则返回 http状态为 200;
         ///  如果是不则返回401的状态和错误信息。此方法用了判断用户身份是否合法且已经开通微博。
         ///   http://open.t.sina.com.cn/wiki/index.php/Account/verify_credentials
         ///   </summary>
         ///   <param name="url"> API URL (XML Format) http://api.t.sina.com.cn/account/verify_credentials.xml?source=AppKey
         ///   </param>
         ///   <returns></returns>
         internal   static  DataSet ReadXMLDataToDataSet( string  url)
        {
            CredentialCache mycache  =   new  CredentialCache();
            mycache.Add( new  Uri(url),  " Basic " ,  new  NetworkCredential(UserInfo.UserName, UserInfo.Password));
            WebRequest myReq  =  WebRequest.Create(url);

myReq.Credentials  =  mycache;
            myReq.Headers.Add( " Authorization " ,  " Basic  "   +  Convert.ToBase64String( new  ASCIIEncoding().GetBytes(UserInfo.UserNamePassword)));

WebResponse wr  =  myReq.GetResponse();

DataSet ds  =   new  DataSet();
             using  (Stream receiveStream  =  wr.GetResponseStream())
            {
                StreamReader reader  =   new  StreamReader(receiveStream, Encoding.UTF8);
                 // string content = reader.ReadToEnd();
                ds.ReadXml(reader);
                reader.Close();
            }
            wr.Close();
             return  ds;
        }

internal   static   string  ReadXMLDataToString( string  url)
        {
            CredentialCache mycache  =   new  CredentialCache();
            mycache.Add( new  Uri(url),  " Basic " ,  new  NetworkCredential(UserInfo.UserName, UserInfo.Password));
            WebRequest myReq  =  WebRequest.Create(url);
            myReq.Credentials  =  mycache;
            myReq.Headers.Add( " Authorization " ,  " Basic  "   +  Convert.ToBase64String( new  ASCIIEncoding().GetBytes(UserInfo.UserNamePassword)));

WebResponse wr  =  myReq.GetResponse();
             string  strData  =   null ;
             using  (Stream receiveStream  =  wr.GetResponseStream())
            {
                StreamReader reader  =   new  StreamReader(receiveStream, Encoding.UTF8);
                strData  =  reader.ReadToEnd();
                reader.Close();
            }
            wr.Close();
             return  strData;
        }

///   <summary>
         ///  以JSON格式字符串返回用户所有关注用户最新n条微博信息。和用户“我的首页”返回内容相同。
         ///   http://open.t.sina.com.cn/wiki/index.php/Statuses/friends_timeline
         ///   </summary>
         ///   <param name="url"> API URL (JSON Format)  http://api.t.sina.com.cn/statuses/friends_timeline.json?source=AppKey
         ///   </param>
         ///   <returns></returns>
         internal   static   string  ReadJsonDataToString( string  url)
        {
            CredentialCache mycache  =   new  CredentialCache();
            mycache.Add( new  Uri(url),  " Basic " ,  new  NetworkCredential(UserInfo.UserName, UserInfo.Password));
            WebRequest myReq  =  WebRequest.Create(url);

myReq.Credentials  =  mycache;
            myReq.Headers.Add( " Authorization " ,  " Basic  "   +  Convert.ToBase64String( new  ASCIIEncoding().GetBytes(UserInfo.UserNamePassword)));

WebResponse wr  =  myReq.GetResponse();
             string  content  =   null ;
             using  (Stream receiveStream  =  wr.GetResponseStream())
            {
                StreamReader reader  =   new  StreamReader(receiveStream, Encoding.UTF8);
                content  =  reader.ReadToEnd();
                reader.Close();
            }
            wr.Close();
             return  content;
        }

///   <summary>
         ///  将JSON格式字符串反序列化为Status集合对象
         ///   </summary>
         ///   <param name="url"> 同ReadJsonDataToString() </param>
         ///   <returns></returns>
         internal   static  List < Status >  DeserializeJsonToListObject( string  url)
        {
            List < Status >  listObj;
             using  (MemoryStream stream  =   new  MemoryStream())
            {
                DataContractJsonSerializer ser  =   new  DataContractJsonSerializer( typeof (List < Status > ));
                StreamWriter wr  =   new  StreamWriter(stream);
                 string  strJson  =  ReadJsonDataToString(url);
                wr.Write(strJson);
                wr.Flush();
                stream.Position  =   0 ;
                Object obj  =  ser.ReadObject(stream);
                listObj  =  (List < Status > )obj;
                wr.Close();
            }

return  listObj;
        }

///   <summary>
         ///  获取并输出图片
         ///   </summary>
         ///   <param name="imgUrl"> 图片URL地址 </param>
         ///   <returns></returns>
         internal   static  Image GetAvatarImage( string  imgUrl)
        {
            Uri myUri  =   new  Uri(imgUrl);
            WebRequest webRequest  =  WebRequest.Create(myUri);
            WebResponse webResponse  =  webRequest.GetResponse();
            Bitmap myImage  =   new  Bitmap(webResponse.GetResponseStream());

return  (Image)myImage;
        }

///   <summary>
         ///  发表一条微博
         ///   </summary>
         ///   <param name="url"> API地址
         ///   http://api.t.sina.com.cn/statuses/update.json
         ///   </param>
         ///   <param name="data"> AppKey和微博内容
         ///  "source=123456&status=" + System.Web.HttpUtility.UrlEncode(微博内容);
         ///   </param>
         ///   <returns></returns>
         internal   static   bool  PostBlog( string  url, string  data)
        {
             try
            {
                System.Net.WebRequest webRequest  =  System.Net.WebRequest.Create(url);
                System.Net.HttpWebRequest httpRequest  =  webRequest  as  System.Net.HttpWebRequest;

System.Net.CredentialCache myCache  =   new  System.Net.CredentialCache();
                myCache.Add( new  Uri(url),  " Basic " ,
                     new  System.Net.NetworkCredential(UserInfo.UserName, UserInfo.Password));
                httpRequest.Credentials  =  myCache;
                httpRequest.Headers.Add( " Authorization " ,  " Basic  "   +  Convert.ToBase64String(
                     new  System.Text.ASCIIEncoding().GetBytes(UserInfo.UserName  +   " : "   +
                    UserInfo.Password)));

httpRequest.Method  =   " POST " ;
                httpRequest.ContentType  =   " application/x-www-form-urlencoded " ;
                System.Text.Encoding encoding  =  System.Text.Encoding.UTF8; // System.Text.Encoding.ASCII
                 byte [] bytesToPost  =  encoding.GetBytes(data); // System.Web.HttpUtility.UrlEncode(data)
                httpRequest.ContentLength  =  bytesToPost.Length;
                System.IO.Stream requestStream  =  httpRequest.GetRequestStream();
                requestStream.Write(bytesToPost,  0 , bytesToPost.Length);
                requestStream.Close();
                 return   true ;
            }
             catch
            {
                 return   false ;
            }
        }
    }
}

感谢博客园的这篇文章,参考价值很大:http://www.cnblogs.com/cmt/archive/2010/05/13/1733904.html

注:AppKey以内置,是我申请的,每IP每用户一小时内限调用350次API。

PS:别拿来干坏事... ...

附一条完整的博客内容数据(XML格式)

< status >
     < created_at > Wed Nov 24 21:24:04 +0800 2010 </ created_at >
     < id > 3858478793 </ id >
     < text > 很好的推论。 //@白手套的小咪:这是罗永浩流传最广的名言之一。给他改一改:没有哪只鸟来到世间是为了躲枪子儿的。所以,手上拿着枪,并用“枪打出头鸟”这样的道理教训人的那些人,一定要明白,每只鸟都梦想出头,你打到老死也打不完的。 </ text >
     < source >
       < a  href ="http://t.sina.com.cn" > 新浪微博 </ a >
     </ source >
     < favorited > false </ favorited >
     < truncated > false </ truncated >
     < geo />
     < in_reply_to_status_id ></ in_reply_to_status_id >
     < in_reply_to_user_id ></ in_reply_to_user_id >
     < in_reply_to_screen_name ></ in_reply_to_screen_name >
     < user >
       < id > 1197161814 </ id >
       < screen_name > 李开复 </ screen_name >
       < name > 李开复 </ name >
       < province > 11 </ province >
       < city > 1000 </ city >
       < location > 北京 </ location >
       < description > 创新工场CEO </ description >
       < url > http://blog.sina.com.cn/kaifulee </ url >
       < profile_image_url > http://tp3.sinaimg.cn/1197161814/50/1290146312/1 </ profile_image_url >
       < domain > kaifulee </ domain >
       < gender > m </ gender >
       < followers_count > 2384862 </ followers_count >
       < friends_count > 132 </ friends_count >
       < statuses_count > 1039 </ statuses_count >
       < favourites_count > 2 </ favourites_count >
       < created_at > Fri Aug 28 00:00:00 +0800 2009 </ created_at >
       < following > false </ following >
       < verified > true </ verified >
       < allow_all_act_msg > false </ allow_all_act_msg >
       < geo_enabled > true </ geo_enabled >
     </ user >
     < retweeted_status >
       < created_at > Wed Nov 24 17:35:07 +0800 2010 </ created_at >
       < id > 3853748245 </ id >
       < text > “希望那些喜欢用“枪打出头鸟”这样的道理教训年轻人,并且因此觉得自己很成熟的中国人有一天能够明白这样一个事实,那就是:有的鸟来到世间,是为了做它该做的事,而不是专门躲枪子儿的。” </ text >
       < source >
         < a  href ="http://t.sina.com.cn" > 新浪微博 </ a >
       </ source >
       < favorited > false </ favorited >
       < truncated > false </ truncated >
       < geo />
       < in_reply_to_status_id ></ in_reply_to_status_id >
       < in_reply_to_user_id ></ in_reply_to_user_id >
       < in_reply_to_screen_name ></ in_reply_to_screen_name >
       < user >
         < id > 1672204023 </ id >
         < screen_name > Ran-w </ screen_name >
         < name > Ran-w </ name >
         < province > 11 </ province >
         < city > 5 </ city >
         < location > 北京 朝阳区 </ location >
         < description > 什么都不知道总比什么都知道要好。慢慢经历那个不知道的未来。 </ description >
         < url > http://blog.sina.com.cn/wongr11 </ url >
         < profile_image_url > http://tp4.sinaimg.cn/1672204023/50/1290577674/0 </ profile_image_url >
         < domain > wongr </ domain >
         < gender > f </ gender >
         < followers_count > 757 </ followers_count >
         < friends_count > 178 </ friends_count >
         < statuses_count > 521 </ statuses_count >
         < favourites_count > 4 </ favourites_count >
         < created_at > Mon Dec 21 00:00:00 +0800 2009 </ created_at >
         < following > false </ following >
         < verified > false </ verified >
         < allow_all_act_msg > false </ allow_all_act_msg >
         < geo_enabled > true </ geo_enabled >
       </ user >
     </ retweeted_status >
   </ status >

status是博主发表的博文,retweeted_status是回复或者转发了哪条博文。

下载微博客户端

转载于:https://www.cnblogs.com/Ferry/archive/2010/11/26/1889307.html

新浪微博PC客户端(DotNet WinForm版)—— 初探相关推荐

  1. 新浪微博PC客户端(DotNet WinForm C# 版,C#调用新浪微博API代码,源码下载)—— 初探 (第二部分内置链接)

    第二篇:新浪微博PC客户端(DotNet WinForm版)--功能实现分解介绍 C#源码下载 最近兴趣使然尝试了一下使用DotNet技术实现新浪微博PC客户端,几天时间,目前实现登录.微博列表.发布 ...

  2. 新浪微博PC客户端(DotNet WinForm版)——功能实现分解介绍

    上一篇:新浪微博PC客户端(DotNet WinForm版)-- 初探 说明一下:只是兴趣,并不是想发布为一个软件,说实在的,如果要作为一个软件发布,要做的工作还有很多. 新浪微博API地址:http ...

  3. 新浪微博PC客户端,(蓝星星微博客户端)VC++

    下载地址: 华军软件站下载 非凡软件站下载 多特软件站下载 介绍: 简洁漂亮的界面,内容时实更新,不用安装air,支持屏幕截图,C++开发,速度超快,在也不用打开浏览器神马的了.屏幕截图功能是其它客户 ...

  4. 新浪微博桌面客户端 v3.0.5.35466 官方PC版

    新浪微博桌面客户端 v3.0.5.35466 官方PC版 软件大小:16.9MB 软件语言:简体中文 软件性质:常用软件 软件授权:官方版 更新时间:2014-04-29 应用平台:/WinXP/|W ...

  5. 新浪微博桌面客户端2014 v3.0.5 官方正式版

    新浪微博桌面客户端2014 v3.0.5 官方正式版 软件大小:29.2MB 软件语言:简体中文 软件性质:常用软件 软件授权:官方版 更新时间:2014-05-22 应用平台:/Win8/Win7/ ...

  6. 移动pc客户端迷你版泄露

    今天忽然发现移动pc客户端迷你版泄露了,是个绿色版,才想起来前段时间就开始报道移动要出迷你版了,马上下载使用了一下,还不错,内存占用虽然还是有点大,但是相比起那个不迷你的版本来说已经相当好了. 先上图 ...

  7. 轻笔记显示无法连接到服务器,轻笔记:支持群组的跨平台笔记应用 (1)PC客户端...

    [摘要]支持群组协作.本文为系列文章的第一篇,细致介绍了其PC客户端的功能.特点,尤其是群组协作功能. [说明]①本文是善用佳软网站的第一篇收费文章,轻笔记官方为此宣传支付了一定费用.②在与轻笔记团队 ...

  8. DotNET多线程使用初探

    最近几周一直在做DotNET WinForm开发,陆陆续续有些收获,希望能够有空好好整理整理.记下来以免以后又忘了.:-) 一.最简单的线程使用方法 新建一个C# Windows应用程序项目,在最前面 ...

  9. 使用 Docker 运行微信 PC 客户端

    作者:阳明 DoChat(盒装微信)是一个 Linux 下的 Docker 化的微信 PC Windows 客户端,项目地址:https://github.com/huan/docker-wechat ...

最新文章

  1. 三步更改win7开机密码
  2. 视频文件详细信息python3_如何用python3爬取自己的收藏夹视频信息
  3. Java递归实现二分法
  4. ssh查找linux端口,linux – 查找当前连接的端口号SSH
  5. JSP访问Spring中的bean
  6. 怎么删除计算机的一个用户名和密码,哪位晓得电脑有两个账户怎么删除一个
  7. 第006讲 多媒体页面 标签汇总
  8. 读《鸟哥的linux私房菜》有感--第四天
  9. python 字符串分割_python拆分字符串到列表
  10. linux基础篇(centeros)
  11. Python导包的几种方法,自定义包的生成以及导入详解
  12. simm计算机专业英语翻译,计算机专业英语翻译
  13. R语言ROC分析、ROC曲线可视化及最佳阈值计算(threshold、cutoff)
  14. unity怎么制作云飘动_Unity Shader教程之 旗帜飘扬效果的简单实现
  15. python_IED工具下载(pycharm)_windows版
  16. Mybatis if标签判断数字大小
  17. sql server 2008 r2 忘记sa密码, 没有window账户登录, 解决办法
  18. 2020哈工程上岸初复试经验
  19. 适合手机页面微信页面pc页面用的幻灯片
  20. 【Tomcat】tomcat9使用tomcat7-maven-plugin插件配置及其他一系列配置问题解决

热门文章

  1. Calendar.getInstance() gives error in Android Studio
  2. 计算机节电模式,电脑节能模式怎么解除关闭步骤
  3. MATLAB使用GPU加速计算
  4. 金额数字转换(小写转大写)
  5. 计算机专业毕业后的工作方向
  6. 自增运算,阴间代码《奇思妙想二》
  7. From CodingHorror: The Long, Dismal History of ...
  8. imageview控件加载图片
  9. 【算法千题案例】每日LeetCode打卡——68.反转字符串中的元音字母
  10. 毕业几年LINUX 驱动研发工作心得分享