2013-02-25 22 views
7

W przypadku testowego, Próbuję skopiować plik z Dysku Google do Dropbox za pomocą skryptów Google pojawiaPrzesyłanie do Dropbox z Dysku Google

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

} 

Żądanie upoważnienie do stosowania w Dropbox i mówi mi że udało mi się autoryzować moją aplikację, ale gdy sprawdzam, aplikacja nie znajduje się na liście "Moje aplikacje", plik nie został przesłany i nie ma żadnych wpisów w dzienniku. Katalog "upload_dir" istnieje zarówno w GD, jak i DB. Próbowałem tego samego kodu w aplikacjach "App Folder" i "Full Dropbox", ale otrzymałem ten sam wynik.

Dodatkowo ponownie ponownie uruchamiając skrypt uruchamia stronę autoryzacji, podobny do

this

się pojawiać, klikając „Zezwól”, a następnie pokazuje ekran sukces, ale aplikacja nie jest wymieniony w sekcji „Moje aplikacje ". Uruchomienie skryptu ponownie powtarza proces.

Czy ktoś może wskazać, co zrobiłem źle?

Aktualizacja

Tak, mam teraz próbował zaimplementować to za pomocą pojedynczych wywołań API i wciąż nie mają żadnych sukcesów.

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

Implementacja kodu dla mapy to here. Głównym problemem, jaki widzę, jest to, że krok autoryzacji nie wywołuje autoryzacji punktu końcowego Dropbox (tzn. Nie następuje przekierowanie przeglądarki w celu autoryzacji aplikacji). Jeśli umieszczę punkt przerwania zaraz po linii Logger.log(authStringx); i ręcznie odwiedzę wklejanie strony w zawartości authStringx, otrzymam ekran autoryzujący moją aplikację. Akceptuję to i otrzymuję komunikat, że aplikacja jest zarejestrowana w "Moje aplikacje". I teraz niech program nadal i jestem witany z komunikatem

enter image description here

jakieś pomysły?

+0

Czy możesz wyjaśnić, co to oznacza, "ponowne uruchomienie skryptu ponownie uruchamia stronę autoryzacji"? –

+0

"Ponowne uruchomienie skryptu ..." oznacza, że ​​wykonanie skryptu za pomocą przycisku Uruchom na panelu sterowania Skrypty uruchamia ekran Dropbox, który sprawdza, czy chcesz uruchomić niestandardową aplikację. Zaktualizuję to pytanie, aby wyjaśnić, co się stało: – Pram

Odpowiedz

3

Wózek,

Próbowałem wykonać to samo zadanie i natknąłem się na twój post.Nie jestem programistą, więc nie mogę wymyślić drugiej części (uruchomienie strony autoryzacji nie powiedzie się), ale udało mi się ukończyć proces w trzecim kroku i połączyć pomyślnie moją aplikację.

Zamiast:

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

użyłem:

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

I wtedy dostałem e-mail potwierdzenie, że połączony nową aplikację do Dropbox i moja aplikacja jest wyświetlana w obszarze Ustawienia na moim koncie . W każdym razie, jak już powiedziałem, nie jestem programistą, więc przepraszam za brzydki kod. Dziękuję, że dostarczyłeś swój kod, że dotarłem tak daleko. Mam nadzieję, że pomoże ci to przynajmniej ruszyć naprzód, nawet jeśli nie rozwiąże podstawowego problemu.

+0

Słodko! To działa. – Pram

+0

Jakie metody Dropbox wykorzystałeś później? Próbuję uzyskać/fileops/create_folder do pracy. –

+0

Używam file_put do automatyzacji przesyłania plików z witryny na mój pulpit. Jakie problemy napotykasz? – INTJCapital

0

Jestem również w stanie zobaczyć ten problem. Z Dropbox dzieje się coś specjalnego. Powinieneś sprawdzić na swoich forach lub w zespole wsparcia API. Wygląda na to, że nie przyjmują poprawnie parametrów wywołania zwrotnego. Być może jest to ograniczenie trybu programistycznego (w przeciwieństwie do trybu produkcji). A może są one ostre o niektórych różnicach POST i GET, których Google nie obsługuje.

Ten kod poniżej przedstawia ten sam problem, który opisałeś, gdy autoryzacja nigdy nie została zakończona.

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

Jednak ten sam kod działa bez problemu z interfejsem API OAuth 1 na Twitterze. Poniższy kod powinien zrzucić JSON ze strumienia (kiedyś zastąpić żetony z konfiguracją w 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); 
} 

Jeśli jesteś w stanie zawęzić ten dół do wydania Google zalogować błąd tutaj na Issue Tracker.

+0

Opublikowałem na forum Dropbox (https://forums.dropbox.com/topic.php?id=97153#post-529744) i otrzymałem odpowiedź "Aplikacja nie będzie pojawiają się na liście "Moje aplikacje", dopóki cały przepływ OAuth nie zakończy się pomyślnie, co oznacza, że ​​/ access_token musi zostać wywołany z oryginalnym tokenem żądania, po tym jak użytkownik autoryzuje aplikację na stronie. Czy ten krok został ukończony? " Jak to robisz z UrlFetchApp Zastanawiam się? – Pram

+0

Apps Script robi trochę magii dla OAuth1 na temat pobierania tokenów. Możesz zrobić wszystko, co '.addOAuthService()' robi ręcznie, wykonując połączenia, aby uzyskać tokeny, obsługę wywołań zwrotnych itp. Możesz zobaczyć przykład tego z OAuth2 - https://github.com/entaq/GoogleAppsScript/blob/ master/Salesforce.com/OAuthAndUploadContactsToSalesforce.gs –

Powiązane problemy