1. Genel Bakış
Bu codelab'de olası bir kurumsal iş akışı (görüntü arşivleme, analiz ve rapor oluşturma) ele alınmaktadır. Kuruluşunuzun, sınırlı bir kaynakta yer kaplayan bir dizi resme sahip olduğunu düşünün. Bu verileri arşivlemek, bu görüntüleri analiz etmek ve en önemlisi, arşivlenen konumları ve analiz sonuçlarını özetleyen, derlenmiş ve yönetim tarafından kullanılmaya hazır bir rapor oluşturmak istiyorsunuz. Google Cloud, Google Workspace (eski adıyla G Suite veya Google Apps) ve Google Cloud (eski adıyla GCP) olmak üzere iki ürün grubunun API'lerini kullanarak bu işlemi gerçekleştirecek araçlar sunar.
Senaryomuzda, işletme kullanıcısının Google Drive'da resimleri var. Bu verileri, Google Cloud Storage'da bulunan depolama sınıfları gibi "daha soğuk" ve daha ucuz depolama alanlarına yedeklemek mantıklıdır. Google Cloud Vision, geliştiricilerin nesne ve önemli nokta algılama, optik karakter tanıma (OCR) gibi görsel algılama özelliklerini uygulamalara kolayca entegre etmelerini sağlar. Son olarak, Google E-Tablolar e-tablosu, tüm bunları yöneticiniz için özetlemek üzere kullanabileceğiniz faydalı bir görselleştirme aracıdır.
Google Cloud'un tüm özelliklerinden yararlanan bir çözüm oluşturmak için bu codelab'i tamamladıktan sonra, kuruluşunuz veya müşterileriniz için daha da etkili bir çözüm oluşturma konusunda ilham alacağınızı umuyoruz.
Neler öğreneceksiniz?
- Cloud Shell'i kullanma
- API isteklerinin kimliğini doğrulama
- Python için Google API'leri istemci kitaplığını yükleme
- Google API'lerini etkinleştirme
- Google Drive'dan dosya indirme
- Cloud Storage'a nesne/blob yükleme
- Cloud Vision ile verileri analiz etme
- Google E-Tablolar'a satır yazma
İhtiyacınız olanlar
- Google Hesabı (Google Workspace hesapları için yönetici onayı gerekebilir)
- Etkin bir Google Cloud faturalandırma hesabına sahip Google Cloud projesi
- İşletim sistemi terminal/kabuk komutları hakkında bilgi
- Python (2 veya 3) konusunda temel beceriler. Ancak desteklenen herhangi bir dili kullanabilirsiniz.
Yukarıda listelenen dört Google Cloud ürünüyle ilgili deneyim sahibi olmanız yararlı olsa da zorunlu değildir. Öncelikle ayrı ayrı bu kavramlara aşina olmak için zamanınız varsa buradaki alıştırmaya başlamadan önce her biriyle ilgili codelab'leri yapabilirsiniz:
- Google Drive'a giriş (Google Workspace API'lerini kullanma) (Python)
- Cloud Vision'ı Python ile kullanma (Python)
- Sheets API ile özelleştirilmiş raporlama araçları oluşturma (JS/Node)
- Nesneleri Google Cloud Storage'a yükleme (kodlama gerekmez)
Anket
Bu eğitimi nasıl kullanacaksınız?
Python ile ilgili deneyiminizi nasıl değerlendirirsiniz?
Google Cloud hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?
Google Workspace geliştirici hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?
Ürün özelliklerinin tanıtıldığı codelab'ler yerine daha fazla "iş odaklı" codelab görmek ister misiniz?
2. Kurulum ve Gereksinimler
Yönlendirmesiz ortam kurulumu
- Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.



- Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Dilediğiniz zaman bunu güncelleyebilirsiniz.
- Proje kimliği, tüm Google Cloud projelerinde benzersiz olmalı ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğine (genellikle
PROJECT_IDolarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince geçerli kalır. - Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
- Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırma ücreti alınmaması için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projenin tamamını silebilirsiniz. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.
Cloud Shell'i Başlatma
Özet
Kodu dizüstü bilgisayarınızda yerel olarak geliştirebilirsiniz ancak bu codelab'in ikincil amacı, modern web tarayıcınız üzerinden bulutta çalışan bir komut satırı ortamı olan Google Cloud Shell'i nasıl kullanacağınızı öğretmektir.
Cloud Shell'i etkinleştirme
- Cloud Console'da Cloud Shell'i etkinleştir 'i
tıklayın.

Cloud Shell'i daha önce hiç başlatmadıysanız ne olduğunu açıklayan bir ara ekran (ekranın alt kısmı) gösterilir. Bu durumda Devam'ı tıkladığınızda bu ekranı bir daha görmezsiniz. Bu tek seferlik ekran aşağıdaki gibi görünür:

Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.

Bu sanal makine, ihtiyaç duyduğunuz tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu codelab'deki çalışmalarınızın neredeyse tamamını yalnızca bir tarayıcı veya Chromebook'unuzla yapabilirsiniz.
Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, proje kimliğinize ayarlandığını görürsünüz.
- Kimliğinizin doğrulandığını onaylamak için Cloud Shell'de şu komutu çalıştırın:
gcloud auth list
Komut çıkışı
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- gcloud komutunun projeniz hakkında bilgi sahibi olduğunu onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project
Komut çıkışı
[core] project = <PROJECT_ID>
Değilse şu komutla ayarlayabilirsiniz:
gcloud config set project <PROJECT_ID>
Komut çıkışı
Updated property [core/project].
3. Python ortamını onaylama
Bu codelab'de Python dilini kullanmanız gerekir (Google API'leri istemci kitaplıkları birçok dili desteklese de en sevdiğiniz geliştirme aracında eşdeğer bir şey oluşturabilir ve Python'u yalnızca sözde kod olarak kullanabilirsiniz). Bu codelab özellikle Python 2 ve 3'ü destekler ancak en kısa sürede 3.x'e geçmenizi öneririz.
Cloud Shell, kullanıcıların doğrudan Cloud Console'dan erişebileceği kullanışlı bir araçtır ve yerel geliştirme ortamı gerektirmez. Bu nedenle, bu eğitim web tarayıcısıyla tamamen bulutta yapılabilir. Bu codelab'de Cloud Shell'e her iki Python sürümü de önceden yüklenmiştir.
Cloud Shell'de IPython da yüklüdür. Bu, özellikle veri bilimi veya makine öğrenimi topluluğunun bir parçasıysanız önerdiğimiz daha üst düzey bir etkileşimli Python yorumlayıcısıdır. Bu durumda, IPython, Google Research tarafından barındırılan Colab'in yanı sıra Jupyter Notebooks'un da varsayılan yorumlayıcısıdır.
IPython, öncelikle Python 3 yorumlayıcısını tercih eder ancak 3.x sürümü kullanılamıyorsa Python 2'ye geri döner. IPython'a Cloud Shell'den erişilebilir ancak yerel bir geliştirme ortamına da yüklenebilir. ^D (Ctrl-d) ile çıkın ve çıkma teklifini kabul edin. ipython ile başlayan örnek çıkış şu şekilde görünür:
$ ipython Python 3.7.3 (default, Mar 4 2020, 23:11:43) Type 'copyright', 'credits' or 'license' for more information IPython 7.13.0 -- An enhanced Interactive Python. Type '?' for help. In [1]:
IPython'ı tercih etmiyorsanız standart bir Python etkileşimli yorumlayıcı (Cloud Shell veya yerel geliştirme ortamınız) kullanmanız da uygundur (^D ile de çıkabilirsiniz):
$ python Python 2.7.13 (default, Sep 26 2018, 18:42:22) [GCC 6.3.0 20170516] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> $ python3 Python 3.7.3 (default, Mar 10 2020, 02:33:39) [GCC 6.3.0 20170516] on linux Type "help", "copyright", "credits" or "license" for more information. >>>
Bu codelab'de pip yükleme aracının (Python paket yöneticisi ve bağımlılık çözümleyici) yüklü olduğu da varsayılır. pip, 2.7.9 veya sonraki sürümler ya da 3.4 veya sonraki sürümlerle birlikte gelir. Daha eski bir Python sürümünüz varsa yükleme talimatları için bu kılavuza bakın. İzinlerinize bağlı olarak sudo veya süper kullanıcı erişimine sahip olmanız gerekebilir ancak bu durum genellikle geçerli değildir. Ayrıca, belirli Python sürümleri için pip komutunu çalıştırmak üzere pip2 veya pip3 komutunu açıkça kullanabilirsiniz.
Bu codelab'in geri kalanında Python 3 kullandığınız varsayılır. 3.x'ten önemli ölçüde farklılık gösteren Python 2'ye özel talimatlar verilir.
[İsteğe bağlı] Sanal ortamlar oluşturma ve kullanma
Bu bölüm isteğe bağlıdır ve yalnızca bu codelab için sanal ortam kullanması gerekenler (yukarıdaki uyarı kenar çubuğunda belirtildiği gibi) için gereklidir. Bilgisayarınızda yalnızca Python 3 varsa my_env adlı bir sanal ortam oluşturmak için bu komutu verebilirsiniz (isterseniz başka bir ad da seçebilirsiniz):
virtualenv my_env
Ancak bilgisayarınızda hem Python 2 hem de 3 varsa -p flag ile yapabileceğiniz bir Python 3 sanal ortamı yüklemenizi öneririz:
virtualenv -p python3 my_env
Yeni oluşturduğunuz virtualenv'yi şu şekilde "etkinleştirerek" girin:
source my_env/bin/activate
Kabuk isteminizin artık ortam adınızla başladığını gözlemleyerek ortamda olduğunuzu doğrulayın. Örneğin:
(my_env) $
Artık gerekli paketleri pip install, bu ortamda kod yürütebilirsiniz vb. Bir diğer avantajı da her şeyi tamamen berbat ederseniz, Python kurulumunuzun bozulduğu bir duruma gelirseniz vb. sisteminizin geri kalanını etkilemeden bu ortamın tamamını silebilirsiniz.
4. Python için Google API'leri istemci kitaplığını yükleme
Bu codelab'de Python için Google API'leri istemci kitaplığının kullanılması gerekir. Bu nedenle, basit bir yükleme işlemi yapmanız veya hiçbir şey yapmamanız gerekebilir.
Daha önce kolaylık sağlaması için Cloud Shell'i kullanmanızı önermiştik. Eğitimin tamamını buluttaki bir web tarayıcısından yapabilirsiniz. Cloud Shell'i kullanmanın bir diğer nedeni de birçok popüler geliştirme aracı ve gerekli kitaplığın zaten önceden yüklenmiş olmasıdır.
*İstemci kitaplıklarını yükleme
(İsteğe bağlı) Cloud Shell'i veya istemci kitaplıklarını daha önce yüklediğiniz bir yerel ortamı kullanıyorsanız bu adım atlanabilir. Bunu yalnızca yerel olarak geliştirme yapıyorsanız ve bunları yüklemediyseniz (veya yüklediğinizden emin değilseniz) yapmanız gerekir. Yükleme işlemini (gerekirse pip'yı güncelleme dahil) yapmanın en kolay yolu pip (veya pip3) kullanmaktır:
pip install -U pip google-api-python-client oauth2client
Kurulumu onaylama
Bu komut, istemci kitaplığının yanı sıra bağlı olduğu tüm paketleri yükler. Cloud Shell'i veya kendi ortamınızı kullanıyor olsanız da gerekli paketleri içe aktararak istemci kitaplığının yüklendiğini doğrulayın ve içe aktarma hatası (veya çıkış) olmadığını onaylayın:
python3 -c "import googleapiclient, httplib2, oauth2client"
Bunun yerine Python 2'yi (Cloud Shell'den) kullanırsanız desteğinin sonlandırıldığına dair bir uyarı alırsınız:
******************************************************************************* Python 2 is deprecated. Upgrade to Python 3 as soon as possible. See https://cloud.google.com/python/docs/python2-sunset To suppress this warning, create an empty ~/.cloudshell/no-python-warning file. The command will automatically proceed in seconds or on any key. *******************************************************************************
İçe aktarma "test" komutunu başarıyla çalıştırabildiğinizde (hata/çıkış yok) Google API'leriyle iletişim kurmaya başlayabilirsiniz.
Özet
Bu bir ara düzey codelab olduğundan, konsolda proje oluşturma ve kullanma konusunda deneyimli olduğunuz varsayılır. Google API'leri ve özellikle Google Workspace API'leri konusunda yeniyseniz önce Google Workspace API'lerine giriş niteliğindeki codelab'i deneyin. Ayrıca, kullanıcı hesabı (hizmet hesabı değil) kimlik bilgilerini nasıl oluşturacağınızı (veya mevcut kimlik bilgilerini nasıl yeniden kullanacağınızı) biliyorsanız client_secret.json dosyasını çalışma dizininize bırakın, sonraki modülü atlayın ve "Google API'lerini etkinleştirme" bölümüne geçin.
5. *API isteklerini yetkilendirme (kullanıcı yetkilendirmesi)
Daha önce kullanıcı hesabı yetkilendirme kimlik bilgileri oluşturduysanız ve bu süreci biliyorsanız bu bölümü atlayabilirsiniz. Bu, tekniği farklı olan hizmet hesabı yetkilendirmesinden farklıdır. Lütfen aşağıdan devam edin.
Yetkilendirmeye giriş (ve biraz kimlik doğrulama)
API'lere istek gönderebilmek için uygulamanızın uygun yetkilendirmeye sahip olması gerekir. Benzer bir kelime olan kimlik doğrulama, giriş kimlik bilgilerini ifade eder. Google Hesabınıza giriş yaparken kullanıcı adı ve şifreyle kimliğinizi doğrularsınız. Kimlik doğrulama tamamlandıktan sonraki adım, veriye erişmek için yetkili olup olmadığınızı (daha doğrusu kodunuzun yetkili olup olmadığını) belirlemektir. Bu veriler, Cloud Storage'daki blob dosyaları veya Google Drive'daki kullanıcının kişisel dosyaları gibi veriler olabilir.
Google API'leri çeşitli yetkilendirme türlerini destekler ancak bu codelab'deki örnek uygulama son kullanıcılara ait verilere eriştiği için G Suite API kullanıcıları için en yaygın olanı kullanıcı yetkilendirmesidir. Bu tür son kullanıcılar, uygulamanızın verilerine erişmesine izin vermelidir. Bu nedenle, kodunuzun kullanıcı hesabı OAuth2 kimlik bilgilerini alması gerekir.
Kullanıcı yetkilendirmesi için OAuth2 kimlik bilgilerini almak üzere API yöneticisine geri dönün ve sol gezinme çubuğunda "Kimlik bilgileri" sekmesini seçin:

İlgili sayfaya ulaştığınızda tüm kimlik bilgilerinizi üç ayrı bölümde görürsünüz:

Birincisi API anahtarları, ikincisi OAuth 2.0 istemci kimlikleri ve sonuncusu OAuth2 hizmet hesapları içindir. Ortadaki seçeneği kullanıyoruz.
Kimlik bilgisi oluşturma
Kimlik Bilgileri sayfasında, üst kısımdaki + Kimlik Bilgileri Oluştur düğmesini tıklayın. Bu işlem, "OAuth istemci kimliği:" seçeneğini belirleyeceğiniz bir iletişim kutusu açar.

Sonraki ekranda 2 işlem yapabilirsiniz: Uygulamanızın yetkilendirme "kullanıcı rızası ekranını" yapılandırma ve uygulama türünü seçme:

Kullanıcı rızası ekranı ayarlamadıysanız konsolda uyarıyı görürsünüz ve şimdi ayarlamanız gerekir. (Kullanıcı rızası ekranınız zaten ayarlandıysa sonraki adımları atlayın.)
OAuth izin ekranı
"Kullanıcı rızası ekranını yapılandır"ı tıklayın. Burada "Harici" bir uygulama seçersiniz (veya G Suite müşterisiyseniz "Dahili"):

Bu alıştırma kapsamında, codelab örneğinizi yayınlamadığınız için hangisini seçtiğinizin önemli olmadığını unutmayın. Çoğu kişi daha karmaşık bir ekrana yönlendirilmek için "Harici"yi seçer ancak aslında yalnızca en üstteki "Uygulama adı" alanını doldurmanız gerekir:

Şu anda ihtiyacınız olan tek şey bir uygulama adı. Bu nedenle, yaptığınız codelab'i yansıtan bir ad seçin ve Kaydet'i tıklayın.
OAuth istemci kimliği oluşturma (kullanıcı hesabı yetkilendirme)
Şimdi OAuth2 istemci kimliği oluşturmak için Kimlik Bilgileri sekmesine geri dönün. Burada oluşturabileceğiniz çeşitli OAuth istemci kimliklerini görürsünüz:

Diğer kategorisinde bir komut satırı aracı geliştiriyoruz. Bu nedenle, bu seçeneği belirleyip Oluştur düğmesini tıklayın. Oluşturduğunuz uygulamayı yansıtan bir istemci kimliği adı seçin veya genellikle "Diğer istemci N" olan varsayılan adı kullanın.
Kimlik bilgilerinizi kaydetme
- Yeni kimlik bilgilerini içeren bir iletişim kutusu gösterilir. Kapatmak için Tamam'ı tıklayın.

- Kimlik Bilgileri sayfasına geri dönün, "OAuth2 İstemci Kimlikleri" bölümüne gidin ve yeni oluşturduğunuz istemci kimliğinizin en sağ alt kısmındaki indirme simgesini
tıklayın. 
- Bu işlem,
client_secret-LONG-HASH-STRING.apps.googleusercontent.com.jsonadlı bir dosyayı kaydetmek için bir iletişim kutusu açar. Bu dosya, büyük olasılıkla İndirilenler klasörünüze kaydedilir.client_secret.jsongibi daha kolay bir adla kısaltmanızı (örnek uygulamada kullanılan ad) ve ardından bu codelab'de örnek uygulamayı oluşturacağınız dizine/klasöre kaydetmenizi öneririz.
Özet
Artık bu codelab'de kullanılan Google API'lerini etkinleştirmeye hazırsınız. Ayrıca, OAuth kullanıcı rızası ekranındaki uygulama adı için "Vision API demo"yu seçtik. Bu nedenle, bu adı yakında paylaşacağımız bazı ekran görüntülerinde görebilirsiniz.
6. Google API'lerini etkinleştirme
Bu codelab'de dört (4) Google Cloud API'si kullanılmaktadır. Bunlardan ikisi Google Cloud'a (Cloud Storage ve Cloud Vision), diğer ikisi ise Google Workspace'e (Google Drive ve Google E-Tablolar) aittir. Aşağıda, Google API'lerini etkinleştirmeye ilişkin genel talimatlar verilmiştir. Bir API'yi etkinleştirmeyi öğrendikten sonra diğerlerini de benzer şekilde etkinleştirebilirsiniz.
Uygulamanızda hangi Google API'sini kullanmak istediğinizden bağımsız olarak, API'lerin etkinleştirilmesi gerekir. API'ler komut satırından veya Cloud Console'dan etkinleştirilebilir. API'leri etkinleştirme süreci aynıdır. Bu nedenle, bir API'yi etkinleştirdikten sonra diğerlerini de benzer şekilde etkinleştirebilirsiniz.
1. seçenek: gcloud komut satırı arayüzü (Cloud Shell veya yerel ortam)
API'leri Cloud Console'dan etkinleştirmek daha yaygın olsa da bazı geliştiriciler her şeyi komut satırından yapmayı tercih eder. Bunun için bir API'nin "hizmet adını" aramanız gerekir. URL'ye benziyor: SERVICE_NAME.googleapis.com. Bu ürünleri Desteklenen ürünler tablosunda bulabilir veya Google Discovery API ile programatik olarak sorgulayabilirsiniz.
Bu bilgilerle donanmış olarak Cloud Shell'i (veya gcloud komut satırı aracı yüklü yerel geliştirme ortamınızı) kullanarak bir API'yi veya hizmeti aşağıdaki şekilde etkinleştirebilirsiniz:
gcloud services enable SERVICE_NAME.googleapis.com
1. örnek: Cloud Vision API'yi etkinleştirme
gcloud services enable vision.googleapis.com
2. örnek: Google App Engine sunucusuz bilgi işlem platformunu etkinleştirme
gcloud services enable appengine.googleapis.com
3. örnek: Tek bir istekle birden fazla API'yi etkinleştirme. Örneğin, bu codelab'de Cloud Translation API'yi kullanarak App Engine, Cloud Functions ve Cloud Run'a uygulama dağıtan izleyiciler varsa komut satırı şu şekilde olur:
gcloud services enable appengine.googleapis.com cloudfunctions.googleapis.com artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com
Bu komut App Engine, Cloud Functions, Cloud Run ve Cloud Translation API'yi etkinleştirir. Ayrıca, Cloud Run'a dağıtım yapmak için Cloud Build derleme sistemi tarafından container görüntülerinin kaydedilmesi gereken yer olan Cloud Artifact Registry'yi etkinleştirir.
Ayrıca, etkinleştirilecek API'leri veya projeniz için halihazırda etkinleştirilmiş API'leri sorgulamak için kullanabileceğiniz birkaç komut da vardır.
4. örnek: Projenizde etkinleştirebileceğiniz Google API'leri için sorgu
gcloud services list --available --filter="name:googleapis.com"
Örnek 5: Projenizde etkinleştirilen Google API'leri için sorgu oluşturma
gcloud services list
Yukarıdaki komutlar hakkında daha fazla bilgi için hizmetleri etkinleştirme ve devre dışı bırakma ile hizmetleri listeleme belgelerine bakın.
2. seçenek: Cloud Console
Google API'lerini API Yöneticisi'nden de etkinleştirebilirsiniz. Cloud Console'dan API Yöneticisi'ne gidin. Bu kontrol paneli sayfasında, uygulamanızla ilgili bazı trafik bilgilerinin yanı sıra uygulama isteklerini, uygulamanızın oluşturduğu hataları ve uygulamanızın yanıt sürelerini gösteren grafikler yer alır:

Bu grafiklerin altında, projeniz için etkinleştirilen Google API'lerinin listesi yer alır:

API'leri etkinleştirmek (veya devre dışı bırakmak) için üst kısımdaki API'leri ve Hizmetleri Etkinleştir'i tıklayın:

Alternatif olarak, soldaki gezinme çubuğuna gidip API'ler ve Hizmetler → Kitaplık'ı seçin:

Her iki durumda da API Kitaplığı sayfasına ulaşırsınız:

Eşleşen sonuçları aramak ve görmek için bir API adı girin:

Etkinleştirmek istediğiniz API'yi seçin ve Etkinleştir düğmesini tıklayın:

Kullanmak istediğiniz Google API'si ne olursa olsun, tüm API'leri etkinleştirme süreci benzerdir.
Maliyet
Birçok Google API'si ücretsiz olarak kullanılabilir ancak çoğu Google Cloud ürünü ve API'si kullanıldığında ücret alınır. Cloud API'lerini etkinleştirirken etkin bir faturalandırma hesabı istenebilir. Ancak bazı Google Cloud ürünlerinde "Daima Ücretsiz" katmanı bulunur. Faturalandırma ücreti ödemek için bu katmanı aşmanız gerekir.
Yeni Google Cloud kullanıcıları, ilk 90 gün boyunca geçerli olan ve şu anda 300 ABD doları değerinde olan ücretsiz deneme sürümünden yararlanabilir. Codelab'ler genellikle çok fazla veya hiç faturalandırmaya neden olmaz. Bu nedenle, özellikle tek seferlik bir teklif olduğundan, ücretsiz denemeyi gerçekten test etmeye hazır olana kadar bekletmenizi öneririz. Ücretsiz katman kotalarının süresi dolmaz ve ücretsiz deneme sürümünü kullanıp kullanmadığınıza bakılmaksızın geçerlidir.
Kullanıcılar, herhangi bir API'yi etkinleştirmeden önce fiyatlandırma bilgilerine (ör. Cloud Vision API fiyatlandırma sayfası) başvurmalı ve özellikle ücretsiz katmanının olup olmadığını ve varsa ne olduğunu not etmelidir. Belirtilen günlük veya aylık sınırları toplu olarak aşmadığınız sürece herhangi bir ücret alınmaz. Fiyatlandırma ve ücretsiz katmanlar, Google ürün grubu API'leri arasında farklılık gösterir. Örnekler:
- Google Cloud: Her ürün farklı şekilde faturalandırılır ve genellikle kullandıkça ödeme yapılır. Yukarıdaki ücretsiz katman bilgilerine bakın.
- Google Haritalar: Bir API paketi içerir ve kullanıcılara genel olarak aylık 200 ABD doları değerinde ücretsiz kredi sunar.
- Google Workspace (eski adıyla G Suite) API'leri: Google Workspace aylık abonelik ücreti kapsamında belirli sınırlara kadar kullanım sunar. Bu nedenle, Gmail, Google Drive, Takvim, Dokümanlar, E-Tablolar veya Slaytlar gibi uygulamalarda API kullanımı için doğrudan faturalandırma yapılmaz.
Farklı Google ürünleri için farklı faturalandırma yöntemleri uygulanır. Bu nedenle, ilgili bilgileri öğrenmek için lütfen uygun dokümanlara bakın.
Özet
Cloud Vision'ı etkinleştirdiğinize göre, diğer üç API'yi (Google Drive, Cloud Storage, Google E-Tablolar) aynı şekilde etkinleştirin. Cloud Shell'den gcloud services enable komutunu kullanın veya Cloud Console'dan:
- API Kitaplığı'na geri dönme
- Adının birkaç harfini yazarak arama başlatma
- İstediğiniz API'yi seçin ve
- Etkinleştir
Köpürtün, durulayın ve tekrarlayın. Cloud Storage için çeşitli seçenekler vardır: "Google Cloud Storage JSON API"yi seçin. Cloud Storage API de etkin bir faturalandırma hesabı bekler.
7. 0. adım: İçe aktarma işlemlerini ve yetkilendirme kodunu ayarlayın
Bu, orta büyüklükte bir kod parçasının başlangıcıdır. Bu nedenle, ana uygulamayla uğraşmadan önce ortak, kararlı ve çalışan bir altyapı parçası elde etmek için çevik yöntemleri bir ölçüde takip etmek faydalı olur. client_secret.json dosyasının geçerli dizininizde bulunduğundan emin olun ve ipython dosyasını başlatıp aşağıdaki kod snippet'ini girin veya analyze_gsimg.py dosyasına kaydedip kabuktan çalıştırın (kod örneğine eklemeler yapmaya devam edeceğimiz için ikinci yöntem tercih edilir):
from __future__ import print_function
from googleapiclient import discovery, http
from httplib2 import Http
from oauth2client import file, client, tools
# process credentials for OAuth2 tokens
SCOPES = 'https://www.googleapis.com/auth/drive.readonly'
store = file.Storage('storage.json')
creds = store.get()
if not creds or creds.invalid:
flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
creds = tools.run_flow(flow, store)
# create API service endpoints
HTTP = creds.authorize(Http())
DRIVE = discovery.build('drive', 'v3', http=HTTP)
Bu temel bileşen; modül/paket içe aktarma, kullanıcı kimlik bilgilerini işleme ve API hizmeti uç noktaları oluşturma ile ilgili kod bloklarını içerir. İncelemeniz gereken kodun temel bölümleri:
print()işlevinin içe aktarılması, bu örnek Python 2-3'ün uyumlu olmasını sağlar. Google kitaplığı içe aktarmaları ise Google API'leriyle iletişim kurmak için gereken tüm araçları getirir.SCOPESdeğişkeni, kullanıcıdan istenen izinleri temsil eder. Şu an için yalnızca bir izin vardır: Google Drive'daki verileri okuma izni.- Kimlik bilgileri işleme kodunun geri kalanı, önbelleğe alınmış OAuth2 jetonlarını okur. Orijinal erişim jetonunun süresi dolmuşsa yenileme jetonuyla yeni bir erişim jetonuna güncellenebilir.
- Hiç jeton oluşturulmamışsa veya geçerli bir erişim jetonu başka bir nedenden dolayı alınamamışsa kullanıcının OAuth2 3 ayaklı akışını (3LO) kullanması gerekir: İstenen izinlerle iletişim kutusunu oluşturun ve kullanıcıdan kabul etmesini isteyin. Bu işlem yapıldığında uygulama devam eder. Aksi takdirde
tools.run_flow()istisna oluşturur ve yürütme durur. - Kullanıcı izin verdikten sonra sunucuyla iletişim kurmak için bir HTTP istemcisi oluşturulur ve tüm istekler güvenlik için kullanıcının kimlik bilgileriyle imzalanır. Ardından, Google Drive API'nin (sürüm 3) hizmet uç noktası bu HTTP istemcisiyle oluşturulur ve
DRIVE'ya atanır.
Uygulamayı çalıştırma
Komut dosyasını ilk kez çalıştırdığınızda, kullanıcının Drive'daki (sizin) dosyalarına erişme yetkisi olmaz. Yürütme duraklatıldığında çıkış şu şekilde görünür:
$ python3 ./analyze_gsimg.py
/usr/local/lib/python3.6/site-packages/oauth2client/_helpers.py:255: UserWarning: Cannot access storage.json: No such file or directory
warnings.warn(_MISSING_FILE_MESSAGE.format(filename))
Your browser has been opened to visit:
https://accounts.google.com/o/oauth2/auth?client_id=LONG-STRING.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2F&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.readonly&access_type=offline&response_type=code
If your browser is on a different machine then exit and re-run this
application with the command-line parameter
--noauth_local_webserver
Cloud Shell'den çalıştırıyorsanız "Cloud Shell'den" bölümüne geçin, ardından uygun olduğunda "Yerel geliştirme ortamından" bölümündeki ilgili ekranları incelemek için geri kaydırın.
Yerel geliştirme ortamından
Bir tarayıcı penceresi açıldığında komut satırı komut dosyası duraklatılır. Aşağıdaki gibi korkutucu görünümlü bir uyarı sayfası alabilirsiniz:

Kullanıcı verilerine erişen bir uygulamayı çalıştırmaya çalıştığınız için bu uyarıyı almanız normaldir. Bu yalnızca bir demo uygulaması olduğundan ve geliştiricisi siz olduğunuzdan, devam etmek için kendinize yeterince güvendiğinizi umuyoruz. Bu durumu daha iyi anlamak için kendinizi kullanıcınızın yerine koyun: Başka birinin kodunun verilerinize erişmesine izin vermeniz isteniyor. Böyle bir uygulama yayınlamayı planlıyorsanız kullanıcılarınızın bu ekranı görmemesi için doğrulama sürecinden geçmeniz gerekir.
"Güvenli olmayan uygulamaya git" bağlantısını tıkladıktan sonra aşağıdakine benzer bir OAuth2 izinleri iletişim kutusu görürsünüz. Kullanıcı arayüzümüzü sürekli olarak iyileştirdiğimiz için tam eşleşme olmaması durumunda endişelenmeyin:

OAuth2 akışı iletişim kutusunda, geliştiricinin istediği izinler (SCOPES değişkeni aracılığıyla) gösterilir. Bu durumda, kullanıcının Google Drive'ından görüntüleme ve indirme özelliği söz konusudur. Bu izin kapsamları, uygulama kodunda URI olarak görünür ancak kullanıcının yerel ayarı tarafından belirtilen dile çevrilir. Burada kullanıcı, istenen izinler için açıkça yetki vermelidir. Aksi takdirde bir istisna oluşturulur ve komut dosyası daha fazla ilerlemez.
Hatta onayınızı isteyen bir iletişim kutusu daha görebilirsiniz:

NOTE: Bazı kullanıcılar farklı hesaplarda oturum açılmış birden fazla web tarayıcısı kullandığından bu yetkilendirme isteği yanlış tarayıcı sekmesine/penceresine gidebilir. Bu durumda, bu isteğin bağlantısını kesip doğru hesapla oturum açılmış bir tarayıcıya yapıştırmanız gerekebilir.
Cloud Shell'den
Cloud Shell'den tarayıcı penceresi açılmadığı için takılıp kalırsınız. En alttaki teşhis mesajının sizin için olduğunu fark etme:
If your browser is on a different machine then exit and re-run this application with the command-line parameter --noauth_local_webserver
^C (Ctrl-C veya komut dosyasının yürütülmesini durdurmak için başka bir tuşa basma) tuşlarına basmanız ve komut dosyasını ek işaretle birlikte kabuğunuzdan uygulamanız gerekir. Bu şekilde çalıştırdığınızda bunun yerine aşağıdaki çıkışı alırsınız:
$ python3 analyze_gsimg.py --noauth_local_webserver
/usr/local/lib/python3.7/site-packages/oauth2client/_helpers.py:255: UserWarning: Cannot access storage.json: No such file or directory
warnings.warn(_MISSING_FILE_MESSAGE.format(filename))
Go to the following link in your browser:
https://accounts.google.com/o/oauth2/auth?client_id=LONG-STRING.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.readonly&access_type=offline&response_type=code
Enter verification code:
(storage.json henüz oluşturulmadığını bildiğimiz için uyarıyı yoksayarak) Bu URL'yi içeren başka bir tarayıcı sekmesindeki talimatları uyguladığınızda, yerel geliştirme ortamları için yukarıda açıklanan deneyime neredeyse tamamen benzer bir deneyim elde edersiniz (yukarıdaki ekran görüntülerini inceleyin). En sonunda, Cloud Shell'e girilecek doğrulama kodunu içeren son bir ekran gösterilir:

Bu kodu kopyalayıp terminal penceresine yapıştırın.
Özet
"Authentication successful" dışında başka bir çıkış beklemeyin. Bunun yalnızca kurulum olduğunu unutmayın. Henüz herhangi bir işlem yapmadınız. Yaptığınız şey, ilk seferde doğru şekilde yürütülme olasılığı daha yüksek bir şeye doğru yolculuğunuza başarıyla başlamaktır. (En iyi yanı, yalnızca bir kez yetkilendirme istemi almanızdır. İzinleriniz önbelleğe alındığı için sonraki tüm yürütmelerde bu adım atlanır.) Şimdi de kodun gerçek bir çıktı oluşturacak şekilde çalışmasını sağlayalım.
Sorun giderme
Çıkış yerine hata alıyorsanız bunun nedeni aşağıdakilerden biri veya birkaçı olabilir. Örneğin:
8. 1. adım: Google Drive'dan resim indirin
Önceki adımda, kodu analyze_gsimg.py olarak oluşturmanızı ve düzenlemeleri buradan yapmanızı önerdik. Ayrıca her şeyi doğrudan iPython veya standart Python kabuğuna kesip yapıştırmak da mümkündür. Ancak uygulamayı parça parça oluşturmaya devam edeceğimiz için bu yöntem daha zahmetlidir.
Uygulamanızın yetkilendirildiğini ve API hizmeti uç noktasının oluşturulduğunu varsayın. Kodunuzda DRIVE değişkeniyle gösterilir. Şimdi Google Drive'ınızda bir resim dosyası bulalım ve
NAME adlı bir değişkene ayarlayın. Bu kodu ve 0. adımdaki kodun hemen altına aşağıdaki drive_get_img() işlevini girin:
FILE = 'YOUR_IMG_ON_DRIVE' # fill-in with name of your Drive file
def drive_get_img(fname):
'download file from Drive and return file info & binary if found'
# search for file on Google Drive
rsp = DRIVE.files().list(q="name='%s'" % fname,
fields='files(id,name,mimeType,modifiedTime)'
).execute().get('files', [])
# download binary & return file info if found, else return None
if rsp:
target = rsp[0] # use first matching file
fileId = target['id']
fname = target['name']
mtype = target['mimeType']
binary = DRIVE.files().get_media(fileId=fileId).execute()
return fname, mtype, target['modifiedTime'], binary
Drive files() koleksiyonunda, belirtilen dosya için sorgu (q parametresi) gerçekleştiren bir list() yöntemi bulunur. fields parametresi, hangi dönüş değerleriyle ilgilendiğinizi belirtmek için kullanılır. Diğer değerleri önemsemiyorsanız neden her şeyi geri alıp süreci yavaşlatasınız? API dönüş değerlerini filtrelemek için alan maskeleri kullanmaya yeni başladıysanız bu blog yayınına ve videoya göz atın. Aksi takdirde sorguyu yürütün ve döndürülen files özelliğini alın. Eşleşme yoksa varsayılan olarak boş liste dizisi kullanılır.
Sonuç yoksa işlevin geri kalanı atlanır ve None döndürülür (örtülü olarak). Aksi takdirde, eşleşen ilk yanıtı (rsp[0]) alın, dosya adını, MIME türünü, son değiştirme zaman damgasını ve son olarak da get_media() işlevi (dosya kimliği aracılığıyla) tarafından alınan ikili yükünü files() koleksiyonunda döndürün. (Yöntem adları, diğer dillerdeki istemci kitaplıklarında biraz farklılık gösterebilir.)
Son bölüm, uygulamanın tamamını yönlendiren "ana" gövdedir:
if __name__ == '__main__':
# download img file & info from Drive
rsp = drive_get_img(FILE)
if rsp:
fname, mtype, ftime, data = rsp
print('Downloaded %r (%s, %s, size: %d)' % (fname, mtype, ftime, len(data)))
else:
print('ERROR: Cannot download %r from Drive' % fname)
Drive'da section-work-card-img_2x.jpg adlı bir resmin olduğunu ve FILE olarak ayarlandığını varsayarsak komut dosyası başarıyla yürütüldüğünde, dosyanın Drive'dan okunabildiğini (ancak bilgisayarınıza kaydedilmediğini) onaylayan bir çıktı görmeniz gerekir:
$ python3 analyze_gsimg.py Downloaded 'section-work-card-img_2x.jpg' (image/jpeg, 2020-02-27T09:27:22.095Z, size: 27781)
Sorun giderme
Yukarıdaki gibi başarılı bir çıkış elde edemiyorsanız bunun nedeni bir veya daha fazla faktör olabilir. Örneğin:
Özet
Bu bölümde, belirli bir dosyayı sorgulayıp indirmek için Drive API'ye nasıl bağlanacağınızı (2 ayrı API çağrısıyla) öğrendiniz. İşletme kullanım alanı: Drive verilerinizi arşivleme ve Google Cloud araçlarıyla analiz etme. Bu aşamada uygulamanızın kodu, step1-drive/analyze_gsimg.py deposundaki kodla eşleşmelidir.
Google Drive'da dosya indirme hakkında daha fazla bilgi edinmek için burayı ziyaret edin veya bu blog yayınına ve videoya göz atın. Bu codelab bölümü, Google Workspace API'lerine giriş codelab'inin tamamıyla neredeyse aynıdır. Dosya indirmek yerine, kullanıcının Google Drive'ındaki ilk 100 dosyayı/klasörü gösterir ve daha kısıtlayıcı bir kapsam kullanır.
9. 2. adım: Dosyayı Cloud Storage'da arşivleyin
Sonraki adım, Google Cloud Storage desteği eklemektir. Bunun için başka bir Python paketi olan io'yı içe aktarmamız gerekir. İçe aktarma işlemlerinizin üst bölümünün artık aşağıdaki gibi göründüğünden emin olun:
from __future__ import print_function
import io
Drive dosya adına ek olarak, bu dosyanın Cloud Storage'da nereye kaydedileceğiyle ilgili bazı bilgilere ihtiyacımız var. Özellikle, dosyayı yerleştireceğiniz"paket"in adı ve varsa "üst klasör" önekleri. Bu konuyla ilgili daha fazla bilgiyi biraz sonra bulabilirsiniz:
FILE = 'YOUR_IMG_ON_DRIVE'
BUCKET = 'YOUR_BUCKET_NAME'
PARENT = '' # YOUR IMG FILE PREFIX
Paketlerle ilgili bir not: Cloud Storage, şekilsiz blob depolama alanı sağlar. Dosyaları buraya yüklerken Google Drive'daki gibi dosya türleri, uzantılar vb. kavramları anlamaz. Cloud Storage'da yalnızca "blob" olarak görünürler. Ayrıca, Cloud Storage'da klasör veya alt dizin kavramı yoktur.
Evet, dosya adlarında birden fazla alt klasörün soyutlamasını temsil etmek için eğik çizgi (/) kullanabilirsiniz ancak sonuç olarak tüm blob'larınız bir pakete gider ve "/" yalnızca dosya adlarındaki karakterlerdir. Daha fazla bilgi için paket ve nesne adlandırma kuralları sayfasına göz atın.
Yukarıdaki 1. adımda Drive'ın salt okunur kapsamı istenmiştir. O zamanlar ihtiyacınız olan tek şey buydu. Artık Cloud Storage'a yükleme (okuma-yazma) izni gerekiyor. SCOPES değerini tek bir dize değişkeninden izin kapsamlarının dizisine (Python tanımlama grubu [veya liste]) değiştirin. Değişiklikten sonra değer şu şekilde görünür:
SCOPES = (
'https://www.googleapis.com/auth/drive.readonly',
'https://www.googleapis.com/auth/devstorage.full_control',
)
Şimdi, Drive için olanın hemen altında Cloud Storage için bir hizmet uç noktası oluşturun. Paylaşılan bir kaynak olabileceği için yeni bir HTTP istemci nesnesi oluşturmaya gerek olmadığından, aynı HTTP istemci nesnesini yeniden kullanmak için çağrıyı biraz değiştirdiğimizi unutmayın.
# create API service endpoints
HTTP = creds.authorize(Http())
DRIVE = discovery.build('drive', 'v3', http=HTTP)
GCS = discovery.build('storage', 'v1', http=HTTP)
Şimdi Cloud Storage'a yükleme yapan bu işlevi (drive_get_img()'dan sonra) ekleyin:
def gcs_blob_upload(fname, bucket, media, mimetype):
'upload an object to a Google Cloud Storage bucket'
# build blob metadata and upload via GCS API
body = {'name': fname, 'uploadType': 'multipart', 'contentType': mimetype}
return GCS.objects().insert(bucket=bucket, body=body,
media_body=http.MediaIoBaseUpload(io.BytesIO(media), mimetype),
fields='bucket,name').execute()
objects.().insert() çağrısı için paket adı, dosya meta verileri ve ikili blob'un kendisi gerekir. Döndürülen değerleri filtrelemek için fields değişkeni, API'den döndürülen yalnızca paket ve nesne adlarını ister. API okuma isteklerindeki bu alan maskeleri hakkında daha fazla bilgi edinmek için bu gönderiye ve videoya göz atın.
Şimdi gcs_blob_upload() kullanımını ana uygulamaya entegre edin:
# upload file to GCS
gcsname = '%s/%s'% (PARENT, fname)
rsp = gcs_blob_upload(gcsname, BUCKET, data, mtype)
if rsp:
print('Uploaded %r to GCS bucket %r' % (rsp['name'], rsp['bucket']))
else:
print('ERROR: Cannot upload %r to Cloud Storage' % gcsname)
gcsname değişkeni, dosya adının kendisiyle eklenen tüm "üst alt dizin" adlarını birleştirir ve paket adıyla önek verildiğinde dosyayı "/bucket/parent.../filename" konumunda arşivliyormuşsunuz gibi bir izlenim verir. Bu parçayı, else ifadesinin hemen üstündeki ilk print() işlevinin hemen sonrasına yerleştirin. Böylece "ana" bölümün tamamı şu şekilde görünür:
if __name__ == '__main__':
# download img file & info from Drive
rsp = drive_get_img(FILE)
if rsp:
fname, mtype, ftime, data = rsp
print('Downloaded %r (%s, %s, size: %d)' % (fname, mtype, ftime, len(data)))
# upload file to GCS
gcsname = '%s/%s'% (PARENT, fname)
rsp = gcs_blob_upload(gcsname, BUCKET, data, mtype)
if rsp:
print('Uploaded %r to GCS bucket %r' % (rsp['name'], rsp['bucket']))
else:
print('ERROR: Cannot upload %r to Cloud Storage' % gcsname)
else:
print('ERROR: Cannot download %r from Drive' % fname)
"analyzed_imgs" alt diziniyle "vision-demo" adlı bir paket belirlediğimizi varsayalım. Bu değişkenleri ayarlayıp komut dosyasını tekrar çalıştırdığınızda section-work-card-img_2x.jpg, Drive'dan indirilip Cloud Storage'a yüklenir, değil mi? NOT!
$ python3 analyze_gsimg.py
Downloaded 'section-work-card-img_2x.jpg' (image/jpeg, 2020-02-27T09:27:22.095Z, size: 27781)
Traceback (most recent call last):
File "analyze_gsimg.py", line 85, in <module>
io.BytesIO(data), mimetype=mtype), mtype)
File "analyze_gsimg.py", line 72, in gcs_blob_upload
media_body=media, fields='bucket,name').execute()
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/googleapiclient/_helpers.py", line 134, in positional_wrapper
return wrapped(*args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/googleapiclient/http.py", line 898, in execute
raise HttpError(resp, content, uri=self.uri)
googleapiclient.errors.HttpError: <HttpError 403 when requesting https://storage.googleapis.com/upload/storage/v1/b/PROJECT_ID/o?fields=bucket%2Cname&alt=json&uploadType=multipart returned "Insufficient Permission">
Dikkatli baktığınızda, Drive'a indirme işleminin başarılı olduğunu ancak Cloud Storage'a yükleme işleminin başarısız olduğunu görebilirsiniz. Neden?
Bunun nedeni, bu uygulamayı 1. adım için ilk kez yetkilendirdiğimizde Google Drive'a yalnızca salt okuma erişimi için yetkilendirme yapmış olmamızdır. Cloud Storage için okuma/yazma kapsamını eklemiş olsak da kullanıcıdan bu erişimi yetkilendirmesini hiçbir zaman istemedik. Çalışması için bu kapsamın eksik olduğu storage.json dosyasını silip yeniden çalıştırmamız gerekir.
Yeniden yetkilendirdikten sonra (storage.json simgesinin içine bakarak her iki kapsamın da orada olduğunu doğrulayın) çıktınız beklendiği gibi olur:
$ python3 analyze_gsimg.py
. . .
Authentication successful.
Downloaded 'section-work-card-img_2x.jpg' (image/jpeg, 2020-02-27T09:27:22.095Z, size: 27781)
Uploaded 'analyzed_imgs/section-work-card-img_2x.jpg' to GCS bucket 'vision-demo'
Özet
Bu, nispeten az sayıda kod satırıyla dosyaları her iki bulut tabanlı depolama sistemi arasında nasıl aktaracağınızı gösteren önemli bir örnektir. Buradaki işletme kullanım alanı, daha önce belirtildiği gibi muhtemelen sınırlı bir kaynağı "daha soğuk" ve daha ucuz bir depolama alanına yedeklemektir. Cloud Storage, verilerinize düzenli olarak mı, aylık mı, üç aylık mı yoksa yıllık mı eriştiğinize bağlı olarak farklı depolama sınıfları sunar.
Elbette geliştiriciler zaman zaman hem Google Drive hem de Cloud Storage'ın neden var olduğunu soruyor. Sonuçta ikisi de bulutta dosya depolama hizmeti sunmuyor mu? Bu nedenle bu videoyu hazırladık. Bu aşamadaki kodunuz, step2-gcs/analyze_gsimg.py adresindeki depoda bulunan kodla eşleşmelidir.
10. 3. adım: Cloud Vision ile analiz edin
Artık Google Cloud ile Google Workspace arasında veri taşıyabileceğinizi biliyoruz ancak henüz herhangi bir analiz yapmadık. Bu nedenle, etiket ekleme (diğer adıyla nesne algılama) için resmi Cloud Vision'a göndermenin zamanı geldi. Bunun için verileri Base64 ile kodlamamız gerekir. Bu da başka bir Python modülü olan base64 anlamına gelir. Üstteki içe aktarma bölümünüzün aşağıdaki gibi göründüğünden emin olun:
from __future__ import print_function
import base64
import io
Vision API, varsayılan olarak bulduğu tüm etiketleri döndürür. Tutarlılığı korumak için yalnızca ilk 5'i isteyelim (elbette kullanıcı tarafından ayarlanabilir). Bunun için sabit bir değişken TOP kullanacağız. Bu değişkeni diğer tüm sabitlerin altına ekleyin:
FILE = 'YOUR_IMG_ON_DRIVE'
BUCKET = 'YOUR_BUCKET_NAME'
PARENT = '' # YOUR IMG FILE PREFIX
TOP = 5 # TOP # of VISION LABELS TO SAVE
Önceki adımlarda olduğu gibi, bu kez Vision API için başka bir izin kapsamına ihtiyacımız var. SCOPES dizesini its ile güncelleyin:
SCOPES = (
'https://www.googleapis.com/auth/drive.readonly',
'https://www.googleapis.com/auth/devstorage.full_control',
'https://www.googleapis.com/auth/cloud-vision',
)
Şimdi Cloud Vision için diğerleriyle aynı şekilde bir hizmet uç noktası oluşturun:
# create API service endpoints
HTTP = creds.authorize(Http())
DRIVE = discovery.build('drive', 'v3', http=HTTP)
GCS = discovery.build('storage', 'v1', http=HTTP)
VISION = discovery.build('vision', 'v1', http=HTTP)
Şimdi resim yükünü Cloud Vision'a gönderen bu işlevi ekleyin:
def vision_label_img(img, top):
'send image to Vision API for label annotation'
# build image metadata and call Vision API to process
body = {'requests': [{
'image': {'content': img},
'features': [{'type': 'LABEL_DETECTION', 'maxResults': top}],
}]}
rsp = VISION.images().annotate(body=body).execute().get('responses', [{}])[0]
# return top labels for image as CSV for Sheet (row)
if 'labelAnnotations' in rsp:
return ', '.join('(%.2f%%) %s' % (
label['score']*100., label['description']) \
for label in rsp['labelAnnotations'])
images().annotate() çağrısı için verilerin yanı sıra istenen API özellikleri gerekir. İlk 5 etiket sınırı da yükün bir parçasıdır (ancak tamamen isteğe bağlıdır). Çağrı başarılı olursa yük, nesnelerin ilk 5 etiketini ve bir nesnenin resimde bulunma güven puanını döndürür. (Yanıt gelmezse aşağıdaki if ifadesinin başarısız olmaması için boş bir Python sözlüğü atayın.) Bu işlev, söz konusu verileri raporumuzda kullanılmak üzere CSV dizesi olarak derler.
vision_label_img() işlevini çağıran bu 5 satır, Cloud Storage'a başarılı bir şekilde yükleme yapıldıktan hemen sonra yerleştirilmelidir:
# process w/Vision
rsp = vision_label_img(base64.b64encode(data).decode('utf-8'), TOP)
if rsp:
print('Top %d labels from Vision API: %s' % (TOP, rsp))
else:
print('ERROR: Vision API cannot analyze %r' % fname)
Bu eklemeyle birlikte, ana sürücünün tamamı şu şekilde görünmelidir:
if __name__ == '__main__':
# download img file & info from Drive
rsp = drive_get_img(FILE)
if rsp:
fname, mtype, ftime, data = rsp
print('Downloaded %r (%s, %s, size: %d)' % (fname, mtype, ftime, len(data)))
# upload file to GCS
gcsname = '%s/%s'% (PARENT, fname)
rsp = gcs_blob_upload(gcsname, BUCKET, data, mtype)
if rsp:
print('Uploaded %r to GCS bucket %r' % (rsp['name'], rsp['bucket']))
# process w/Vision
rsp = vision_label_img(base64.b64encode(data).decode('utf-8'), TOP)
if rsp:
print('Top %d labels from Vision API: %s' % (TOP, rsp))
else:
print('ERROR: Vision API cannot analyze %r' % fname)
else:
print('ERROR: Cannot upload %r to Cloud Storage' % gcsname)
else:
print('ERROR: Cannot download %r from Drive' % fname)
Kapsamları yenilemek için storage.json silindiğinde ve güncellenen uygulama yeniden çalıştırıldığında, Cloud Vision analizinin eklendiği aşağıdaki gibi bir çıkış elde edilmelidir:
$ python3 analyze_gsimg.py
. . .
Authentication successful.
Downloaded 'section-work-card-img_2x.jpg' (image/jpeg, 2020-02-27T09:27:22.095Z, size: 27781)
Uploaded 'analyzed_imgs/section-work-card-img_2x.jpg' to GCS bucket 'vision-demo'
Top 5 labels from Vision API: (89.94%) Sitting, (86.09%) Interior design, (82.08%) Furniture, (81.52%) Table, (80.85%) Room
Özet
Herkesin verilerini analiz etmek için kendi makine öğrenimi modellerini oluşturup eğitmek üzere makine öğrenimi uzmanlığı yoktur. Google Cloud ekibi, Google'ın önceden eğitilmiş bazı modellerini genel kullanıma sunarak API'lere ekledi. Bu sayede, yapay zeka ve makine öğreniminin herkes için erişilebilir hale gelmesine yardımcı oldu.
Geliştiriciyseniz ve bir API çağırabiliyorsanız makine öğrenimini kullanabilirsiniz. Cloud Vision, verilerinizi analiz etmek için kullanabileceğiniz API hizmetlerinden yalnızca biridir. Diğerleri hakkında buradan bilgi edinebilirsiniz. Kodunuz artık step3-vision/analyze_gsimg.py adresindeki depoda bulunan kodla eşleşmelidir.
11. 4. adım: Google E-Tablolar ile rapor oluşturun
Bu noktada, kurumsal verileri arşivleyip analiz edebiliyorsunuz ancak bu çalışmanın bir özeti eksik. Tüm sonuçları, patronunuza verebileceğiniz tek bir raporda düzenleyelim. Yönetime e-tablodan daha iyi sunulabilecek ne var?
Google E-Tablolar API'si için ek içe aktarma işlemi gerekmez. Gerekli olan tek yeni bilgi, önceden biçimlendirilmiş ve yeni bir veri satırı bekleyen mevcut bir e-tablonun dosya kimliğidir. Bu nedenle SHEET sabiti kullanılır. Aşağıdakine benzer bir yeni e-tablo oluşturmanızı öneririz:

Bu e-tablonun URL'si şu şekilde görünür: https://docs.google.com/spreadsheets/d/FILE_ID/edit. FILE_ID öğesini alıp SHEET öğesine sting olarak atayın.
Ayrıca, baytları kilobaytlara dönüştüren k_ize() adlı küçük bir işlevi de ekledik. Bu işlevi, tek satırlık basit bir kod olduğu için Python lambda olarak tanımladık. Bu iki sabit, diğer sabitlerle birlikte şu şekilde görünür:
k_ize = lambda b: '%6.2fK' % (b/1000.) # bytes to kBs
FILE = 'YOUR_IMG_ON_DRIVE'
BUCKET = 'YOUR_BUCKET_NAME'
PARENT = '' # YOUR IMG FILE PREFIX
SHEET = 'YOUR_SHEET_ID'
TOP = 5 # TOP # of VISION LABELS TO SAVE
Önceki adımlarda olduğu gibi, bu kez Sheets API için okuma/yazma izni olmak üzere başka bir izin kapsamına ihtiyacımız var. SCOPES artık gereken 4 özelliğin tümüne sahip:
SCOPES = (
'https://www.googleapis.com/auth/drive.readonly',
'https://www.googleapis.com/auth/devstorage.full_control',
'https://www.googleapis.com/auth/cloud-vision',
'https://www.googleapis.com/auth/spreadsheets',
)
Şimdi diğerlerinin yakınına Google E-Tablolar için bir hizmet uç noktası oluşturun. Bu uç nokta şu şekilde görünür:
# create API service endpoints
HTTP = creds.authorize(Http())
DRIVE = discovery.build('drive', 'v3', http=HTTP)
GCS = discovery.build('storage', 'v1', http=HTTP)
VISION = discovery.build('vision', 'v1', http=HTTP)
SHEETS = discovery.build('sheets', 'v4', http=HTTP)
sheet_append_row() işlevi basittir: Bir veri satırı ve bir e-tablonun kimliğini alın, ardından bu satırı ilgili e-tabloya ekleyin:
def sheet_append_row(sheet, row):
'append row to a Google Sheet, return #cells added'
# call Sheets API to write row to Sheet (via its ID)
rsp = SHEETS.spreadsheets().values().append(
spreadsheetId=sheet, range='Sheet1',
valueInputOption='USER_ENTERED', body={'values': [row]}
).execute()
if rsp:
return rsp.get('updates').get('updatedCells')
spreadsheets().values().append() çağrısı için E-Tablo'nun dosya kimliği, bir hücre aralığı, verilerin nasıl girileceği ve verilerin kendisi gerekir. Dosya kimliği basittir, hücre aralığı A1 gösterimiyle verilir. "Sheet1" aralığı, tüm sayfayı ifade eder. Bu, API'ye satırı sayfadaki tüm verilerin sonuna eklemesi için sinyal verir. Verilerin sayfaya nasıl ekleneceği konusunda iki seçenek vardır: "RAW" (dize verilerini olduğu gibi girin) veya "USER_ENTERED" (verileri, kullanıcı Google E-Tablolar uygulamasıyla klavyesine girmiş gibi yazın ve hücre biçimlendirme özelliklerini koruyun).
Çağrı başarılı olursa döndürülen değer çok kullanışlı olmaz. Bu nedenle, API isteğiyle güncellenen hücre sayısını almayı tercih ettik. Aşağıda, bu işlevi çağıran kod verilmiştir:
# push results to Sheet, get cells-saved count
fsize = k_ize(len(data))
row = [PARENT,
'=HYPERLINK("storage.cloud.google.com/%s/%s", "%s")' % (
BUCKET, gcsname, fname), mtype, ftime, fsize, rsp
]
rsp = sheet_append_row(SHEET, row)
if rsp:
print('Updated %d cells in Google Sheet' % rsp)
else:
print('ERROR: Cannot write row to Google Sheets')
Google E-Tablosu'nda, üst "alt dizin", arşivlenmiş dosyanın Cloud Storage'daki konumu (paket + dosya adı), dosyanın MIME türü, dosya boyutu (başlangıçta bayt cinsinden olup k_ize() ile kilobayta dönüştürülür) ve Cloud Vision etiketleri dizesi gibi verileri temsil eden sütunlar bulunur. Ayrıca, arşivlenen konumun bir köprü olduğunu unutmayın. Yöneticiniz, güvenli bir şekilde yedeklendiğini onaylamak için bu köprüyü tıklayabilir.
Yukarıdaki kod bloğunu Cloud Vision'dan sonuçlar gösterildikten hemen sonra eklediğinizde, uygulamayı yönlendiren ana bölüm yapısal olarak biraz karmaşık olsa da tamamlanmış olur:
if __name__ == '__main__':
# download img file & info from Drive
rsp = drive_get_img(FILE)
if rsp:
fname, mtype, ftime, data = rsp
print('Downloaded %r (%s, %s, size: %d)' % (fname, mtype, ftime, len(data)))
# upload file to GCS
gcsname = '%s/%s'% (PARENT, fname)
rsp = gcs_blob_upload(gcsname, BUCKET, data, mtype)
if rsp:
print('Uploaded %r to GCS bucket %r' % (rsp['name'], rsp['bucket']))
# process w/Vision
rsp = vision_label_img(base64.b64encode(data).decode('utf-8'))
if rsp:
print('Top %d labels from Vision API: %s' % (TOP, rsp))
# push results to Sheet, get cells-saved count
fsize = k_ize(len(data))
row = [PARENT,
'=HYPERLINK("storage.cloud.google.com/%s/%s", "%s")' % (
BUCKET, gcsname, fname), mtype, ftime, fsize, rsp
]
rsp = sheet_append_row(SHEET, row)
if rsp:
print('Updated %d cells in Google Sheet' % rsp)
else:
print('ERROR: Cannot write row to Google Sheets')
else:
print('ERROR: Vision API cannot analyze %r' % fname)
else:
print('ERROR: Cannot upload %r to Cloud Storage' % gcsname)
else:
print('ERROR: Cannot download %r from Drive' % fname)
storage.json öğesini son bir kez silip güncellenen uygulamayı yeniden çalıştırmak, Cloud Vision analizinin eklendiği aşağıdaki gibi bir çıkışla sonuçlanmalıdır:
$ python3 analyze_gsimg.py
. . .
Authentication successful.
Downloaded 'section-work-card-img_2x.jpg' (image/jpeg, 2020-02-27T09:27:22.095Z, size: 27781)
Uploaded 'analyzed_imgs/section-work-card-img_2x.jpg' to GCS bucket 'vision-demo'
Top 5 labels from Vision API: (89.94%) Sitting, (86.09%) Interior design, (82.08%) Furniture, (81.52%) Table, (80.85%) Room
Updated 6 cells in Google Sheet
Ek çıktı satırı faydalı olsa da güncellenen Google E-Tablosu'na göz atarak daha iyi görselleştirilebilir. Bu tabloda, daha önce eklenen mevcut veri kümesine son satır (aşağıdaki örnekte 7. satır) eklenmiştir:

Özet
Bu eğitimin ilk 3 adımında, tüm işin% 80'ini oluşturan verileri taşımak ve analiz etmek için Google Workspace ve Google Cloud API'lerine bağlandınız. Ancak günün sonunda, tüm bu çalışmaların hiçbir anlamı kalmaz. Çünkü yönetim ekibine başarılarınızı sunamazsınız. Sonuçları daha iyi görselleştirmek için tüm sonuçları oluşturulan bir raporda özetlemek çok faydalıdır.
Analizin faydasını daha da artırmak için sonuçları bir e-tabloya yazmanın yanı sıra, her resim için en iyi 5 etiketi dizine eklemek de bir iyileştirme olabilir. Böylece, yetkili çalışanların arama ekibine göre resim sorgulamasına olanak tanıyan bir dahili veritabanı oluşturulabilir. Ancak bu kısmı okuyuculara alıştırma olarak bırakıyoruz.
Şu an için sonuçlarımız bir e-tabloda yer alıyor ve yönetim tarafından erişilebiliyor. Bu aşamada uygulamanızın kodu, step4-sheets/analyze_gsimg.py deposundaki kodla eşleşmelidir. Son adım, kodu temizlemek ve kullanılabilir bir komut dosyasına dönüştürmektir.
12. *Son adım: yeniden düzenleme
(isteğe bağlı) Çalışan bir uygulamanızın olması iyi bir şey ancak uygulamayı daha iyi hale getirebilir miyiz? Evet, özellikle de karmaşık bir yığın gibi görünen ana uygulama. Bunu kendi işlevine yerleştirelim ve sabit değerler yerine kullanıcı girişine izin verecek şekilde çalıştıralım. Bunu argparse modülüyle yapacağız. Ayrıca, veri satırımızı yazdıktan sonra sayfayı göstermek için bir web tarayıcısı sekmesi başlatalım. Bu işlem webbrowser modülüyle yapılabilir. Bu içe aktarma işlemlerini diğerleriyle birlikte kullanın. Böylece en üstteki içe aktarma işlemleri aşağıdaki gibi görünür:
from __future__ import print_function
import argparse
import base64
import io
import webbrowser
Bu kodu diğer uygulamalarda kullanabilmek için çıktıyı bastırabilmemiz gerekir. Bu nedenle, bunu yapmak için DEBUG işaretini ekleyelim ve bu satırı en üstteki sabitler bölümünün sonuna ekleyelim:
DEBUG = False
Şimdi de ana metin hakkında konuşalım. Bu örneği oluştururken, kodumuz her hizmet eklendiğinde başka bir iç içe yerleştirme düzeyi eklediğinden "rahatsız" olmaya başlamış olmalısınız. Bu durumun kod karmaşıklığını artırdığını düşünüyorsanız yalnız değilsiniz. Bu konu Google Testing Blog yayınında açıklanmıştır.
Bu en iyi uygulamaya uyarak uygulamanın ana bölümünü bir işlev olarak yeniden düzenleyelim ve iç içe yerleştirmek yerine her "kesme noktasında" return (herhangi bir adım başarısız olursa None, tüm adımlar başarılı olursa True döndürülür) kullanalım:
def main(fname, bucket, sheet_id, folder, top, debug):
'"main()" drives process from image download through report generation'
# download img file & info from Drive
rsp = drive_get_img(fname)
if not rsp:
return
fname, mtype, ftime, data = rsp
if debug:
print('Downloaded %r (%s, %s, size: %d)' % (fname, mtype, ftime, len(data)))
# upload file to GCS
gcsname = '%s/%s'% (folder, fname)
rsp = gcs_blob_upload(gcsname, bucket, data, mtype)
if not rsp:
return
if debug:
print('Uploaded %r to GCS bucket %r' % (rsp['name'], rsp['bucket']))
# process w/Vision
rsp = vision_label_img(base64.b64encode(data).decode('utf-8'))
if not rsp:
return
if debug:
print('Top %d labels from Vision API: %s' % (top, rsp))
# push results to Sheet, get cells-saved count
fsize = k_ize(len(data))
row = [folder,
'=HYPERLINK("storage.cloud.google.com/%s/%s", "%s")' % (
bucket, gcsname, fname), mtype, ftime, fsize, rsp
]
rsp = sheet_append_row(sheet_id, row)
if not rsp:
return
if debug:
print('Added %d cells to Google Sheet' % rsp)
return True
Bu yöntem, yukarıda açıklandığı gibi kod karmaşıklığını azaltmanın yanı sıra daha düzenli ve temiz bir kod oluşturarak yinelemeli if-else zincir hissini ortadan kaldırır. Bulmacanın son parçası, kullanıcı özelleştirmesine olanak tanıyan ve çıktıyı en aza indiren (istenmediği sürece) "gerçek" bir ana sürücü oluşturmaktır:
if __name__ == '__main__':
# args: [-hv] [-i imgfile] [-b bucket] [-f folder] [-s Sheet ID] [-t top labels]
parser = argparse.ArgumentParser()
parser.add_argument("-i", "--imgfile", action="store_true",
default=FILE, help="image file filename")
parser.add_argument("-b", "--bucket_id", action="store_true",
default=BUCKET, help="Google Cloud Storage bucket name")
parser.add_argument("-f", "--folder", action="store_true",
default=PARENT, help="Google Cloud Storage image folder")
parser.add_argument("-s", "--sheet_id", action="store_true",
default=SHEET, help="Google Sheet Drive file ID (44-char str)")
parser.add_argument("-t", "--viz_top", action="store_true",
default=TOP, help="return top N (default %d) Vision API labels" % TOP)
parser.add_argument("-v", "--verbose", action="store_true",
default=DEBUG, help="verbose display output")
args = parser.parse_args()
print('Processing file %r... please wait' % args.imgfile)
rsp = main(args.imgfile, args.bucket_id,
args.sheet_id, args.folder, args.viz_top, args.verbose)
if rsp:
sheet_url = 'https://docs.google.com/spreadsheets/d/%s/edit' % args.sheet_id
print('DONE: opening web browser to it, or see %s' % sheet_url)
webbrowser.open(sheet_url, new=1, autoraise=True)
else:
print('ERROR: could not process %r' % args.imgfile)
Tüm adımlar başarılı olursa komut dosyası, yeni veri satırının eklendiği belirtilen e-tablo için bir web tarayıcısı başlatır.
Özet
Kapsam değişikliği olmadığından storage.json silinmesine gerek yoktur. Güncellenen uygulamayı yeniden çalıştırmak, değiştirilen sayfada yeni bir tarayıcı penceresinin açıldığını, daha az çıktı satırı olduğunu ve -h seçeneğinin verilmesinin, kullanıcıların daha önce görülen ve artık bastırılmış çıktı satırlarını geri yüklemek için -v seçeneği de dahil olmak üzere seçeneklerini gösterdiğini ortaya koyuyor:
$ python3 analyze_gsimg.py Processing file 'section-work-card-img_2x.jpg'... please wait DONE: opening web browser to it, or see https://docs.google.com/spreadsheets/d/SHEET_ID/edit $ python3 analyze_gsimg.py -h usage: analyze_gsimg.py [-h] [-i] [-t] [-f] [-b] [-s] [-v] optional arguments: -h, --help show this help message and exit -i, --imgfile image file filename -t, --viz_top return top N (default 5) Vision API labels -f, --folder Google Cloud Storage image folder -b, --bucket_id Google Cloud Storage bucket name -s, --sheet_id Google Sheet Drive file ID (44-char str) -v, --verbose verbose display output
Diğer seçenekler, kullanıcıların farklı Drive dosya adları, Cloud Storage "alt dizin" ve paket adları, Cloud Vision'dan elde edilen ilk "N" sonuç ve e-tablo (Sheets) dosya kimlikleri seçmesine olanak tanır. Bu son güncellemelerle birlikte kodunuzun nihai sürümü artık final/analyze_gsimg.py adresindeki depoda ve burada yer alan kodla tamamen eşleşmelidir:
'''
analyze_gsimg.py - analyze Google Workspace image processing workflow
Download image from Google Drive, archive to Google Cloud Storage, send
to Google Cloud Vision for processing, add results row to Google Sheet.
'''
from __future__ import print_function
import argparse
import base64
import io
import webbrowser
from googleapiclient import discovery, http
from httplib2 import Http
from oauth2client import file, client, tools
k_ize = lambda b: '%6.2fK' % (b/1000.) # bytes to kBs
FILE = 'YOUR_IMG_ON_DRIVE'
BUCKET = 'YOUR_BUCKET_NAME'
PARENT = '' # YOUR IMG FILE PREFIX
SHEET = 'YOUR_SHEET_ID'
TOP = 5 # TOP # of VISION LABELS TO SAVE
DEBUG = False
# process credentials for OAuth2 tokens
SCOPES = (
'https://www.googleapis.com/auth/drive.readonly',
'https://www.googleapis.com/auth/devstorage.full_control',
'https://www.googleapis.com/auth/cloud-vision',
'https://www.googleapis.com/auth/spreadsheets',
)
store = file.Storage('storage.json')
creds = store.get()
if not creds or creds.invalid:
flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
creds = tools.run_flow(flow, store)
# create API service endpoints
HTTP = creds.authorize(Http())
DRIVE = discovery.build('drive', 'v3', http=HTTP)
GCS = discovery.build('storage', 'v1', http=HTTP)
VISION = discovery.build('vision', 'v1', http=HTTP)
SHEETS = discovery.build('sheets', 'v4', http=HTTP)
def drive_get_img(fname):
'download file from Drive and return file info & binary if found'
# search for file on Google Drive
rsp = DRIVE.files().list(q="name='%s'" % fname,
fields='files(id,name,mimeType,modifiedTime)'
).execute().get('files', [])
# download binary & return file info if found, else return None
if rsp:
target = rsp[0] # use first matching file
fileId = target['id']
fname = target['name']
mtype = target['mimeType']
binary = DRIVE.files().get_media(fileId=fileId).execute()
return fname, mtype, target['modifiedTime'], binary
def gcs_blob_upload(fname, bucket, media, mimetype):
'upload an object to a Google Cloud Storage bucket'
# build blob metadata and upload via GCS API
body = {'name': fname, 'uploadType': 'multipart', 'contentType': mimetype}
return GCS.objects().insert(bucket=bucket, body=body,
media_body=http.MediaIoBaseUpload(io.BytesIO(media), mimetype),
fields='bucket,name').execute()
def vision_label_img(img, top):
'send image to Vision API for label annotation'
# build image metadata and call Vision API to process
body = {'requests': [{
'image': {'content': img},
'features': [{'type': 'LABEL_DETECTION', 'maxResults': top}],
}]}
rsp = VISION.images().annotate(body=body).execute().get('responses', [{}])[0]
# return top labels for image as CSV for Sheet (row)
if 'labelAnnotations' in rsp:
return ', '.join('(%.2f%%) %s' % (
label['score']*100., label['description']) \
for label in rsp['labelAnnotations'])
def sheet_append_row(sheet, row):
'append row to a Google Sheet, return #cells added'
# call Sheets API to write row to Sheet (via its ID)
rsp = SHEETS.spreadsheets().values().append(
spreadsheetId=sheet, range='Sheet1',
valueInputOption='USER_ENTERED', body={'values': [row]}
).execute()
if rsp:
return rsp.get('updates').get('updatedCells')
def main(fname, bucket, sheet_id, folder, top, debug):
'"main()" drives process from image download through report generation'
# download img file & info from Drive
rsp = drive_get_img(fname)
if not rsp:
return
fname, mtype, ftime, data = rsp
if debug:
print('Downloaded %r (%s, %s, size: %d)' % (fname, mtype, ftime, len(data)))
# upload file to GCS
gcsname = '%s/%s'% (folder, fname)
rsp = gcs_blob_upload(gcsname, bucket, data, mtype)
if not rsp:
return
if debug:
print('Uploaded %r to GCS bucket %r' % (rsp['name'], rsp['bucket']))
# process w/Vision
rsp = vision_label_img(base64.b64encode(data).decode('utf-8'), top)
if not rsp:
return
if debug:
print('Top %d labels from Vision API: %s' % (top, rsp))
# push results to Sheet, get cells-saved count
fsize = k_ize(len(data))
row = [folder,
'=HYPERLINK("storage.cloud.google.com/%s/%s", "%s")' % (
bucket, gcsname, fname), mtype, ftime, fsize, rsp
]
rsp = sheet_append_row(sheet_id, row)
if not rsp:
return
if debug:
print('Added %d cells to Google Sheet' % rsp)
return True
if __name__ == '__main__':
# args: [-hv] [-i imgfile] [-b bucket] [-f folder] [-s Sheet ID] [-t top labels]
parser = argparse.ArgumentParser()
parser.add_argument("-i", "--imgfile", action="store_true",
default=FILE, help="image file filename")
parser.add_argument("-b", "--bucket_id", action="store_true",
default=BUCKET, help="Google Cloud Storage bucket name")
parser.add_argument("-f", "--folder", action="store_true",
default=PARENT, help="Google Cloud Storage image folder")
parser.add_argument("-s", "--sheet_id", action="store_true",
default=SHEET, help="Google Sheet Drive file ID (44-char str)")
parser.add_argument("-t", "--viz_top", action="store_true",
default=TOP, help="return top N (default %d) Vision API labels" % TOP)
parser.add_argument("-v", "--verbose", action="store_true",
default=DEBUG, help="verbose display output")
args = parser.parse_args()
print('Processing file %r... please wait' % args.imgfile)
rsp = main(args.imgfile, args.bucket_id,
args.sheet_id, args.folder, args.viz_top, args.verbose)
if rsp:
sheet_url = 'https://docs.google.com/spreadsheets/d/%s/edit' % args.sheet_id
print('DONE: opening web browser to it, or see %s' % sheet_url)
webbrowser.open(sheet_url, new=1, autoraise=True)
else:
print('ERROR: could not process %r' % args.imgfile)
Bu eğitimin içeriğini güncel tutmak için elimizden geleni yapacağız ancak zaman zaman kodun en son sürümü depoda yer alacaktır.
13. Tebrikler!
Bu codelab'de çok şey öğrendiniz ve uzun codelab'lerden birini tamamlayarak bunu başardınız. Sonuç olarak, Google Cloud ve Google Workspace'in tüm özelliklerinden yararlanarak ve aralarında veri taşıyarak yaklaşık 130 satırlık Python koduyla olası bir kurumsal senaryoyu ele alıp çalışan bir çözüm oluşturdunuz. Bu uygulamanın tüm sürümleri için açık kaynaklı depoyu inceleyebilirsiniz (daha fazla bilgiyi aşağıda bulabilirsiniz).
Temizleme
- Google Cloud API'lerinin kullanımı ücretsiz değildir. Google Workspace API'leri ise aylık Google Workspace abonelik ücretinize dahildir (tüketici Gmail kullanıcıları için aylık ücret sıfırdır). Bu nedenle, Google Workspace kullanıcıları için API temizleme/kapatma işlemi gerekmez. Google Cloud için Cloud Console kontrol panelinize gidip tahmini ücretler için Faturalandırma "kartını" kontrol edebilirsiniz.
- Cloud Vision için ayda sabit sayıda API çağrısı ücretsiz olarak yapılabilir. Bu nedenle, bu sınırların altında kaldığınız sürece hiçbir şeyi kapatmanız veya projenizi devre dışı bırakmanız/silmeniz gerekmez. Vision API'nin faturalandırması ve ücretsiz kotası hakkında daha fazla bilgiyi fiyatlandırma sayfasında bulabilirsiniz.
- Bazı Cloud Storage kullanıcıları ayda ücretsiz depolama alanı alır. Bu codelab'i kullanarak arşivlediğiniz resimler kotayı aşmanıza neden olmazsa herhangi bir ücret alınmaz. GCS faturalandırması ve ücretsiz kota hakkında daha fazla bilgiyi fiyatlandırma sayfasında bulabilirsiniz. Blob'ları Cloud Storage tarayıcısından görüntüleyebilir ve kolayca silebilirsiniz.
- Google Drive kullanımınızın da depolama alanı kotası olabilir. Bu kotayı aşarsanız (veya aşmaya yaklaşırsanız) Drive'da daha fazla alan elde etmek için bu codelab'de oluşturduğunuz aracı kullanarak bu resimleri Cloud Storage'da arşivleyebilirsiniz. Google Drive depolama alanı hakkında daha fazla bilgiyi Google Workspace Basic veya Gmail/tüketici kullanıcıları için uygun fiyatlandırma sayfasında bulabilirsiniz.
Çoğu Google Workspace Business ve Enterprise planında sınırsız depolama alanı olsa da bu durum, Drive klasörlerinizin dağınık ve/veya karmaşık olmasına neden olabilir. Bu eğitimde oluşturduğunuz uygulama, gereksiz dosyaları arşivlemenin ve Google Drive'ınızı temizlemenin harika bir yoludur.
Alternatif sürümler
Bu eğitimde üzerinde çalıştığınız "son" resmi sürüm final/analyze_gsimg.py olsa da bu, hikayenin sonu değildir. Uygulamanın nihai sürümüyle ilgili bir sorun, desteği sonlandırılmış eski kimlik doğrulama kitaplıklarını kullanmasıdır. Bu yolu seçmemizin nedeni, bu makalenin yazıldığı sırada daha yeni kimlik doğrulama kitaplıklarının OAuth jetonu depolama yönetimi ve iş parçacığı güvenliği gibi çeşitli temel öğeleri desteklememesiydi.
Mevcut (daha yeni) kimlik doğrulama kitaplıkları
Ancak bir noktada eski kimlik doğrulama kitaplıkları artık desteklenmeyecek. Bu nedenle, iş parçacığı güvenli olmasalar bile (ancak kendi çözümünüzü oluşturabilirsiniz) deponun alt klasöründe daha yeni (mevcut) kimlik doğrulama kitaplıklarını kullanan sürümleri incelemenizi öneririz. Adında *newauth* bulunan dosyaları arayın.
Google Cloud ürün istemci kitaplıkları
Google Cloud, tüm geliştiricilerin Google Cloud API'lerini kullanırken ürün istemci kitaplıklarını kullanmasını önerir. Maalesef Google Cloud dışındaki API'ler için şu anda bu tür kitaplıklar bulunmamaktadır. Daha düşük düzeydeki kitaplıkların kullanılması, API'nin tutarlı bir şekilde kullanılmasını sağlar ve daha iyi okunabilirlik sunar. Yukarıdaki öneriye benzer şekilde, Google Cloud ürün istemci kitaplıklarını kullanan alternatif sürümler, incelemeniz için deponun alt klasöründe mevcuttur. Adında *-gcp* bulunan dosyaları arayın.
Hizmet hesabını yetkilendirme
Tamamen bulutta çalışırken genellikle insanlar veya kullanıcıya ait veriler olmaz. Bu nedenle, hizmet hesapları ve hizmet hesabı yetkilendirmesi öncelikle Google Cloud ile kullanılır. Ancak Google Workspace dokümanları genellikle (insan) kullanıcılara ait olduğundan bu eğitimde kullanıcı hesabı yetkilendirmesi kullanılmaktadır. Ancak bu, Google Workspace API'lerinin hizmet hesaplarıyla kullanılamayacağı anlamına gelmez. Bu hesaplar uygun erişim düzeyine sahip olduğu sürece uygulamalarda kullanılabilir. Yukarıdakine benzer şekilde, hizmet hesabı yetkilendirmesi kullanan alternatif sürümler incelemeniz için deponun alt klasöründe mevcuttur. Adında *-svc* bulunan dosyaları arayın.
Alternatif sürüm kataloğu
Aşağıda, final/analyze_gsimg.py öğesinin tüm alternatif sürümlerini bulabilirsiniz. Bu sürümlerin her birinde yukarıdaki özelliklerden biri veya daha fazlası bulunur. Her sürümün dosya adında şunları arayın:
- Eski kimlik doğrulama kitaplıklarını kullanan sürümler için "
oldauth" (final/analyze_gsimg.py'a ek olarak) - Mevcut/daha yeni kimlik doğrulama kitaplıklarını kullananlar için "
newauth" - Google Cloud ürün istemci kitaplıklarını (ör. google-cloud-storage) kullananlar için "
gcp" - Kullanıcı hesabı yerine hizmet hesabı ("svc acct") kimlik doğrulaması kullananlar için "
svc"
Tüm sürümleri aşağıda bulabilirsiniz:
Dosya adı | Açıklama |
| Birincil örnek; eski kimlik doğrulama kitaplıklarını kullanır. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Orijinal final/analyze_gsimg.py ile birlikte, Google API geliştirme ortamınızdan bağımsız olarak nihai çözümün olası tüm kombinasyonlarına sahip olursunuz ve ihtiyaçlarınıza en uygun olanı seçebilirsiniz. Benzer bir açıklama için alt/README.md bölümüne de bakın.
Ek Çalışma
Bu alıştırmayı bir veya iki adım daha ileriye taşıyabileceğiniz birkaç fikri aşağıda bulabilirsiniz. Mevcut çözümün işleyebileceği sorun kümesi genişletilebilir. Bu sayede aşağıdaki iyileştirmeleri yapabilirsiniz:
- (Klasörlerdeki birden fazla resim) Bir resmi işlemek yerine, Google Drive klasörlerinizde resimler olduğunu varsayalım.
- (ZIP dosyalarındaki birden fazla resim) Resim klasörü yerine, resim dosyaları içeren ZIP arşivleri kullanabilirsiniz. Python kullanıyorsanız
zipfilemodülünü kullanabilirsiniz. - (Vision etiketlerini analiz etme) Benzer resimleri birlikte gruplandırın. Belki de en yaygın etiketleri, ardından en yaygın ikinci etiketleri ve bu şekilde devam ederek aramaya başlayabilirsiniz.
- (grafik oluşturma) 3. takip: Vision API analizi ve sınıflandırmasına dayalı olarak Sheets API ile grafik oluşturma
- (Belgeleri kategorize etme) Cloud Vision API ile görüntüleri analiz etmek yerine, Cloud Natural Language API ile kategorize edilecek PDF dosyalarınız olduğunu varsayalım. Yukarıdaki çözümlerinizi kullanarak bu PDF'ler Drive klasörlerinde veya Drive'daki ZIP arşivlerinde olabilir.
- (Sunu oluşturma) Google E-Tablolar raporunun içeriğinden bir slayt destesi oluşturmak için Slaytlar API'sini kullanın. İlham almak için e-tablo verilerinden slayt oluşturma konulu bu blog yayınına ve videoya göz atın.
- (PDF olarak dışa aktarma) E-tabloyu ve/veya slayt sunusunu PDF olarak dışa aktarabilirsiniz. Ancak bu, E-Tablolar veya Slaytlar API'lerinin bir özelliği değildir. İpucu: Google Drive API. Ekstra bilgi: Ghostscript (Linux, Windows) veya
Combine PDF Pages.action(Mac OS X) gibi araçlarla hem E-Tablolar hem de Slaytlar PDF'lerini tek bir ana PDF'de birleştirin.
Daha Fazla Bilgi
Codelab uygulamaları
- Google Workspace API'lerine giriş (Google Drive API) (Python)
- Cloud Vision'ı Python ile kullanma (Python)
- Özelleştirilmiş raporlama araçları oluşturma (Google Sheets API) (JS/Node)
- Nesneleri Google Cloud Storage'a yükleme (kodlama gerekmez)
Genel
Google Workspace
- Google Drive API ana sayfası
- Google Sheets API ana sayfası
- Google Workspace geliştirici genel bakışı ve dokümanları
Google Cloud
- Google Cloud Storage ana sayfası
- Google Cloud Vision ana sayfası ve canlı demo
- Cloud Vision API belgeleri
- Vision API görüntü etiketleme belgeleri
- Google Cloud'da Python
- Google Cloud ürün istemci kitaplıkları
- Google Cloud belgeleri
Lisans
Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.