2

(注意如果你不理解 clojure,我可以翻译 Java 中的代码,请询问)

我正在将 scribe 与 clojure 一起使用,我发现使用 twitter 登录有一些问题,我正在使用的代码:

(def twitter-service
  (-> (doto
          (ServiceBuilder.)
        (.provider (TwitterApi$Authenticate.))
        (.apiKey "apikey")
        (.apiSecret "apisecret")
        (.callback "https://morgan-siscia.rhcloud.com/tatata/"))
      (.build)))

(def tokens (atom {}))

(defn get-token []
  (.getRequestToken twitter-service))

(defn get-twitter-url [token]
  (swap! tokens assoc (.getToken token) token)
  (.getAuthorizationUrl twitter-service token))

(defn get-info-twitter [oauth-token oauth-veri]
  (let [token (get @tokens oauth-token)
        verifier (Verifier. oauth-veri)
        access-token (.getAccessToken twitter-service token verifier)
        request (doto (OAuthRequest. (Verb/POST)
                                     "https://api.twitter.com/oauth/access_token")
                  (.addOAuthParameter "oauth_token" oauth-token)
                  (.addBodyParameter "oauth_verifier" oauth-veri))]
    (do
      (.signRequest twitter-service access-token request)
      (swap! tokens dissoc oauth-token))
    (.getBody (.send request))))

该代码是java代码的直接翻译,但是它不起作用。

当我调用 (get-info-twitter "the-oauth-code" "the verifier code") twitter 返回错误:

<?xml version="1.0" encoding="UTF-8"?>
<hash>
  <request>/oauth/access_token</request>
  <error>The access_token method must be called with a request_token</error>
</hash>

老实说,我不知道我做错了什么,有人可以帮助我吗?

4

3 回答 3

2

以下是 Twitter OAuth 的工作原理(我使用 Twitter4j 进行,原理应该与您相同):

  • 你问一个RequestToken

RequestToken requestToken = twitter.getOAuthRequestToken();

  • 从这里,你得到 2 个对象:一个token和一个tokenSecret

字符串令牌 = requestToken.getToken(); 字符串 secretToken = requestToken.getTokenSecret();

  • 用户正在授权您的应用程序, Twitter 调用回调 URL,向您传递 2 个参数:oauth_tokenoauth_verifier

  • 使用这 2 个参数,您可以询问AccessToken

AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, oauth_verifier);

requestToken 是从以前的令牌重建的,并且 secretToken 保存在某处

  • 这个新对象包含 2 个字符串,您必须保留以备将来调用 Twitter 时使用:

credentials.token = accessToken.getToken();

credentials.secret = accessToken.getTokenSecret();

我将此对象保存在数据库中,并在以后调用 Twitter 时重用它。当我对所有这些标记都不太了解时,我遇到了和你一样的错误。

尝试逐步遵循此步骤,它应该可以工作。

于 2012-12-04T22:27:59.603 回答
0

参数来自oauth_verifier回调。使用那个

于 2013-04-22T12:32:31.453 回答
0

你为什么不使用clojure-twitter?它会更干净。

例子:

(:require twitter [oauth.client :as oauth])

 ;; Make a OAuth consumer
 (def oauth-consumer (oauth/make-consumer 
                      twitter-key
                      twitter-secret
                      "https://api.twitter.com/oauth/request_token"
                      "https://api.twitter.com/oauth/access_token"
                      "https://api.twitter.com/oauth/authorize"
                      :hmac-sha1))

接着:

(twitter/with-oauth oauth-consumer
     oauth-access-token
     oauth-access-token-secret
     (print (twitter/user-timeline :screen-name username)))

https://github.com/mattrepl/clojure-twitter

于 2012-12-05T16:29:49.250 回答