2013-02-25 134 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