Суббота, 03 января 2015 20:06

Сайт на Google Drive

Google Drive позволяет публиковать директорию в качестве сайта. Вы можете добавлять статические файлы (HTML, CSS) и изображения в папку для публичного доступа, а затем напрямую обращаться к ним, используя относительные пути и названия файлов. Google Drive поддерживает JavaScript и другие скриптовые языки, так что вполне возможен запуск приложения JavaScript Drive.

Требования к публикации:

1. Папка, содержащая файлы, должна быть общедоступной. Любые папки, добавляемые в основную директорию, также должны быть общедоступными. 

2. Файлы, содержащиеся в папке, должны быть связаны между собой webViewLink API

Чтобы создать общедоступную папку программно, вам необходимо вставить MIME файл типа application/vnd.google-apps.folder (данный тип зарезервирован в Google Drive) и затем выставить необходимые разрешения (на английском). Тип аккаунта должен быть назначен на "Любой" (anyone), роль - "Для чтения" (reader). Следующие примеры показывают, как создать общедоступную папку, используя поддерживаемые и доступные библиотеки.


JAVA:

private static File createPublicFolder(Drive service, String folderName) throws IOException {
File body = new File();
body.setTitle(folderName);
body.setMimeType("application/vnd.google-apps.folder");

File file = service.files().insert(body).execute();

Permission permission = new Permission();
permission.setValue("");
permission.setType("anyone");
permission.setRole("reader");

service.permissions().insert(file.getId(), permission).execute();

return file;
}

Python:
def create_public_folder(service, folder_name):
body = {
'title': folder_name,
'mimeType': 'application/vnd.google-apps.folder'
}

file = service.files().insert(body=body).execute()

permission = {
'value': '',
'type': 'anyone',
'role': 'reader'
}

service.permissions().insert(
fileId=file['id'], body=permission).execute()

 return file


PHP:

function createPublicFolder($service, $folderName) {
$file = new Google_DriveFile();
$file->setTitle($folderName);
$file->setMimeType('application/vnd.google-apps.folder');

$createdFile = $service->files->insert($file, array(
'mimeType' => 'application/vnd.google-apps.folder',
));

$permission = new Google_Permission();
$permission->setValue('');
$permission->setType('anyone');
$permission->setRole('reader');

$service->permissions->insert(
$createdFile->getId(), $permission);

return $file;
}


.NET:

private static File createPublicFolder(DriveService service, String folderName) {
File body = new File();
body.Title = folderName;
body.MimeType = "application/vnd.google-apps.folder";

File file = service.Files.Insert(body).Fetch();

Permission permission = new Permission();
permission.Value = "";
permission.Type = "anyone";
permission.Role = "reader";

service.Permissions.Insert(permission, file.Id).Fetch();

return file;
}


Ruby:

def create_public_folder(client, folder_name)
drive = client.discovered_api('drive', 'v2')
file = drive.files.insert.request_schema.new({
'title' => folder_name,
'mimeType' => 'application/vnd.google-apps.folder'
})

result = client.execute(
:api_method => drive.files.insert,
:body_object => file)

permission = drive.permissions.insert.request_schema.new({
'value' => '',
'type' => 'anyone',
'role' => 'reader'
})

file_id = result.data['id']

result = client.execute(
:api_method => drive.permissions.insert,
:body_object => permission,
:parameters => { 'fileId' => file_id })

return result.data
end


JavaScript:

function createPublicFolder(folderName) {
var body = {
'title': folderName,
'mimeType': "application/vnd.google-apps.folder"
};

var request = gapi.client.drive.files.insert({
'resource': body
});

request.execute(function(resp) {
console.log('Folder ID: ' + resp.id);
var permissionBody = {
'value': '',
'type': 'anyone',
'role': 'reader'
};
var permissionRequest = gapi.client.drive.permissions.insert({
'fileId': resp.id,
'resource': permissionBody
});
permissionRequest.execute(function(resp) { });
});
}


Использование webViewLink

Основой в использовании встроенной утилиты Google Drive и публикации сайта является webViewLink. Когда вы обращаетесь к общедоступной папке, используя files.insert, то ответ от Google Drive содержит в себе запись от webViewLink, которая выглядит примерно так:

https://googledrive.com/host/A1B2C3D4E5F6G7H8J9

Примечание: Папка в Google Drive по сути MIME файл с типом application/vnd.google-apps.folder. Более подробную информацию можно найти тут (на английском).

Как только мы получаем данный URL, наше приложение в Google Drive может его использовать, чтобы предоставлять доступ к содержимому папок. Например, ссылка на файл kittens.jpg в папке с изображениями может выглядеть как

https://googledrive.com/host/A1B2C3D4E5F6G7H8J9/images/kittens.jpg

Можно получить доступ к файлам и папкам в общедоступной папке, используя названия файлов и относительные пути вместо уникальных номеров (ID) файлов. Если добавить подобную ссылку в index.html файл, то страница отобразится вместе с изображением, как и ожидается. А если вы напрямую укажите на папку, в которой не будет index.html файла, то Google Drive отобразить простой список всех файлов каталога.

Расширение базовой идеи публикации

Возможность связывать файлы между собой подобным способом дает огромное количество возможностей для разработчиков. Написание утилиты для блогинга, создание утилит для публикаций обновлений общих документов, галереи - во всех случаях можно получить выгоду и неплохой проект на выходе. Для более нагруженных проектов, Google Drive можно рассматривать как платформу для создания сайтостроительной утилиты для других пользователей Google Drive.