2

http://twitter4j.org/en/code-examples.html - 如何在 OAuth 身份验证期间静态提供 Twitter PIN,代码示例讨论了提供 PIN(如果它已经可用)。

我们的应用程序是一个独立的 Java 应用程序,并且更愿意通过属性文件传递凭据,而无需任何人工干预。

4

2 回答 2

2

Twitter 将为您提供 PIN 码。

在示例中,Twitter4J 假设有人将在 Web 浏览器中复制它提供的 URL(requestToken.getAuthorizationURL()在第 10 行),并通过浏览器授权应用程序。之后,用户应该在示例程序中编写在其浏览器中显示的 PIN 码。

在此示例中,您有两个很大的缺点:

  • 人为干预
  • 如果 Twitter 没有给你一个 PIN 码,你会给你的示例程序提供哪个代码(如果你的 Twitter 应用程序的回调 URL 不是“ oob”,就会发生这种情况)?

您必须模拟人为干预才能获取 PIN 码。不幸的是,Twitter4J 似乎没有获得执行此操作的方法(我在 Javadoc 中没有看到这种方法),因此您必须自己编写以下过程:

  1. 在 中检索网页的 HTML 代码requestToken.getAuthorizationURL()
  2. 此 HTML 页面包含一个表单,其中的一些参数将与用户名(或电子邮件)和用户密码一起发布,以获取 PIN 码。这些参数称为“ oauth_token”(您已经拥有的临时 OAuth 令牌)、“ deny”(如果您不想授权应用程序时使用的标记)和“ authenticity_token”。它们都在<input>HTML 标签中。挑选它们。
  3. 模拟表单的发布。为此,您将不得不使用POST oauth/authorize端点。网址是https://api.twitter.com/oauth/authorize?oauth_token=<your OAuth Token>。该请求必须按照Twitter 的 Authenticating requests 流程进行身份验证。这是您将发布的内容:“ authenticity_token=<the form's "authenticity_token" parameter>&session[username_or_email]=<user's name or email>&session[password]=<the user's password in clear>”。如果您不授权应用程序,请&deny=<the form's "deny" parameter>在正文消息中附加“”。对您来说不会有任何问题,因为您session[xxx]在属性文件中获得了凭据(参数),并且您在表单中选择了其他参数(参见 2.)。
  4. Twitter API 将返回一个网页。如果授权成功,PIN 码将在里面。但是,要小心。PIN 采用不同的名称,具体取决于回调 URL。如果回调 URL 为“ oob”,则 PIN 码称为OAuth PIN。它是<div id="oauth_pin">HTML 标记中某处的 4 位数字。否则,它被称为OAuth Verifier。它包含在位于<div class="happy notice callback">HTML 标记中的 URL 中。在此 URL 中,PIN 是oauth_verifier请求字符串的。它看起来像一个 OAuth 令牌。

不要犹豫,看看我的流程的第 2 步和第 4 步的网页的 HTML 代码。了解这个过程非常有用。

于 2012-08-24T01:07:25.833 回答
2

我今天花了一些时间试图弄清楚如何使用 Twitter4j 库在没有用户干预的情况下进行身份验证。我想出了以下内容:

ConfigurationBuilder conf = new ConfigurationBuilder();
conf.setOAuthConsumerKey(CONSUMER_KEY);
conf.setOAuthConsumerSecret(CONSUMER_KEY_SECRET);
conf.setOAuthAccessToken(TOKEN);
conf.setOAuthAccessTokenSecret(TOKEN_SECRET);
Twitter twitter = new TwitterFactory(conf.build()).getInstance();

通过使用 ConfigurationBuilder,我现在能够自动进行身份验证。当然,您需要相应地设置 CONSUMER 和 TOKEN 键的值。这是我验证它的方法:

User user = twitter.verifyCredentials();
System.out.println("Successfully verified credentials of " + user.getScreenName());

希望这可以帮助!

于 2013-06-30T06:48:31.597 回答