Z tego artykułu dowiesz się, jak otrzymywać zdarzenia z Google Drive z Google Cloud Pub/Sub.
Zdarzenie na Dysku to działanie lub zmiana zasobu na Dysku, np. nowy plik w folderze. Zdarzenia możesz wykorzystywać do analizowania tego, co się wydarzyło, a potem podejmować odpowiednie działania lub reagować w sposób, który będzie przydatny dla użytkowników.
Oto kilka przykładów zastosowań zdarzeń:
Obserwuj zmiany w pliku, folderze lub na dysku współdzielonym i reaguj na nie, np. gdy plik zostanie zmodyfikowany lub zostanie przesłana nowa wersja.
Monitoruj zmiany w plikach, aby zwiększyć wydajność aplikacji.
Audytowanie działań takich jak udostępnianie plików, przenoszenie plików i usuwanie plików, aby wykrywać potencjalne wycieki danych i nieautoryzowany dostęp.
Dostarczanie statystyk dotyczących zarządzania plikami przez użytkowników, co pomaga określać obszary, w których można ulepszyć zarządzanie treściami.
śledzić zmiany w plikach, aby sprawdzać zgodność z wymaganiami prawnymi lub zasadami bezpieczeństwa;
Analizuj aktywność na Dysku za pomocą innych usług Google Cloud, takich jak Eventarc, Workflows i BigQuery.
Jak działają zdarzenia
Za każdym razem, gdy coś się dzieje na Dysku, zasób interfejsu Google Drive API jest tworzony, aktualizowany lub usuwany. Dysk używa zdarzeń do przekazywania aplikacji informacji o rodzaju aktywności i zasobie interfejsu Drive API, którego dotyczy ta aktywność.
Dysk kategoryzuje zdarzenia według typu. Typy zdarzeń pomagają filtrować i otrzymywać tylko potrzebne informacje oraz umożliwiają podobne działania w ten sam sposób.
W tabeli poniżej pokazano, jak aktywność na Dysku wpływa na powiązany zasób interfejsu Drive API oraz jaki typ zdarzenia otrzymuje aplikacja na Dysku:
Aktywność | Zasób Drive API | Typ zdarzenia |
---|---|---|
Użytkownik dodaje plik do folderu lub dysku współdzielonego. | Utworzono zasób File . |
Nowy plik |
Użytkownik tworzy propozycję dostępu do pliku. | Utworzony zostanie zasób AccessProposal . |
Nowa propozycja dostępu |
Odbieranie zdarzeń z Dysku Google
Tradycyjnie aplikacja Dysku mogła lokalizować zdarzenia za pomocą interfejsu Drive API lub interfejsu Google Drive Activity API. Dzięki dodaniu zdarzeń Dysku w interfejsie Google Workspace Events API dostępna jest teraz trzecia metoda odbierania zdarzeń:
Wersja zapoznawcza dla deweloperów: subskrybuj zdarzenia za pomocą interfejsu Google Workspace Events API, aby otrzymywać zdarzenia w miarę ich występowania. Więcej informacji znajdziesz w artykule Subskrybowanie zdarzeń na Dysku Google.
Subskrybuj zdarzenia za pomocą interfejsu Drive API. Pobierz zdarzenia zmiany użytkownika za pomocą metody
changes.watch
lub zdarzenia zmiany pliku za pomocą metodyfiles.watch
.Wysyłaj zapytania o ostatnie zdarzenia, wywołując interfejs Google Drive Activity API.
W tabeli poniżej znajdziesz wyjaśnienie różnic między subskrybowaniem zdarzeń a wysyłaniem zapytań o nie oraz powody, dla których warto subskrybować zdarzenia:
Subskrybowanie wydarzeń Google Workspace | Subskrybowanie zdarzeń interfejsu Drive API | Wysyłanie zapytań o zdarzenia interfejsu Drive Activity API | |
---|---|---|---|
Przypadki użycia |
|
|
|
Interfejs API | Interfejs Google Workspace Events API | Drive API | Drive Activity API |
Źródło zdarzeń | Pliki, foldery i dyski współdzielone |
changes.watch i files.watch
|
DriveActivity
|
Obsługiwane zdarzenia | Listę obsługiwanych typów zdarzeń znajdziesz w artykule Typy zdarzeń do tworzenia subskrypcji w dokumentacji interfejsu Google Workspace Events API. |
Channel
Listę obsługiwanych typów zdarzeń znajdziesz w artykule Informacje o zdarzeniach powiadomień interfejsu Google Drive API w dokumentacji interfejsu Drive API. |
Action
Listę obsługiwanych pól znajdziesz w dokumentacji referencyjnej interfejsu Drive Activity API. Action
|
Format zdarzenia | Wiadomość Pub/Sub sformatowana zgodnie ze specyfikacją CloudEvent. Więcej informacji znajdziesz w artykule Struktura zdarzeń Google Workspace. |
Zasób Drive API (Channel )
|
Zasób Drive Activity API (Action )
|
Dane zdarzenia | Ciąg tekstowy zakodowany w formacie Base64 z danymi zasobu lub bez nich. Przykładowe ładunki znajdziesz w sekcji Dane zdarzenia. |
Ładunek JSON zawierający dane zasobu. Przykładowy ładunek znajdziesz w sekcji Channel
w dokumentacji referencyjnej.
|
Ładunek JSON zawierający dane zasobu. Przykładowy ładunek znajdziesz w treści odpowiedzi
w dokumentacji referencyjnej.activity.query
|
Pierwsze kroki z wydarzeniami na Dysku
Z tego przewodnika dowiesz się, jak utworzyć subskrypcję zdarzeń Google Workspace na zasobie Dysku i nią zarządzać. Dzięki temu Twoja aplikacja będzie mogła otrzymywać zdarzenia za pomocą Google Cloud Pub/Sub.
Tworzenie projektu Google Cloud
Aby wygenerować projekt Google Cloud, zapoznaj się z artykułem Tworzenie projektu Google Cloud.
Włącz interfejsy Google Workspace Events API, Google Cloud Pub/Sub API i Google Drive API.
Zanim zaczniesz korzystać z interfejsów Google API, musisz je włączyć w projekcie Google Cloud. W jednym projekcie Google Cloud możesz włączyć co najmniej 1 interfejs API.Google Cloud Console
W konsoli Google Cloud otwórz projekt Google Cloud dla swojej aplikacji i włącz interfejsy Google Workspace Events API, Pub/Sub API i Drive API:
Sprawdź, czy włączasz interfejsy API w odpowiednim projekcie w Cloud, a potem kliknij Dalej.
Sprawdź, czy włączasz odpowiednie interfejsy API, a następnie kliknij Włącz.
gcloud
W katalogu roboczym zaloguj się na konto Google:
gcloud auth login
Ustaw projekt na projekt Cloud dla aplikacji:
gcloud config set project PROJECT_ID
Zastąp
PROJECT_ID
identyfikatorem projektu projektu Cloud na potrzeby aplikacji.Włącz interfejsy Google Workspace Events API, Pub/Sub API i Drive API:
gcloud services enable workspaceevents.googleapis.com \ pubsub.googleapis.com \ drive.googleapis.com
Konfigurowanie identyfikatora klienta
Aby wygenerować identyfikator klienta OAuth 2.0, zapoznaj się z artykułem Tworzenie danych logowania identyfikatora klienta OAuth.
Tworzenie tematu Pub/Sub
Zanim utworzysz subskrypcję, musisz utworzyć temat Google Cloud Pub/Sub, który będzie otrzymywać odpowiednie zdarzenia, którymi jest zainteresowana Twoja aplikacja. Aby utworzyć temat Pub/Sub, zapoznaj się z artykułem Tworzenie tematu Pub/Sub i subskrybowanie go.
Pamiętaj, aby w swoich żądaniach odwoływać się do konta usługi Dysku (drive-api-event-push@system.gserviceaccount.com
).
Tworzenie subskrypcji Dysku
Zdarzenia w chmurze są wysyłane, gdy zmieni się temat subskrypcji (lub dowolny inny plik w hierarchii tematu). Jeśli na przykład utworzysz subskrypcję na dysku współdzielonym, a plik znajdujący się w kilku podfolderach na tym dysku zostanie zmieniony, wygenerowane zostanie zdarzenie. Listę obsługiwanych zasobów i typów zdarzeń na Dysku znajdziesz w artykule Typy zdarzeń do tworzenia subskrypcji.
Ta aplikacja Node.js tworzy subskrypcję zdarzeń na Dysku w pliku lub folderze, aby nasłuchiwać zdarzeń zmiany treści. Więcej informacji znajdziesz w artykule Tworzenie subskrypcji Google Workspace.
Aby uruchomić ten przykład, upewnij się, że masz zainstalowane Node.js i npm. Musisz też sprawdzić, czy masz zainstalowane wymagane zależności, aby uruchomić ten przykład.
# Install needed dependencies
$ npm install googleapis @google-cloud/local-auth axios
Aby utworzyć subskrypcję Dysku, użyj metody subscriptions.create()
interfejsu Google Workspace Events API, aby utworzyć zasób Subscription
:
// app.js
const fs = require('fs').promises;
const {authenticate} = require('@google-cloud/local-auth');
const {google} = require('googleapis');
const axios = require('axios');
// Scopes for Google Drive API access.
const SCOPES = ['SCOPES'];
/**
* Authenticates the user running the script.
* @return {Promise<OAuth2Client>} The authorized client.
*/
async function authorize() {
const client = await authenticate({
scopes: SCOPES,
keyfilePath: 'credentials.json',
});
if (client.credentials) {
const content = await fs.readFile('credentials.json');
const keys = JSON.parse(content);
const {client_id, client_secret} = keys.installed || keys.web;
const payload = JSON.stringify({
type: 'authorized_user',
client_id,
client_secret,
refresh_token: client.credentials.refresh_token,
});
await fs.writeFile('token.json', payload);
return client;
} else {
throw new Exception(
'credentials.json did not have the Oauth client secret or it was not properly formatted');
}
}
/**
* Creates a subscription to Google Drive events.
* @param {OAuth2Client} authClient An authorized OAuth2 client.
*/
async function createSubscription(authClient) {
const url = 'https://workspaceevents.googleapis.com/v1beta/subscriptions';
const data = {
targetResource: 'TARGET_RESOURCE',
eventTypes: ['EVENT_TYPES'],
payload_options: {
include_resource: {
{
'<var>RESOURCE_DATA</var>'
}
}
},
drive_options: {
include_descendants: {
{
'<var>INCLUDE_DESCENDANTS</var>'
}
}
},
notification_endpoint: {pubsub_topic: 'TOPIC_NAME'}
};
try {
const {token} = await authClient.getAccessToken();
const response = await axios.post(
url, data, {headers: {'Authorization': `Bearer ${token}`}});
console.log('Subscription created:', response.data);
} catch (error) {
const message = error.response ? error.response.data : error.message;
console.error('Error creating subscription:', message);
}
}
authorize().then(createSubscription).catch(console.error);
Zastąp następujące elementy:
SCOPES
: Co najmniej 1 zakres OAuth, który obsługuje każdy typ zdarzenia w subskrypcji. Sformatowane jako tablica ciągów tekstowych. Aby podać kilka zakresów, oddziel je przecinkami. Zalecamy używanie najbardziej restrykcyjnego zakresu, który nadal umożliwia działanie aplikacji. Na przykład:'https://www.googleapis.com/auth/drive.file'
.TARGET_RESOURCE
: zasób Google Workspace, który subskrybujesz, sformatowany jako pełna nazwa zasobu. Aby na przykład zasubskrybować plik lub folder na Dysku, użyj//drive.googleapis.com/files/FileID
.EVENT_TYPES
: co najmniej 1 typ zdarzenia, na który chcesz się subskrybować w zasobie docelowym. Sformatuj jako tablicę ciągów znaków, np.'google.workspace.drive.file.v3.contentChanged'
.RESOURCE_DATA
: wartość logiczna określająca, czy subskrypcja obejmuje dane zasobów w ładunku zdarzenia. Ta właściwość wpływa na czas trwania subskrypcji. Więcej informacji znajdziesz w sekcji Dane zdarzenia.True
: obejmuje wszystkie dane zasobów. Aby ograniczyć liczbę uwzględnianych pól, dodaj parametrfieldMask
i określ co najmniej 1 pole zmienionego zasobu. Tylko subskrypcje zasobów w Google Chat i na Dysku obsługują uwzględnianie danych zasobów.False
: nie obejmuje danych o zasobach.
INCLUDE_DESCENDANTS
: pole logiczne, które jest częściąDriveOptions
. Dostępne tylko wtedy, gdytargetResource
jest plikiem na Dysku lub dyskiem współdzielonym, którego typ MIME jest ustawiony naapplication/vnd.google-apps.folder
. Nie można ustawić w folderze głównym Mojego dysku ani dysków współdzielonych.True
: Subskrypcja obejmuje wszystkie pliki na Dysku potomne na liście zdarzeń.False
: subskrypcja jest tworzona dla pojedynczego pliku lub dysku współdzielonego, który jest określony jakotargetResource
.
TOPIC_NAME
: pełna nazwa tematu Pub/Sub utworzonego w projekcie Cloud. Ten temat Pub/Sub odbiera zdarzenia dla subskrypcji. Sformatowano jakoprojects/PROJECT_ID/topics/TOPIC_ID
. PolenotificationEndpoint
służy do określania tematu Pub/Sub, do którego subskrypcja dostarcza zdarzenia.
Testowanie subskrypcji Dysku
Aby sprawdzić, czy otrzymujesz zdarzenia z Dysku, możesz wywołać zdarzenie i pobrać wiadomości do subskrypcji Pub/Sub. Więcej informacji znajdziesz w artykule Testowanie subskrypcji Google Workspace.
Przetwarzanie zdarzeń na Dysku za pomocą Cloud Functions
Zdarzenia na Dysku są wysyłane do tematu Pub/Sub w utworzonej przez Ciebie subskrypcji. Podczas tworzenia wyzwalacza upewnij się, że temat Pub/Sub wyzwalacza jest zgodny z tematem Pub/Sub w subskrypcji zdarzeń. Następnie możesz wdrożyć funkcję Cloud Run i wprowadzić zmiany w pliku, aby zobaczyć zmiany zdarzeń w logach.
Zanim utworzysz funkcję, zaktualizuj plik package.json
w przypadku zależności:
{
"dependencies": {
"@google-cloud/functions-framework": "^3.0.0",
"cloudevents": "^8.0.0"
}
}
Następnie utwórz kod źródłowy funkcji:
const functions = require('@google-cloud/functions-framework');
const { HTTP } = require("cloudevents");
/**
* A Cloud Function triggered by Pub/Sub messages containing Google Drive activity events.
* This function processes different types of Drive events.
*
* @param {object} cloudEvent The CloudEvent object.
* @param {object} cloudEvent.data The data payload from the event source.
*/
functions.cloudEvent('helloFromDrive', async (cloudEvent) => {
try {
// Verify the Pub/Sub message exists
if (!cloudEvent.data || !cloudEvent.data.message) {
console.warn("Event is missing the Pub/Sub message payload.");
return;
}
// Extract the Pub/Sub message details
const { message } = cloudEvent.data;
const { attributes, data } = message;
// The original Drive CloudEvent is reconstructed from the Pub/Sub message attributes
const driveEvent = HTTP.toEvent({ headers: attributes });
const { type } = driveEvent;
// The Drive event's payload is a base64 encoded JSON string
const payload = JSON.parse(Buffer.from(data, "base64").toString());
console.log(`Processing Drive event type: ${type}`);
// Use a switch statement to handle different event types
switch (type) {
case 'google.workspace.drive.file.v3.contentChanged':
console.log('File Content Changed:', payload);
break;
case 'google.workspace.drive.accessproposal.v3.created':
console.log('Access Proposal Created:', payload);
break;
default:
console.log(`Received unhandled event type: ${type}`);
break;
}
} catch (error) {
console.error("An error occurred while processing the Drive event:", error);
}
});
Ograniczenia
- Gdy pole logiczne
includeDescendants
wDriveOptions
ma wartośćtrue
, subskrypcje Dysku na dyskach i folderach współdzielonych zawsze wysyłają zdarzenie, nawet jeśli plik, który je wywołał, jest zagnieżdżony wiele poziomów poniżej folderu użytego do subskrypcji Dysku. - Nawet jeśli utworzysz subskrypcję folderu, możesz nie otrzymywać wszystkich zdarzeń w hierarchii plików, ponieważ użytkownik lub aplikacja mogą nie mieć do nich dostępu. W takim przypadku subskrypcja pozostanie aktywna, ale nie będziesz otrzymywać żadnych zdarzeń dotyczących zasobów, do których nie masz dostępu.
- Subskrypcje są obsługiwane w przypadku zdarzeń dotyczących wszystkich plików i folderów, ale nie folderu głównego dysków współdzielonych. Subskrypcje są obsługiwane tylko w przypadku plików i folderów na dyskach współdzielonych. Zmiany wprowadzone bezpośrednio w folderze głównym dysku współdzielonego nie spowodują wywołania zdarzeń.
- Użytkownik, który autoryzuje subskrypcję, musi mieć uprawnienia do pliku odpowiadającego zdarzeniom, które subskrybuje.
- Subskrypcja otrzymuje tylko zdarzenia dotyczące zasobów, do których użytkownik ma dostęp za pomocą konta Google Workspace lub konta Google.
Powiązane artykuły
- Omówienie interfejsu Google Workspace Events API
- Tworzenie subskrypcji Google Workspace
- Subskrybowanie zdarzeń na Dysku Google