2013-02-25 3 views
7

В качестве тестового случая, я пытаюсь скопировать файл из Google Диска в Dropbox с помощью скриптов Google появляетсяЗагрузка в Dropbox из Google Drive

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 и он говорит мне что я успешно разрешил свое приложение, но когда я проверяю, приложение не входит в список «Мои приложения», файл не был загружен и в журнале нет записей. Каталог «upload_dir» существует как для GD, так и для DB. Я пробовал один и тот же код с типами приложений «Папка приложений» и «Полный Dropbox», но получал тот же результат.

Кроме того, запустив сценарий снова снова запускает страницу авторизации, похожий на

this

появляться, нажав на кнопку «Разрешить», а затем показывает экран успеха, но приложение не отображается в «Мои приложения ». Выполнение скрипта снова повторяет этот процесс.

Может ли кто-нибудь указать, что я сделал неправильно?

Update

Итак, я в настоящее время пытался осуществить это с помощью отдельных вызовов 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

Можете ли вы объяснить, что это значит, «запуск сценария снова снова запускает страницу авторизации»? –

+0

«Запуск сценария снова ...» означает выполнение скрипта с помощью кнопки «Выполнить» на панели управления «Сценарии» запускает экран «Dropbox», который проверяет, хотите ли вы запускать настраиваемое приложение. Я обновлю вопрос, чтобы уточнить – Pram

ответ

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

Sweet! Оно работает. – Pram

+0

Какие методы Dropbox вы использовали после этого? Попытка получить/fileops/create_folder для работы. –

+0

Я использую files_put для автоматизации передачи файлов с веб-сайта на рабочий стол. С какими проблемами вы сталкиваетесь? – INTJCapital

0

Я тоже могу видеть этот вопрос. Здесь есть что-то особенное с Dropbox. Вы должны проверить свои форумы или свою группу поддержки API. Похоже, они неправильно принимают параметры обратного вызова. Возможно, это ограничение режима разработки (по сравнению с режимом производства). Или, возможно, они строгие в отношении некоторых POST и GET различий, которые Google не поддерживает.

В приведенном ниже коде приведена одна и та же проблема, которую вы описали, где авторизация не завершена.

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); 
} 

Однако, тот же код работает без проблем с API-интерфейсом Twitter OAuth 1. Приведенный ниже код должен выливать 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); 
} 

Если вы можете сузить это вниз к проблеме Google войти ошибку здесь на Issue Tracker.

+0

Я разместил на форумах Dropbox (https://forums.dropbox.com/topic.php?id=97153#post-529744) и получил ответ «Приложение не будет появятся в списке «Мои приложения» до тех пор, пока весь поток OAuth не будет успешно завершен, что означает, что/access_token нужно вызывать с оригинальным маркером запроса после того, как пользователь авторизует приложение на сайте. Закончен ли этот шаг? » Как вы это делаете с UrlFetchApp? Интересно? – Pram

+0

Служебный скрипт делает немного магии для OAuth1 о том, чтобы вытащить токены. Вы можете делать все, что '.addOAuthService()' делает вручную, делая вызовы для получения токенов, обработки обратных вызовов и т. Д. Вы можете увидеть пример этого здесь с OAuth2 - https://github.com/entaq/GoogleAppsScript/blob/ master/Salesforce.com/OAuthAndUploadContactsToSalesforce.gs –

Смежные вопросы