Я не вижу файлы и папки, созданные через api на моем Google Диске, используя php
Я пытаюсь создать папку с помощью google drive api. Я могу получить идентификатор файла в конце. но я не могу использовать мою папку на диске Google. кажется, проблема с разрешением?
$scopes = array(
'https://www.googleapis.com/auth/drive',
'https://www.googleapis.com/auth/drive.appdata','https://www.googleapis.com/auth/drive.apps.readonly',
'https://www.googleapis.com/auth/drive.metadata','https://www.googleapis.com/auth/drive.file',
'https://www.googleapis.com/auth/drive.readonly','https://www.googleapis.com/auth/drive.photos.readonly'
);
$creds = new Google_Auth_AssertionCredentials(
$serviceAccountName,
$scopes,
file_get_contents($keyFile)
);
$client = new Google_Client();
$client->setApplicationName($appName);
$client->setClientId($clientId);
$client->setAssertionCredentials($creds);
$service = new Google_Service_Drive($client);
$fileMetadata = new Google_Service_Drive_DriveFile(array(
'name' => 'Invoices',
'permissions' => array('type'=>'anyone','role'=>'reader','allowFileDiscovery'=>1),
'mimeType' => 'application/vnd.google-apps.folder'));
$file = $service->files->create($fileMetadata, array());
printf("File ID: %s\n", $file->id);
Ответы
Ответ 1
Ответ Mayrop частично прав.
Создаваемые файлы принадлежат электронной почте для учетной записи API (что-то вроде [email protected]
Вам необходимо предоставить разрешение владельцу этой учетной записи, например
$newPermission = new Google_Service_Drive_Permission();
$value="email id";
$type="user";
$role="writer";
$newPermission->setValue($value);
$newPermission->setType($type);
$newPermission->setRole($role);
try {
$res= $service->permissions->insert($fileId, $newPermission);
print_r($res);
} catch (Exception $e) {
print "An error occurred: " . $e->getMessage();
}
Вы увидите эту папку в Shared with me. Вы также можете добавить свой диск вручную.
Вы также можете отключить отправку уведомлений по электронной почте с помощью
$service->permissions->insert($fileId, $newPermission,array('sendNotificationEmails'=>false));
Надеюсь, это сработает для вас.
Ответ 2
Создаваемые файлы принадлежат к электронной почте учетной записи API (что-то вроде [email protected]
). Если вы перейдете к URL-адресу накопителя:
https://docs.google.com/document/d/{ID}
, вы получите страницу "Разрешение на отказ, запрос доступа".
Электронная почта учетной записи службы не связана с вашим электронным адресом пользователя.
Чтобы создать файлы с вашим пользователем, вам необходимо создать авторизацию маркера OAauth.
-
Создайте учетные данные OAuth в соответствии с шагами "Шаг 1: включите API-интерфейс накопителя" на на этой странице
-
Измените script, следуя примеру этой страницы, вы можете:
use Google_Client;
use Google_Service_Drive;
use Google_Service_Drive_DriveFile;
...
$file = 'root/to/your/credentials.json';
$client = new Google_Client();
$client->setScopes([
'https://www.googleapis.com/auth/drive',
'https://www.googleapis.com/auth/drive.appdata',
'https://www.googleapis.com/auth/drive.apps.readonly',
'https://www.googleapis.com/auth/drive.metadata',
'https://www.googleapis.com/auth/drive.file',
'https://www.googleapis.com/auth/drive.readonly',
'https://www.googleapis.com/auth/drive.photos.readonly'
]);
$client->setAuthConfig($file);
$authUrl = $client->createAuthUrl();
printf("Open the following link in your browser:\n%s\n", $authUrl);
// You will need to open this url
print 'Enter verification code: ';
$authCode = trim(fgets(STDIN));
$accessToken = $client->authenticate($authCode);
file_put_contents($credentialsPath, $accessToken);
printf("Credentials saved to %s\n", $credentialsPath);
$client->setAccessToken(json_decode($accessToken, true));
$service = new Google_Service_Drive($client);
$metadata = new Google_Service_Drive_DriveFile([
'name' => 'testing drive',
'mimeType' => "application/vnd.google-apps.document"
]);
$file = $service->files->create($metadata, []);
print_r($file);
Файл должен находиться в домашнем каталоге диска.
Кстати, я предлагаю вам попробовать новую версию google/apiclient: 2.0.2 (которая все еще находится на бета-версии, но работает нормально).
Ответ 3
Да, кажется, проблемы с разрешениями. Попробуйте удалить
'permissions' => array('type'=>'anyone','role'=>'reader','allowFileDiscovery'=>1),
из
$fileMetadata = new Google_Service_Drive_DriveFile(array(
'name' => 'Invoices',
'permissions' => array('type'=>'anyone','role'=>'reader','allowFileDiscovery'=>1),
'mimeType' => 'application/vnd.google-apps.folder'));