> 백엔드 개발 > XML/RSS 튜토리얼 > RSS 리소스 파일 생성을 위한 API 호출 예시에 대한 자세한 설명

RSS 리소스 파일 생성을 위한 API 호출 예시에 대한 자세한 설명

Y2J
풀어 주다: 2017-05-05 09:49:29
원래의
3771명이 탐색했습니다.

C#은 Sina Weibo API를 호출하여 RSS 리소스 파일을 생성합니다(소스 파일 데모)

Sina Weibo는 현재 탄력을 받고 있는 것으로 보이며 많은 사람들이 설정하고 있습니다. 웨이보에 있을 때는 처음에는 호기심으로 많은 사람들을 팔로우했지만, 시간이 지나면서 친구 수가 100명이 넘으면 완전히 정보의 홍수에 빠져들게 됩니다. 너무 많은 사람을 팔로우했습니다. 모든 사람은 앞으로는 전혀 생각하지도 못할 수도 있고, 앞으로는 볼 수도 없는 사람일 것입니다. 이는 분명히 '팔로우'의 목적에 어긋나는 일이며, 단순히 아는 사람에 대한 뉴스를 보고 싶을 수도 있습니다. 업데이트? 하지만 당연히 팔로우하는 사람의 목록을 하나씩 클릭하고 그 사람의 홈페이지를 하나씩 방문할 수는 없습니다. 이 작업은 너무 번거롭습니다.

RSS 리더를 사용해 본 사용자라면 정보 획득에 있어 RSS 리더의 우수성을 실감했을 것입니다. RSS 리소스의 업데이트를 실시간으로 추적하고 지정된 구독 리소스 뒤에 있는 업데이트 수를 표시할 수 있습니다. 이는 사용자가 타겟 방식으로 정보를 볼 수 있게 하며, 사용자가 정보를 수동적으로 받아들이는 대신 적극적으로 정보를 얻을 수 있게 해줍니다. 왜냐하면 웨이보의 '정보 홍수' 문제를 해결하는 것은 매우 효과적이기 때문입니다.

저자는 며칠을 투자하여 마침내 특정 사용자의 친구를 구해 ACCESS 데이터베이스에 저장 및 백업한 후 RSS 읽기 리소스를 생성하는 프로그램을 작성했습니다. 감히 혼자만 간직할 수가 없어서 소스를 공개하고 모든 사람과 공유합니다. 나중에 시간이 된다면 프로그램을 이해하지 못하는 사용자들의 조작을 용이하게 하기 위해 데스크탑 소프트웨어로 만들어보고 싶습니다.

1. Sina Weibo RSS타사 웹사이트 구독

Sina Weibo 자체에서는 RSS 구독을 제공하지 않습니다. 그러나 온라인에서 을 검색하여 Sina Weibo에 대한 RSS 리소스를 제공하는 타사 웹사이트를 찾았습니다. 따라서 이 기사의 RSS 구독은 모두 이 타사 웹사이트를 기반으로 합니다.

log.medcl.net/item/2010/02/sina-bo-rss-subscribe-feed-generate-micro/

온라인 공통 OPML 파일 XML 형식

다음은 Google 리더에서 내보낸 opml 파일로, 네트워크 RSS를 읽어오는 것입니다. RSS 리더 또는 모든 RSS 리더의 표준 형식입니다. 적어도 "Xianguo" 및 "Youdao"와 같이 더 널리 사용되는 온라인 리더는 이 형식의 파일 가져오기를 지원합니다.

<?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 파일의 구조를 분석한 다음 프로그램을 사용하여 편리하게 이 구조의 파일에 필요한 정보를 작성합니다. 독자가참조합니다. OPML 파일은 헤더 태그 (주로 이 파일의 일부 주석으로 구성되며 이는 실제 RSS 구독 정보에 영향을 주지 않으며 그다지 중요하지 않습니다.) 및 구독 리소스 모든 데이터 소스를 추출합니다. 노드 아래에는 첫 번째 수준의 노드가 있으며, 이 노드는 RSS 리더의 RSS 리소스 분류된 폴더와 관련된 정보에 해당하며, 그 다음 첫 번째는 -level 아래는 RSS 리소스의 관련 데이터 내용을 포함하는 보조 태그 쌍입니다. 두 번째 수준 에 있는 노드의 몇 가지 중요한 속성 : text는 리소스의 제목을 나타내고, htmlUrl은 정보의 웹 페이지 주소를 나타내며, xmlUrl은 정보의 RSS 구독 주소를 나타냅니다. .

3. Sina Weibo API—서버에서 사용자 친구 데이터를 로컬 XML 파일로 내보내기

Sina Weibo API에 대한 자세한 소개는 공식 Sina Weibo API 웹사이트를 참조하세요:

open.t.sina.com.cn/wiki/index.php/Homepage

신원 인증 및 데이터 요청은 cnblogs를 참조하세요.

"Sina Weibo Open Platform 호출을 위한 .NET 코드 예시 인터페이스 "

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);

            }
        }
로그인 후 복사


RSS 리소스 파일 생성을 위한 API 호출 예시에 대한 자세한 설명为了程序设计简单一点,笔者就有点偷懒了,没有仔细研究如何将所有的数据写到一个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,这方便用户分多次到服务器上请求数据时可以此作为定位依据。

20

0</previous_cursor></p></td></tr></tbody></table><p><strong>4. </strong><strong>将XML</strong><strong>文件存储到ACCESS</strong><strong>数据库中进行备份</strong></p><p>如果不想备份的可以直接从第3步中到第5步,但是笔者,觉得将数据转换成此构架后,更加方便后来的程序操作以及浏览数据。</p><p>关于XML的详细方法参考:小气的鬼</p><p>《在C#.net中如何操作XML》</p><p>www.cnblogs.com/weekzero/archive/2005/06/21/178140.html</p><p>下面开始读取刚才从新浪微博服务器上请求得到的XML文件了。然后转换成ACCESS数据库内容。(当然你要先用ACCESS在指定目录下建立一个*.mdb文件用来存储数据)</p><p>下面是对单个XML文件进行读取,并插入到数据库中(这段代码是在<a href="//m.sbmmt.com/wiki/1494.html" target="_blank">ASP.NET</a>中写的)</p><table style="width: 400px;" border="0"><tbody><tr class="firstRow"><td valign="top" width="400" style="word-break: break-all;"><pre class="brush:c#;toolbar:false;"> public void readTsinaFriends(string fileName) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(Server.MapPath(fileName)); XmlNodeList nodeList = xmlDoc.SelectSingleNode("users").ChildNodes;//获取 根节点的所有子节点 ; //删除不用的一级节点,比如提示人数的所在位置的标记 XmlNode root = xmlDoc.SelectSingleNode("users"); // XmlNodeList xnl = xmlDoc.SelectSingleNode("Employees").ChildNodes; for (int k = 0; k < nodeList.Count; k++) { XmlElement xe = (XmlElement)nodeList.Item(k); if(xe.Name=="user") {//去掉XML文件中不需要的节点:next_cursor,previous_coursor以及user节点中的status,方便XML直接转换成DataTable XmlNodeList nodeList1 = xmlDoc.SelectNodes("users/user");//得到所有的标签user一级节点 foreach (XmlNode xmlNodeTemp in nodeList1) { if (xmlNodeTemp.LastChild.Name == "status")//移除每个user节点中的"status"子节点--(一般情况下此节点都放在最后一个,所以就不遍历了,直接地址定位) { xmlNodeTemp.RemoveChild(xmlNodeTemp.LastChild); } } } else if (xe.Name == "next_cursor" || xe.Name == "previous_cursor") { root.RemoveChild(xe); if (k < nodeList.Count) k = k - 1; } } string tbxml = xmlDoc.OuterXml; DataTable dt = new DataTable(); DataSet ds = new DataSet(); System.IO.StringReader reader = new System.IO.StringReader(tbxml); ds.ReadXml(reader); dt = ds.Tables[0];//如果XML文本中有同名的父子节点,那么此语句就会多读出一条数据,这可能是此API函数的局限性吧 DataTable dtCopy = dt.Copy(); //dtCopy.Columns.Remove("url"); //dtCopy.Columns.Remove("profile_image_url"); dtCopy.Columns.Remove("description"); //这个字段里面字符编码不太规则,在插入ACCESS的时候总有问题,而且用处不大,所以就去除了。(又偷懒了呃) DataRow drTemp = dtCopy.NewRow(); string strInsert = string.Empty; OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\coursware\\网络软文\\API_微波\\weibo.mdb"); aConnection.Open(); for (int i = 0; i < dtCopy.Rows.Count - 1; i++) { drTemp = dtCopy.Rows[i]; strInsert = "&#39;"+drTemp[0].ToString()+"&#39;,&#39;"; for (int j = 1; j < dtCopy.Columns.Count - 1; j++) { strInsert += (drTemp[j].ToString() + "&#39;,&#39;"); } strInsert += drTemp[dtCopy.Columns.Count - 1].ToString() + "&#39;"; string strCmd = "INSERT INTO Friends VALUES(" + strInsert + ")"; OleDbCommand command = new OleDbCommand(strCmd, aConnection); command.ExecuteNonQuery(); } aConnection.Close(); }
로그인 후 복사

对多个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中了。如下图所示:

RSS 리소스 파일 생성을 위한 API 호출 예시에 대한 자세한 설명

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 리소스 파일 생성을 위한 API 호출 예시에 대한 자세한 설명

然后将此文件就可以导入到任何一个RSS阅读器中了,用户就能够通过RSS阅读器来获取微博信息了,而且现在的RSS阅读器都有个一键转贴到微博的功能,很方便的,不想转到自己微博的,也可以通过RSS阅读器直接收藏到阅读器中。辛苦了两天,今天能有这么一点小成果,还是觉得很不错的,呵呵,也祝大家也能好运。本次代码比较还需要各种完善,比如,如何将所以的数据写成一个XML文件,这个笔者就暂时不做了,留给大家去做吧。

Rss阅读器效果图如下:

RSS 리소스 파일 생성을 위한 API 호출 예시에 대한 자세한 설명

【相关推荐】

1. RSS高校入门教程

위 내용은 RSS 리소스 파일 생성을 위한 API 호출 예시에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿