GVKun编程网logo

停止Twitter流并使用twitter4j返回状态列表(推特停止运行)

8

在这篇文章中,我们将为您详细介绍停止Twitter流并使用twitter4j返回状态列表的内容,并且讨论关于推特停止运行的相关问题。此外,我们还会涉及一些关于android–使用twitter4j库时

在这篇文章中,我们将为您详细介绍停止Twitter流并使用twitter4j返回状态列表的内容,并且讨论关于推特停止运行的相关问题。此外,我们还会涉及一些关于android – 使用twitter4j库时没有发现身份验证问题、android – 如何使用Twitter4j api在推文上回复?、android – 如何使用Twitter4j获取没有用户身份验证的Twitter公共时间线?、android – 没有TwitterLoginButton的Twitter登录的知识,以帮助您更全面地了解这个主题。

本文目录一览:

停止Twitter流并使用twitter4j返回状态列表(推特停止运行)

停止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 – 使用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在推文上回复?

android – 如何使用Twitter4j api在推文上回复?

我在twitter上工作,我有访问令牌,我现在也收到推文我想在推特上回复,就像我们在Twitter网站上做的那样我使用下面的代码,但它不是回复推文但它更新我的状态请帮我解决这个问题谢谢..
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公共时间线?

android – 如何使用Twitter4j获取没有用户身份验证的Twitter公共时间线?

我写了一些代码,允许用户登录他的Twitter帐户并使用Twitter4j和 this tutorial发送Tweet.

现在我也可以使用公共帐户的推文

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?

解决方法

这当然是可能的,我已经尝试过了.如果您的疑问只是关于访问令牌和访问令牌秘密是空的,那么您应该尝试使用应用页面中提供的访问令牌.通过应用页面我的意思是,您已经注册了您的Twitter应用程序的链接.

如果您转到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登录

android – 没有TwitterLoginButton的Twitter登录

是否有任何内置方法可以在不使用TwitterLoginButton的情况下启动登录.我能找到的所有示例都使用TwitterLoginButton.

解决方法

这有效.
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登录的相关知识,请在本站搜索。

本文标签: