`
Jelen_123
  • 浏览: 71040 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

新浪微博API下载用户微博程序

阅读更多

     由于做实验需要用到新浪微博的数据,尝试了一些方法都不太好用,最后只有用新浪提供的API进行下载,新浪对于普通用户的数据下载是有限制的,一个的IP限制,一个是用户限制,很纠结的,要每天都要重新申请token,没有办法,只能老老实实的每天申请一次了,我是申请了七个应用,用一个账号,一次可以得到七个token,每个小时可以有7000个请求,大概差不多了,下载程序也是根据这个来完成。当然有条件的可以通过一个应用多加几个用户或者通过动态IP的方式也是可以实现的。对于获取token,我还是老老实实的一个一个获取,很麻烦,有能力的可以通过解析获取到的请求信息来获取。在这里没有加入获取token的程序。

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import weibo4j.Timeline;
import weibo4j.Weibo;
import weibo4j.model.Paging;
import weibo4j.model.Status;
import weibo4j.model.StatusWapper;
import weibo4j.model.WeiboException;

/**
* 下载用户的所有的微博信息,只需要微博的tid和转发次数即可
* @author Liuxingyun
*
*/
public class DownloadUserTweete {
   
   static int number = 1;
   /**
    * 获取某个用户发表的最新微博,根据id
    * 只需要微博的id即可
    * @param uid 需要获取微博的用户
    * @param nickName  用户昵称
    * @param tweetCount   用户的微博总数
    * @param bw  写入文件的信息流
    * @throws WeiboException
    * @throws IOException
    */
   public void getTweet(String uid,String nickName,int tweetCount,BufferedWriter bw) throws WeiboException, IOException
   {
       
       int numPerPage = 100;        //每页获取的微博数
       int pageCount = tweetCount/numPerPage + 1;  //总页数
       Timeline timeline = new Timeline();
       StatusWapper sw;
       List<Status> status = new ArrayList<Status>();
       for(int j = 1; j <= pageCount; j++)
       {
           System.out.println(uid+"用户共"+pageCount+"页正在进行"+"第"+j+"页下载.......");
           Paging page = new Paging(j);
           page.setCount(numPerPage);
           try {
                   sw = timeline.getUserTimelineByUid(uid, page, 0, 0);
                   status = sw.getStatuses();
                   for(Status s : status)
                   {
                       //System.out.println(i+"--"+uid+"--"+s.getId()+"--"+s.getRepostsCount());
                       if(s.getText().equals("此微博已被删除。"))  //微博删除则标记为deleted
                       {
                           bw.write(uid+"--deleted");
                       }
                       if(s.getSource() == null)//微博不存在异常
                       {
                           bw.write(uid+"--not exit");
                       }
                       else
                       {
                           bw.write(uid+",,"+nickName+",,"+s.getId()+",,"+s.getText()+",,"+s.getSource()+",,"+s.getCreatedAt()+",,"+s.isFavorited()+",,"+s.getRepostsCount()+",,"+s.getCommentsCount());// 获取对应的微博id和转发次数
                           //System.out.println(uid+"--"+s.getId()+"--"+s.getRepostsCount());
                       }
                       bw.newLine();
               }
           } catch (WeiboException e) {
               e.printStackTrace();
               //bw.close();
           }    
       }
   }
   

   /**
    * 根据微博id,获取微博信息
    * 只需要微博的id即可
    * @param tid 需要获取微博的id
    * @param bw  写入文件的信息流
    * @throws WeiboException
    * @throws IOException
    */
   public void getTweet(String uid,String nickName,String tid,BufferedWriter bw) throws WeiboException, IOException
   {
       
       Timeline timeline = new Timeline();
       Status status;
       String isRetweet;
       try {
               status = timeline.showStatus(tid);
                       //System.out.println(i+"--"+uid+"--"+s.getId()+"--"+s.getRepostsCount());
               if(status.getText().equals("此微博已被删除。")){  //微博删除则标记为deleted    
                       bw.write(uid+",0,deleted");
                   }
                   if(status.getSource() == null){          //微博不存在异常
                       bw.write(uid+",0,not exit");
                   }
                   else{
                       if(status.getRetweetedStatus() == null)   //如果是null,那么就是原创的
                           isRetweet = "false";
                       else
                           isRetweet = "true";
                       bw.write(uid+",0,"+nickName+",0,"+status.getId()+",0,"+status.getText()+",0,"+status.getSource()+",0,"+status.getCreatedAt()+",0,"+status.isFavorited()+",0,"+status.getRepostsCount()+",0,"+status.getCommentsCount()+",0,"+isRetweet);// 获取对应的微博id和转发次数
                           //System.out.println(uid+"--"+s.getId()+"--"+s.getRepostsCount());
                   }
                   bw.newLine();
           } catch (WeiboException e) {
               e.printStackTrace();
               //bw.close();
           }    
   }
   
   /**
    * 获取用户的所有的微博tid和转发次数,自动执行
    *
    * 因为每个token一个小时只有150次,而服务器一个小时有1000次,为了充分利用服务器资源
    * 申请了七个应用,每个应用有一个token,在一个小时内循环调用不同的token,则一个小时
    * 内可以获取980个请求的数据。同时将已经读取的文件的行删除更新到新的行,等待下一次重新
    * 读取该文件的新数据信息
    * @throws IOException
    */
   public void getTweets() throws IOException, WeiboException
   {
       
       String retweetIdsFile = "DATA/downloadretweet/uid-fnickname-wid-text-source-date-shoucang-retweetcount-commentcount1.txt";  //已获取微博id和tweetcount的文件路径
       FileUtil fu = new FileUtil();
       String[] tokens = {                            //七个应用的七个token循环调用
               "2.00DdJ8lBpRRC5E10561e1d81hYRH5D",
               "2.00DdJ8lB0xzLPB1ee31551160ixrIZ",
               "2.00DdJ8lBSiwMBE2b8caac185NNCC2E",
               "2.00DdJ8lB0JbR_S422bb3747a0z7LIB",
               "2.00DdJ8lBTBYz6Eb1fef2b31auC7OGB",
               "2.00DdJ8lBQ_jEAE1a0f5ddc66pKysXD",
               "2.00DdJ8lB0FVbrafafc4e5bf0xkPSZC"
               };
       String path = "DATA/downloadretweet/1/uid-fnickname-wid-text-source-date-shoucang-retweetcount-commentcount1";  //保存获取到的数据的文件前缀
       String format = ".txt";
       BufferedWriter bw;
       String[] words;
       String filePath = path + number + format; //保存获取到的数据的文件路径
       bw = fu.writeFile(filePath);
       for(int i = 0; i < tokens.length; i++)  //循环调用token
       {  
           System.out.println(tokens[i]+":");
           Weibo weibo = new Weibo();
           weibo.setToken(tokens[i]);          //重设token
           Timeline timeline = new Timeline();
           List<String> lines = fu.getPartfromFile(retweetIdsFile, 142); //获取前N行的数据
           try{            
               for(String l:lines)
               {
                   if(l.contains(",,")){
                       words = l.split(",,");
                       getTweet(words[0],words[1],words[2],bw);
                   }
               }
           }catch(Exception e)
           {
               e.getStackTrace();
               bw.close();
           }
           fu.deletePartfromFile(retweetIdsFile, lines);//删除已经读取过的行,并更新文件
       }
       bw.close();
   }

   /**
    *设置定时器,每隔一个小时执行一次程序 ,一天执行23次
    *执行一次生成一个文件
    */
   public  void operateOnTime()
   {
          TimerTask task = new TimerTask()
          {
              int count = 1;
              public void run()
              {
                  System.out.println("第"+count+"个小时执行");
                   if(count>23)
                        System.exit(0);
                   try
                   {
                       System.out.println("开始第"+number+"个文件下载------");
                       getTweets();
                       System.out.println("结束第"+number+"个文件下载!");
                       number++;
                       
                   } catch (IOException e)
                   {
                       e.printStackTrace();
                   } catch (WeiboException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                   }
                   count++;
               }
          };
          Timer timer = new Timer();
          // 设值 5 秒钟后开始执行第一次,以后每隔 一个小时执行一次
          timer.schedule(task, 1 * 1000, 3650  * 1000);
   }
   public static void main(String[] args) throws WeiboException, IOException
   {
       DownloadUserTweete getTweet = new DownloadUserTweete();
       getTweet.operateOnTime();
      
   }

   
}

分享到:
评论

相关推荐

    新浪微博 api Oauth认证.

    【标题】:“新浪微博API OAuth认证”是一个关于使用OAuth授权机制与新浪微博API进行交互的技术主题。OAuth是一种开放标准,允许用户提供一个令牌,而不是用户名和密码来访问他们存储在特定服务提供者的数据。在微博...

    毕业设计,关于新浪微博API的Java编程

    新浪微博API(应用程序编程接口)允许开发者访问微博的数据,从而开发出各种基于微博的应用程序。本毕业设计旨在利用Java编程语言,通过对新浪微博API的调用,实现一个具有实际应用价值的微博相关应用程序。 二、...

    新浪微博API提取个人信息

    总结来说,通过Java和Weibo4J,我们可以便捷地从新浪微博API获取用户信息,并结合MySQL数据库实现数据的存储和管理。这一过程涉及了OAuth2认证、API调用、JSON解析、数据库操作等多个关键环节,是Web开发中常见的...

    新浪微博API-取消关注

    对于新浪微博API,它提供了一系列的HTTP接口,通过这些接口,开发者可以进行关注、取关、获取用户信息、发送微博等一系列操作。 在“取消关注”这个功能上,我们需要使用到的是微博API中的“取消关注”接口。通常,...

    新浪微博API开发WEB应用

    新浪微博API开发Web应用是一项技术性强且充满挑战的任务,它涉及到互联网应用程序与社交媒体平台的深度集成。在这个过程中,开发者需要理解并掌握一系列关键概念和技术,以实现有效的数据交互和功能实现。以下是对...

    Android版新浪微博API(OAuth2.0授权)

    在Android版新浪微博API中,OAuth2.0用于获取访问令牌,使应用能够代表用户执行各种操作。 1. **申请接入**: 开发者需要在新浪开放平台注册并创建应用,获取App Key和App Secret。这两个参数在后续的授权流程中至关...

    毕业设计,关于新浪微博API的Java编程..zip

    本项目的主要目标是开发一个功能强大、易于使用的Java应用程序,通过新浪微博API实现对微博平台的各种操作。用户可以通过该应用程序方便地进行微博内容的获取、发布、评论等操作,实现了更灵活、个性化的微博体验。

    新浪微博API文件及程序范例

    《新浪微博API文件及程序范例》 在当今的互联网时代,社交媒体平台成为了信息传播和交流的重要渠道。作为中国最受欢迎的社交网络之一,新浪微博(Sina Weibo)不仅为用户提供了分享生活点滴的平台,也为开发者提供...

    新浪微博登录 sina

    标题“新浪微博登录 sina”指的是关于如何使用新浪开放平台的OAuth协议进行微博登录的教程或代码示例。在互联网开发中,OAuth是一种授权框架,允许第三方应用在用户授权的情况下,访问其存储在另一服务提供者上的...

    本地会员与新浪微博api绑定和同步登陆(文件 数据库 教程)

    1. **新浪API注册与认证**:在使用新浪微博API之前,你需要在新浪开放平台上注册一个开发者账号,申请应用并获取App Key和App Secret。这两个参数是之后与微博API通信时的身份验证凭证。 2. **授权流程**:本地会员...

    新浪微博api调用实例 java 测试过

    这里提到的是新浪微博API,它是由新浪提供的一个接口,让开发者能够通过编程方式访问和操作新浪微博的数据,例如发布微博、获取用户信息、评论、转发等。 Java是一种广泛使用的面向对象的编程语言,具有跨平台的...

    新浪微博开放平台API使用笔记及演示程序

    在使用新浪微博API时,OAuth2.0扮演着关键角色,确保了用户数据的安全性。开发者需要先注册应用,获取App Key和App Secret,然后引导用户进行授权,获取Access Token,以此来执行后续的API调用。 以下是使用新浪...

    新浪微博第三方登陆API

    2. **请求签名**: 新浪微博API要求在请求中加入签名(Signature),这通常基于AppKey、AppSecret以及请求参数生成,用于防止数据被篡改。 3. **权限控制**: 不同的API权限等级不同,开发者需要明确哪些操作需要用户...

    毕业设计-新浪微博API的Java编程源代码

    【标题】"毕业设计-新浪微博API的Java编程源代码"主要涵盖了使用Java语言与新浪微博API进行交互的开发实践。在毕业设计中,这样的项目通常旨在帮助学生深入理解Web服务接口的使用,以及如何将这些接口集成到实际应用...

    新浪微博api接口开发实例c#

    新浪微博可以实现以下功能 1.获取最新的公共微博消息 2.获取当前登录用户及其所关注用户的最新微博消息 (别名: statuses/home_timeline) 3.获取用户发布的微博消息列表 4.获取@当前用户的微博列表 5.获取当前...

    新浪微博API

    在新浪微博API中,这些接口提供了与微博平台交互的能力,例如获取用户信息、发送微博、评论、转发等。 2. **授权机制**:为了确保安全,微博API通常会采用OAuth或OAuth2这样的授权协议。开发者需要先申请应用,获得...

    定时发送 新浪微博 程序 c# 实现 所有源码

    - **OAuth**:用于安全地获取新浪微博的访问权限,允许程序代表用户进行操作。 - **API集成**:理解新浪的开放API,包括发送微博的接口规范。 - **JSON解析**:API通常返回或接收JSON格式的数据,需要能够解析和构造...

    C#新浪微博验证程序

    C#新浪微博验证程序是一款基于C#编程语言开发的应用,主要用于实现微博用户在第三方网站上的身份验证。这个程序的核心功能是利用OAuth授权协议,允许用户使用其新浪微博账号登录到非新浪的网站,从而提高用户体验,...

Global site tag (gtag.js) - Google Analytics