7

我编写了一些代码,允许用户登录到他的 Twitter 帐户并使用 Twitter4j 并按照本教程发送推文。

现在我还可以使用获取公共帐户的推文

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 应用程序和用户。

现在,如果用户没有登录,我怎样才能获得公共时间线?在这种情况下,没有OAUTH_TOKENand OAUTH_SECRET,并且上面显示的请求不起作用,因为空字符串设置为ConfigurationBuilder.setOAuthAccessTokenand ConfigurationBuilder.setOAuthAccessTokenSecret

那么,如果存在,获取公共时间表的请求是什么,没有OAUTH_TOKENand OAUTH_SECRET

4

4 回答 4

8

在您的情况下,您应该使用Application-only authentication

要使用 Twitter4J 执行此操作,请尝试以下代码

    ConfigurationBuilder cb = new ConfigurationBuilder();
    cb
    .setOAuthConsumerKey(<YOUR_CONSUMER_KEY>)
    .setOAuthConsumerSecret(<YOUR_CONSUMER_SECRET>)
    .setApplicationOnlyAuthEnabled(true); // IMPORTANT: set T4J to use App-only auth
    TwitterFactory tf = new TwitterFactory(cb.build());
    Twitter twitter = tf.getInstance();

    OAuth2Token token = twitter.getOAuth2Token();
    if (token != null) {
        System.out.println("Token Type  : " + token.getTokenType());
        System.out.println("Access Token: " + token.getAccessToken());
    }
    ResponseList<Status> list = twitter.getUserTimeline(783214); // Load @twitter's timeline without user login.

上述示例代码的关键点:

  • 调用setApplicationOnlyAuthEnabled(true)以启用仅应用程序身份验证。
  • getOAuth2Token()使用而不是获取访问令牌getOAuthAccessToken()
于 2013-09-12T06:00:59.240 回答
7

这当然是可能的,我已经尝试过了。如果您只是怀疑 Access Token 和 Access Token secret 是否为空,那么您应该尝试使用应用页面中提供的 Access Token。我所说的应用页面是指您注册 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。

于 2013-09-16T12:44:40.727 回答
2

如何使用 Twitter4j获得没有访问令牌和秘密的 Twitter 公共时间线?

哦,那很简单。你不能

Twitter 是一家基于数据的公司。公司 99% 的财产(我的意思是公司拥有的)是数据。将这些数据免费提供给其他人/企业会适得其反。

如果您想要的东西是可能的,那么将有一种简单的方法来备份整个 Twitter 数据库。

这就是为什么他们允许您为每个想要使用 API 的应用程序注册一个帐户,并将每个帐户限制为每个时间范围内一定数量的 API 调用。当然,他们还想防止他们的网络收到垃圾邮件等。

于 2013-09-11T07:36:28.003 回答
1

如果你想在没有用户身份验证的情况下获取推文,你可以使用Application-only Authentication,因为用户不需要登录。

通过仅应用程序身份验证,Twitter 为应用程序提供了代表应用程序本身(而不是代表特定用户)发出经过身份验证的请求的能力

仅限应用程序的身份验证流程遵循以下步骤:

应用程序将其消费者密钥和秘密编码为一组经过特殊编码的凭据。

应用程序向 POST oauth2/token 端点发出请求,以将这些凭证交换为不记名令牌。

访问 REST API 时,应用程序使用不记名令牌进行身份验证。

注意:因为 twitter4j 最近添加了这个功能,所以你应该使用最后一个快照库。

一个使用它的例子:

private ConfigurationBuilder    builder;
private Twitter                 twitter;
private TwitterFactory          factory;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.init_act_layout);

// setup
builder = new ConfigurationBuilder();
builder.setUseSSL(true);
builder.setApplicationOnlyAuthEnabled(true);
builder.setOAuthConsumerKey(Constants.CONSUMER_KEY);
builder.setOAuthConsumerSecret(Constants.CONSUMER_SECRET);

Configuration configuration = builder.build();
factory = new TwitterFactory(configuration);
((MyApp) (MyApp.getApp())).setTFactory(factory);

if (isNeededTwitterAuth()) {
    twitter = factory.getInstance();
        //Get the token async and save it
}

    //Search tweets

}

/*
 * Checks if twitter access token is already saved in preferences
 * 
 * @return true if auth needed
 */
private boolean isNeededTwitterAuth() {
    SharedPreferences settings = getSharedPreferences(Constants.TWITTER_PREFERENCES, Context.MODE_PRIVATE);
    String twitterAccesToken = settings.getString("bearerAccessToken", "");
    String twitterTokenType = settings.getString("bearerTokenType", "");
    return ((twitterAccesToken.length() == 0) && (twitterTokenType.length() == 0));
}

}

要获取不记名令牌,请在主 UI 线程之外执行以避免网络异常,使用 AsyncTask:

@Override
    protected OAuth2Token doInBackground(Void... params) {
        OAuth2Token bearerToken = null;

        try {
            bearerToken = twitter.getOAuth2Token();
        } catch (TwitterException e) {
            e.printStackTrace();
        }
        return bearerToken;
    }

当您获得不记名令牌时,将其保存:

SharedPreferences appSettings = getSharedPreferences(Constants.TWITTER_PREFERENCES, MODE_PRIVATE);
            SharedPreferences.Editor prefEditor = appSettings.edit();
            prefEditor.putString("bearerAccessToken", result.getAccessToken());
            prefEditor.putString("bearerTokenType", result.getTokenType());
            prefEditor.commit();

并使用不记名令牌:

OAuth2Token bearerToken = new OAuth2Token(bearerTokenType, bearerAccesstoken);

        twitter.setOAuth2Token(bearerToken);

并搜索推文(总是在主线程之外):

@Override
 protected QueryResult doInBackground(Void... params) {

 twitter.setOAuth2Token(bearerToken);
 Query query = new Query();
 [...]
 result = twitter.search(query);

博客中的完整解释(西班牙语...)

以及twitter4j github中的完整示例

希望能帮助到你!

于 2013-09-17T11:30:58.230 回答