1. Giriş
Milyarlarca işletme ve kişi, iletişim kurmak ve veri işlemek için Gmail'i ve diğer G Suite hizmetlerini kullanıyor. Google, bu hizmetlerdeki bilgilere programatik olarak erişmenize yardımcı olmak için G Suite API'leri sunar. Günlük iş akışınızı kolayca otomatikleştirmek için API'leri kullanabilirsiniz. Bu laboratuvarda, gelen iletilerdeki e-postaları otomatik olarak kategorilere ayıran ve bu kategorileri bir Google e-tablosuna kaydeden güçlü bir Gmail uzantısı oluşturacaksınız. Bu uzantı G Suite'in RESTful API'lerini, Google Cloud Functions'ı ve diğer Google Cloud Platform hizmetlerini kullanacak.
Ne oluşturacaksınız?
Bu laboratuvarda, G Suite API'lerine ve diğer Google Cloud Platform hizmetlerine bağlı birkaç Cloud Functions işlevi oluşturup dağıtacaksınız. Bu işlevler:
- Gmail ve Google E-Tablolar verilerinize güvenli erişimi yetkilendirme
- Gelen postalara ekli resimleri ayıkla
- Cloud Vision API kullanarak bu görüntüleri kategorilere ayırın
- Bu kategorileri, gönderenin adresini ve ekin adını bir Google E-Tablosu'na yazın
Öğrenecekleriniz
- G Suite RESTful API'leriyle ilgili temel bilgiler
- Google Cloud Functions ve diğer Google Cloud Platform hizmetleriyle ilgili temel bilgiler
- Google Cloud Functions kullanarak Gmail'e programatik olarak erişme
Gerekenler
- Gmail ve Google E-Tablolar erişimine sahip bir Google hesabı. Hesabınız yoksa buradan bir hesap oluşturabilirsiniz.
- Temel JavaScript/Node.js bilgisi.
2. Öncelikle
API'leri etkinleştirme
Bu laboratuvarda aşağıdaki Google ürünlerini/hizmetlerini kullanacaksınız:
- Google Cloud Functions
- Google Cloud Pub/Sub
- Google Cloud Vision API
- Google Cloud Datastore
- Gmail API
- Google Sheets API
Google Cloud Functions
Google Cloud Functions, ayrı kod snippet'lerini ("işlevler") basit ve ölçeklenebilir şekilde çalıştırmanıza olanak tanıyan, Google'ın "Hizmet Olarak Sunucusuz İşlevler" platformudur.
Google Cloud Functions'ı etkinleştirmek için ekranınızın sol üstündeki üçgen menüyü tıklayarak sol gezinme kenar çubuğunu açın:
Gezinme menüsünde Cloud Functions'ı bulun ve tıklayın. Projenizde Google Cloud Functions'ı etkinleştirmek için API'yi etkinleştir'i tıklayın.
Google Cloud Pub/Sub
Google Cloud Pub/Sub, veri akışı ve etkinlik teslimi için basit ve ölçeklenebilir bir temel sunar. Bu laboratuvarda Gmail ile Google Cloud Functions arasında kurye görevi görür.
Google Cloud Pub/Sub'ı etkinleştirmek için sol gezinme kenar çubuğunu açın, Pub/Sub'ı bulup tıklayın. Projenizde Google Cloud Pub/Sub'ı etkinleştirmek için API'yi etkinleştir'i tıklayın.
Google Cloud Datastore
Google Cloud Datastore, ölçeklenebilir ve dağıtılmış bir sunucusuz veritabanıdır.
Google Cloud Datastore'u etkinleştirmek için sol gezinme kenar çubuğunda Datastore'u bulup tıklayın. Yeni sayfada Datastore Modunu Seç'i tıklayın.
Bu laboratuvarda dilediğiniz veritabanı konumunu kullanabilirsiniz. Google Cloud Datastore'u etkinleştirmek için Create Database'i (Veritabanı Oluştur) tıklayın. tamamlanması birkaç dakika sürebilir.
Google Cloud Vizyonu
Google Cloud Vision API, görüntülerinizden analizler elde etmek için önceden eğitilmiş modeller kullanan güçlü bir makine öğrenimi hizmetidir.
Google Cloud Vision API'yi etkinleştirmeyle ilgili bilgi için aşağıdaki talimatlara bakın.
Gmail API, Google Sheets API ve Google Cloud Vision API'yi etkinleştirme
Sol gezinme kenar çubuğunu tekrar açın ve API'ler ve Hizmetler. Kitaplık'ı tıklayın. API ve Hizmetler alanına Gmail yazın. Arama sonuçlarında, Gmail API'yi seçin ve Etkinleştir'i tıklayın.
API Kitaplığı sayfasına geri dönün. Google Sheets API'yi arayın ve etkinleştirin.
Süreç tekrarlanır. Cloud Vision API'yi bulup etkinleştirin.
Google Cloud Shell'i açın
Bu laboratuvarda, çoğu işlemi gerçekleştirmek için Google Cloud Shell'i kullanacaksınız. Cloud Shell, Google Cloud Platform kaynaklarınıza doğrudan tarayıcınız üzerinden komut satırı erişimi sunarak bunları yerel makine kullanmadan yönetmenize olanak tanır.
Google Cloud Shell'i açmak için üstteki mavi yatay çubuktaki Cloud Shell'i Etkinleştir düğmesini tıklayın:
Ekranın alt kısmında yeni bir panel görünür:
Cloud Shell Kod Düzenleyici'yi başlatmak için Kod düzenleyiciyi başlat düğmesini tıklayın:
Cloud Shell Kod Düzenleyici yeni bir pencerede açılır.
Kodu indirme
Projeyi klonlamak için Cloud Shell'inizde aşağıdaki komutu çalıştırın:
git clone https://github.com/googlecodelabs/gcf-gmail-codelab.git cd gcf-gmail-codelab
Cloud Shell Kod Düzenleyici'de yeni gcf-gmail-codelab
klasörünü göreceksiniz.
3. Mimariye genel bakış
Bu laboratuvarın iş akışı aşağıda belirtilmiştir:
- Kullanıcı, Gmail push bildirimlerini ayarlar: Gelen kutusuna her yeni ileti geldiğinde Gmail, Cloud Pub/Sub'a bildirim gönderir.
- Cloud Pub/Sub, yeni mesaj bildirimini Google Cloud Functions'a gönderir.
- Yeni ileti bildirimi geldiğinde, bir Cloud Functions örneği Gmail'e bağlanır ve yeni iletiyi alır.
- Postada ek olarak bir resim varsa Cloud Functions örneği, eki analiz etmek için Cloud Vision API'yi çağırır.
- Cloud Functions örneği, iletiyi kimin gönderdiğini ve ekin nereye indirileceğini belirterek seçtiğiniz bir Google E-Tablosunu günceller.
4. Gmail'e erişim yetkisi verme
E-postalarınızı otomatik olarak okuyacak bir Cloud Functions işlevi ayarlamadan önce bu işlevin Gmail'e erişimini yetkilendirmeniz gerekir. Google'a bir OAuth istemcisi kaydetmeniz ve ilişkili bir istemci kimliği oluşturmanız gerekir.
OAuth istemcisi kaydedin
Google Cloud Console'un sol gezinme menüsünden API'ler ve Hizmetler. OAuth izin ekranı'nı tıklayın.
Uygulama adı alanına GCF + Gmail Codelab gibi bir ad yazın. Diğer ayarları olduğu gibi bırakın, sayfayı aşağı kaydırın ve Kaydet'i tıklayın.
İlişkilendirilmiş bir istemci kimliği oluşturun
Credentials (Kimlik Bilgisi) sekmesine geçin. Create Credentials'ı (Kimlik Bilgileri Oluştur) tıklayın ve OAuth client ID (OAuth istemci kimliği) seçeneğini belirleyin. Web uygulaması türünü seçin, uygulamaya bir ad verin (burada GCF + Gmail Codelab'i tekrar kullanabilirsiniz) ve Oluştur'u tıklayın. Kısıtlamalar alanlarını şimdilik boş bırakın.
Pop-up pencerede döndürülen istemci kimliğini ve istemci gizli anahtarını yazın. Bu değerleri tekrar görüntülemek için sayfada müşterinizin adını tıklayabilirsiniz:
Yetkilendirme sürecini gerçekleştirme
Örnek kodda auth/index.js
, az önce oluşturduğunuz istemci kimliğini ve istemci gizli anahtarını kullanarak yetkilendirme işlemini gerçekleştirmek için birlikte çalışan iki Cloud Functions (auth_init
ve auth_callback
) Cloud Functions işlevini belirtir.
Kodu incelemek için Cloud Shell Kod Düzenleyici'de auth/index.js
öğesini açın.
Yetkilendirme işlemi iki tür jeton döndürür: erişim jetonları ve yenileme jetonları.
- Erişim jetonları, sahip olduğu kullanıcılara verilerinize kapsamlı erişim sağlayan kısa ömürlü kimlik kanıtlarıdır;
auth_callback
bunları Cloud Datastore'a kaydeder. - Yenileme jetonları yeni erişim jetonları almak için kullanılır ve önemli ölçüde daha uzundur.
Bunlar genellikle şifrelenir ve/veya erişim jetonlarından ayrı olarak depolanır.
Cloud Shell Kod Düzenleyici'de auth/env_vars.yaml
öğesini düzenleyin. YOUR-GOOGLE-CLIENT-ID
ve YOUR-GOOGLE-CLIENT-SECRET
değerlerini kendi değerlerinizle değiştirin. Daha fazla bilgi için önceki adıma bakın. YOUR-GOOGLE-CLIENT-CALLBACK-URL
ve YOUR-PUBSUB-TOPIC
değerlerini şimdilik olduğu gibi bırakın.
auth/env_vars.yaml
öğesini düzenledikten sonra, Cloud Functions'ı dağıtmak için Cloud Shell'de aşağıdaki komutu çalıştırın:
cd ~ cd gcf-gmail-codelab/auth # Deploy Cloud Function auth_init gcloud functions deploy auth_init --runtime=nodejs8 --trigger-http --env-vars-file=env_vars.yaml # Deploy Cloud Function auth_callback gcloud functions deploy auth_callback --runtime=nodejs8 --trigger-http --env-vars-file=env_vars.yaml
Cloud Functions'ın dağıtılması birkaç dakika sürebilir. İstenirse Google Cloud SDK'ya beta komutlarını yükleme izni verin.
Ardından, Google Cloud Console'a gidin ve soldaki gezinme menüsünden Cloud Functions'ı tıklayın. Cloud Functions listesinde auth_callback
öğesini tıklayın ve Tetikleyici sekmesine geçin.
Sayfadaki URL'yi kopyalayın. Cloud Functions sayfasına dönün ve Cloud Functions listesinde auth_init
simgesini tıklayın. Genel sekmesinde Düzenle'yi tıklayın. Ortam değişkenleri, ağ iletişimi, zaman aşımları ve daha fazlası'nı tıklayın ve GOOGLE_CALLBACK_URL
değerini, az önce kopyaladığınız URL ile değiştirin.
Değişiklikleri uygulamak için Dağıt'ı tıklayın. İşlemi tekrarlayın ve auth_callback
uygulamasını da güncelleyin.
Son olarak, sol gezinme menüsünü açın ve API'ler ve Hizmetler > Alan doğrulaması. Yetkilendirilmiş alan eklemek için Alan ekle'yi tıklayın. Örneğin, daha önce kopyaladığınız URL
https://us-central1-my-project.cloudfunctions.net/auth_callback
Aşağıdakileri yetkili alan olarak eklemeniz gerekir:
us-central1-my-project.cloudfunctions.net
Onaylamak için Alan ekle'ye basın.
Credentials (Kimlik Bilgisi) sayfasına geri dönün. OAuth istemcinizin adını tıklayın ve kopyaladığınız URL'yi Yetkili yönlendirme URI'si olarak ekleyin. Onaylamak için Enter tuşuna basın.
/auth_callback
bölümünü URL'den kaldırın ve geri kalanını Yetkili JavaScript kaynağı olarak ekleyin. Örneğin, URL'niz
https://us-central1-my-project.cloudfunctions.net/auth_callback
Aşağıdakini kaynak olarak eklemeniz gerekir:
https://us-central1-my-project.cloudfunctions.net/
Onaylamak için Enter'a basın, değişiklikleri uygulamak için ise Kaydet'i tıklayın.
5. Gmail push bildirimlerini ayarlama
Yetkilendirme işlemi başarılı olursa auth_callback
, push bildirimlerini ayarlamak için otomatik olarak Gmail API'yi çağırır.
Gmail push bildirimleri almak için bir Pub/Sub konusu oluşturmanız gerekir. Konunun tüm aboneleri, Gmail'den ulaştıklarında gelen ileti bildirimlerini otomatik olarak alır.
Pub/Sub konusu oluşturmak için Google Cloud Console'a gidip Pub/Sub'ı tıklayın > Konular'ı tıklayın. Konu Oluştur'u tıklayın. Konunun adını (ör. gmail-watch
) yazın ve Oluştur'u tıklayın. Ayrıca, Gmail'e Pub/Sub konunuza ileti gönderme izni vermeniz gerekir: Az önce oluşturduğunuz konunun içerik menüsünü (üç dikey nokta) tıklayın ve İzinler'i seçin; Üye ekle'yi tıklayın, gmail-api-push@system.gserviceaccount.com
adlı kullanıcıyı yeni üye olarak belirtin ve Pub/Sub > rolünü verin. Pub/Sub Yayıncısı; son olarak, değişiklikleri uygulamak için Kaydet'i tıklayın.
Hangi Pub/Sub konusunun kullanılacağını belirtmek için auth_callback
adlı Cloud Functions işlevini güncelleyin. Soldaki gezinme menüsünden Cloud Functions'ı tıklayın ve Cloud Functions listesinden auth_callback
'i seçin. Genel sekmesinde Düzenle'yi tıklayın. More'u (Diğer) tıklayın ve PUBSUB_TOPIC
değerini az önce oluşturduğunuz Pub/Sub konusunun adıyla değiştirin. Değişiklikleri uygulamak için Kaydet'i tıklayın.
Artık Gmail push bildirimlerini yetkilendirmeye ve ayarlamaya hazırsınız. Yeni değişiklikler tamamlanana kadar bekleyin, ardından Cloud Functions sayfasına dönün, Cloud Functions listesinde auth_init
öğesini seçin ve Tetikleyici sekmesine geçin. URL'yi tıkladığınızda Google ile oturum açma sayfasına yönlendirilirsiniz:
Size ait bir Gmail hesabıyla oturum açın. Hesabın gelen kutusuna gelen her yeni ileti bir push bildirimini tetikler. Oturum açtıktan sonra aşağıdaki sayfayı göreceksiniz:
Erişimi yetkilendirmek için İzin ver'i tıklayın. auth_callback
yetkilendirme işlemini tamamlayacak, erişim jetonlarını kaydedecek ve Gmail push bildirimlerini sizin için ayarlayacaktır. Bu işlem tamamlandığında tarayıcınızda Successfully set up Gmail push notifications
mesajını görürsünüz.
Bu codelab, yetkilendirme iş akışını sizin için otomatikleştirmek üzere @google-cloud/express-oauth2-handlers
paketini kullanır. Daha fazla bilgi için GitHub'daki kod deposuna bakın.
6. Gelen mesajları işle
Daha önce belirttiğimiz gibi, oluşturduğunuz Pub/Sub konusunun tüm aboneleri, gelen kutunuza yeni mesajlar geldiğinde bildirim alır. pubsub/index.js
, konunun abonesi olarak dağıtıldıktan sonra yeni mesajları okuyacak, ekli görüntüleri kategorilere ayıracak ve bu kategorileri bir Google E-Tablosu'na aktaracak watchGmailMessages
adlı bir Cloud Functions işlevini belirtir.
Kodu incelemek için Cloud Shell Kod Düzenleyici'de pubsub/index.js
öğesini açın.
Mesajlar alınıyor
Gmail push bildirimlerinde, bildirimin ilişkilendirildiği e-posta adresi ve geçmiş kimliği bulunur. Kolaylık sağlaması açısından, bu codelab'de Gmail API'ye bir push bildirimi geldiğinde en son mesajı sormanız yeterlidir. iletileri aramak için bunun yerine geçmiş kimliğini kullanın.
// Look up the most recent message. const listMessagesRes = await gmail.users.messages.list({ userId: email, maxResults: 1 }); const messageId = listMessagesRes.messages[0].id; // Get the message using the message ID. const message = await gmail.users.messages.get({ userId: email, id: messageId }); return message;
Resim eklerini analiz etme
Mesajda resim eki varsa watchGmailMessages
, görüntüye açıklama eklemek için Cloud Vision API'yi çağırır. Bu codelab'de Cloud Vision API'den görüntüyü sınıflandırmasını ve çeşitli görüntü etiketleri döndürmesini isteyeceksiniz. örneğin, mavi gökyüzünün resmiyle birlikte sağlanırsa Cloud Vision API; mavi, gökyüzü ve doğa etiketlerini döndürebilir.
watchGmailMessages
, Cloud Vision API'yi çağırmak için Node.js için Cloud Vision API Kitaplığı'nı kullanır:
// Tag the attachment using Cloud Vision API const analyzeAttachment = async (data, filename) => { var topLabels = ['', '', '']; if (filename.endsWith('.png') || filename.endsWith('.jpg')) { const [analysis] = await visionClient.labelDetection({ image: { content: Buffer.from(data, 'base64') } }); const labels = analysis.labelAnnotations; topLabels = labels.map(x => x.description).slice(0, 3); } return topLabels; };
Google E-Tablosunu Güncelle
watchGmailMessages
, bu analizin sonuçlarını bir Google E-Tablosu'na aktarır. Gönderenin adı, ekin adı ve resim eklerinin etiketlerini (varsa) içerir.
İlk olarak bir Google E-Tablosu oluşturun. Google E-Tablolar'ı açın ve Yeni bir e-tablo başlat'ın altındaki Boş şablonu tıklayın. E-tablonuzun kimliğini kopyalayın. Örneğin, tarayıcınızdaki adres aşağıdaki gibi görünüyorsa:
https://docs.google.com/spreadsheets/d/abcdefghij01234567890/edit#gid=0
E-tablonuzun kimliği: abcdefghij01234567890
. Cloud Shell Kod Düzenleyici'de gcf-gmail-codelab/pubsub/env_vars.yaml
değerini güncelleyin ve YOUR-GOOGLE-SHEET-ID
değerini kendi değerinizle değiştirin.
watchGmailMessages
, bilgi eklemek için Google Sheets API ile bağlantı kurar:
const updateReferenceSheet = async (from, filename, topLabels) => { await googleSheets.spreadsheets.values.append({ spreadsheetId: SHEET, range: SHEET_RANGE, valueInputOption: 'USER_ENTERED', requestBody: { range: SHEET_RANGE, majorDimension: 'ROWS', values: [ [from, filename].concat(topLabels) ] } }); };
Son bir adım
Cloud Shell Kod Düzenleyici'de gcf-gmail-codelab/pubsub/env_vars.yaml
aracını açıp YOUR-GOOGLE-CLIENT-ID
, YOUR-GOOGLE-CLIENT-SECRET
ve YOUR-GOOGLE-CALLBACK-URL
değerlerini kendi değerlerinizle değiştirin. Bu değerleri Google Cloud Console'da bulabilirsiniz: Soldaki gezinme menüsünden Cloud Functions'ı açın, Cloud Functions listesinden auth_init
öğesini seçin ve Ortam değişkenleri bölümünü bulun.
Kodu dağıtma
Cloud Functions işlevini dağıtmak için aşağıdaki komutu çalıştırın:
cd ~ cd gcf-gmail-codelab/pubsub gcloud functions deploy watchGmailMessages --runtime=nodejs8 --trigger-topic=gmail-watch --env-vars-file=env_vars.yaml
Cloud Pub/Sub konunuza gmail-watch
dışında bir ad verdiyseniz yukarıdaki komutta gmail-watch
öğesini konunuzun adıyla değiştirin. Cloud Functions işlevinin dağıtılması birkaç saniye sürebilir.
7. Deneyin
Tebrikler, tamamladınız! Kendinize resim eki içeren bir e-posta gönderin. Birkaç saniye içinde, oluşturduğunuz Google E-Tablosunun sağladığınız bilgilerle otomatik olarak güncellendiğini göreceksiniz.