2

Google クラウド プリントに接続して一部の印刷を自動化する Google Apps Script を作成しました。スクリプトは時間間隔で自動実行され、関連するファイルを検索し、見つかった場合はそれらをプリンターに送信します。私のコードはOAuthConfig を使用し、正常に動作していましたが、今ではそのクラスは廃止されており、週末の試行錯誤とインターウェブの精査の後、 OAuth2 で動作させることができません

正常に動作していたOAuthConfig コードは次のとおりです。

function printDoc(docId, docTitle, myPrinterId) {

  var scope = 'https://www.googleapis.com/auth/cloudprint';
  var url = 'https://www.google.com/cloudprint/submit'; 
  var payloadOfSubmit = {
    "printerid" : myPrinterId, 
    "title" : docTitle,
    "content"  : docId, 
    "contentType" : "google.kix"  
  };

  var fetchArgs = googleOAuth_('google', scope, payloadOfSubmit); 
  fetchArgs.method = 'POST';
  var responseOfSubmit = UrlFetchApp.fetch(url, fetchArgs);
  var jsonOfSubmit = JSON.parse(responseOfSubmit.getContentText()); 

  return jsonOfSubmit;
}

function googleOAuth_(name, scope, payloadData) {
  var oAuthConfig = UrlFetchApp.addOAuthService(name);
  oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
  oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope="+scope);
  oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
  oAuthConfig.setConsumerKey("anonymous");
  oAuthConfig.setConsumerSecret("anonymous");
  return {
    oAuthServiceName:name, 
    oAuthUseToken:"always", 
    muteHttpExceptions:true, 
    payload:payloadData
  }; 
}  

OAuth2の githubライブラリの接続に成功しました。ただし、そこで提供されている手順と他の多くのサイトで提供されている手順の違いは、ユーザーが手動でクリックしてリクエストを承認するように求められる Web サービスとしてコードがデプロイされることを想定していることです。私の場合、コードは Google Apps Script ファイルに保存され、クラウド プリンターは同じ Google アカウントにあるため、この手動の介入や元の OAuthconfig とのやり取りは必要ありませんでした。

指示を適応させることによる私の最初の試みは次のとおりです。

function printDoc2(docId, docTitle, myPrinterId) {

  var url = 'https://www.google.com/cloudprint/submit';
  var scope = 'https://www.googleapis.com/auth/cloudprint'; 
  var payloadOfSubmit = {
    "printerid" : myPrinterId, 
    "title" : docTitle,
    "content"  : docId, 
    "contentType" : "google.kix",
  };

  var accessToken = googleOAuth_('google', scope).getAccessToken();

  var params = {
    method:"POST",
    headers: {"Authorization": "Bearer " + accessToken},
    muteHttpExceptions:true,
    payload:payloadOfSubmit
  };

  var responseOfSubmit = UrlFetchApp.fetch(url, params);
  //Logger.log(responseOfSubmit);
  var jsonOfSubmit = JSON.parse(responseOfSubmit.getContentText()); 

  return jsonOfSubmit;
}

function googleOAuth2_(name, scope) {

  return OAuth2.createService(name)
    .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
    .setTokenUrl('https://accounts.google.com/o/oauth2/token')
    .setClientId("anonymous")
    .setClientSecret("anonymous")
    .setProjectKey(ScriptApp.getProjectKey())
    .setPropertyStore(PropertiesService.getUserProperties())
    .setScope(scope)
    .setCallbackFunction('authCallback');
}

function authCallback(request) {
  var driveService = getDriveService();
  var isAuthorized = driveService.handleCallback(request);
  if (isAuthorized) {
    return HtmlService.createHtmlOutput('Success! You can close this tab.');
  } else {
    return HtmlService.createHtmlOutput('Denied. You can close this tab');
  }
}

しかし、これにより、行を実行しようとすると「アクセスが許可されていないか、有効期限が切れています」というエラーが表示されます。

var accessToken = googleOAuth_('google', scope).getAccessToken();

そこで、必要なトークンを取得できるように思われるアプリの ScriptApp Method getOAuthTokenを見つけました。上記の行を次のように置き換えました。

var accessToken = ScriptApp.getOAuthToken();

コードは実行されますが、サーバーからの応答は「エラー 403 ユーザー資格情報が必要です」です。

@Mogsdadの提案に基づく3回目の試みは次のとおりです。

function sendPrintJob(docId,myPrinterId,docTitle) {

  var payloadOfSubmit = {
            "printerid" : myPrinterId, 
            "title" : docTitle,
            "content"  : docId, 
            "contentType" : "google.kix" ,
  };

  var request = {
    "method": "POST",
    "headers":{"Authorization": "Bearer "+ScriptApp.getOAuthToken()},    
    "muteHttpExceptions": true
  };

  var responseOfSubmit = UrlFetchApp.fetch("https://www.google.com/cloudprint/submit", request);
  Logger.log(responseOfSubmit);
}

開発者コンソール プロジェクトを作成し、そこで提供されたクライアント ID を使用するなど、さまざまなバリエーションを試しましたが、これら 2 つの問題 (アクセスが許可されない、または資格情報が必要) で行き詰まります。誰かが何か助けを提供できれば、本当に感謝しています。

4

2 に答える 2