2012-12-04 23 views
2

(NB如果你不明白我的Clojure可以在平移,Java的代碼,只是問請)Twitter的書記和Clojure的「該方法的access_token必須以request_token被稱爲」

我使用劃線使用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-嘰嘰喳喳「的-OAuth的代碼」,「驗證碼」)嘰嘰喳喳返回一個錯誤:

<?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> 

老實說,我不知道我做錯了,可以有人幫助我?

回答

2

這是Twitter的OAuth的是如何工作的(我Twitter4j做到這一點,原則上應該是相同的你):

  • 你問一個RequestToken

RequestToken requestToken = twitter.getOAuthRequestToken();

  • 從這裏,你得到2個對象:一個代幣和一個tokenSecret

String token = requestToken.getToken(); String secretToken = requestToken.getTokenSecret();

  • 用戶被授權的應用程序和回調URL由Twitter的調用,傳遞你2個參數:的oauth_tokenoauth_verifier

  • 有了這兩個參數,你可以問一個AccessToken

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

requestToken從以前的令牌重建和secretToken保存的地方

  • 這個新的對象包含2字符串,你必須保持對未來的呼叫到Twitter:

credentials.token = accessToken.getToken();

credentials.secret = accessToken.getTokenSecret();

我將該對象保存在數據庫中,並將其用於稍後調用Twitter。 當我對所有這些令牌都無法很好地理解時,我的錯誤和你一樣。

嘗試按照此步驟一步,它應該工作。

+0

這裏很晚,但是,多虧了你,我應該得到我的錯誤...我明天早上會檢查...謝謝無論如何:-) – Siscia

+0

是的,我找到了問題,謝謝。 – Siscia

+0

我做得太多了,我正在獲取訪問令牌並嘗試使用錯誤的令牌訪問其他資源......抄寫員文檔不太清楚...... – Siscia

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

+0

是的,這將是,但我會需要一些爲臉譜,然後爲G + ... – Siscia

0

oauth_verifier參數來回調。使用那一個

相關問題