由于做实验需要用到新浪微博的数据,尝试了一些方法都不太好用,最后只有用新浪提供的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认证”是一个关于使用OAuth授权机制与新浪微博API进行交互的技术主题。OAuth是一种开放标准,允许用户提供一个令牌,而不是用户名和密码来访问他们存储在特定服务提供者的数据。在微博...
新浪微博API(应用程序编程接口)允许开发者访问微博的数据,从而开发出各种基于微博的应用程序。本毕业设计旨在利用Java编程语言,通过对新浪微博API的调用,实现一个具有实际应用价值的微博相关应用程序。 二、...
总结来说,通过Java和Weibo4J,我们可以便捷地从新浪微博API获取用户信息,并结合MySQL数据库实现数据的存储和管理。这一过程涉及了OAuth2认证、API调用、JSON解析、数据库操作等多个关键环节,是Web开发中常见的...
对于新浪微博API,它提供了一系列的HTTP接口,通过这些接口,开发者可以进行关注、取关、获取用户信息、发送微博等一系列操作。 在“取消关注”这个功能上,我们需要使用到的是微博API中的“取消关注”接口。通常,...
新浪微博API开发Web应用是一项技术性强且充满挑战的任务,它涉及到互联网应用程序与社交媒体平台的深度集成。在这个过程中,开发者需要理解并掌握一系列关键概念和技术,以实现有效的数据交互和功能实现。以下是对...
在Android版新浪微博API中,OAuth2.0用于获取访问令牌,使应用能够代表用户执行各种操作。 1. **申请接入**: 开发者需要在新浪开放平台注册并创建应用,获取App Key和App Secret。这两个参数在后续的授权流程中至关...
本项目的主要目标是开发一个功能强大、易于使用的Java应用程序,通过新浪微博API实现对微博平台的各种操作。用户可以通过该应用程序方便地进行微博内容的获取、发布、评论等操作,实现了更灵活、个性化的微博体验。
《新浪微博API文件及程序范例》 在当今的互联网时代,社交媒体平台成为了信息传播和交流的重要渠道。作为中国最受欢迎的社交网络之一,新浪微博(Sina Weibo)不仅为用户提供了分享生活点滴的平台,也为开发者提供...
标题“新浪微博登录 sina”指的是关于如何使用新浪开放平台的OAuth协议进行微博登录的教程或代码示例。在互联网开发中,OAuth是一种授权框架,允许第三方应用在用户授权的情况下,访问其存储在另一服务提供者上的...
1. **新浪API注册与认证**:在使用新浪微博API之前,你需要在新浪开放平台上注册一个开发者账号,申请应用并获取App Key和App Secret。这两个参数是之后与微博API通信时的身份验证凭证。 2. **授权流程**:本地会员...
这里提到的是新浪微博API,它是由新浪提供的一个接口,让开发者能够通过编程方式访问和操作新浪微博的数据,例如发布微博、获取用户信息、评论、转发等。 Java是一种广泛使用的面向对象的编程语言,具有跨平台的...
在使用新浪微博API时,OAuth2.0扮演着关键角色,确保了用户数据的安全性。开发者需要先注册应用,获取App Key和App Secret,然后引导用户进行授权,获取Access Token,以此来执行后续的API调用。 以下是使用新浪...
2. **请求签名**: 新浪微博API要求在请求中加入签名(Signature),这通常基于AppKey、AppSecret以及请求参数生成,用于防止数据被篡改。 3. **权限控制**: 不同的API权限等级不同,开发者需要明确哪些操作需要用户...
【标题】"毕业设计-新浪微博API的Java编程源代码"主要涵盖了使用Java语言与新浪微博API进行交互的开发实践。在毕业设计中,这样的项目通常旨在帮助学生深入理解Web服务接口的使用,以及如何将这些接口集成到实际应用...
新浪微博可以实现以下功能 1.获取最新的公共微博消息 2.获取当前登录用户及其所关注用户的最新微博消息 (别名: statuses/home_timeline) 3.获取用户发布的微博消息列表 4.获取@当前用户的微博列表 5.获取当前...
在新浪微博API中,这些接口提供了与微博平台交互的能力,例如获取用户信息、发送微博、评论、转发等。 2. **授权机制**:为了确保安全,微博API通常会采用OAuth或OAuth2这样的授权协议。开发者需要先申请应用,获得...
- **OAuth**:用于安全地获取新浪微博的访问权限,允许程序代表用户进行操作。 - **API集成**:理解新浪的开放API,包括发送微博的接口规范。 - **JSON解析**:API通常返回或接收JSON格式的数据,需要能够解析和构造...
C#新浪微博验证程序是一款基于C#编程语言开发的应用,主要用于实现微博用户在第三方网站上的身份验证。这个程序的核心功能是利用OAuth授权协议,允许用户使用其新浪微博账号登录到非新浪的网站,从而提高用户体验,...