google-apps-script - 从 Google Drive 上传到 Dropbox

标签 google-apps-script dropbox dropbox-api

作为测试用例,我正在尝试使用 Google Scripts 将文件从 Google Drive 复制到 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 中出现应用的授权请求,它告诉我我已经成功授权我的应用,但是当我检查时,该应用不在“我的应用”列表中,文件没有上传,也没有日志中的条目。 GD 和 DB 上都存在目录“upload_dir”。我已经对“App Folder”和“Full 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)
}

map 的代码实现是here .我可以看到的主要问题是授权步骤没有调用 Dropbox 授权端点(即没有浏览器重定向来授权应用程序)。如果我在 Logger.log(authStringx); 行之后放置一个断点并手动访问粘贴 authStringx 内容的网页我得到屏幕以授权我的应用程序。我接受并收到消息,表明该应用程序已在“我的应用程序”中注册。我现在让程序继续,我收到消息

enter image description here

有任何想法吗?

最佳答案

婴儿车,

我试图完成相同的任务并遇到了您的帖子。我不是程序员,所以我也无法弄清楚第二部分(启动授权页面失败),但我能够在第三步中完成该过程并成功连接我的应用程序。

代替:

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,并且我的应用程序确实显示在我帐户的“设置”下。无论如何,正如我所说,我不是程序员,对于丑陋的代码感到抱歉。感谢您提供您的代码,让我走到这一步。我希望这至少可以帮助您向前迈进,即使它不能解决根本问题。

关于google-apps-script - 从 Google Drive 上传到 Dropbox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15066453/

相关文章:

javascript - 如何使用 Dropbox Drop-in 应用程序始终从我的帐户中选择文件?

javascript - 以编程方式制作的表格不会在触发器上返回响应

javascript - 成功登录 firebase 后,Google Apps 脚本重定向到 HTML 文件

javascript - 如何使用谷歌脚本创建子菜单

ios - Dropbox - 应用程序文件夹已删除 - 出现 NSURLErrorRequestBodyStreamExhausted 错误 - iOS

iphone - 如何在 iPhone 应用程序中使用 Dropbox Api 共享文档?

mysql - 带 IF 语句的 for 循环不会退出

Dropbox API : Get Notified On File Events Without Polling

node.js - 使用 dropboxjs 通过 oauth 对客户端进行身份验证 2. 服务器端呢?

javascript - Dropbox Datastore - 单个表的recordsChanged 监听器?