7

テストケースとして、GoogleScriptsを使用してGoogleドライブから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にアプリケーションの承認リクエストが表示され、アプリが正常に承認されたことが示されますが、確認すると、アプリが[マイアプリ]のリストになく、ファイルがアップロードされておらず、ログのエントリ。ディレクトリ「upload_dir」はGDとDBの両方に存在します。「AppFolder」と「FullDropbox」のアプリタイプで同じコードを試しましたが、同じ結果が得られます。

さらに、スクリプトをもう一度実行すると、次のような承認ページが再度トリガーされます。

これ

表示するには、[許可]をクリックすると成功画面が表示されますが、アプリケーションは[マイアプリ]に表示されません。スクリプトを再度実行すると、プロセスが繰り返されます。

誰かが私が間違ったことを指摘できますか?

アップデート

そのため、個々の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)
}

マップのコード実装はここにあります。私が見ることができる主な問題は、承認ステップがDropbox承認エンドポイントを呼び出さないことです(つまり、アプリケーションを承認するためのブラウザーのリダイレクトは行われません)。行の直後にブレークポイントを配置し、Logger.log(authStringx);authStringxのコンテンツを貼り付けているWebページに手動でアクセスすると、アプリを承認するための画面が表示されます。私はそれを受け入れ、アプリが「マイアプリ」に登録されているというメッセージを受け取ります。プログラムを続行すると、メッセージが表示されます

ここに画像の説明を入力してください

何か案は?

4

2 に答える 2

3

乳母車、

私は同じタスクを達成しようとしていて、あなたの投稿に出くわしました。私はプログラマーではないので、2番目の部分も理解できません(認証ページの起動は失敗します)が、3番目のステップでプロセスを完了し、アプリを正常に接続することができました。

それ以外の:

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に接続したことを確認するメールを受け取りました。アプリは、アカウントの[設定]の下に表示されます。とにかく、私が言ったように、私はプログラマーではないので、醜いコードでごめんなさい。これまでのところ、コードを提供していただきありがとうございます。根本的な問題が解決しない場合でも、これが少なくとも前進するのに役立つことを願っています。

于 2013-03-01T04:49:16.097 に答える
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 OAuth1APIで問題なく機能します。以下のコードは、ストリームから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の問題に絞り込むことができる場合は、ここで問題追跡システムにバグを記録してください。

于 2013-02-25T21:51:28.887 に答える