ホーム>source

Googleドライブのファイルを削除する作業を行っていますが、機能しません。 $client->setScopes(Google_Service_Drive::DRIVE_METADATA_READONLY); からスコープを変更しました   $client->setScopes(Google_Service_Drive::DRIVE); へ 。

完全なコードは次のとおりです。

<?php
require __DIR__ . '/vendor/autoload.php';
if (php_sapi_name() != 'cli') {
 throw new Exception('This application must be run on the command line.');
}
/**
* Returns an authorized API client.
* @return Google_Client the authorized client object
*/
function getClient()
{
  $client = new Google_Client();
  $client->setApplicationName('Google Drive API PHP Quickstart');
  //$client->setScopes(Google_Service_Drive::DRIVE_METADATA_READONLY);
  $client->setScopes(Google_Service_Drive::DRIVE);
  //$client->setScopes(Google_Service_Drive::DRIVE_APPDATA);
  //$client->setScopes(Google_Service_Drive::DRIVE_FILE);
  //$client->setAuthConfig('credentials.json');
  $client->setAccessType('offline');
  // Load previously authorized credentials from a file.
  $credentialsPath = 'token.json';
  if (file_exists($credentialsPath)) {
    $accessToken = json_decode(file_get_contents($credentialsPath), true);
  } else {
    // Request authorization from the user.
    $authUrl = $client->createAuthUrl();
    printf("Open the following link in your browser:\n%s\n", $authUrl);
    print 'Enter verification code: ';
    $authCode = trim(fgets(STDIN));
    // Exchange authorization code for an access token.
    $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
    // Check to see if there was an error.
    if (array_key_exists('error', $accessToken)) {
        throw new Exception(join(', ', $accessToken));
    }
    // Store the credentials to disk.
    if (!file_exists(dirname($credentialsPath))) {
        mkdir(dirname($credentialsPath), 0700, true);
    }
    file_put_contents($credentialsPath, json_encode($accessToken));
    printf("Credentials saved to %s\n", $credentialsPath);
}
$client->setAccessToken($accessToken);
// Refresh the token if it's expired.
if ($client->isAccessTokenExpired()) {
    $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
    file_put_contents($credentialsPath, json_encode($client->getAccessToken()));
}
    return $client;
}

// Get the API client and construct the service object.
$client = getClient();
$service = new Google_Service_Drive($client);
/*Get Files under hourly_backup*/
$hourly_backup_id = '1Y3cGEwXy9gLcw9WO0isqwtwtysU0g_bK';
$optParams = array(
  //'pageSize' => 20,
  'fields' => 'nextPageToken, files(id,name,size,parents,createdTime)',
  'q' => "'".$hourly_backup_id."' in parents"
);
$results = $service->files->listFiles($optParams);
if (count($results->getFiles()) == 0) {
    print "No files found.\n";
} else {
    foreach ($results->getFiles() as $file) {
        if(strtotime(date('Y-m-d H:i:s', strtotime($file->getcreatedTime()))) <= strtotime('-48 hours')){
            try {
                return $service->files->delete($file->getId());
            } catch (Exception $e) {
                print "An error occurred: " . $e->getMessage();
            }
            return NULL;
        } else {
           print "weh \n";
        }
    }
}

条件が満たされ、削除コードが実行された場合、これは私が得るものです:

An error occurred: {
 "error": {
   "errors": [
   {
    "domain": "global",
    "reason": "insufficientPermissions",
    "message": "Insufficient Permission"
   }
  ],
  "code": 403,
  "message": "Insufficient Permission"
 }
}

更新:

API Explorerでも試しましたが、問題なく機能しました。

私が取り組んでいるGoogleドライブは私のものであり、問​​題なく直接ファイルを削除することができます。私のコードには何が欠けているのでしょうか?

あなたの答え
  • 解決した方法 # 1

    "Insufficient Permission"

    現在認証されているユーザーには、あなたがやろうとしていることを行う権限がありません。

    スコープを変更したと言いました。しかし、アプリケーションを再認証しましたか?アプリケーションがポップアップし、ドライブアカウントへのアクセス許可を要求します。まだ読み取り専用アクセス権を持つ古いアクセストークンまたは更新トークンを使用して実行している場合、ファイルを削除することはできません。

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ java - コンパイラは、静的コンテキストで別のクラスの変数を呼び出していると考えていますが、