学习使用新浪接口随笔(一)_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 学习使用新浪接口随笔(一)

学习使用新浪接口随笔(一)

 2013/8/9 13:22:10  Manofthecursed  博客园  我要评论(0)
  • 摘要:小生初入C#领域,因为学校部门里面在办新浪微博活动的时候,需要统计转发数量。(个别团或者班级会去买转发数量,这没节操的),所以有的时候统计起来的时候,会比较麻烦。于是就产生了想利用新浪的API制作一个能统计微博转发数量的工具,因为学校里面微博的转发量不会很大,而且新浪上面的的应用又要钱。。。。具体就是把转发过微博的昵称记录下来,存到Excel文件当中,再对Excel文件里的名称那一列进行排序,去掉重复的。为了加深理解和记录下编程中遇到的问题,所以就写了这个随笔。1.去新浪开放平台申请一个应用
  • 标签:学习 使用 新浪 接口 随笔

小生初入C#领域,因为学校部门里面在办新浪微博活动的时候,需要统计转发数量。(个别团或者班级会去买转发数量,这没节操的),所以有的时候统计起来的时候,会比较麻烦。于是就产生了想利用新浪的API制作一个能统计微博转发数量的工具,因为学校里面微博的转发量不会很大,而且新浪上面的的应用又要钱。。。。具体就是把转发过微博的昵称记录下来,存到Excel文件当中,再对Excel文件里的名称那一列进行排序,去掉重复的。为了加深理解和记录下编程中遇到的问题,所以就写了这个随笔

1.去新浪开放平台申请一个应用(当然这个应用是不需要提交到新浪那边审核的,因为我只是自己使用而已)

2.申请完毕后,可以在应用信息那边得到App Key、App Secret、Access Token(这个可以通过调用OAuth)的方法得到。

3.写程序

4.测试使用

新建项目什么的就不说了,我用的是VS2012,新建了个WPF的项目,因为对WPF的效果还是蛮看好的。代码部分我上网找了一些例子看的。

//其他的using就不贴了
using NetDimension.Weibo;

//获得AcessToken的方法
//因为我的AppKey和AppSecrect都存在了Settings.settings里面
OAuth o = new OAuth(Properties.Settings.Default.AppKey, Properties.Settings.Default.AppSecrect);           
            string username = this.txtUserName.Text;
            string userpwd = this.txtUserPwd.Password;
            try
            {
          //使用账户登录(指的是申请应用使用到的帐号,或者可以自己设置15个测试帐号(在未经过新浪审核的条件下,只能设置15个测试帐号))
if (o.ClientLogin(username, userpwd)) { AccessToken accessToken = o.GetAccessTokenByPassword(username, userpwd); //请注意这里返回的是AccessToken对象,不是string } } catch (WeiboException ex) { MessageBox.Show(ex.Message); } return o;

接下来是在统计转发数量遇到的问题。

新浪API里面有个接口statuses/querymid和statuses/queryid 分别是通过mid和id获取对方的值。

因为在单条微博的地址栏里面,只能得到mid,就是类似A3Bhu9rW6的东西,所以我调用了statuses/querymid接口,然后调用statuses/show接口显示这条微博的信息。

string[] MIDlist = this.txtIDlist.Text.Split(',');
            foreach (string msgid in MIDlist)
            {
                try
                {
                    string id = _sina.API.Entity.Statuses.QueryID(1, false, true, msgid);
                    var _msgInfo = _sina.API.Entity.Statuses.Show(id);
                    string meg = " The message ID:" + id + "\n reposts_count:" + _msgInfo.RepostsCount + "\n";
                    RText(meg);
                }
                catch
                {
                    MessageBox.Show("这ID有问题吧。。。。");
                }
            }

到这里其实都没什么问题,早上在测试转发数量大于50条的微博的时候,出现了一个问题。

statuses/repost_timeline接口可以得到转发数量的详细json信息,官方的解释,这个接口只能获取最新的2000条记录,数据的结构有点让我凌乱,昨天解析这个数据的时候,多谢@dudu大神的指导,使用Json.NET并通过下面的代码提取转发人的名称。

var jObject = JObject.Parse(jsonStr);

Console.WriteLine(jObject["reposts"][0]["user"]);

statuses/repost_timeline接口默认每一页是50条数据,我实际测起来是这样,而不是官方文档里面说的20条。一旦大于50条的数据,就要通过接口里面的page属性,翻页查询。

foreach (string msgid in MIDlist)
            {
                try
                {
                    
                    string id = _sina.API.Entity.Statuses.QueryID(1, false, true, msgid);
                    int x = _sina.API.Entity.Statuses.RepostTimeline(id).TotalNumber;
                    string[] Rname = new string[x];
                    sb.Append("\n Reposts Count:" + x);
                    sb.Append("\n The message ID:" + id);
                    //Statuses.RepostTimeline接口默认读取50条数据
                    //如果数据大于50条,则进行分批读取                    
                    int m=0;
                    if (x > 50)
                    {
                        for (int i = 1; i < x / 50 + 1; i++)
                        {
                            var _msgInfo = _sina.API.Entity.Statuses.RepostTimeline(id, "0", "0", 50, i, 0);
                            //IEnumerable<Entity> collection=_msgInfo.Statuses;
                            //collection.Count();
                            var jObject = JObject.Parse(_msgInfo.ToString());
                            for (int n = 0; n < _msgInfo.Statuses.Count(); n++)
                            {
                                sb.Append("\n Reposts User:" + jObject["reposts"][n]["user"]["name"]);
                                Rname[m] = jObject["reposts"][n]["user"]["name"].ToString();
                                m++;
                            }
                            sb.Append("\n--------------");
                        }
                    }
                    else
                    {
                        var _msgInfos = _sina.API.Entity.Statuses.RepostTimeline(id);
                        var jObjects = JObject.Parse(_msgInfos.ToString());
                        for (int n = 0; n < _msgInfos.Statuses.Count(); n++)
                        {
                            sb.Append("\n Reposts User:" + jObjects["reposts"][n]["user"]["name"]);
                            Rname[m] = jObjects["reposts"][n]["user"]["name"].ToString();
                            m++;
                        }
                        sb.Append("\n--------------");
                    }
                    RText(sb.ToString());
                    _t.Create_Excel(Rname, x);             
                }
                
      catch (WeiboException ex)
            {
                MessageBox.Show(ex.Message);
            }


当时一直在纠结怎么取出每次读取的数据实际的数量,因为在最后一页当中,不可能都是50条数据,有可能是40、30等等。后来才发现_msgInfo.Statuses.Count()这句代码就可以直接得到数量。。。。

这些就是目前遇到的问题,下一步,想研究下大于2000条的数据要怎么取出来的,然后再加个抽奖的小功能。

PS:小生希望有大神看到这个随笔的时候,能给与一些指导哈,我知道我的代码有一些不规范,而且初次调用这些接口,处理方式肯定有一些不对的地方!

 

 

发表评论
用户名: 匿名