Google Workspace में इमेज संग्रहित करना, उनका विश्लेषण करना, और रिपोर्ट जनरेट करना Google क्लाउड

1. खास जानकारी

यह कोडलैब एक संभावित एंटरप्राइज़ वर्कफ़्लो की कल्पना करता है: इमेज संग्रहित करना, उसका विश्लेषण करना, और रिपोर्ट जनरेट करना. कल्पना करें कि आपके संगठन के पास सीमित संसाधन पर स्थान लेने वाली छवियों की एक शृंखला है. आपको उस डेटा को संग्रहित करना है, उन इमेज का विश्लेषण करना है, और सबसे ज़रूरी बात, संग्रहित की गई जगहों की खास जानकारी वाली रिपोर्ट जनरेट करनी है. साथ ही, उस रिपोर्ट को जनरेट करना है जिसमें इकट्ठा की गई जानकारी के साथ-साथ विश्लेषण के नतीजे भी शामिल हों. ये रिपोर्ट, मैनेजमेंट के हिसाब से इस्तेमाल के लिए तैयार की जाती हैं. Google Cloud, इसके लिए टूल उपलब्ध कराता है. इसके लिए वह अपने दो प्रॉडक्ट लाइन, Google Workspace (पहले इसे G Suite या Google Apps के नाम से जाना जाता था) और Google Cloud (पहले इसे GCP कहा जाता था) के एपीआई का इस्तेमाल करता है.

हमारे मामले में, कारोबारी उपयोगकर्ता के पास Google Drive पर इमेज होंगी. इन सवालों को "हल्का" सस्ता स्टोरेज, जैसे कि Google Cloud Storage में मिलने वाली स्टोरेज की क्लास. Google Cloud Vision की मदद से डेवलपर, ऐप्लिकेशन में दृष्टि पहचानने वाली सुविधाओं को आसानी से इंटिग्रेट कर सकते हैं. इनमें ऑब्जेक्ट और लैंडमार्क की पहचान, ऑप्टिकल कैरेक्टर रिकग्निशन (ओसीआर) की सुविधाएं शामिल हैं. आखिर में, Google Sheets स्प्रेडशीट की मदद से, आपके बॉस को इन चीज़ों की खास जानकारी मिल सकती है.

इस कोडलैब को पूरा करके, Google Cloud के सभी टूल और सेवाओं का इस्तेमाल करने वाला समाधान तैयार करने के बाद, हमें उम्मीद है कि आपको अपने संगठन या ग्राहकों के लिए कुछ ऐसा बनाने की प्रेरणा मिलेगी जो ज़्यादा असरदार हो.

आप इन चीज़ों के बारे में जानेंगे

  • Cloud Shell का इस्तेमाल कैसे करें
  • एपीआई अनुरोधों की पुष्टि करने का तरीका
  • Python के लिए, Google API की क्लाइंट लाइब्रेरी इंस्टॉल करने का तरीका
  • Google API चालू करने का तरीका
  • Google Drive से फ़ाइलें डाउनलोड करने का तरीका
  • Cloud Storage में ऑब्जेक्ट/ब्लॉब कैसे अपलोड करें
  • Cloud Vision की मदद से डेटा का विश्लेषण करने का तरीका
  • Google Sheets में पंक्तियां लिखने का तरीका

आपको इनकी ज़रूरत होगी

  • Google खाता (Google Workspace खातों के लिए एडमिन की अनुमति ज़रूरी हो सकती है)
  • एक ऐसा Google Cloud प्रोजेक्ट जिसमें Google Cloud का बिलिंग खाता चालू हो
  • ऑपरेटिंग सिस्टम टर्मिनल/शेल निर्देशों की जानकारी
  • Python (2 या 3) में बुनियादी स्किल, लेकिन इस्तेमाल की जा सकने वाली किसी भी भाषा का इस्तेमाल किया जा सकता है

ऊपर दिए गए Google Cloud के चार प्रॉडक्ट का अनुभव आपके लिए मददगार साबित होगा. हालांकि, ऐसा करना ज़रूरी नहीं है. अगर आपको पहले उन्हें अलग-अलग जानने की अनुमति दें, तो यहां व्यायाम करने से पहले हर एक के लिए कोडलैब (कोड बनाना सीखना) आपका स्वागत है:

सर्वे

इस ट्यूटोरियल का इस्तेमाल कैसे किया जाएगा?

इसे सिर्फ़ पढ़ें इसे पढ़ें और कसरतों को पूरा करें

Python के साथ अपने अनुभव को आप कितनी रेटिंग देंगे?

शुरुआती इंटरमीडिएट कुशल

Google Cloud की सेवाएं इस्तेमाल करने का आपका अनुभव कैसा रहा?

शुरुआती इंटरमीडिएट कुशल

Google Workspace की डेवलपर सेवाएं इस्तेमाल करने का आपका अनुभव कैसा रहा?

शुरुआती इंटरमीडिएट कुशल

क्या आपको ज़्यादा "कारोबार की जानकारी" वाला सुझाव देखना है codelabs बनाम प्रॉडक्ट सुविधाओं के बारे में बताने वाला लैब

हां नहीं दोनों से ज़्यादा

2. सेटअप और ज़रूरी शर्तें

अपने हिसाब से एनवायरमेंट सेटअप करें

  1. Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से Gmail या Google Workspace खाता नहीं है, तो आपको नया खाता बनाना होगा.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों का डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करता. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होना चाहिए. साथ ही, आईडी को बदला नहीं जा सकता. सेट अप के बाद इसे बदला नहीं जा सकता. Cloud Console, एक यूनीक स्ट्रिंग अपने-आप जनरेट करता है; आम तौर पर, आपको उसके होने की कोई परवाह नहीं होती. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी का रेफ़रंस देना होगा. आम तौर पर, इसे PROJECT_ID के तौर पर पहचाना जाता है. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो किसी भी क्रम में एक और आईडी जनरेट किया जा सकता है. इसके अलावा, खुद भी आज़माया जा सकता है और देखें कि वह उपलब्ध है या नहीं. इस चरण के बाद इसे बदला नहीं जा सकता और प्रोजेक्ट के कुल समय तक बना रहेगा.
  • आपकी जानकारी के लिए, एक तीसरी वैल्यू यानी प्रोजेक्ट नंबर है. इसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
  1. इसके बाद, आपको क्लाउड संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग चालू करनी होगी. इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. इस ट्यूटोरियल के अलावा, संसाधनों को बंद करने के लिए कि आपको बिलिंग न करनी पड़े. इसके लिए, अपने बनाए गए संसाधनों को मिटाएं या पूरा प्रोजेक्ट मिटाएं. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले प्रोग्राम में हिस्सा ले सकते हैं.

क्लाउड शेल शुरू करें

खास जानकारी

कोड को अपने लैपटॉप पर स्थानीय तौर पर डेवलप किया जा सकता है. हालांकि, इस कोडलैब का दूसरा लक्ष्य आपको Google Cloud Shell को इस्तेमाल करने का तरीका सिखाना है. यह ऐसा कमांड-लाइन एनवायरमेंट है जो आपके मॉडर्न वेब ब्राउज़र के ज़रिए क्लाउड पर चलता है.

Cloud Shell चालू करें

  1. Cloud Console में, Cloud Shell चालू करें 853e55310c205094.png पर क्लिक करें.

55efc1aaa7a4d3ad.png

अगर आपने Cloud Shell का इस्तेमाल पहले कभी नहीं किया है, तो आपको इसके बारे में जानकारी देने वाली एक इंटरमीडिएट स्क्रीन (पेज के फ़ोल्ड के नीचे) दिखेगी. अगर ऐसा है, तो जारी रखें पर क्लिक करें (यह आपको फिर कभी नहीं दिखेगा). एक बार इस्तेमाल होने वाली स्क्रीन कुछ इस तरह दिखती है:

9c92662c6a846a5c.png

प्रावधान करने और Cloud Shell से कनेक्ट होने में कुछ ही समय लगेगा.

9f0e51b578fecce5.png

इस वर्चुअल मशीन में ऐसे सभी डेवलपमेंट टूल मौजूद हैं जिनकी आपको ज़रूरत है. यह पांच जीबी की स्थायी होम डायरेक्ट्री उपलब्ध कराता है और Google Cloud में चलता है. यह नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस को बेहतर बनाता है. अगर सभी नहीं, तो इस कोडलैब में आपका बहुत सारा काम बस किसी ब्राउज़र या आपके Chromebook से किया जा सकता है.

Cloud Shell से कनेक्ट करने के बाद, आपको दिखेगा कि आपकी पुष्टि पहले ही हो चुकी है. साथ ही, यह प्रोजेक्ट पहले से ही आपके प्रोजेक्ट आईडी पर सेट है.

  1. यह पुष्टि करने के लिए Cloud Shell में नीचे दिया गया कमांड चलाएं कि आपकी पुष्टि हो गई है:
gcloud auth list

कमांड आउटपुट

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Cloud Shell में यह कमांड चलाएं, ताकि यह पुष्टि की जा सके कि gcloud के लिए कमांड को आपके प्रोजेक्ट के बारे में जानकारी है:
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

अगर ऐसा नहीं है, तो आप इसे इस निर्देश की मदद से सेट कर सकते हैं:

gcloud config set project <PROJECT_ID>

कमांड आउटपुट

Updated property [core/project].

3. Python एनवायरमेंट की पुष्टि करें

इस कोडलैब के लिए आपको Python लैंग्वेज का इस्तेमाल करना होगा. हालांकि, Google API की क्लाइंट लाइब्रेरी कई भाषाओं का इस्तेमाल करती है. इसलिए, अपने पसंदीदा डेवलपमेंट टूल में इसके जैसा कुछ बनाएं और Python का इस्तेमाल स्यूडोकोड के तौर पर करें. खास तौर पर, यह कोडलैब Python 2 और 3 के साथ काम करता है. हालांकि, हमारा सुझाव है कि जल्द से जल्द 3.x का इस्तेमाल करें.

Cloud Shell एक ऐसा आसान टूल है जिसे सीधे Cloud Console से उपलब्ध कराया जाता है. इसके लिए किसी लोकल डेवलपमेंट एनवायरमेंट की ज़रूरत नहीं होती. इसलिए, इस ट्यूटोरियल को वेब ब्राउज़र की मदद से, क्लाउड पर पूरी तरह से बनाया जा सकता है. खास तौर पर, इस कोडलैब के लिए Cloud Shell में Python के दोनों वर्शन पहले से इंस्टॉल किए जा चुके हैं.

Cloud Shell में IPython भी इंस्टॉल किया गया है: यह एक बेहतर लेवल का इंटरैक्टिव Python इंटरप्रेटर है. हमारा सुझाव है कि आप इसका सुझाव दें. खास तौर पर तब, जब आप डेटा साइंस या मशीन लर्निंग कम्यूनिटी का हिस्सा हों. अगर आप हैं, तो IPython, Jupyter Notebooks के साथ-साथ Colab के लिए डिफ़ॉल्ट अनुवादक है. यह Jupyter Notebooks को Google Research होस्ट करता है.

IPython सबसे पहले, Python 3 अनुवादक को प्राथमिकता देता है, लेकिन 3.x उपलब्ध न होने पर Python 2 का इस्तेमाल करना शुरू कर देता है. IPython को Cloud Shell से ऐक्सेस किया जा सकता है. हालांकि, इसे लोकल डेवलपमेंट एनवायरमेंट में भी इंस्टॉल किया जा सकता है. ^D (Ctrl-d) से बाहर निकलें और बाहर निकलने के लिए ऑफ़र स्वीकार करें. ipython शुरू करने के बाद आने वाले आउटपुट का उदाहरण कुछ ऐसा दिखेगा:

$ 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 को इस्तेमाल करना आपको पसंद नहीं है, तो Python के स्टैंडर्ड इंटरैक्टिव इंटरप्रेटर (Cloud Shell या आपका लोकल डेवलपमेंट एनवायरमेंट) का इस्तेमाल करना सही है (^D से भी बाहर निकलें):

$ 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.
>>>

कोडलैब यह भी मानता है कि आपके पास pip इंस्टॉलेशन टूल (Python पैकेज मैनेजर और डिपेंडेंसी रिज़ॉल्वर) मौजूद है. यह 2.7.9+ या 3.4+ वर्शन के साथ आता है. अगर आपके पास Python का पुराना वर्शन है, तो इंस्टॉल करने से जुड़े निर्देशों के लिए यह गाइड देखें. आपकी अनुमतियों के आधार पर, आपके पास sudo या सुपर उपयोगकर्ता का ऐक्सेस होना चाहिए. हालांकि, आम तौर पर ऐसा नहीं होता. pip को लागू करने के लिए, Python के खास वर्शन के लिए pip2 या pip3 का भी साफ़ तौर पर इस्तेमाल किया जा सकता है.

कोडलैब का बाकी हिस्सा यह मानकर चलता है कि आपने Python 3 का इस्तेमाल किया है. अगर Python 2, 3.x से काफ़ी अलग है, तो इसके लिए खास निर्देश दिए जाएंगे.

[ज़रूरी नहीं] वर्चुअल एनवायरमेंट बनाना और उनका इस्तेमाल करना

यह सेक्शन ज़रूरी नहीं है. यह सिर्फ़ उन लोगों के लिए ज़रूरी है जिन्हें इस कोडलैब के लिए, वर्चुअल एनवायरमेंट का इस्तेमाल करना होता है (ऊपर मौजूद चेतावनी साइडबार में). अगर आपके कंप्यूटर पर सिर्फ़ Python 3 दिया गया है, तो my_env नाम का वर्चुअल एनवायरमेंट बनाने के लिए, यह निर्देश दिया जा सकता है. अगर ज़रूरत हो, तो कोई दूसरा नाम चुनें:

virtualenv my_env

हालांकि, अगर आपके पास Python 2 और हमारा सुझाव है कि आप अपने कंप्यूटर पर, Python 3 Virtualenv इंस्टॉल करें. -p flag का इस्तेमाल इस तरह से किया जा सकता है:

virtualenv -p python3 my_env

"चालू करें" विकल्प का इस्तेमाल करके, नया वर्चुअल एनवायरमेंट डालें इस तरह दिखेगा:

source my_env/bin/activate

इस एनवायरमेंट में होने की पुष्टि करने के लिए, आपके शेल प्रॉम्प्ट के आगे अब आपके एनवायरमेंट का नाम दिखेगा, जैसे कि

(my_env) $ 

अब किसी भी ज़रूरी पैकेज को pip install किया जा सकता है, इस वर्शन में कोड को एक्ज़ीक्यूट किया जा सकता है वगैरह. दूसरा फ़ायदा यह है कि अगर आपने इसमें गड़बड़ी कर दी है, तो ऐसी स्थिति में आ जाएं जिसमें आपके Python इंस्टॉलेशन में कोई गड़बड़ी हो. ऐसे में, आपके सिस्टम को नुकसान पहुंचाए बिना इस पूरे एनवायरमेंट को उड़ा दें.

4. Python के लिए, Google API की क्लाइंट लाइब्रेरी इंस्टॉल करना

इस कोडलैब के लिए, Python के लिए Google API क्लाइंट लाइब्रेरी का इस्तेमाल करना ज़रूरी है. इसलिए, या तो इसे इंस्टॉल करना आसान है या फिर आपको कुछ भी करने की ज़रूरत नहीं है.

हमने पहले सुझाव दिया था कि सुविधा के लिए, आप Cloud Shell का इस्तेमाल करें. क्लाउड पर मौजूद वेब ब्राउज़र का इस्तेमाल करके, पूरा ट्यूटोरियल पूरा किया जा सकता है. Cloud Shell का इस्तेमाल करने की एक और वजह यह है कि कई लोकप्रिय डेवलपमेंट टूल और ज़रूरी लाइब्रेरी पहले से ही पहले से इंस्टॉल होते हैं.

*क्लाइंट लाइब्रेरी इंस्टॉल करना

(ज़रूरी नहीं) अगर Cloud Shell या किसी ऐसे लोकल एनवायरमेंट का इस्तेमाल किया जा रहा है जहां क्लाइंट लाइब्रेरी पहले से इंस्टॉल हैं, तो इसे स्किप किया जा सकता है. आपको ऐसा सिर्फ़ तब करना होगा, जब ऐप्लिकेशन को स्थानीय तौर पर डेवलप किया जा रहा हो और आपने उन्हें इंस्टॉल न किया हो (या पक्का न किया हो कि आपने इंस्टॉल किया है). इंस्टॉल करने के लिए pip (या pip3) का इस्तेमाल करना सबसे आसान तरीका है (इसमें ज़रूरी होने पर pip को खुद अपडेट करना भी शामिल है):

pip install -U pip google-api-python-client oauth2client

इंस्टॉल करने की पुष्टि करें

यह निर्देश क्लाइंट लाइब्रेरी के साथ-साथ, ऐसे सभी पैकेज इंस्टॉल करता है जिन पर यह निर्भर करता है. चाहे क्लाउड शेल का इस्तेमाल किया जा रहा हो या अपने एनवायरमेंट का, पुष्टि करें कि क्लाइंट लाइब्रेरी ज़रूरी पैकेज इंपोर्ट करके इंस्टॉल की गई है या नहीं. साथ ही, पुष्टि करें कि इंपोर्ट में कोई गड़बड़ी नहीं है (न ही आउटपुट):

python3 -c "import googleapiclient, httplib2, oauth2client"

Cloud Shell से Python 2 का इस्तेमाल करने पर, आपको यह चेतावनी मिलेगी कि इसके लिए सहायता सेवा बंद कर दी गई है:

*******************************************************************************
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.
*******************************************************************************

इस इंपोर्ट "टेस्ट" को चलाने के बाद निर्देश सफलतापूर्वक दिया गया है (कोई गड़बड़ी/आउटपुट नहीं), तो आप Google API का इस्तेमाल करने के लिए तैयार हैं!

खास जानकारी

यह एक इंटरमीडिएट कोडलैब है. इसलिए, हम यह मानते हैं कि आपके पास पहले से ही करने के लिए डिज़ाइन किया गया है. अगर आपने Google API और खास तौर पर Google Workspace API का इस्तेमाल पहले नहीं किया है, तो पहले Google Workspace API का शुरुआती कोडलैब आज़माएं. इसके अलावा, अगर आपको उपयोगकर्ता खाता (न कि सेवा खाता) क्रेडेंशियल बनाने या दोबारा इस्तेमाल करने का तरीका पता है, तो client_secret.json फ़ाइल को अपनी वर्क डायरेक्ट्री में छोड़ें, अगले मॉड्यूल को छोड़ें और "Google API चालू करें" पर जाएं.

5. *एपीआई अनुरोध को अनुमति देना (उपयोगकर्ता की अनुमति)

अगर आपने उपयोगकर्ता खाते को अनुमति देने से जुड़े क्रेडेंशियल पहले से बना लिए हैं और प्रोसेस के बारे में जानकारी है, तो इस सेक्शन को छोड़ा जा सकता है. यह सेवा खाते को अनुमति देने की तकनीक से अलग है, जिसकी तकनीक अलग है, इसलिए कृपया नीचे जारी रखें.

अनुमति देने के बारे में जानकारी (साथ ही, पुष्टि करने के कुछ तरीके)

एपीआई को ऐक्सेस करने का अनुरोध करने के लिए, आपके ऐप्लिकेशन को सही अनुमति की ज़रूरत होगी. इसी तरह, पुष्टि करने की सुविधा का इस्तेमाल, लॉगिन क्रेडेंशियल के बारे में बताता है. इसका इस्तेमाल करके, Google खाते में लॉगिन करने के दौरान, अपनी पहचान की पुष्टि की जा सकती है पासवर्ड डालें. पुष्टि होने के बाद, अगला चरण यह होता है कि क्या आप—या आपका कोड को—को डेटा ऐक्सेस करने की अनुमति है. जैसे, Cloud Storage में मौजूद BLOB फ़ाइलों या Google Drive पर मौजूद उपयोगकर्ता की निजी फ़ाइलों को ऐक्सेस करने की अनुमति.

Google API में कई तरह की अनुमतियों का इस्तेमाल किया जा सकता है. हालांकि, G Suite API के उपयोगकर्ताओं के लिए सबसे ज़्यादा इस्तेमाल किया जाने वाला तरीका, उपयोगकर्ता की अनुमति है. ऐसा इसलिए, क्योंकि इस कोडलैब में मौजूद ऐप्लिकेशन, असली उपयोगकर्ताओं का डेटा ऐक्सेस करता है. उन असली उपयोगकर्ताओं को आपके ऐप्लिकेशन को अपना डेटा ऐक्सेस करने की अनुमति देनी होगी. इसका मतलब है कि आपके कोड को उपयोगकर्ता खाते के OAuth2 क्रेडेंशियल हासिल करने होंगे.

उपयोगकर्ता की अनुमति के लिए, OAuth2 क्रेडेंशियल पाने के लिए, एपीआई मैनेजर पर वापस जाएं और "क्रेडेंशियल" चुनें टैब:

635af008256d323.png

वहां पहुंचने पर, आपको अपने सभी क्रेडेंशियल तीन अलग-अलग सेक्शन में दिखेंगे:

fd2f4133b406d572.png

पहला, एपीआई पासकोड के लिए, दूसरा OAuth 2.0 क्लाइंट आईडी, और आखिरी OAuth2 सेवा खाते—हम दोनों के बीच में से एक का इस्तेमाल कर रहे हैं.

क्रेडेंशियल बनाना

क्रेडेंशियल पेज पर, सबसे ऊपर + क्रेडेंशियल बनाएं बटन पर क्लिक करें. इसके बाद, आपको एक डायलॉग दिखेगा, जिसमें आपको "OAuth क्लाइंट आईडी" चुनना होगा:

b17b663668e38787.png

अगली स्क्रीन पर, आपको दो कार्रवाइयां करनी होंगी: अपने ऐप्लिकेशन के लिए अनुमति देने वाली "सहमति वाली स्क्रीन" को कॉन्फ़िगर करना और ऐप्लिकेशन टाइप चुनें:

4e0b967c9d70d262.png

अगर आपने सहमति वाली स्क्रीन सेट नहीं की है, तो आपको कंसोल में चेतावनी दिखेगी और अब ऐसा करना होगा. (अगर सहमति वाली स्क्रीन पहले ही सेट अप हो चुकी है, तो इन चरणों को छोड़ दें.)

"सहमति वाली स्क्रीन कॉन्फ़िगर करें" पर क्लिक करें जहां आप "बाहरी उपयोगकर्ता" का विकल्प चुनते हैं ऐप्लिकेशन (या अगर आप G Suite ग्राहक हैं, तो "आंतरिक"):

f17e97b30d994b0c.png

ध्यान रखें कि इस अभ्यास के लिए, इससे कोई फ़र्क़ नहीं पड़ता कि आपने किसे चुना है, क्योंकि कोडलैब का सैंपल पब्लिश नहीं किया जा रहा है. ज़्यादातर लोग "बाहरी उपयोगकर्ता" का विकल्प चुनेंगे को और जटिल स्क्रीन पर ले जाया जा सकता है, लेकिन आपको वाकई में सिर्फ़ "ऐप्लिकेशन का नाम" फ़ील्ड:

b107ab81349bdad2.png

इस समय आपको बस एक ऐप्लिकेशन के नाम की ज़रूरत है, इसलिए कोई ऐसा व्यक्ति चुनें जो आपके द्वारा किए जा रहे कोडलैब को दर्शाता हो और फिर सेव करें क्लिक करें.

OAuth क्लाइंट आईडी बनाना (उपयोगकर्ता खाता पुष्टि)

अब OAuth2 क्लाइंट आईडी बनाने के लिए, क्रेडेंशियल टैब पर वापस जाएं. यहां आपको कई तरह के OAuth क्लाइंट आईडी दिखेंगे, जिन्हें बनाया जा सकता है:

5ddd365ac0af1e34.png

हम एक कमांड-लाइन टूल बना रहे हैं, जो अन्य है. इसलिए, इसे चुनें और बनाएं बटन पर क्लिक करें. बनाए जा रहे ऐप्लिकेशन को दिखाने वाला एक क्लाइंट आईडी नाम चुनें या बस डिफ़ॉल्ट नाम लें, जो आम तौर पर "अन्य क्लाइंट N" होता है.

आपके क्रेडेंशियल सेव किए जा रहे हैं

  1. नए क्रेडेंशियल वाला एक डायलॉग दिखेगा; बंद करने के लिए, ठीक है पर क्लिक करें

8bec84d82cb104d7.png

  1. क्रेडेंशियल पेज पर वापस जाएं और नीचे की ओर स्क्रोल करके "OAuth2 क्लाइंट आईडी" पर जाएं सेक्शन में, अपने नए बनाए गए क्लाइंट आईडी के सबसे नीचे दाईं ओर, डाउनलोड आइकॉन f54b28417901b3aa.png पर क्लिक करें. 1b4e8d248274a338.png
  2. इससे client_secret-LONG-HASH-STRING.apps.googleusercontent.com.json नाम की फ़ाइल सेव हो जाएगी और यह एक डायलॉग बॉक्स खुलेगा. यह फ़ाइल शायद आपके डाउनलोड फ़ोल्डर में सेव होगी. हमारा सुझाव है कि इसे छोटा करके client_secret.json (जिसका सैंपल ऐप्लिकेशन इस्तेमाल करता है) जैसे आसान नाम दिया जाए. इसके बाद, इसे उस डायरेक्ट्री/फ़ोल्डर में सेव करें जहां आपको इस कोडलैब में सैंपल ऐप्लिकेशन बनाना है.

खास जानकारी

अब आप इस कोडलैब में इस्तेमाल किए गए Google API को चालू करने के लिए तैयार हैं. साथ ही, OAuth के लिए सहमति वाली स्क्रीन पर ऐप्लिकेशन के नाम के लिए, हमने "Vision API डेमो" चुना है. इसलिए, आने वाले स्क्रीनशॉट में यह दिख सकता है.

6. Google API चालू करें

यह कोडलैब चार (4) Google Cloud API का इस्तेमाल करता है. इनमें से एक जोड़ा Google Cloud (Cloud Storage और Cloud Vision) और Google Workspace (Google Drive और Google Sheets) के दूसरे पेयर का इस्तेमाल करता है. Google API को चालू करने के लिए सामान्य निर्देश नीचे दिए गए हैं. जब आपको एक एपीआई को चालू करने का तरीका पता चल जाता है, तो बाकी एपीआई आपके लिए काम के होते हैं.

आप अपने ऐप्लिकेशन में चाहे जिस Google API का इस्तेमाल करना चाहते हों वह चालू होना चाहिए. कमांड-लाइन या Cloud Console पर जाकर, एपीआई चालू किए जा सकते हैं. एपीआई को चालू करने की प्रोसेस एक जैसी है. इसलिए, जब एक एपीआई चालू किया जाता है, तो दूसरे एपीआई को भी उसी तरह से चालू किया जा सकता है.

पहला विकल्प: gcloud कमांड-लाइन इंटरफ़ेस (क्लाउड शेल या लोकल एनवायरमेंट)

हालांकि, Cloud Console से एपीआई चालू करना सामान्य बात है, लेकिन कुछ डेवलपर कमांड लाइन से ही सारे काम करना पसंद करते हैं. ऐसा करने के लिए, आपको एपीआई की "सेवा का नाम" खोजना होगा. यह यूआरएल जैसा लग रहा है: SERVICE_NAME.googleapis.com. इन्हें इस्तेमाल किए जा सकने वाले प्रॉडक्ट के चार्ट में देखा जा सकता है. इसके अलावा, Google Discovery API की मदद से, प्रोग्राम बनाकर इनके लिए क्वेरी की जा सकती है.

इस जानकारी के साथ, Cloud Shell का इस्तेमाल करके (या आपका लोकल डेवलपमेंट एनवायरमेंट, जिसमें gcloud कमांड-लाइन टूल इंस्टॉल किया गया है) का इस्तेमाल करके, किसी एपीआई या सेवा को इस तरह से चालू किया जा सकता है:

gcloud services enable SERVICE_NAME.googleapis.com

पहला उदाहरण: Cloud Vision API को चालू करना

gcloud services enable vision.googleapis.com

दूसरा उदाहरण: Google App Engine का सर्वरलेस कंप्यूट प्लैटफ़ॉर्म चालू करना

gcloud services enable appengine.googleapis.com

तीसरा उदाहरण: एक अनुरोध से कई एपीआई चालू करें. उदाहरण के लिए, अगर इस कोडलैब के व्यूअर किसी ऐप्लिकेशन को Cloud Translation API से App Engine, Cloud Functions, और Cloud Run में डिप्लॉय कर रहे हैं, तो कमांड लाइन यह होगी:

gcloud services enable appengine.googleapis.com cloudfunctions.googleapis.com artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com

यह निर्देश App Engine, Cloud Functions, Cloud Run, और Cloud Translation API को चालू करता है. इसके अलावा, यह Cloud Artifact Registry को चालू कर देता है. इसकी वजह यह है कि कंटेनर इमेज को Cloud Build सिस्टम में रजिस्टर किया जाना चाहिए, ताकि उन्हें Cloud Run पर डिप्लॉय किया जा सके.

कुछ निर्देशों का पालन करके, एपीआई को चालू करने के लिए क्वेरी करें या आपके प्रोजेक्ट के लिए कौनसे एपीआई पहले से चालू हों.

चौथा उदाहरण: आपके प्रोजेक्ट को चालू करने के लिए, Google API के लिए क्वेरी उपलब्ध है

gcloud services list --available --filter="name:googleapis.com"

पांचवां उदाहरण: आपके प्रोजेक्ट के लिए चालू किए गए Google API के लिए क्वेरी

gcloud services list

ऊपर दिए गए निर्देशों के बारे में ज़्यादा जानकारी पाने के लिए, सेवाओं को चालू और बंद करने और सेवाओं की सूची बनाने से जुड़े दस्तावेज़ देखें.

दूसरा विकल्प: Cloud Console

एपीआई मैनेजर में जाकर भी, Google API को चालू किया जा सकता है. Cloud Console से, एपीआई मैनेजर पर जाएं. इस डैशबोर्ड पेज पर, आपको अपने ऐप्लिकेशन के लिए ट्रैफ़िक की कुछ जानकारी, ऐप्लिकेशन अनुरोध दिखाने वाले ग्राफ़, आपके ऐप्लिकेशन से जनरेट हुई गड़बड़ियां, और आपके ऐप्लिकेशन का जवाब देने में लगने वाला समय दिखेगा:

df4a0a5e00d29ffc.png

नीचे दिए गए चार्ट में उन Google API की सूची दी गई है जो आपके प्रोजेक्ट के लिए चालू हैं:

5fcf10e5a05cfb97.png

एपीआई चालू या बंद करने के लिए, सबसे ऊपर एपीआई और सेवाएं चालू करें पर क्लिक करें:

eef4e5e863f4db66.png

इसके अलावा, बाईं ओर नेविगेशन बार पर जाकर, एपीआई और सेवाएंलाइब्रेरी:

6eda5ba145b30b97.png

दोनों ही स्थितियों में, एपीआई लाइब्रेरी के पेज पर पहुंचा जा सकता है:

5d4f1c8e7cf8df28.png

खोजने और मिलते-जुलते नतीजे देखने के लिए कोई एपीआई नाम डालें:

35bc4b9cf72ce9a4.png

वह एपीआई चुनें जिसे आपको चालू करना है और चालू करें बटन पर क्लिक करें:

9574a69ef8d9e8d2.png

आप चाहे किसी भी Google API का इस्तेमाल करना चाहते हों, सभी एपीआई को चालू करने की प्रोसेस एक जैसी ही होती है.

लागत

कई Google API का इस्तेमाल बिना किसी शुल्क के किया जा सकता है. हालांकि, Google Cloud के ज़्यादातर प्रॉडक्ट और एपीआई का इस्तेमाल करने पर पैसे चुकाने पड़ सकते हैं. Cloud API चालू करते समय, आपसे कोई चालू बिलिंग खाता बनाने के लिए कहा जा सकता है. हालांकि, Google Cloud के कुछ प्रॉडक्ट में "हमेशा मुफ़्त" सुविधा उपलब्ध है टियर चुनें, जिसे बिलिंग शुल्क देने के लिए आपको पार करना होगा.

Google Cloud के नए उपयोगकर्ता मुफ़्त में आज़माने की ज़रूरी शर्तें पूरी करते हैं. फ़िलहाल, इस ऑफ़र के तहत 90 दिनों तक 300 डॉलर की छूट मिलेगी. आम तौर पर, कोड लैब पर ज़्यादा या कोई बिलिंग नहीं होती है. इसलिए, हमारा सुझाव है कि जब तक आप इसे आज़माने के लिए तैयार न हों, तब तक मुफ़्त में आज़माने की सुविधा को रोक दें. खास तौर पर, ऐसा इसलिए है, क्योंकि यह एक बार इस्तेमाल किया जा सकने वाला ऑफ़र है. मुफ़्त टियर का कोटा खत्म नहीं होता है और इस पर कोई असर नहीं पड़ता. भले ही, आपने मुफ़्त में आज़माने की सुविधा का इस्तेमाल किया हो या नहीं.

उपयोगकर्ताओं को एपीआई को चालू करने से पहले, किसी भी एपीआई के लिए कीमत की जानकारी देखनी चाहिए. जैसे, Cloud Vision API की कीमत पेज. खास तौर पर यह ध्यान रखना चाहिए कि क्या एपीआई का कोई फ़्री टियर है और अगर उपलब्ध है, तो वह क्या है. अगर आपने हर दिन या महीने की तय सीमा के अंदर रहकर काम किया है, तो आपसे कोई शुल्क नहीं लिया जाएगा. Google प्रॉडक्ट ग्रुप एपीआई के हिसाब से, कीमत और मुफ़्त टियर अलग-अलग होते हैं. उदाहरण:

Google के अलग-अलग प्रॉडक्ट के लिए, अलग-अलग तरीके से बिल भेजा जाता है. इसलिए, पक्का करें कि आपने उस जानकारी के लिए सही दस्तावेज़ दिए हों.

खास जानकारी

Cloud Vision को चालू कर दिया गया है, इसलिए बाकी तीन एपीआई (Google Drive, Cloud Storage, Google Sheets) को भी इसी तरह चालू करें. Cloud Shell से, gcloud services enable या Cloud Console का इस्तेमाल करें:

  1. एपीआई लाइब्रेरी पर वापस जाएं
  2. नाम के कुछ अक्षर लिखकर खोज शुरू करें
  3. अपनी ज़रूरत के हिसाब से एपीआई चुनें और
  4. चालू करें

लैदर करें, साफ़ करें, और दोहराएं. Cloud Storage के लिए कई विकल्प हैं: "Google Cloud Storage JSON API" चुनें. Cloud Storage API के लिए यह भी ज़रूरी है कि बिलिंग खाता चालू हो.

7. पहला चरण: इंपोर्ट सेट अप करना और ऑथराइज़ेशन कोड

यह मीडियम साइज़ के कोड की शुरुआत है. इसलिए, कुछ आसान तरीकों का पालन करने से यह पक्का करने में मदद मिलती है कि मुख्य ऐप्लिकेशन से पहले, सामान्य, स्थिर, और काम करने वाले इन्फ़्रास्ट्रक्चर का इस्तेमाल किया जा सके. client_secret.json की दोबारा जाँच करने की सुविधा आपकी मौजूदा डायरेक्ट्री में उपलब्ध है और ipython को चालू करें और नीचे दिया गया कोड स्निपेट डालें या इसे analyze_gsimg.py में सेव करें और शेल से चलाएं (इसके बाद वाले कोड को प्राथमिकता दी जाती है, क्योंकि हम कोड सैंपल में जोड़ना जारी रखेंगे):

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)

इस मुख्य कॉम्पोनेंट में, मॉड्यूल/पैकेज इंपोर्ट करने, उपयोगकर्ता की पुष्टि करने वाले क्रेडेंशियल प्रोसेस करने, और एपीआई सेवा एंडपॉइंट बनाने के लिए कोड ब्लॉक शामिल हैं. कोड के मुख्य हिस्से, जिनकी आपको समीक्षा करनी चाहिए:

  • print() फ़ंक्शन को इंपोर्ट करने से यह सैंपल Python 2-3 के साथ काम करता है. साथ ही, Google लाइब्रेरी से इंपोर्ट किए गए इंपोर्ट से वे सभी टूल आ जाते हैं जो Google API के साथ कम्यूनिकेट करने के लिए ज़रूरी हैं.
  • SCOPES वैरिएबल उन अनुमतियों को दिखाता है जिनका इस्तेमाल करके उपयोगकर्ता से अनुरोध किया जा सकता है. फ़िलहाल, सिर्फ़ एक वैरिएबल है: उपयोगकर्ता के Google Drive से डेटा पढ़ने की अनुमति
  • क्रेडेंशियल प्रोसेसिंग कोड का बचा हुआ हिस्सा, कैश मेमोरी में सेव किए गए OAuth2 टोकन में पढ़ा जाता है. इसके अलावा, ओरिजनल ऐक्सेस टोकन की समयसीमा खत्म होने के बाद, रीफ़्रेश टोकन के साथ नए ऐक्सेस टोकन में अपडेट किया जा सकता है.
  • अगर कोई टोकन नहीं बनाया गया है या किसी दूसरी वजह से मान्य ऐक्सेस टोकन फ़ेच नहीं किया जा सका, तो उपयोगकर्ता को OAuth2 3-लेग्ड फ़्लो (3LO) से गुज़रना होगा. इसके लिए, अनुरोध की गई अनुमतियों वाला डायलॉग बॉक्स बनाएं और उसे स्वीकार करने के लिए उपयोगकर्ता से कहें. जब वे ऐसा करते हैं, तब ऐप्लिकेशन काम करना जारी रखता है. ऐसा नहीं होने पर, tools.run_flow() अपवाद की वजह से गेम को रन करने पर रोक लगा देता है.
  • उपयोगकर्ता के अनुमति मिलने के बाद, सर्वर से संपर्क करने के लिए एक एचटीटीपी क्लाइंट बनाया जाता है. इसके बाद, सुरक्षा के लिहाज़ से सभी अनुरोधों पर उपयोगकर्ता के क्रेडेंशियल से हस्ताक्षर किया जाता है. इसके बाद, उस एचटीटीपी क्लाइंट का इस्तेमाल करके Google Drive API (वर्शन 3) के लिए एक सर्विस एंडपॉइंट बनाया जाता है. इसके बाद, DRIVE को असाइन किया जाता है.

ऐप्लिकेशन चलाना

जब आप पहली बार स्क्रिप्ट निष्पादित करते हैं, तो उसके पास डिस्क (आपकी) पर मौजूद उपयोगकर्ता फ़ाइलों तक पहुंचने का प्राधिकरण नहीं होगा. आउटपुट कुछ ऐसा दिखता है, लेकिन एक्ज़ीक्यूशन रुक गया होता है:

$ 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

अगर आप क्लाउड शेल से चला रहे हैं, तो सीधे "क्लाउड शेल से" पर जाएं सेक्शन में जाकर, "लोकल डेवलपमेंट एनवायरमेंट से" सेक्शन में दिख रही स्क्रीन पर वापस जाने के लिए स्क्रोल करें ज़रूरत पड़ने पर.

लोकल डेवलपमेंट एनवायरमेंट से

ब्राउज़र विंडो के खुलने पर कमांड-लाइन स्क्रिप्ट को रोक दिया जाता है. आपको डरावना चेतावनी वाला पेज दिख सकता है, जो कुछ ऐसा दिखता है:

149241d33871a141.png

यह एक उचित चिंता है, क्योंकि आपकी कोशिश है कि कोई ऐसा ऐप्लिकेशन चलाया जा रहा हो जो उपयोगकर्ता का डेटा ऐक्सेस करता हो. यह सिर्फ़ एक डेमो ऐप्लिकेशन है और आप इसके डेवलपर हैं. इसलिए, उम्मीद है कि आपको आगे बढ़ने के लिए खुद पर भरोसा है. इसे बेहतर ढंग से समझने के लिए, खुद को उपयोगकर्ता की जगह पर रखकर देखें: आपसे किसी दूसरे व्यक्ति के कोड को आपका डेटा ऐक्सेस करने की अनुमति देने के लिए कहा जा रहा है. अगर आप इस तरह का ऐप्लिकेशन पब्लिश करना चाहते हैं, तो आपको पुष्टि की प्रक्रिया से गुज़रना होगा. इससे आपके उपयोगकर्ताओं को यह स्क्रीन नहीं दिखेगी.

"'unsafe' पर जाएं' पर क्लिक करने के बाद ऐप" लिंक डालने पर, आपको OAuth2 अनुमतियों वाला डायलॉग बॉक्स दिखेगा. यह कुछ ऐसा दिखेगा:

a122eb7468d0d34e.png

OAuth2 फ़्लो डायलॉग, उन अनुमतियों को दिखाता है जिनका डेवलपर अनुरोध कर रहा है. यह अनुरोध SCOPES वैरिएबल की मदद से किया जाता है. इस स्थिति में, यह उपयोगकर्ता की Google डिस्क से देखने और डाउनलोड करने की क्षमता होगी. ऐप्लिकेशन कोड में, ये अनुमति के दायरे, यूआरआई के तौर पर दिखते हैं, लेकिन उनका अनुवाद उपयोगकर्ता की स्थान-भाषा के मुताबिक तय की गई भाषा में किया जाता है. यहां उपयोगकर्ता को अनुरोध की गई अनुमति(अनुमतियों) के लिए साफ़ तौर पर अनुमति देनी चाहिए. ऐसा न करने पर एक अपवाद दिया जाता है, ताकि स्क्रिप्ट आगे न बढ़ पाए.

आपको पुष्टि करने के लिए एक और डायलॉग भी मिल सकता है:

bf171080dcd6ec5.png

ध्यान दें: कुछ लोग, अलग-अलग खातों में लॉग इन किए गए एक से ज़्यादा वेब ब्राउज़र का इस्तेमाल करते हैं. इसलिए, अनुमति पाने का यह अनुरोध गलत ब्राउज़र टैब/विंडो पर जा सकता है. ऐसे में, हो सकता है कि आपको इस अनुरोध के लिंक को कट करके ऐसे ब्राउज़र में चिपकाना पड़े जिसमें आपने सही खाते से लॉग इन किया हो.

Cloud Shell से

Cloud Shell में, कोई भी ब्राउज़र विंडो पॉप-अप नहीं होती है. इससे आपका काम अटक जाता है. नीचे दिए गए डाइग्नोस्टिक्स मैसेज को समझें:

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 या अन्य बटन दबाने) होगा और अतिरिक्त फ़्लैग के साथ इसे अपने शेल से चलाना होगा. इसे इस तरह चलाने पर, आपको इसके बजाय यह आउटपुट मिलेगा:

$ 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 अभी तक नहीं बनाया गया है और) उस यूआरएल के साथ किसी दूसरे ब्राउज़र टैब में दिए गए निर्देशों का पालन करने पर, आपको करीब वैसा ही अनुभव मिलेगा जैसा स्थानीय डेवलपमेंट एनवायरमेंट के लिए ऊपर बताया गया था (ऊपर स्क्रीनशॉट देखें). आखिर में एक आखिरी स्क्रीन दिखती है, जिसमें Cloud Shell में पुष्टि करने के लिए कोड दिया जाता है:

40a567cda0f31cc9.png

इस कोड को कॉपी करके टर्मिनल विंडो में चिपकाएं.

खास जानकारी

"Authentication successful" के अलावा, किसी और आउटपुट की उम्मीद न करें. याद रखें कि यह सिर्फ़ सेटअप है... आपने अभी तक कुछ भी नहीं किया है. आपने जो किया है वह सफलता से शुरू हो गया है. पहली बार में ही, किसी ऐसी चीज़ को सही तरीके से लागू करने की संभावना बढ़ गई है. (सबसे अच्छी बात यह है कि आपको सिर्फ़ एक बार अनुमति के लिए प्रॉम्प्ट किया गया था; एक के बाद एक होने वाले सभी प्रोसेस इसे छोड़ देते हैं, क्योंकि आपकी अनुमतियां कैश मेमोरी में सेव हो जाती हैं.) अब कोड को कुछ वास्तविक आउटपुट देने के लिए तैयार करते हैं.

समस्या का हल

अगर आपको कोई आउटपुट नहीं मिलने के बजाय कोई गड़बड़ी मिलती है, तो इसकी एक या इससे ज़्यादा वजहें हो सकती हैं. जैसे:

8. पहला चरण: Google Drive से इमेज डाउनलोड करना

पिछले चरण में, हमारा सुझाव था कि आप analyze_gsimg.py के तौर पर कोड बनाएं और वहां से उसमें बदलाव करें. हम हर चीज़ को सीधे iPython या स्टैंडर्ड Python शेल में काट-छांटकर चिपका सकते हैं. हालांकि, यह एक मुश्किल काम है, क्योंकि हम हर चीज़ के हिसाब से ऐप्लिकेशन बनाना जारी रखेंगे.

मान लें कि आपके ऐप्लिकेशन को अनुमति दे दी गई है और एपीआई सेवा एंडपॉइंट बनाया गया है. आपके कोड में, इसे DRIVE वैरिएबल से दिखाया जाता है. अब आइए आपकी Google डिस्क पर एक इमेज फ़ाइल ढूंढते हैं और

इसे NAME वैरिएबल पर सेट करें. इसके साथ ही, चरण 0 में दिए गए कोड के ठीक नीचे नीचे दिया गया drive_get_img() फ़ंक्शन डालें:

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() कलेक्शन में एक list() तरीका होता है, जो बताई गई फ़ाइल के लिए क्वेरी (q पैरामीटर) करता है. fields पैरामीटर का इस्तेमाल यह बताने के लिए किया जाता है कि आपको कौनसी रिटर्न वैल्यू चाहिए? अगर आपको अन्य वैल्यू की परवाह नहीं है, तो सब कुछ वापस पाने और चीज़ों को धीमा करने की परेशानी क्यों है? अगर एपीआई की रिटर्न वैल्यू को फ़िल्टर करने के लिए, फ़ील्ड मास्क आपके लिए नए हैं, तो यह ब्लॉग पोस्ट देखें और वीडियो होना चाहिए. अगर ऐसा नहीं है, तो क्वेरी चलाएं और दिए गए files एट्रिब्यूट को हासिल करें. कोई भी मैच न होने पर, सूची की खाली कैटगरी के तौर पर सेट होती है.

अगर कोई नतीजा नहीं मिलता है, तो बाकी फ़ंक्शन को स्किप कर दिया जाता है और None दिखता है. हालांकि, इसमें कोई अंतर नहीं है. अगर ऐसा नहीं है, तो मेल खाने वाला पहला रिस्पॉन्स (rsp[0]) पाएं, फ़ाइल का नाम, उसका MIMEtype, आखिरी बदलाव का टाइमस्टैंप, और आखिर में, get_media() फ़ंक्शन (अपनी फ़ाइल आईडी के ज़रिए) से मिले बाइनरी पेलोड को files() कलेक्शन में भी दिखाएं. (अन्य भाषा की क्लाइंट लाइब्रेरी से, तरीकों के नाम अलग-अलग हो सकते हैं.)

आखिरी हिस्सा "मुख्य" पूरे ऐप्लिकेशन को चलाने वाली बॉडी:

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 पर section-work-card-img_2x.jpg नाम की इमेज है और उसे FILE पर सेट किया गया है. इसके बाद, स्क्रिप्ट को एक्ज़ीक्यूट करने के बाद आपको आउटपुट की पुष्टि करनी होगी. इस इमेज में Drive पर मौजूद इस फ़ाइल को पढ़ा जा सकता है, लेकिन यह आपके कंप्यूटर पर सेव नहीं होगा:

$ python3 analyze_gsimg.py
Downloaded 'section-work-card-img_2x.jpg' (image/jpeg, 2020-02-27T09:27:22.095Z, size: 27781)

समस्या का हल

अगर आपको ऊपर दिए गए निर्देशों के मुताबिक सही नतीजे नहीं मिल पा रहे हैं, तो इसकी एक या इससे ज़्यादा वजहें हो सकती हैं. जैसे:

खास जानकारी

इस सेक्शन में, आपको दो अलग-अलग एपीआई कॉल में Drive API से कनेक्ट करने और उसे डाउनलोड करने का तरीका बताया गया था. कारोबार के इस्तेमाल का उदाहरण: अपने Drive में मौजूद डेटा को संग्रहित करें और उसका विश्लेषण करें. जैसे, Google Cloud के टूल की मदद से डेटा का विश्लेषण करें. इस चरण में आपके ऐप्लिकेशन का कोड, रेपोstep1-drive/analyze_gsimg.py में मौजूद कोड से मेल खाना चाहिए.

Google डिस्क पर फ़ाइलें डाउनलोड करने के बारे में यहां से ज़्यादा पढ़ें या यह ब्लॉग पोस्ट और वीडियो होना चाहिए. कोडलैब का यह हिस्सा, Google Workspace एपीआई कोडलैब के बारे में पूरी जानकारी की तरह ही है—फ़ाइल डाउनलोड करने के बजाय, यह उपयोगकर्ता के Google Drive पर शुरुआती 100 फ़ाइलें/फ़ोल्डर दिखाता है और ज़्यादा पाबंदियों वाले दायरे का इस्तेमाल करता है.

9. दूसरा चरण: फ़ाइल को Cloud Storage में संग्रहित करना

अगला चरण है, Google Cloud Storage के लिए सहायता जोड़ना. इसके लिए हमें एक और Python पैकेज, io इंपोर्ट करना होगा. पक्का करें कि आपके इंपोर्ट का टॉप सेक्शन अब कुछ ऐसा दिखता हो:

from __future__ import print_function                   
import io

Drive के फ़ाइल नाम के अलावा, हमें इस बारे में भी कुछ जानकारी चाहिए कि इस फ़ाइल को Cloud Storage में कहां सेव करना है, खास तौर पर "बकेट" के नाम के बारे में आप उसे किसी "पैरंट फ़ोल्डर" में डाल देंगे प्रीफ़िक्स हैं. इस बारे में थोड़ी देर में ज़्यादा जानकारी:

FILE = 'YOUR_IMG_ON_DRIVE'
BUCKET = 'YOUR_BUCKET_NAME'
PARENT = ''     # YOUR IMG FILE PREFIX                  

बकेट के बारे में जानकारी: Cloud Storage, ढंके हुए BLOB स्टोरेज की सुविधा देता है. फ़ाइलों को वहां अपलोड करने पर, वह फ़ाइल प्रकार, एक्सटेंशन वगैरह के सिद्धांत को नहीं समझता, जैसे Google Drive को होता है. वे बस "ब्लॉब" हैं Cloud Storage में ले जाते हैं. इसके अलावा, Cloud Storage में फ़ोल्डर या सबडायरेक्ट्री का कोई कॉन्सेप्ट नहीं है.

हां, एक से ज़्यादा सब-फ़ोल्डर के ऐब्स्ट्रैक्ट को दिखाने के लिए, फ़ाइल नामों में स्लैश (/) का इस्तेमाल किया जा सकता है. हालांकि, दिन के आखिर में, आपके सभी ब्लॉब एक बकेट में चले जाते हैं और "/" उनके फ़ाइल नामों में मौजूद सिर्फ़ वर्ण होते हैं. ज़्यादा जानकारी के लिए, बकेट और ऑब्जेक्ट का नाम रखने से जुड़े कन्वेंशन पेज पर जाएं.

ऊपर बताए गए पहले चरण में, Drive के रीड-ओनली ऐक्सेस का अनुरोध किया गया था. फ़िलहाल, आपको सिर्फ़ इतना ही करना है. अब, Cloud Storage में अपलोड (पढ़ें-लिखें) अनुमति ज़रूरी है. SCOPES को सिंगल स्ट्रिंग वैरिएबल से अनुमति के स्कोप के अरे (Python टपल [या सूची]) में बदलें, ताकि यह कुछ ऐसा दिखे:

SCOPES = (
    'https://www.googleapis.com/auth/drive.readonly',
    'https://www.googleapis.com/auth/devstorage.full_control',
)                  

अब Drive के ठीक नीचे, Cloud Storage के लिए सेवा एंडपॉइंट बनाएं. ध्यान दें कि हमने एक जैसे एचटीटीपी क्लाइंट ऑब्जेक्ट को फिर से इस्तेमाल करने के लिए, कॉल में थोड़ा बदलाव किया है. ऐसा इसलिए, क्योंकि जब उसे शेयर किया जा सकता है, तब नया अनुरोध करने की ज़रूरत नहीं है.

# create API service endpoints
HTTP = creds.authorize(Http())
DRIVE  = discovery.build('drive',   'v3', http=HTTP)
GCS    = discovery.build('storage', 'v1', http=HTTP)                  

अब यह फ़ंक्शन जोड़ें (drive_get_img() के बाद), जो Cloud Storage में अपलोड होता है:

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() कॉल के लिए बकेट का नाम, फ़ाइल का मेटाडेटा, और बाइनरी ब्लॉब की ज़रूरत होती है. रिटर्न वैल्यू को फ़िल्टर करने के लिए, fields वैरिएबल, एपीआई से लौटाए गए सिर्फ़ बकेट और ऑब्जेक्ट के नामों का अनुरोध करता है. एपीआई पढ़ने के अनुरोधों पर इन फ़ील्ड मास्क के बारे में ज़्यादा जानने के लिए, यह पोस्ट और वीडियो होना चाहिए.

अब gcs_blob_upload() के इस्तेमाल को मुख्य ऐप्लिकेशन में इंटिग्रेट करें:

        # 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 वैरिएबल, किसी भी "पैरंट सबडायरेक्ट्री" को मर्ज करता है नाम के साथ फ़ाइल नाम भी जुड़ा होता है और जब बकेट के नाम के साथ आगे जोड़ा जाता है, तो यह इंप्रेशन मान लेता है कि आप "/bucket/parent.../filename" पर फ़ाइल को संग्रहित कर रहे हैं. पहले print() फ़ंक्शन के ठीक बाद else क्लॉज़ के ठीक बाद इस हिस्से को स्लाइड करें, ताकि पूरा "main" ऐसा दिखता है:

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)

मान लें कि हम "vision-demo" नाम की बकेट तय करते हैं "analyzed_imgs" के साथ को "पैरंट सबडायरेक्ट्री" के तौर पर डालें. उन वैरिएबल को सेट करने और स्क्रिप्ट को फिर से चलाने के बाद, section-work-card-img_2x.jpg को Drive से डाउनलोड करके Cloud Storage में अपलोड कर दिया जाएगा, है न? नहीं!

$ 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">

ध्यान से देखें कि Drive डाउनलोड हो गया, लेकिन Cloud Storage में अपलोड नहीं हो सका. क्यों?

इसकी वजह यह है कि जब हमने इस ऐप्लिकेशन को पहले चरण के लिए अनुमति दी थी, तब हमने Google Drive को सिर्फ़ रीड-ओनली ऐक्सेस दिया था. हमने Cloud Storage के लिए पढ़ने-लिखने का दायरा जोड़ा है, लेकिन हमने उपयोगकर्ता को इस ऐक्सेस की अनुमति देने के लिए कभी नहीं कहा. इससे काम करने के लिए, हमें उस storage.json फ़ाइल को हटाना होगा जिसमें यह दायरा मौजूद नहीं है और उसे फिर से चलाएं.

फिर से अनुमति देने के बाद, storage.json में जाकर इसकी पुष्टि करें और वहां दोनों स्कोप देखें. इसके बाद, आपका आउटपुट उम्मीद के मुताबिक होगा:

$ 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'

खास जानकारी

यह एक बहुत बड़ी बात है, जो आपको कोड की कम लाइनों में दिखाती है कि क्लाउड-आधारित दोनों स्टोरेज सिस्टम के बीच फ़ाइलें कैसे ट्रांसफ़र की जाती हैं. यहां अपना कारोबारी मामला यह जानने के लिए आया है कि कैसे "कम" स्थिति में काम करने वाले किसी सीमित संसाधन का इस्तेमाल जैसा कि पहले बताया गया है, सस्ता स्टोरेज. Cloud Storage में स्टोरेज की अलग-अलग क्लास मिलती हैं. यह इस बात पर निर्भर करता है कि आपने डेटा को नियमित, महीने, तिमाही या साल में एक बार ऐक्सेस किया है.

बेशक, डेवलपर हमसे समय-समय पर यह पूछते हैं कि Google Drive और Cloud Storage, दोनों का इस्तेमाल क्यों किया जा रहा है. ऐसा इसलिए, क्योंकि क्या वे दोनों फ़ाइल स्टोरेज, क्लाउड में सेव नहीं होते? इसलिए, हमने यह वीडियो बनाया है. इस चरण में आपका कोड, रेपोstep2-gcs/analyze_gsimg.py में मौजूद कोड से मेल खाना चाहिए.

10. तीसरा चरण: Cloud Vision की मदद से विश्लेषण करना

हमें पता है कि डेटा को Google Cloud और Google Workspace के बीच ट्रांसफ़र किया जा सकता है. हालांकि, हमने अभी तक इसका विश्लेषण नहीं किया है. इसलिए, अब समय आ गया है कि लेबल एनोटेशन यानी ऑब्जेक्ट की पहचान करने के लिए, इमेज को Cloud Vision को भेजा जा सके. ऐसा करने के लिए, हमें डेटा को Base64-एन्कोड करना होगा, जिसका मतलब है कि एक और Python मॉड्यूल, base64. पक्का करें कि आपका टॉप इंपोर्ट सेक्शन अब कुछ ऐसा दिखता हो:

from __future__ import print_function
import base64
import io

डिफ़ॉल्ट रूप से, Vision API मिलने वाले सभी लेबल दिखाता है. चीज़ों को एक जैसा बनाए रखने के लिए, चलिए सबसे ऊपर के पांच के लिए अनुरोध करते हैं (जिसमें उपयोगकर्ता की ओर से बदलाव किया जा सकता है). इसके लिए, हम कॉन्स्टेंट वैरिएबल TOP का इस्तेमाल करेंगे; इसे अन्य सभी स्थिरांक के साथ जोड़ दें:

FILE = 'YOUR_IMG_ON_DRIVE'
BUCKET = 'YOUR_BUCKET_NAME'
PARENT = ''   # YOUR IMG FILE PREFIX 
TOP = 5       # TOP # of VISION LABELS TO SAVE                 

पहले के चरणों की तरह ही, हमें Vision API के लिए एक और अनुमति की ज़रूरत है. SCOPES को इसकी स्ट्रिंग से अपडेट करें:

SCOPES = (
    'https://www.googleapis.com/auth/drive.readonly',
    'https://www.googleapis.com/auth/devstorage.full_control',
    'https://www.googleapis.com/auth/cloud-vision',
)                  

अब Cloud Vision के लिए सेवा एंडपॉइंट बनाएं, ताकि यह इस तरह की अन्य सेवाओं के साथ लाइन अप हो जाए:

# 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)

अब यह फ़ंक्शन जोड़ें जो इमेज पेलोड को Cloud Vision में भेजता है:

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() कॉल के लिए, डेटा और एपीआई की ज़रूरी सुविधाओं की ज़रूरत होती है. पांच लेबल की ऊपरी सीमा भी पेलोड का हिस्सा है. हालांकि, यह ज़रूरी नहीं है. अगर कॉल पूरा होता है, तो पेलोड ऑब्जेक्ट के पांच सबसे ऊपर के लेबल दिखाता है. साथ ही, इमेज में ऑब्जेक्ट के बारे में कॉन्फ़िडेंस स्कोर भी दिखाता है. (अगर कोई जवाब वापस नहीं आता है, तो एक खाली Python डिक्शनरी असाइन करें, ताकि नीचे दिया गया if स्टेटमेंट पूरा न हो.) यह फ़ंक्शन, हमारी रिपोर्ट में उस डेटा को CSV स्ट्रिंग में बांटता है, ताकि उस डेटा का इस्तेमाल कभी भी किया जा सके.

vision_label_img() को कॉल करने वाली ये पांच लाइनें, Cloud Storage में अपलोड होने के तुरंत बाद डाली जानी चाहिए:

            # 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)

इसके साथ, पूरा मुख्य ड्राइवर कुछ ऐसा दिखना चाहिए:

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)

दायरों को रीफ़्रेश करने और अपडेट किए गए ऐप्लिकेशन को फिर से चलाने के लिए, storage.json को मिटाने पर, नीचे दिए गए आउटपुट जैसा आउटपुट मिलेगा. इसमें Cloud विज़न विश्लेषण शामिल है:

$ 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

खास जानकारी

सभी लोगों के पास अपने डेटा का विश्लेषण करने के लिए, अपने एमएल मॉडल बनाने और उन्हें ट्रेनिंग देने की मशीन लर्निंग विशेषज्ञता नहीं होती. Google Cloud की टीम ने Google के, पहले से ट्रेन किए गए कुछ मॉडल को सामान्य इस्तेमाल के लिए उपलब्ध कराया है. साथ ही, उन्हें एपीआई की मदद से, सभी के लिए एआई और सभी के लिए मशीन लर्निंग का इस्तेमाल करें.

अगर आप डेवलपर हैं और एपीआई को कॉल कर सकते हैं, तो मशीन लर्निंग का इस्तेमाल कर सकते हैं. Cloud Vision, उन एपीआई सेवाओं में से एक है जिनका इस्तेमाल करके, अपने डेटा का विश्लेषण किया जा सकता है. अन्य सुविधाओं के बारे में यहां जानें. अब आपका कोड, रेपोstep3-vision/analyze_gsimg.py में मौजूद कोड से मेल खाना चाहिए.

11. चौथा चरण: Google Sheets का इस्तेमाल करके रिपोर्ट जनरेट करना

यहां तक पहुंचने पर, कॉर्पोरेट डेटा को संग्रहित किया जा सकता है और उसका विश्लेषण किया जा सकता है. हालांकि, इसमें सिर्फ़ कॉन्टेंट की खास जानकारी की कमी है. आइए, सभी नतीजों को एक ही रिपोर्ट में व्यवस्थित करते हैं, जिसे आप अपने बॉस को दे सकते हैं. मैनेजमेंट के लिए स्प्रेडशीट से बेहतर क्या हो सकता है?

Google Sheets API का इस्तेमाल करने के लिए, किसी दूसरी जानकारी को इंपोर्ट करने की ज़रूरत नहीं है. इसके लिए, पहले से फ़ॉर्मैट की गई किसी मौजूदा स्प्रेडशीट का फ़ाइल आईडी चाहिए, जो डेटा की नई लाइन का इंतज़ार कर रहा है. इसलिए, SHEET कॉन्सटेंट है. हम आपको एक नई स्प्रेडशीट बनाने का सुझाव देते हैं, जो नीचे दी गई स्प्रेडशीट से मिलती-जुलती है:

4def78583d05300.png

उस स्प्रेडशीट का यूआरएल इस तरह दिखेगा: https://docs.google.com/spreadsheets/d/FILE_ID/edit. उस FILE_ID को पकड़ें और उसे SHEET को स्टिंग के रूप में असाइन करें.

हमने k_ize() नाम का एक छोटा सा फ़ंक्शन भी शामिल किया है जो बाइट को किलोबाइट में बदल देता है. इसकी वजह यह है कि इसे Python lambda कहा जाता है, क्योंकि यह एक सामान्य 1-लाइनर है. अन्य कॉन्सटेंट के साथ जुड़े ये दोनों एट्रिब्यूट कुछ इस तरह दिखते हैं:

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                 

पहले के चरणों की तरह ही, हमें अनुमति के एक और दायरे की ज़रूरत होगी. इस बार Sheets API के लिए, पढ़ने के लिए लिखें. SCOPES के पास अब चारों ज़रूरी सुविधाएं उपलब्ध हैं:

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',
)                  

अब दूसरों के पास, Google Sheets में सेवा एंडपॉइंट बनाएं, ताकि यह इस तरह दिखे:

# 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() की सुविधा आसान है: डेटा की एक पंक्ति और शीट का आईडी लें. इसके बाद, उस पंक्ति को उस शीट में जोड़ें:

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() कॉल के लिए शीट का फ़ाइल आईडी, सेल की रेंज, डेटा डालने का तरीका, और डेटा की ज़रूरत होती है. फ़ाइल का आईडी आसान है और सेल की रेंज A1 नोटेशन में दी गई है. "Sheet1" की रेंज पूरी शीट का मतलब है. यह शीट में मौजूद सारे डेटा के बाद लाइन जोड़ने के लिए, एपीआई को सिग्नल भेजता है. डेटा को शीट में कैसे जोड़ा जाना चाहिए, "RAW" के लिए दो विकल्प दिए गए हैं (स्ट्रिंग के डेटा का हूबहू डालें) या "USER_ENTERED" (डेटा को ऐसे लिखें, जैसे किसी उपयोगकर्ता ने उसे Google Sheets ऐप्लिकेशन से अपने कीबोर्ड पर डाला हो. साथ ही, सेल फ़ॉर्मैटिंग की सभी सुविधाएं बनी रहें).

अगर कॉल पूरा हो जाता है, तो रिटर्न वैल्यू में कोई खास काम की जानकारी नहीं होती. इसलिए, हमने एपीआई अनुरोध के ज़रिए सेल की अपडेट की गई संख्या पाने का विकल्प चुना है. नीचे वह कोड दिया गया है जो फ़ंक्शन को कॉल करता है:

                # 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 शीट में डेटा को दिखाने वाले कॉलम होते हैं. जैसे, किसी पैरंट "सबडायरेक्ट्री" Cloud Storage में मौजूद, संग्रहित की गई फ़ाइल की जगह (बकेट + फ़ाइल नाम), फ़ाइल का MIMEटाइप, फ़ाइल का साइज़ (मूल रूप से बाइट में, लेकिन k_ize() के साथ किलोबाइट में बदला गया), और Cloud Vision लेबल स्ट्रिंग. यह भी ध्यान रखें कि संग्रहित की गई जगह की जानकारी एक हाइपरलिंक है, ताकि आपका मैनेजर उस पर क्लिक करके पुष्टि कर सके कि उसका सुरक्षित तरीके से बैक अप ले लिया गया है.

Cloud Vision से मिलने वाले नतीजों को दिखाने के ठीक बाद, ऊपर कोड का एक ब्लॉक जोड़ना

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 को एक बार मिटाने और अपडेट किए गए ऐप्लिकेशन को फिर से चलाने पर, नीचे दिए गए आउटपुट जैसा आउटपुट मिलेगा. इसमें Cloud विज़न विश्लेषण शामिल है:

$ 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

आउटपुट की अतिरिक्त लाइन, अपडेट की गई Google शीट पर एक नज़र डालकर बेहतर तरीके से विज़ुअलाइज़ की जाती है. इसके लिए, नीचे दिए गए उदाहरण में दी गई आखिरी लाइन को, पहले से जोड़े गए मौजूदा डेटा सेट में जोड़ा गया है:

b53a5bc944734652.png

खास जानकारी

इस ट्यूटोरियल के पहले तीन चरणों में, आपने डेटा को ट्रांसफ़र करने और उसका विश्लेषण करने के लिए, Google Workspace और Google Cloud API को कनेक्ट किया है. इससे पता चलता है कि यह 80% काम है. हालांकि, अगर आप अपना पूरा काम मैनेज करने के लिए शेयर नहीं कर सकते, तो इनमें से कोई भी तरीका काम नहीं करेगा. नतीजों को बेहतर तरीके से विज़ुअलाइज़ करने के लिए, जनरेट की गई रिपोर्ट में सभी नतीजों की खास जानकारी देने से काफ़ी मदद मिलती है.

विश्लेषण को ज़्यादा उपयोगी बनाने के लिए, नतीजों को स्प्रेडशीट में लिखने के अलावा, एक और सुधार किया जा सकता है. हर इमेज के लिए इन टॉप 5 लेबल को इंडेक्स किया जा सकता है. इससे एक ऐसा इंटरनल डेटाबेस बनाया जा सकता है जिसके तहत, अनुमति पा चुके कर्मचारियों को, खोज टीम से इमेज के बारे में क्वेरी करने की सुविधा मिलती हो. हालांकि, हम इसे पढ़ने वालों के लिए काम के तौर पर रखते हैं.

फ़िलहाल, हमारे नतीजे 'शीट' में हैं और इन्हें मैनेज किया जा सकता है. इस चरण में आपके ऐप्लिकेशन का कोड, रेपोstep4-sheets/analyze_gsimg.py में मौजूद कोड से मेल खाना चाहिए. आखिरी कदम है कोड को हटाना और उसे इस्तेमाल करने लायक स्क्रिप्ट में बदलना.

12. *आखिरी चरण: रीफ़ैक्टर

(वैकल्पिक) एक चालू ऐप्लिकेशन होना अच्छा है, हालांकि, क्या हम इसे बेहतर बना सकते हैं? हां, खास तौर पर मुख्य ऐप्लिकेशन, जो किसी गड़बड़ी की तरह लगता है. आइए, इसे इसके अपने फ़ंक्शन में रखें. साथ ही, इसे तय कॉन्सटेंट के बजाय, उपयोगकर्ता के इनपुट के लिए चलाएं. हम ऐसा argparse मॉड्यूल की मदद से करेंगे. इसके अलावा, जब हम डेटा की लाइन में डेटा जोड़ दें, तब शीट को दिखाने के लिए वेब ब्राउज़र टैब को लॉन्च करते हैं. webbrowser मॉड्यूल की मदद से ऐसा किया जा सकता है. इन इंपोर्ट को दूसरे लोगों के साथ बुनें, ताकि सबसे ज़्यादा इंपोर्ट होने वाला डेटा इस तरह दिखे:

from __future__ import print_function
import argparse
import base64
import io
import webbrowser

अन्य ऐप्लिकेशन में इस कोड का इस्तेमाल करने के लिए, हमें आउटपुट को छिपाने की सुविधा चाहिए. इसलिए, अब हम DEBUG फ़्लैग जोड़ते हैं. ऐसा करने के लिए, इस लाइन को सबसे ऊपर मौजूद कॉन्सटेंट सेक्शन के आखिर में जोड़ें:

DEBUG = False

अब मुख्य शरीर के बारे में बात करते हैं. जब हम यह नमूना बना रहे थे, तो आपको यह "असहज" लगने लगा होगा क्योंकि हमारा कोड हर सेवा के साथ नेस्टिंग का एक और लेवल जोड़ता है. अगर आपको ऐसा लगता है, तो आप अकेले नहीं हैं, क्योंकि इससे Google के इस टेस्टिंग ब्लॉग पोस्ट में कोड की जटिलता बढ़ जाती है.

इस सबसे सही तरीके को ध्यान में रखते हुए, अब ऐप्लिकेशन के मुख्य हिस्से को फ़ंक्शन में और return को हर "ब्रेक पॉइंट" पर फिर से व्यवस्थित करें नेस्ट करने के बजाय (अगर कोई चरण पूरा नहीं होता है, तो None और सभी पूरा होने पर True दिखाया जाएगा):

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

यह ज़्यादा साफ़-सुथरा और बार-बार दिखने वाला if-else चेन का एहसास दिलाता है. साथ ही, इससे कोड की मुश्किलें भी कम होती है, जैसा कि ऊपर बताया गया है. पहेली का आखिरी हिस्सा है "असली" बनाना मुख्य ड्राइवर, उपयोगकर्ता को पसंद के मुताबिक बनाने और आउटपुट को कम से कम करने की अनुमति देना (जब तक कि ज़रूरत न हो):

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)

अगर सभी चरण पूरे हो जाते हैं, तो स्क्रिप्ट वेब ब्राउज़र को उस स्प्रेडशीट पर लॉन्च करती है जिसमें नई डेटा पंक्ति जोड़ी गई थी.

खास जानकारी

स्कोप में कोई बदलाव नहीं हुआ, इसलिए storage.json को मिटाने की ज़रूरत नहीं है. अपडेट किए गए ऐप्लिकेशन को फिर से चलाने से पता चलता है कि बदली गई शीट में एक नई ब्राउज़र विंडो खुली हुई है. साथ ही, आउटपुट की कम लाइनें, और -h विकल्प जारी करने पर उपयोगकर्ताओं को उनके विकल्प दिखते हैं. इनमें -v भी शामिल है, ताकि पहले देखी गई आउटपुट की अभी बंद की गई लाइनों को पहले जैसा किया जा सके:

$ 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

अन्य विकल्पों की मदद से उपयोगकर्ता, Drive की फ़ाइलों के अलग-अलग नाम चुन सकते हैं. जैसे- Cloud Storage की "सबडायरेक्ट्री" और बकेट के नाम, सबसे ऊपर "N" और स्प्रेडशीट (Sheets) के फ़ाइल आईडी से भी नतीजे मिलते हैं. इन आखिरी अपडेट के बाद, अब आपके कोड का आखिरी वर्शन, रेपो में जानकारीfinal/analyze_gsimg.py के साथ-साथ यहां दिए गए कोड से मेल खाना चाहिए:

'''
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)

हम इस ट्यूटोरियल के कॉन्टेंट को अप-टू-डेट रखने की पूरी कोशिश करेंगे. हालांकि, कुछ मामलों में कोड का सबसे नया वर्शन भी होगा.

13. बधाई हो!

इस कोडलैब में वाकई बहुत कुछ सीखना था और आपने उसे पूरा कर लिया. साथ ही, आपने लंबे कोडलैब में से एक का इस्तेमाल किया. इस वजह से, आपने Python की करीब 130 लाइनों वाली एक संभावित एंटरप्राइज़ स्थिति का सामना किया. साथ ही, Google Cloud और Google Workspace का पूरा फ़ायदा लिया और इन दोनों के बीच डेटा ट्रांसफ़र किया, ताकि एक बेहतर समाधान बनाया जा सके. इस ऐप्लिकेशन के सभी वर्शन के लिए, ओपन सोर्स रेपो को एक्सप्लोर करें. ज़्यादा जानकारी नीचे दी गई है.

व्यवस्थित करें

  1. Google Cloud API का इस्तेमाल मुफ़्त नहीं है. हालांकि, Google Workspace API के लिए, आपको हर महीने लगने वाला Google Workspace सदस्यता शुल्क (उपभोक्ता Gmail उपयोगकर्ताओं का हर महीने का शुल्क शून्य) लगता है. इसलिए, Google Workspace के उपयोगकर्ताओं को एपीआई की सेवा हटाने या उसे बंद करने की ज़रूरत नहीं है. Google Cloud के लिए, Cloud Console के डैशबोर्ड पर जाकर बिलिंग "कार्ड" देखें देखें.
  2. Cloud Vision के लिए, आपको हर महीने एक तय संख्या तक एपीआई कॉल मुफ़्त में करने की अनुमति है. इसलिए, जब तक इन सीमाओं के अंदर रहकर काम किया जाएगा, तब तक आपको अपने प्रोजेक्ट को बंद नहीं करना होगा और न ही उसे बंद करना होगा या मिटाना होगा. Vision API की बिलिंग और मुफ़्त कोटा के बारे में ज़्यादा जानकारी, इसके कीमत तय करने वाले पेज पर मिल सकती है.
  3. Cloud Storage के कुछ उपयोगकर्ताओं को हर महीने, बिना किसी शुल्क के मिलने वाला स्टोरेज मिलता है. अगर इस कोडलैब का इस्तेमाल करके संग्रहित की गई इमेज की वजह से, कोटा पार नहीं होता है, तो आपको कोई शुल्क नहीं देना होगा. GCS की बिलिंग और मुफ़्त कोटा के बारे में ज़्यादा जानकारी, इसके कीमत पेज पर मिल सकती है. Cloud Storage ब्राउज़र से ब्लॉब को देखा और आसानी से मिटाया जा सकता है.
  4. Google Drive के आपके इस्तेमाल में भी स्टोरेज कोटा हो सकता है. अगर आपने इससे ज़्यादा स्टोरेज इस्तेमाल किया है या आप स्टोरेज के करीब हैं, तो इस कोडलैब में बनाए गए टूल का इस्तेमाल करके, उन इमेज को Cloud Storage में संग्रहित किया जा सकता है. इससे आपको Drive में ज़्यादा जगह मिलेगी. Google Drive के स्टोरेज के बारे में ज़्यादा जानने के लिए, Google Workspace बेसिक के उपयोगकर्ताओं या Gmail/उपभोक्ता के लिए, सही कीमत वाले पेज पर जाएं.

Google Workspace Business और Enterprise के ज़्यादातर प्लान में अनलिमिटेड स्टोरेज मिलता है. हालांकि, इस वजह से Drive में मौजूद फ़ोल्डर अव्यवस्थित और/या बहुत ज़्यादा काम के हो सकते हैं. इस ट्यूटोरियल में बनाया गया ऐप्लिकेशन, ग़ैर-ज़रूरी फ़ाइलों को संग्रहित करने और Google Drive में स्टोरेज खाली करने का एक बेहतरीन तरीका है.

वैकल्पिक वर्शन

हालांकि, final/analyze_gsimg.py "आखिरी" है यहां काम किया जा रहा है. यह कहानी यहीं खत्म नहीं हुई है. इस ऐप्लिकेशन के आखिरी वर्शन में एक समस्या यह भी है कि इसमें पुष्टि करने की उन पुरानी लाइब्रेरी का इस्तेमाल किया जाता है जो अब काम नहीं करतीं. हमने यह पाथ इसलिए चुना है, क्योंकि यह लिखने के समय, पुष्टि करने की नई लाइब्रेरी में कई मुख्य एलिमेंट काम नहीं करते थे: OAuth टोकन स्टोरेज मैनेजमेंट और थ्रेड की सुरक्षा.

पुष्टि करने वाली मौजूदा (नई) लाइब्रेरी

हालांकि, कुछ समय पर, पुरानी पुष्टि करने की लाइब्रेरी काम नहीं करेंगी. इसलिए, हमारी सलाह है कि आप ऐसे वर्शन की समीक्षा करें जो रेपो के alt फ़ोल्डर में, नई (मौजूदा) पुष्टि करने वाली लाइब्रेरी का इस्तेमाल करते हैं. भले ही, वे थ्रेडसुरक्षित न हों. हालांकि, आप अपना खुद का समाधान बना सकते हैं. वे फ़ाइलें ढूंढें जिनके नाम में *newauth* है.

Google Cloud प्रॉडक्ट की क्लाइंट लाइब्रेरी

Google Cloud, सभी डेवलपर को Google Cloud API का इस्तेमाल करते समय प्रॉडक्ट क्लाइंट लाइब्रेरी का इस्तेमाल करने का सुझाव देता है. माफ़ करें, फ़िलहाल Google Cloud API से बाहर के एपीआई में ऐसी लाइब्रेरी मौजूद नहीं हैं. निचले लेवल की लाइब्रेरी का इस्तेमाल करने से, एपीआई का लगातार इस्तेमाल होता है और सुविधाएं बेहतर तरीके से पढ़ी जा सकती हैं. ऊपर दिए गए सुझाव की तरह ही, Google Cloud प्रॉडक्ट की क्लाइंट लाइब्रेरी का इस्तेमाल करने वाले अन्य वर्शन, रेपो के alt फ़ोल्डर में उपलब्ध हैं, ताकि आप उनकी समीक्षा कर सकें. वे फ़ाइलें ढूंढें जिनके नाम में *-gcp* है.

सेवा खाते की अनुमति देना

पूरी तरह से क्लाउड पर काम करते समय, आम तौर पर न तो इंसान और न ही उपयोगकर्ता के मालिकाना हक वाला डेटा होता है. इसलिए, सेवा खातों और सेवा खाते की अनुमति का इस्तेमाल मुख्य रूप से Google Cloud के साथ किया जाता है. आम तौर पर, Google Workspace दस्तावेज़ों के मालिक (मानवीय) होते हैं. इसलिए, इस ट्यूटोरियल में, उपयोगकर्ता खाते की अनुमति का इस्तेमाल किया जाता है. इसका मतलब यह नहीं है कि सेवा खातों से Google Workspace API का इस्तेमाल नहीं किया जा सकता. जब तक उन खातों के पास उचित ऐक्सेस लेवल है, तब तक उनका इस्तेमाल ऐप्लिकेशन में ज़रूर किया जा सकता है. ऊपर दी गई जानकारी की तरह ही, सेवा खाते की अनुमति का इस्तेमाल करने वाले अन्य वर्शन, रेपो के alt फ़ोल्डर में उपलब्ध हैं, ताकि आप उनकी समीक्षा कर सकें. वे फ़ाइलें ढूंढें जिनके नाम में *-svc* है.

अन्य वर्शन का कैटलॉग

नीचे, आपको final/analyze_gsimg.py के सभी वैकल्पिक वर्शन मिलेंगे. हर वर्शन में, ऊपर दी गई एक या एक से ज़्यादा प्रॉपर्टी होंगी. हर वर्शन के फ़ाइल नाम में, इन्हें देखें:

  • "oldauth" पुरानी पुष्टि करने की लाइब्रेरी (final/analyze_gsimg.py के अलावा) का इस्तेमाल करने वाले वर्शन के लिए
  • "newauth" जिनके लिए, मौजूदा/नई पुष्टि करने वाली लाइब्रेरी का इस्तेमाल किया जा रहा है
  • "gcp" जो Google Cloud प्रॉडक्ट की क्लाइंट लाइब्रेरी, जैसे कि google-cloud-storage वगैरह का इस्तेमाल करते हैं.
  • "svc" उन लोगों के लिए जो उपयोगकर्ता खाते के बजाय, सेवा खाते ("svc खाते") की पुष्टि करते हैं

सभी वर्शन यहां दिए गए हैं:

फ़ाइल का नाम

ब्यौरा

final/analyze_gsimg.py

मुख्य सैंपल; पुरानी पुष्टि लाइब्रेरी का इस्तेमाल करता है

alt/analyze_gsimg-newauth.py

final/analyze_gsimg.py की तरह, लेकिन नई पुष्टि करने वाली लाइब्रेरी का इस्तेमाल किया जाता है

alt/analyze_gsimg-oldauth-gcp.py

final/analyze_gsimg.py की तरह है, लेकिन इसमें Google Cloud प्रॉडक्ट क्लाइंट लाइब्रेरी का इस्तेमाल किया जाता है

alt/analyze_gsimg-newauth-gcp.py

alt/analyze_gsimg-newauth.py की तरह है, लेकिन इसमें Google Cloud प्रॉडक्ट क्लाइंट लाइब्रेरी का इस्तेमाल किया जाता है

alt/analyze_gsimg-oldauth-svc.py

final/analyze_gsimg.py की तरह है, लेकिन उपयोगकर्ता खाते के बजाय svc खाते का इस्तेमाल किया जाता है

alt/analyze_gsimg-newauth-svc.py

alt/analyze_gsimg-newauth.py की तरह है, लेकिन उपयोगकर्ता खाते के बजाय svc खाते की पुष्टि करने की सुविधा का इस्तेमाल किया जाता है

alt/analyze_gsimg-oldauth-svc-gcp.py

alt/analyze_gsimg-oldauth-svc.py की तरह है, लेकिन Google Cloud प्रॉडक्ट की क्लाइंट लाइब्रेरी और alt/analyze_gsimg-oldauth-gcp.py की तरह ही इस्तेमाल किया जाता है. हालांकि, यह उपयोगकर्ता खाते के बजाय svc खाते की पुष्टि करने की सुविधा का इस्तेमाल करता है

alt/analyze_gsimg-newauth-svc-gcp.py

alt/analyze_gsimg-oldauth-svc-gcp.py की तरह, लेकिन नई पुष्टि करने वाली लाइब्रेरी का इस्तेमाल किया जाता है

इसे मूल final/analyze_gsimg.py के साथ जोड़ा गया है. आपके पास फ़ाइनल समाधान के सभी संभावित कॉम्बिनेशन हैं, भले ही आपका Google API डेवलपमेंट एनवायरमेंट कोई भी हो. साथ ही, आपके पास अपनी ज़रूरत के हिसाब से सबसे सही विकल्प चुनने का विकल्प होता है. इसी तरह की जानकारी के लिए, alt/README.md पर भी जाएं.

अतिरिक्त अध्ययन

नीचे कुछ आइडिया दिए गए हैं, जिनसे पता चलता है कि इस अभ्यास को एक या दो कदम आगे कैसे बढ़ाया जा सकता है. मौजूदा समाधान की मदद से, जिस समस्या को हल किया जा सकता है उसे बड़ा करके देखा जा सकता है. इससे आपको ये सुधार करने में मदद मिलती है:

  1. (फ़ोल्डर में एक से ज़्यादा इमेज) एक इमेज प्रोसेस करने के बजाय, मान लें कि आपके पास Google Drive फ़ोल्डर में इमेज थीं.
  2. (ZIP फ़ाइलों में एक से ज़्यादा इमेज) इमेज के फ़ोल्डर के बजाय, ZIP फ़ाइलों को संग्रहित करने के बारे में क्या ख्याल है? अगर Python का इस्तेमाल किया जा रहा है, तो zipfile मॉड्यूल का इस्तेमाल करें.
  3. (विज़न लेबल का विश्लेषण करें) मिलती-जुलती इमेज को एक साथ क्लस्टर करें. सबसे पहले, सबसे सामान्य लेबल खोजें. इसके बाद, दूसरा सबसे सामान्य लेबल खोजें. इसके बाद, इसी तरह की अन्य इमेज देखें.
  4. (चार्ट बनाएं) फ़ॉलो-अप #3, Vision API के विश्लेषण और कैटगरी के आधार पर Sheets API की मदद से चार्ट जनरेट करें
  5. (दस्तावेज़ों की कैटगरी तय करें) Cloud Vision API की मदद से इमेज का विश्लेषण करने के बजाय, आपके पास Cloud Natural Language API की मदद से कैटगरी तय करने के लिए PDF फ़ाइलें हैं. ऊपर दिए गए समाधानों का इस्तेमाल करके, ये PDF फ़ाइलें, Drive में मौजूद Drive फ़ोल्डर या ZIP फ़ाइलों में संग्रहित की जा सकती हैं.
  6. (प्रज़ेंटेशन बनाएं) Google शीट रिपोर्ट के कॉन्टेंट से स्लाइड डेक जनरेट करने के लिए, Slides API का इस्तेमाल करें. प्रेरणा के लिए, यह ब्लॉग पोस्ट देखें और स्प्रेडशीट डेटा से स्लाइड जनरेट करने के बारे में वीडियो.
  7. (PDF के तौर पर एक्सपोर्ट करें) स्प्रेडशीट और/या स्लाइड डेक को PDF के तौर पर एक्सपोर्ट करें. हालांकि, यह सुविधा न तो Sheets के एपीआई की मदद से बनाई गई है और न ही Slides के एपीआई में. जानकारी: Google Drive API. अतिरिक्त क्रेडिट: Ghostscript (Linux, Windows) या Combine PDF Pages.action (Mac OS X) जैसे टूल की मदद से, Sheets और Slides की PDF फ़ाइलों को एक मास्टर PDF फ़ाइल में मर्ज करें.

ज़्यादा जानें

कोड लैब

सामान्य

Google Workspace

Google Cloud

लाइसेंस

इस काम को क्रिएटिव कॉमंस एट्रिब्यूशन 2.0 जेनरिक लाइसेंस के तहत लाइसेंस मिला है.