2013-02-25 131 views
7

作爲測試的情況下,我想將文件從谷歌驅動器上覆制使用谷歌腳本上傳到Dropbox的從谷歌驅動

function pushBuild() { 
    // Setup OAuthServiceConfig 
    var oAuthConfig = UrlFetchApp.addOAuthService("dropbox"); 
    oAuthConfig.setAccessTokenUrl("https://api.dropbox.com/1/oauth/access_token"); 
    oAuthConfig.setRequestTokenUrl("https://api.dropbox.com/1/oauth/request_token"); 
    oAuthConfig.setAuthorizationUrl("https://www.dropbox.com/1/oauth/authorize"); 
    oAuthConfig.setConsumerKey(ScriptProperties.getProperty("dropboxKey")); 
    oAuthConfig.setConsumerSecret(ScriptProperties.getProperty("dropboxSecret")); 

    var fileName = "blah.zip" 
    var folderName = "upload_dir" 

    var docs = DocsList.getFolder(folderName).find(fileName); 
    for(n=0;n<docs.length;++n){ 
    if(docs[n].getName() == fileName){ 
     var ID = docs[n].getId(); 
     var options = { 
     "oAuthServiceName" : "dropbox", 
     "oAuthUseToken" : "always", 
     "method" : "put", 
     "payload" : docs[n].getBlob().getBytes(), 
     "contentType" : "application/zip"   
    }; 

    var response = UrlFetchApp.fetch("https://api-content.dropbox.com/1/files_put/sandbox/upload_dir/" + fileName, options); 

    Logger.log(response); 
    } 
} 

} 

在Dropbox的應用程序中的授權請求似乎Dropbox和它告訴我我已成功授權我的應用程序,但是當我檢查時,該應用程序不在「我的應用程序」列表中,該文件尚未上傳,並且日誌中沒有條目。目錄「upload_dir」存在於GD和DB上。我已經嘗試了與「應用程序文件夾」和「完整Dropbox」應用程序類型相同的代碼,但獲得相同的結果。

此外,再次運行該腳本再次觸發授權頁面,類似

this

出現,點擊「允許」,然後顯示成功屏幕,但應用程序沒有在「我的應用程序上市」。再次運行腳本會重複此過程。

任何人都可以指出我做錯了什麼?

更新

所以,我現在想實現這個使用單獨的API調用,我仍然沒有任何成功。

function testOAuth() { 

    var timestamp = getTimestamp(); 
    var nonce = getNonce(timestamp); 

    var authString = 'OAuth oauth_version="1.0", oauth_signature_method="PLAINTEXT", oauth_signature="' + encodeURIComponent(ScriptProperties.getProperty("dropboxSecret") + '&') + '", oauth_consumer_key="' + ScriptProperties.getProperty("dropboxKey") + '"'; 

    Logger.log(authString) 

    var options = { 
    method : "POST", 
    headers : {"Authorization" : authString} 
    } 

    var response = UrlFetchApp.fetch("https://api.dropbox.com/1/oauth/request_token",options); 
    var params = response.getContentText().split("&"); 
    var map = new Map; 
     for(i = 0; i < params.length; i++){ 
     var param = params[i].split("="); 
     map.put(param[0],param[1]);   
     } 

    var authStringx = "https://www.dropbox.com/1/oauth/authorize?oauth_token=" + map.get("oauth_token"); 

    Logger.log(authStringx); 

    var response2 = UrlFetchApp.fetch(authStringx); 

    Logger.log(response2.getContentText()); 

    var authString2 = 'OAuth oauth_version="1.0", oauth_signature_method="PLAINTEXT", oauth_token="' + map.get("oauth_token") + '" , oauth_signature="' + encodeURIComponent(ScriptProperties.getProperty("dropboxSecret") + '&' + map.get("oauth_token_secret")) + '", oauth_consumer_key="' + ScriptProperties.getProperty("dropboxKey") + '",oauth_timestamp="'+ timestamp +'", oauth_nonce="' + nonce +'"'; 

    Logger.log(authString2); 

    var options3 = { 
    "method" : "POST", 
    "Authorization" : authString2 
    } 

    var response3 = UrlFetchApp.fetch("https://api.dropbox.com/1/oauth/access_token", options3); 

    Logger.log(response3.getContentText()); 
} 

var getTimestamp = function(){ 
    return (Math.floor((new Date()).getTime()/1000)).toString() 
} 

var getNonce = function(timestamp){ 
    return timestamp + Math.floor(Math.random() * 100000000) 
} 

地圖的代碼實現是here。我可以看到的主要問題是,授權步驟不會調用Dropbox授權終結點(即,不會發生瀏覽器重定向來授權應用程序)。如果我在Logger.log(authStringx);行後面放置一個斷點並手動訪問粘貼authStringx內容的網頁,我將獲得授權我的應用程序的屏幕。我接受並收到該應用程序已在「我的應用程序」中註冊的消息。我現在讓程序繼續,我與消息

enter image description here

任何想法招呼?

+0

你能解釋一下這是什麼意思,「再次運行腳本再次觸發授權頁面出現」? – 2013-02-25 14:15:55

+0

「再次運行腳本...」意味着使用「腳本」控制面板上的「運行」按鈕執行腳本會觸發Dropbox屏幕,驗證您是否要運行自定義應用程序。我會更新這個問題,以澄清 – Pram 2013-02-25 14:22:04

回答

3

Pram,

我試圖完成相同的任務,並遇到您的文章。我不是程序員,因此我無法弄清楚第二部分(啓動授權頁失敗),但是我能夠在第三步中完成該過程併成功連接我的應用程序。

相反的:

var authString2 = 'OAuth oauth_version="1.0", oauth_signature_method="PLAINTEXT", oauth_token="' + map.get("oauth_token") + '" , oauth_signature="' + encodeURIComponent(ScriptProperties.getProperty("dropboxSecret") + '&' + map.get("oauth_token_secret")) + '", oauth_consumer_key="' + ScriptProperties.getProperty("dropboxKey") + '",oauth_timestamp="'+ timestamp +'", oauth_nonce="' + nonce +'"'; 

Logger.log(authString2); 

var options3 = { 
"method" : "POST", 
"Authorization" : authString2 
} 

var response3 = UrlFetchApp.fetch("https://api.dropbox.com/1/oauth/access_token", options3); 

Logger.log(response3.getContentText()); 

我用:

var authtokenURL = "https://api.dropbox.com/1/oauth/access_token"; 

var authString2 = "?oauth_signature_method=PLAINTEXT&oauth_token=" + [MY_OAUTH_REQUEST_TOKEN] + "&oauth_signature=" + encodeURIComponent([MY_DROPBOX_CONSUMER_SECRET] + "&" + [MY_OAUTH_REQUEST_SECRET]) +"&oauth_consumer_key=" + [MY_DROPBOX_CONSUMER_KEY]; 

Logger.log(authString2); 

var response3 = UrlFetchApp.fetch("https://api.dropbox.com/1/oauth/access_token" + authString2);  

Logger.log(response3.getContentText()); 

然後我得到了我連接了一個新的應用程序到Dropbox的確認電子郵件,和我的應用程序不會出現在我的帳戶設置下。無論如何,正如我所說的,我不是程序員,所以對於難看的代碼感到抱歉。感謝您爲我提供代碼,使其成爲現實。我希望這可以幫助你至少繼續前進,即使它不能解決潛在的問題。

+0

甜!有用。 – Pram 2013-03-01 13:39:20

+0

你之後使用了哪些dropbox方法?試圖讓/ fileops/create_folder自己工作。 – 2013-03-05 06:25:14

+0

我一直在使用files_put來自動將文件從網站傳輸到我的桌面。你遇到什麼問題? – INTJCapital 2013-03-05 06:33:50

0

我也可以看到這個問題。 Dropbox有一些特殊的功能。你應該檢查他們的論壇或他們的API支持團隊。看起來他們沒有正確接受回調參數。也許這是一種發展模式限制(相對於生產模式)。或者,他們對Google不支持的某些POST和GET差異很嚴格。

下面的代碼展示了您描述授權永遠不會完成的相同問題。

function dropbox() { 
    var oAuthCfg = UrlFetchApp.addOAuthService("dropbox"); 
    oAuthCfg.setAccessTokenUrl('https://api.dropbox.com/1/oauth/access_token'); 
    oAuthCfg.setRequestTokenUrl('https://api.dropbox.com/1/oauth/request_token'); 
    oAuthCfg.setAuthorizationUrl('https://api.dropbox.com/1/oauth/authorize'); 
    oAuthCfg.setConsumerKey('DROPBOX_KEY'); 
    oAuthCfg.setConsumerSecret('DROPBOX_SECRET'); 

    var options = {oAuthServiceName:'dropbox',oAuthUseToken:'always'} 

    var url = 'https://api.dropbox.com/1/account/info'; 
    var response = UrlFetchApp.fetch(url, options).getContentText(); 
    Logger.log(response); 
} 

但是,相同的代碼在Twitter OAuth 1 API中沒有問題。下面的代碼應該從你的流傾倒了JSON(一旦你替換從您的設置令牌http://dev.twitter.com

function twitter(){ 
    var oAuthCfg = UrlFetchApp.addOAuthService('twitter'); 
    oAuthCfg.setAccessTokenUrl('http://api.twitter.com/oauth/access_token'); 
    oAuthCfg.setRequestTokenUrl('http://api.twitter.com/oauth/request_token'); 
    oAuthCfg.setAuthorizationUrl('http://api.twitter.com/oauth/authorize'); 
    oAuthCfg.setConsumerKey('TWITTER_KEY'); 
    oAuthCfg.setConsumerSecret('TWITTER_SECRET'); 

    var options = {oAuthServiceName:'twitter',oAuthUseToken:'always'} 

    var url = "http://api.twitter.com/1/statuses/user_timeline.json"; 
    var response = UrlFetchApp.fetch(url, options).getContentText(); 
    Logger.log(response); 
} 

如果你能在這裏縮小,這歸因於谷歌事件記錄錯誤的Issue Tracker

+0

我發佈到Dropbox論壇(https://forums.dropbox.com/topic.php?id=97153#post-529744),並收到回覆 「該應用程序不會出現在「我的應用程序」列表中,直到整個OAuth流程成功完成,這意味着必須在用戶在站點上授權應用程序之後,用原始請求令牌調用/ access_token,該步驟是否已完成? 你如何用UrlFetchApp做這件事我想知道? – Pram 2013-02-26 07:40:31

+0

應用程序腳本對於獲取令牌的OAuth1有點神奇。您可以通過調用獲取令牌,處理回調等來手動執行'.addOAuthService()'手動執行的所有操作。您可以在這裏看到OAuth2的示例 - https://github.com/entaq/GoogleAppsScript/blob/ master/Salesforce.com/OAuthAndUploadContactsToSalesforce.gs – 2013-02-26 12:42:49