2013-02-25 40 views
7

Là một trường hợp thử nghiệm, tôi đang cố gắng để sao chép một tập tin từ Google Drive Dropbox sử dụng Google ScriptsĐang tải lên Dropbox từ 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); 
    } 
} 

} 

Yêu cầu ủy quyền cho các ứng dụng trong Dropbox xuất hiện và nó nói với tôi rằng tôi đã ủy quyền thành công ứng dụng của mình, nhưng khi tôi kiểm tra, ứng dụng không có trong danh sách "Ứng dụng của tôi", tệp chưa được tải lên và không có mục nhập nào trong nhật ký. Thư mục "upload_dir" tồn tại trên cả GD và DB. Tôi đã thử cùng một mã với các loại ứng dụng "Thư mục ứng dụng" và "Full Dropbox" nhưng có cùng kết quả.

Thêm vào đó, chạy kịch bản lại một lần nữa gây nên các trang Authorization, tương tự như

this

xuất hiện, nhấp vào "Cho phép", sau đó cho thấy màn hình thành công nhưng ứng dụng không được liệt kê trong "Ứng dụng của tôi ". Chạy kịch bản một lần nữa lặp lại quá trình.

Có ai có thể chỉ ra những gì tôi đã làm sai?

Cập nhật

Vì vậy, bây giờ tôi đã cố gắng để thực hiện điều này bằng cách sử dụng các cuộc gọi api cá nhân và đang vẫn không có bất kỳ thành công.

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

Việc triển khai mã cho bản đồ là here. Vấn đề chính mà tôi có thể thấy là bước ủy quyền không gọi điểm kết thúc cho phép Dropbox (tức là không có chuyển hướng trình duyệt nào diễn ra để cho phép ứng dụng). Nếu tôi đặt điểm ngắt ngay sau dòng Logger.log(authStringx); và truy cập thủ công dán trang web trong nội dung của authStringx, tôi nhận được màn hình cho phép ứng dụng của tôi. Tôi chấp nhận điều đó và nhận được thông báo rằng ứng dụng được đăng ký trong "Ứng dụng của tôi". Bây giờ tôi để cho các chương trình tiếp tục và tôi đang chào đón với thông điệp

enter image description here

Bất kỳ ý tưởng?

+0

Bạn có thể giải thích điều này có nghĩa là "chạy lại tập lệnh một lần nữa sẽ kích hoạt trang Ủy quyền xuất hiện" không? –

+0

"Chạy lại tập lệnh ..." nghĩa là thực thi tập lệnh bằng nút Chạy trên bảng điều khiển Tập lệnh kích hoạt màn hình Dropbox xác minh xem bạn có muốn chạy ứng dụng tùy chỉnh không. Tôi sẽ cập nhật câu hỏi để làm rõ – Pram

Trả lời

3

Pram,

Tôi đã cố gắng hoàn thành nhiệm vụ tương tự và bắt gặp bài đăng của bạn.Tôi không phải là lập trình viên, vì vậy tôi không thể tìm ra phần thứ hai hoặc (khởi chạy trang ủy quyền không thành công), nhưng tôi đã có thể hoàn tất quy trình ở bước thứ ba và kết nối ứng dụng của mình thành công.

Thay vì:

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

tôi đã sử dụng:

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

sau đó tôi nhận được một email xác nhận rằng tôi đã kết nối một ứng dụng mới để Dropbox, và ứng dụng của tôi không xuất hiện bên dưới Cài đặt trong tài khoản của tôi . Dù sao, như tôi đã nói, tôi không có lập trình viên, vì vậy xin lỗi vì mã xấu xí. Cảm ơn bạn đã cung cấp mã cho tôi để làm điều này cho đến nay. Tôi hy vọng điều này sẽ giúp bạn ít nhất là tiến lên phía trước, ngay cả khi nó không giải quyết được vấn đề cơ bản.

+0

Ngọt ngào! Nó hoạt động. – Pram

+0

Bạn đã sử dụng phương thức dropbox nào sau đó? Đang cố gắng để có được/fileops/create_folder để làm việc bản thân mình. –

+0

Tôi đã sử dụng files_put để tự động chuyển các tệp từ trang web sang máy tính để bàn của mình. Bạn đang gặp phải vấn đề gì? – INTJCapital

0

Tôi cũng có thể thấy vấn đề này. Có một cái gì đó đặc biệt đang xảy ra ở đây với Dropbox. Bạn nên kiểm tra trên diễn đàn của họ hoặc với nhóm hỗ trợ API của họ. Có vẻ như họ không chấp nhận chính xác các tham số gọi lại. Có lẽ đây là giới hạn chế độ phát triển (so với chế độ sản xuất). Hoặc có lẽ họ nghiêm ngặt về một số khác biệt POST so với GET mà Google không hỗ trợ.

Mã bên dưới thể hiện cùng một vấn đề mà bạn đã mô tả trong đó ủy quyền không bao giờ hoàn thành.

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

Tuy nhiên, cùng một mã hoạt động mà không có vấn đề với API OAuth 1 của Twitter. Đoạn mã dưới đây sẽ đổ ra JSON từ luồng của mình (một khi bạn thay thế các thẻ từ thiết lập của bạn trong 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); 
} 

Nếu bạn có thể để thu hẹp này xuống đến một vấn đề Google đăng nhập một lỗi ở đây trên Issue Tracker.

+0

Tôi đã đăng lên diễn đàn Dropbox (https://forums.dropbox.com/topic.php?id=97153#post-529744) và nhận được phản hồi "Ứng dụng sẽ không xuất hiện trong danh sách "Ứng dụng của tôi" cho đến khi toàn bộ luồng OAuth được hoàn tất thành công, nghĩa là/access_token phải được gọi bằng mã thông báo yêu cầu ban đầu, sau khi người dùng ủy quyền ứng dụng trên trang web. Bước đó đã hoàn tất chưa? " Bạn làm cách nào để thực hiện điều đó với UrlFetchApp tôi tự hỏi? – Pram

+0

Apps Script thực hiện một chút phép thuật cho OAuth1 về việc tìm nạp mã thông báo. Bạn có thể thực hiện mọi thứ mà '.addOAuthService()' thực hiện thủ công bằng cách thực hiện cuộc gọi để nhận mã thông báo, xử lý cuộc gọi lại. Bạn có thể xem ví dụ về điều đó tại đây với OAuth2 - https://github.com/entaq/GoogleAppsScript/blob/ master/Salesforce.com/OAuthAndUploadContactsToSalesforce.gs –

Các vấn đề liên quan