Processing 如何在我的处理+;Twitter4j应用程序?
我在处理中使用Twitter4j库来检索推文。我已经在我的应用程序中添加了一个计时器,这样它就可以在适当的时间间隔收集tweet,而不会多次点击twitterapi。然而,我在实现Since_Id参数时遇到了困难,因为我无法向前(而不是像现在这样向后)通过tweet的时间线。我如何跟踪MAX_ID,以便在计时器通知我的应用程序再次运行时将该值输入下一个间隔Processing 如何在我的处理+;Twitter4j应用程序?,processing,twitter4j,Processing,Twitter4j,我在处理中使用Twitter4j库来检索推文。我已经在我的应用程序中添加了一个计时器,这样它就可以在适当的时间间隔收集tweet,而不会多次点击twitterapi。然而,我在实现Since_Id参数时遇到了困难,因为我无法向前(而不是像现在这样向后)通过tweet的时间线。我如何跟踪MAX_ID,以便在计时器通知我的应用程序再次运行时将该值输入下一个间隔 Timer timer; import java.util.List; void setup() { timer = new Ti
Timer timer;
import java.util.List;
void setup() {
timer = new Timer(30000);
timer.start();
goTwitter();
}
void draw(){
if (timer.isFinished()){
goTwitter();
timer.start();
}
}
void goTwitter(){
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setOAuthConsumerKey("");
cb.setOAuthConsumerSecret("");
cb.setOAuthAccessToken("");
cb.setOAuthAccessTokenSecret("");
Twitter twitter = new TwitterFactory(cb.build()).getInstance();
Query query = new Query("#processing");
int numberOfTweets = 300;
long lastID = Long.MAX_VALUE;
ArrayList<Status> tweets = new ArrayList<Status>();
while (tweets.size () < numberOfTweets) {
if (numberOfTweets - tweets.size() > 100)
query.setCount(100);
else
query.setCount(numberOfTweets - tweets.size());
try {
QueryResult result = twitter.search(query);
tweets.addAll(result.getTweets());
println("Gathered " + tweets.size() + " tweets");
for (Status t: tweets)
if(t.getId() < lastID) lastID = t.getId();
}
catch (TwitterException te) {
println("Couldn't connect: " + te);
};
query.setMaxId(lastID-1);
}
for (int i = 0; i < tweets.size(); i++) {
Status t = (Status) tweets.get(i);
GeoLocation loc = t.getGeoLocation();
String user = t.getUser().getScreenName();
String msg = t.getText();
String time = "";
if (loc!=null) {
Double lat = t.getGeoLocation().getLatitude();
Double lon = t.getGeoLocation().getLongitude();
println(i + " USER: " + user + " wrote: " + msg + " located at " + lat + ", " + lon);
}
}
println("lastID= " + lastID);
}
class Timer {
int savedTime;
int totalTime;
Timer (int tempTotalTime) {
totalTime = tempTotalTime;
}
void start(){
savedTime = millis();
}
boolean isFinished() {
int passedTime = millis() - savedTime;
if (passedTime > totalTime){
return true;
} else {
return false;
}
}
}
定时器;
导入java.util.List;
无效设置(){
定时器=新定时器(30000);
timer.start();
goTwitter();
}
作废提款(){
if(timer.isFinished()){
goTwitter();
timer.start();
}
}
void goTwitter(){
ConfigurationBuilder cb=新的ConfigurationBuilder();
cb.setOAuthConsumerKey(“”);
cb.SetOAuthConsumerCret(“”);
cb.setOAuthAccessToken(“”);
cb.setOAuthAccessTokenSecret(“”);
Twitter=newtwitterfactory(cb.build()).getInstance();
查询=新查询(“处理”);
int numberOfTweets=300;
long lastID=long.MAX_值;
ArrayList tweets=新建ArrayList();
while(tweets.size()100)
query.setCount(100);
其他的
setCount(numberOfTweets-tweets.size());
试一试{
QueryResult result=twitter.search(查询);
addAll(result.getTweets());
println(“收集的”+tweets.size()+tweets”);
对于(状态t:tweets)
如果(t.getId()总时间){
返回true;
}否则{
返回false;
}
}
}
你可以接电话
long lastID = Long.MAX_VALUE;
把它移到正上方
void setup() {
像这样:
long lastID = Long.MAX_VALUE;
void setup() {
从本质上讲,它是一个可以被处理草图中的每个方法访问的变量,一种“全局变量”。另外,如果您希望它在每次达到tweet数量后重新启动,您应该更改while循环中的else子句,并使其如下所示
else {
query.setCount(numberOfTweets - tweets.size());
long lastID = Long.MAX_VALUE;
}
再次感谢你,佩特罗斯!还有一个问题:为了在时间轴中前进一步并使用您建议的全局变量,我是否应该将“query.setMaxID()”更改为“query.setinceid()”?我希望我的应用程序以设定的时间间隔收集最新的推文,以最大限度地减少我在时间轴中向后搜索得到的冗余结果。我想你可以使用它,我可以看到它的好处,但你必须以不同的方式思考你的循环。。。还有一些问题需要你思考。比如如果你长时间不更新,并且有很多推特,会发生什么。你想要所有的推文直到你上次更新的时候,还是只想要最后的300条,不管中间是什么?你是要存储推文,并且只在创建推文时检索新推文,还是总是想获取新推文,以及你已经拥有的推文,直到达到一个数字?实际上,你为什么不将问题拆分为另一个问题?