在这篇文章中,我们将为您详细介绍停止Twitter流并使用twitter4j返回状态列表的内容,并且讨论关于推特停止运行的相关问题。此外,我们还会涉及一些关于android–使用twitter4j库时
在这篇文章中,我们将为您详细介绍停止Twitter流并使用twitter4j返回状态列表的内容,并且讨论关于推特停止运行的相关问题。此外,我们还会涉及一些关于android – 使用twitter4j库时没有发现身份验证问题、android – 如何使用Twitter4j api在推文上回复?、android – 如何使用Twitter4j获取没有用户身份验证的Twitter公共时间线?、android – 没有TwitterLoginButton的Twitter登录的知识,以帮助您更全面地了解这个主题。
本文目录一览:- 停止Twitter流并使用twitter4j返回状态列表(推特停止运行)
- android – 使用twitter4j库时没有发现身份验证问题
- android – 如何使用Twitter4j api在推文上回复?
- android – 如何使用Twitter4j获取没有用户身份验证的Twitter公共时间线?
- android – 没有TwitterLoginButton的Twitter登录
停止Twitter流并使用twitter4j返回状态列表(推特停止运行)
使用Twitter4j提供的代码示例,我想在收集到1000个状态列表后停止流,并返回此列表。我怎样才能做到这一点?
public class Stream { public List<Status> execute throws TwitterException { List<Status> statuses = new ArrayList(); ConfigurationBuilder cb = new ConfigurationBuilder(); cb.setDebugEnabled(true); cb.setOAuthConsumerKey("bbb"); cb.setOAuthConsumerSecret("bbb"); cb.setOAuthAccessToken("bbb"); cb.setOAuthAccessTokenSecret("bbb"); TwitterStream twitterStream = new TwitterStreamFactory(cb.build()).getInstance(); StatusListener listener = new StatusListener() { public void onStatus(Status status) { statuses.add(status); if (statuses.size>1000){ //return statuses. Obviously that''s not the correct place for a return statement... } } public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) { System.out.println("Got a status deletion notice id:" + statusDeletionNotice.getStatusId()); } public void onTrackLimitationNotice(int numberOfLimitedStatuses) { System.out.println("Got track limitation notice:" + numberOfLimitedStatuses); } public void onScrubGeo(long userId, long upToStatusId) { System.out.println("Got scrub_geo event userId:" + userId + " upToStatusId:" + upToStatusId); } public void onException(Exception ex) { ex.printStackTrace(); } }; FilterQuery fq = new FilterQuery(); String keywords[] = {"Keyword 1", "Keyword 2"}; fq.track(keywords); twitterStream.addListener(listener); twitterStream.filter(fq);}
答案1
小编典典将异步代码强制进入同步模式不是一个好主意。换句话说:使您的check方法也异步,传递一个回调参数而不是返回一个值;并将回调传递给execRequest(只需s将对每个分配的调用替换为该回调)。正如Jai所建议的那样,您不一定需要在应用程序范围的事件总线上触发事件:它有助于解耦,但这并不总是您所需要/想要的。
查看是否可以重做逻辑。
但是,以下代码根据您的要求工作。
public class Stream { public static void main(String[] args) throws TwitterException { Stream stream = new Stream(); stream.execute(); } private final Object lock = new Object(); public List<Status> execute() throws TwitterException { final List<Status> statuses = new ArrayList(); ConfigurationBuilder cb = new ConfigurationBuilder(); cb.setDebugEnabled(true); cb.setOAuthConsumerKey("bbb"); cb.setOAuthConsumerSecret("bbb"); cb.setOAuthAccessToken("bbb"); cb.setOAuthAccessTokenSecret("bbb"); TwitterStream twitterStream = new TwitterStreamFactory(cb.build()) .getInstance(); StatusListener listener = new StatusListener() { public void onStatus(Status status) { statuses.add(status); System.out.println(statuses.size() + ":" + status.getText()); if (statuses.size() > 100) { synchronized (lock) { lock.notify(); } System.out.println("unlocked"); } } public void onDeletionNotice( StatusDeletionNotice statusDeletionNotice) { System.out.println("Got a status deletion notice id:" + statusDeletionNotice.getStatusId()); } public void onTrackLimitationNotice(int numberOfLimitedStatuses) { System.out.println("Got track limitation notice:" + numberOfLimitedStatuses); } public void onScrubGeo(long userId, long upToStatusId) { System.out.println("Got scrub_geo event userId:" + userId + " upToStatusId:" + upToStatusId); } public void onException(Exception ex) { ex.printStackTrace(); } @Override public void onStallWarning(StallWarning sw) { System.out.println(sw.getMessage()); } }; FilterQuery fq = new FilterQuery(); String keywords[] = { "federer", "nadal", "#Salute" }; fq.track(keywords); twitterStream.addListener(listener); twitterStream.filter(fq); try { synchronized (lock) { lock.wait(); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("returning statuses"); twitterStream.shutdown(); return statuses; }}
android – 使用twitter4j库时没有发现身份验证问题
我目前正致力于在我的Android应用程序中集成Twitter.我在一定程度上成功地整合了它.但是,我在以下方案中获得了无认证质询发现异常.
>我使用仅限App的身份验证(无需登录Twitter)从twitter获取公共提要.我成功取了它们.
>当我尝试回复或转发或将其标记为收藏时,我会检查用户是否已登录,如果未登录,则我首先尝试登录,然后进行回复或转发.
>但是我在尝试登录时遇到上述异常,所以我没有收到回复或转推.
注意:如果我不使用仅限应用程序身份验证并选择直接登录(不提取公共提要),那么它可以正常工作,我可以登录.
以下是堆栈跟踪:
11-14 19:33:03.597: W/System.err(3305): No authentication challenges found
11-14 19:33:03.667: W/System.err(3305): Relevant discussions can be found on the Internet at:
11-14 19:33:03.667: W/System.err(3305): http://www.google.co.jp/search?q=9ddbeb3a or
11-14 19:33:03.727: W/System.err(3305): http://www.google.co.jp/search?q=937eec8d
11-14 19:33:03.747: W/System.err(3305): TwitterException{exceptionCode=[9ddbeb3a-937eec8d c8a7b39b-dc5ea0d9], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.4}
11-14 19:33:03.797: W/System.err(3305): at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:177)
11-14 19:33:03.857: W/System.err(3305): at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61)
11-14 19:33:03.897: W/System.err(3305): at twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:98)
11-14 19:33:03.957: W/System.err(3305): at twitter4j.auth.OAuthAuthorization.getoAuthAccesstoken(OAuthAuthorization.java:145)
11-14 19:33:04.097: W/System.err(3305): at twitter4j.auth.OAuthAuthorization.getoAuthAccesstoken(OAuthAuthorization.java:165)
11-14 19:33:04.107: W/System.err(3305): at twitter4j.TwitterBaseImpl.getoAuthAccesstoken(TwitterBaseImpl.java:381)
编辑:
以下是我用于根据用户是否登录来切换配置的代码.
private TwitterInstance(boolean withLoginConfig) {
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder
.setoAuthConsumerKey(STAConstants.TWITTER_CONSUMER_KEY);
configurationBuilder
.setoAuthConsumerSecret(STAConstants.TWITTER_CONSUMER_SECRET);
// configuration required to fetch Feeds without login.
if (!withLoginConfig) {
configurationBuilder.setUseSSL(true);
// IMPORTANT: set T4J to use App-only authentication
configurationBuilder.setApplicationOnlyAuthEnabled(true);
configurationBuilder.setoAuth2TokenType(getoAuth2Token()
.getTokenType());
configurationBuilder.setoAuth2Accesstoken(getoAuth2Token()
.getAccesstoken());
}
Configuration configuration = configurationBuilder.build();
twitterFactory = new TwitterFactory(configuration);
twitter = twitterFactory.getInstance();
requestToken = null;
}
我也搜索了SO和其他网站上的解决方案,但没有得到任何解决方案.
任何帮助都非常感谢.
解决方法:
我做了很少的事情,终于找到了回答我自己的问题.因此张贴在这里.
Issue: No authentication challenges found
原因:登录后我没有在配置中发送Accesstoken和AccesstokenSecret.因此,它没有获得身份验证数据.
方案:
第1步:我使用仅限App的身份验证(无需登录Twitter)从twitter获取公共提要.我成功取了它们.为此我在配置中使用BearerToken如下:
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.setoAuthConsumerKey(Constants.TWITTER_CONSUMER_KEY);
configurationBuilder.setoAuthConsumerSecret(Constants.TWITTER_CONSUMER_SECRET);
configurationBuilder.setUseSSL(true);
// IMPORTANT: set T4J to use App-only authentication
configurationBuilder.setApplicationOnlyAuthEnabled(true);
configurationBuilder.setoAuth2TokenType(getoAuth2Token().getTokenType());
configurationBuilder.setoAuth2Accesstoken(getoAuth2Token().getAccesstoken());
第2步:当我尝试回复或转发或将其标记为收藏时,我检查用户是否已登录,如果未登录,则先尝试登录,然后进行回复或转发.为此,我使用以下配置.
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.setoAuthConsumerKey(Constants.TWITTER_CONSUMER_KEY);
configurationBuilder.setoAuthConsumerSecret(Constants.TWITTER_CONSUMER_SECRET);
这将给我RequestToken,它反过来将给我Accesstoken和AccesstokenSecret.
步骤3:此后,我对后续请求使用以下配置,没有任何问题.
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.setoAuthConsumerKey(Constants.TWITTER_CONSUMER_KEY);
configurationBuilder.setoAuthConsumerSecret(Constants.TWITTER_CONSUMER_SECRET);
configurationBuilder.setoAuthAccesstoken(getAccesstoken()); // from sharedPreferences
configurationBuilder.setoAuthAccesstokenSecret(getAccesstokenSecret()); // from sharedPreferences
android – 如何使用Twitter4j api在推文上回复?
public void tweetReply() { try { // System.out.println("Post Id= " + itemsObj.postId); Accesstoken a = new Accesstoken(twittertokens[0],twittertokens[1]); Twitter twitter = new TwitterFactory().getInstance(); twitter = new TwitterFactory().getInstance(); twitter.setoAuthConsumer(Constants.CONSUMER_KEY,Constants.CONSUMER_SECRET); twitter.setoAuthAccesstoken(a); Long id = new Long("236178766597087234"); twitter.updateStatus(new StatusUpdate("@lalitrajput024 this is to test For reply option ").inReplyToStatusId(id)); } catch (Exception e) { // Todo: handle exception } }
解决方法
public static void reply(long inReplyToStatusId,String text,double latitude,double longitude,TwitterFactory factory) throws TwitterException { Accesstoken accesstoken = loadAccesstoken(); Twitter twitter = factory.getInstance(); twitter.setoAuthConsumer(consumerKey,consumerSecrate); twitter.setoAuthAccesstoken(accesstoken); StatusUpdate stat= new StatusUpdate(text); stat.setInReplyToStatusId(inReplyToStatusId); GeoLocation location= new GeoLocation(latitude,longitude); stat.setLocation(location); twitter.updateStatus(stat); }'
我称之为
reply(238912922250792960l,"@praveena_kd testing reply",12.787,77.7578,factory);
android – 如何使用Twitter4j获取没有用户身份验证的Twitter公共时间线?
现在我也可以使用公共帐户的推文
ConfigurationBuilder cb = new ConfigurationBuilder(); cb.sethttpconnectionTimeout(10000) .setHttpReadTimeout(10000) .setoAuthConsumerKey(Config.TWITTER_CONSUMER_KEY) .setoAuthConsumerSecret(Config.TWITTER_CONSUMER_SECRET) .setoAuthAccesstoken(Utils.getPrefsstring(getActivity(),TwitterPrefsFragment.PREF_KEY_OAUTH_TOKEN,"")) // empty if not authentified .setoAuthAccesstokenSecret(Utils.getPrefsstring(getActivity(),TwitterPrefsFragment.PREF_KEY_OAUTH_SECRET,"")); // empty if not authentified TwitterFactory tf = new TwitterFactory(cb.build()); Twitter twitter = tf.getInstance(); List<twitter4j.Status> statuses = twitter.getUserTimeline(SOME_PUBLIC_TWITTER_ACCOUNT,new Paging(1,50));
但这仅在用户通过身份验证且应用程序在首选项中具有oauth令牌和机密时才有效.
如何获得没有访问令牌的Twitter公共时间线,即无需用户进行身份验证?
编辑
我正在重新提出我的问题以使其更清楚:
我设法验证我的Twitter应用程序和用户的代码为here.
现在,如果用户未登录,我如何获得公共时间表?在这种情况下,没有OAUTH_TOKEN和OAUTH_SECRET,并且上面显示的请求不起作用,因为空字符串设置为ConfigurationBuilder.setoAuthAccesstoken和ConfigurationBuilder.setoAuthAccesstokenSecret.
那么,如果它存在,那么获取公共时间线的请求是什么,没有OAUTH_TOKEN和OAUTH_SECRET?
解决方法
如果您转到dev.twitter.com并转到您的应用设置,您可以看到消费者密钥,消费者密钥,访问令牌和访问令牌密钥.利用这些并遵循我的下面的代码,它应该工作,
ConfigurationBuilder cb = new ConfigurationBuilder(); cb.setDebugEnabled(true) .setoAuthConsumerKey("B*************Q") .setoAuthConsumerSecret( "l*************o") .setoAuthAccesstoken( "1*************s") .setoAuthAccesstokenSecret( "s*************s"); TwitterFactory tf = new TwitterFactory(cb.build()); twitter = tf.getInstance(); try { List<Status> statuses; String user; user = "Replace this with the screen name whose Feeds you want to fetch"; statuses = twitter.getUserTimeline(user); Log.i("Status Count",statuses.size() + " Feeds"); } catch (TwitterException te) { te.printstacktrace(); }
我使用了twitter 4j 3.03.jar.
android – 没有TwitterLoginButton的Twitter登录
解决方法
TwitterauthClient mTwitterauthClient= new TwitterauthClient(); mTwitterauthClient.authorize(activity,new Callback<TwitterSession>() { @Override public void success(Result<TwitterSession> twitterSessionResult) { // Success } @Override public void failure(TwitterException e) { e.printstacktrace(); } }); @Override protected void onActivityResult(int requestCode,int responseCode,Intent intent) { mTwitterauthClient.onActivityResult(requestCode,responseCode,intent); }
今天关于停止Twitter流并使用twitter4j返回状态列表和推特停止运行的讲解已经结束,谢谢您的阅读,如果想了解更多关于android – 使用twitter4j库时没有发现身份验证问题、android – 如何使用Twitter4j api在推文上回复?、android – 如何使用Twitter4j获取没有用户身份验证的Twitter公共时间线?、android – 没有TwitterLoginButton的Twitter登录的相关知识,请在本站搜索。
本文标签: