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

Android 如何使用Twitter4j获得没有用户身份验证的Twitter公共时间线?,android,twitter4j,Android,Twitter4j,我已经编写了一些代码,允许用户登录到他的Twitter帐户,并使用Twitter4j和以下工具发送Tweet 现在,我还可以使用 ConfigurationBuilder cb = new ConfigurationBuilder(); cb.setHttpConnectionTimeout(10000) .setHttpReadTimeout(10000) .setOAuthConsumerKey(Config.TWITTER_CONSUMER_KEY) .setOAuthConsumerSe

我已经编写了一些代码,允许用户登录到他的Twitter帐户,并使用Twitter4j和以下工具发送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));
ConfigurationBuilder cb=new ConfigurationBuilder();
cb.setHttpConnectionTimeout(10000)
.setHttpReadTimeout(10000)
.setOAuthConsumerKey(Config.TWITTER\u CONSUMER\u键)
.setOAuthConsumerCret(Config.TWITTER\u CONSUMER\u SECRET)
.setOAuthAccessToken(Utils.getPrefsString(getActivity()),
TwitterPrefsFragment.PREF_KEY_OAUTH_TOKEN,“”)//如果未进行身份验证,则为空
.setOAuthAccessTokenSecret(Utils.getPrefsString(getActivity()),
TwitterPrefsFragment.PREF_KEY_OAUTH_SECRET,”);//如果未进行身份验证,则为空
TwitterFactory tf=新的TwitterFactory(cb.build());
Twitter=tf.getInstance();
List status=twitter.getUserTimeline(一些公共twitter账户,新页面(1,50));
但这仅在用户经过身份验证且应用程序在首选项中具有oauth令牌和密码时有效

我如何获得没有访问令牌的Twitter公共时间线,即没有用户进行身份验证

编辑

我正在重新阐述我的问题,让它更清楚:

我设法用给定的代码验证了我的Twitter应用程序和一个用户

现在,如果用户未登录,如何获取公共时间线?在这种情况下,没有
OAUTH_令牌
OAUTH_密钥
,上面显示的请求不起作用,因为将空字符串设置为
ConfigurationBuilder.setOAuthAccessToken
ConfigurationBuilder.setOAuthAccessTokenSecret

那么,如果存在的话,获取公共时间线的请求是什么,没有
OAUTH_令牌
OAUTH_秘密

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

哦,那很简单你不能

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

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


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

在您的情况下,您应该使用

要使用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.
ConfigurationBuilder cb=new ConfigurationBuilder();
cb
.setOAuthConsumerKey()
.setOAuthConsumerCret()
.setApplicationOnlyAuthEnabled(true);//重要提示:将T4J设置为仅使用应用程序身份验证
TwitterFactory tf=新的TwitterFactory(cb.build());
Twitter=tf.getInstance();
OAuth2Token token=twitter.getOAuth2Token();
if(令牌!=null){
System.out.println(“令牌类型:+Token.getTokenType());
System.out.println(“访问令牌:+Token.getAccessToken());
}
ResponseList=twitter.getUserTimeline(783214);//在没有用户登录的情况下加载@twitter的时间线。
上述示例代码的要点:

  • 调用
    setApplicationOnlyAuthEnabled(true)
    以启用仅应用程序身份验证
  • 使用
    getOAuth2Token()
    而不是
    getOAuthAccessToken()

    • 这当然是可能的,我已经尝试过了。如果您怀疑的只是访问令牌和访问令牌密钥为空,那么您应该尝试使用应用程序页面中提供的访问令牌。我所说的应用程序页面是指你注册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();
              }
      
      ConfigurationBuilder cb=new ConfigurationBuilder();
      cb.setDebugEnabled(true)
      .setOAuthConsumerKey(“B**********************Q”)
      .SetOAuthConsumerCret(
      “l****************o”)
      .setOAuthAccessToken(
      “1*************s”)
      .setOAuthAccessTokenSecret(
      “s***************s”);
      TwitterFactory tf=新的TwitterFactory(cb.build());
      twitter=tf.getInstance();
      试一试{
      列出状态;
      字符串用户;
      user=“将其替换为要获取其提要的屏幕名称”;
      status=twitter.getUserTimeline(用户);
      Log.i(“Status Count”,Status.size()+“feed”);
      }捕获(twitter异常){
      te.printStackTrace();
      }
      

      为此,我使用了twitter4j3.03.jar

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

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

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

      应用程序将其使用者密钥和机密编码为一组经过特殊编码的凭据

      应用程序向POST oauth2/令牌端点发出请求,以将这些凭据交换为承载令牌

      当访问RESTAPI时,应用程序使用承载令牌进行身份验证

      注意:因为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);