新浪微博現在好像勢頭很猛,很多人在創立自己的微博客的時候,開始出於好奇,都會跟隨很多人,久而久之,自己的好友人數超過100後,那麼你就發現,你已經完全淹沒在信息的洪流中了,你跟隨了那麼多人,很多人都是今後可能永遠都不會想起,也永遠不會看到的人,這顯然與「關注」的目的是相背的,更有時候可能你只是想看下你認識的人的消息更新了沒有,但是顯然你不可能每次都一個個到自己的關注人物表中點開然後再一一訪問他的主頁,這樣操作太繁瑣了。
用過RSS閱讀器的使用者可能都體會到RSS閱讀器在取得資訊的優越性了吧。它能即時追蹤RSS資源的更新,並顯示更新數目到指定的訂閱資源後面,可以讓用戶有針對性地查看信息,讓用戶主動地去獲取信息,而不再是被動地接受信息了,這對於解決微博的「資訊洪流」問題是很有效的。
筆者花了幾天時間,終於寫了一個程序,用於獲取指定用戶的好友,並儲存備份到ACCESS資料庫中,然後產生一個RSS閱讀資源。不敢獨享,所以開源跟大家分享。今後如果有時間,我想再將它做成一個桌面軟體,方便一般不懂程式的使用者來操作,這都是後話了吧。
1. 新浪微博RSS訂閱第三方網站
新浪微博本身沒有提供RSS訂閱,但是到網路上搜尋,發現了一個第三方的網站,提供新浪微博的RSS資源,所以,本文的RSS訂閱說穿了都是基於這個第三方網站的。
log.medcl.net/item/2010/02/sina-bo-rss-subscribe-feed-generate-micro/
2. 網路上通用的OPML文件的XML格式
下面是從Google Reader中導出的opml文件,這是網路RSS閱讀器甚至所有RSS閱讀器的標準格式吧,至少“鮮果”,“有道”這些比較流行的在線閱讀器都支持這個格式的文件導入。
<?xml version="1.0" encoding="UTF-8"?><opml version="1.0"> <head> <title>subscriptions</title> <dateCreated>2010-05-16 15:45:03</dateCreated> <ownerName></ownerName> </head> <body> <outline text="微博客" title="微博客"> <outline text="冷笑话(1567852087)" title="冷笑话(1567852087)" type="rss" htmlUrl="http://t.sina.com.cn/1567852087" xmlUrl="http://medcl.net/SinaRss.aspx?uid=1567852087" /> <outline text="后宫优雅(1665289110)" title="后宫优雅(1665289110)" type="rss" htmlUrl="http://t.sina.com.cn/1665289110" xmlUrl="http://medcl.net/SinaRss.aspx?uid=1665289110" /> <outline text="围脖经典语录" title="围脖经典语录" type="rss" htmlUrl="http://t.sina.com.cn/1646465281" xmlUrl="http://medcl.net/SinaRss.aspx?uid=1646465281" /> <outline text="破阵子(1644022141)" title="破阵子(1644022141)" type="rss" htmlUrl="http://t.sina.com.cn/1644022141" xmlUrl="http://medcl.net/SinaRss.aspx?uid=1644022141" /> </outline> <outline text="珞珈山水" title="珞珈山水"> <outline text="今日十大热门话题" title="今日十大热门话题" type="rss" htmlUrl="http://bbs.whu.edu.cn/frames.html" xmlUrl="http://bbs.whu.edu.cn/rssi.php?h=1" /> <outline text="贴图版" title="贴图版" type="rss" htmlUrl="http://bbs.whu.edu.cn/wForum/board.php?name=Picture" xmlUrl="http://bbs.whu.edu.cn/wForum/rss.php?board=Picture&ic=1" /> </outline> </body></opml> 登入後複製 |
|
,然後方便透過程式來將它需要的資訊寫成此架構的文件,以便於閱讀器引用。 OPML檔案由頭部標籤
(主要是本文件的一些註解,不影響實際的RSS訂閱訊息,不是太重要)和(RSS閱讀器提取訂閱資源的全部資料來源)。在節點下面有個一級的關於新浪微博API的詳細介紹,可以參考新浪微博API官方網站:
#open.t.sina.com.cn/wiki/index.php/首頁
關於身分認證和資料要求,請參考cnblogs:
www.cnblogs.com /cmt/archive/2010/05/13/1733904.html |
private void getFriends() { int previous_cursor=-1; int next_cursor = -1; while (next_cursor != 0) { string cursor = Convert.ToString(previous_cursor); string url = " http://api.t.sina.com.cn/statuses/friends.xml?source=AppKey&cursor=" + cursor; string username = "dreamzsm@gmail.com"; string password = name; //这里输入你自己微博登录的的密码 //注意这里的格式哦,为 "username:password" System.Net.WebRequest webRequest = System.Net.WebRequest.Create(url); System.Net.HttpWebRequest myReq = webRequest as System.Net.HttpWebRequest; //身份验证 string usernamePassword = username + ":" + password; CredentialCache mycache = new CredentialCache(); mycache.Add(new Uri(url), "Basic", new NetworkCredential(username, password)); myReq.Credentials = mycache; myReq.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword))); WebResponse wr = myReq.GetResponse(); Stream receiveStream = wr.GetResponseStream(); StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8); string content = reader.ReadToEnd(); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(content); // xmlDoc.Load("data1.xml"); XmlNodeList nodeList = xmlDoc.SelectSingleNode("users").ChildNodes;//获取根节点的所有子节点 next_cursor = Convert.ToInt16(nodeList.Item(nodeList.Count - 2).InnerText); previous_cursor = Convert.ToInt16(nodeList.Item(nodeList.Count-1).InnerText); string xmlName = "friends_" + nodeList.Item(nodeList.Count - 1).InnerText + "_" + Convert.ToInt16(nodeList.Item(nodeList.Count - 2).InnerText) + ".xml"; previous_cursor = next_cursor; xmlDoc.Save(xmlName); } }
为了程序设计简单一点,笔者就有点偷懒了,没有仔细研究如何将所有的数据写到一个XML文件中,而是每次请求得到的20条数据写成一个XML文件,最后我159个好友,按照指定的命名方法生成了8个XML文件。
如此,就得到了所有的你的好友(就是你跟随的人)的信息了,以单人为例,其主要信息如下:
<user> <id>1710993410</id> <screen_name>某丫大人</screen_name> <name>某丫大人</name> <province>43</province> <city>1</city> <location>湖南 长沙</location> <description>饭否儿,心朝饭否,春暖花开。 我还是@饿YA 我还真是懒得介绍了。</description> <url>http://1</url> <profile_image_url>http://tp3.sinaimg.cn/1710993410/50/1273755892</profile_image_url> <domain> </domain> <gender>f</gender> <followers_count>168</followers_count> <friends_count>79</friends_count> <statuses_count>846</statuses_count> <favourites_count>0</favourites_count> <created_at>Sun Mar 14 00:00:00 +0800 2010</created_at> <following>false</following> <verified>false</verified> <allow_all_act_msg>false</allow_all_act_msg> <geo_enabled>false</geo_enabled> <status> <created_at>Sun May 16 21:02:44 +0800 2010</created_at> <id>364379114</id> <text>烦死了快、</text> <source> <a href="">新浪微博</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> </status> </user> 登入後複製 |
|
可以看到这里面的信息量是超级多的,我简单介绍下几个主要的节点吧
id | 用户新浪微博的数字ID,就像你的QQ号一样 |
name | 用户昵称 |
province | 省代号 |
city | 市代号 |
location | 所在省市(好像和上面两个节点重复了) |
description | 自我描述 |
domain | 域名,就是除了数字ID后,用户申请的修改域名 |
gender | 性别。男的是Male,女的是Female. |
followers_count | 粉丝数 |
friends_count | 跟随的人数 |
statuses_count | 发表的状态也就是微博数 |
favourites_count | 收藏微博数目吧?(不知道这个有什么用) |
created_at | 用户创建此微博客的时间 |
verified | 是否经过新浪的VIP认证 |
status | 用户最近的一次状态 |
除了user信息外,还有一些其它信息,比如根节点下的next_cursor和previous_cousor,这方便用户分多次到服务器上请求数据时可以此作为定位依据。
登入後複製 |
|
对多个XML文件进行遍历,一个个导入到ACCESS数据库中:
/// <summary> /// 将所有好友都导出了,然后存储在ACCESS数据库中了。 /// </summary> public void readAllXml() { for (int i = 0; i < 8; i++) { string fileName = "friends_" + Convert.ToString(i * 20) + "_" + Convert.ToString(i*20+20)+".xml";//按照存储XML文件时的命名规则进行读取 readTsinaFriends(fileName); } } 登入後複製 |
|
经过上面的操作后,你再打开你的ACCESS数据库文件weibo.mdb文件中对应的表,就可以看到所以的信息都已经导入到ACCESS中了。如下图所示:
5. 对ACCESS数据库查询并写成RSS阅读器的OPML格式
对于制作RSS阅读器的OPML格式,需要的数据只有两条字段:一个是id字段,一个是name字段。
这个过程实际上就是对数据进行XML编码的过程,啥都不说了,一切都在代码中了(也是在ASP.NET工程中写的):
/// <summary> /// 建立新浪微博的RSS文件 /// </summary> public void CreateTsinaRssXmlFile() { OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\coursware\\网络软文\\API_微波\\weibo.mdb"); string strCmd = "select id as idnum,screen_name as name from Friends"; //从ACCESS中获取数据 aConnection.Open(); OleDbDataAdapter da = new OleDbDataAdapter(strCmd, aConnection); DataSet ds = new DataSet(); da.Fill(ds, "TSina"); ds.DataSetName = "RssReader"; DataTable dt = ds.Tables[0];//数据集的第0张表格 XmlDocument xmldoc; XmlElement xmlelem; xmldoc = new XmlDocument(); //加入XML的声明段落 XmlDeclaration xmldecl; xmldecl = xmldoc.CreateXmlDeclaration("1.0", "UTF-8", null); xmldoc.AppendChild(xmldecl); //加入一个根元素 xmlelem = xmldoc.CreateElement(" ", "opml", " "); xmldoc.AppendChild(xmlelem); XmlNode root = xmldoc.SelectSingleNode("opml");//查找<opml> 节点 XmlElement xeHead = xmldoc.CreateElement("head");//创建一个<head>节点 //为head节点增加子节点 XmlElement xeHeadsub = xmldoc.CreateElement("title"); xeHeadsub.InnerText = "Rss Reader";//设置节点文本 xeHead.AppendChild(xeHeadsub);//添加到<head>子节点中 root.AppendChild(xeHead);//添加到<head>节点中 //增加body子节点,然后,将所有的RSS订阅信息全部写入到body节点中间 XmlElement xeBody = xmldoc.CreateElement("body"); root.AppendChild(xeBody); //第一层循环是标签(文件夹循环)由于本次只做一个标签,所以就只循环一次了 //RSS的文件夹属性节点 XmlElement xe1 = xmldoc.CreateElement("outline"); xe1.SetAttribute("text", "Tsina");//设置该节点title属性 xe1.SetAttribute("title", "Tsina");//设置该节点title属性 --第一层的outline节点的属性表示的是RSS的标签或者说是文件夹 //下面就要开始为此文件夹节点添加下属子节点,也就是添加一些实质的RSS地址了 string strTitle = string.Empty; string strText = string.Empty; string strXmlUrl = string.Empty; string strHtmlUrl = string.Empty; for (int i = 0; i < dt.Rows.Count; i++) { strTitle = dt.Rows[i]["NAME"].ToString().Trim(); strText = strTitle; strXmlUrl = "http://medcl.net/SinaRss.aspx?uid=" + dt.Rows[i]["IDNum"].ToString().Trim(); strHtmlUrl = "http://t.sina.com.cn/" + dt.Rows[i]["IDNum"].ToString().Trim(); XmlElement xesub1 = xmldoc.CreateElement("outline"); xesub1.SetAttribute("text", strText);//设置该节点title属性 xesub1.SetAttribute("title", strTitle);//设置该节点title属性 --第一层的outline节点的属性表示的是RSS的标签或者说是文件夹 xesub1.SetAttribute("type", "rss"); xesub1.SetAttribute("xmlUrl", strXmlUrl); xesub1.SetAttribute("htmlUrl", strHtmlUrl); xe1.AppendChild(xesub1);//添加到<Node>节点中 } xeBody.AppendChild(xe1); //保存创建好的XML文档 xmldoc.Save(Server.MapPath("RssReader.xml")); } 登入後複製 |
|
最后在指定的目录下,程序就自动生成了一个RssReader.xml的文件了。大功告成了!
然后将此文件就可以导入到任何一个RSS阅读器中了,用户就能够通过RSS阅读器来获取微博信息了,而且现在的RSS阅读器都有个一键转贴到微博的功能,很方便的,不想转到自己微博的,也可以通过RSS阅读器直接收藏到阅读器中。辛苦了两天,今天能有这么一点小成果,还是觉得很不错的,呵呵,也祝大家也能好运。本次代码比较还需要各种完善,比如,如何将所以的数据写成一个XML文件,这个笔者就暂时不做了,留给大家去做吧。
Rss阅读器效果图如下:
【相关推荐】
1. RSS高校入门教程
以上是呼叫API產生RSS資源檔的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!