Основные сведения о примере Python Google API


Я упоминал о попытке заставить пример кода Google java работать в одном из моих предыдущих вопросов о StackOverflow, но отказался от попыток сделать это после того, как понял, насколько устаревшими были образцы. Поскольку я немного увлекся python около 4 лет назад, я решил, что взгляну на API Google Blogger для Python.

Хотя большинство вызовов API имеют смысл, я не могу заставить этот пример работать правильно!

Вот пример, который я пытаюсь запустить:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright 2014 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Simple command-line sample for Blogger.

Command-line application that retrieves the users blogs and posts.

Usage:
  $ python blogger.py

You can also get help on all the command-line flags the program understands
by running:

  $ python blogger.py --help

To get detailed log output run:

  $ python blogger.py --logging_level=DEBUG
"""
from __future__ import print_function

__author__ = 'jcgregorio@google.com (Joe Gregorio)'

import sys

from oauth2client import client
from googleapiclient import sample_tools


def main(argv):
  # Authenticate and construct service.
  service, flags = sample_tools.init(
      argv, 'blogger', 'v3', __doc__, __file__,
      scope='https://www.googleapis.com/auth/blogger')

  try:

      users = service.users()

      # Retrieve this user's profile information
      thisuser = users.get(userId='self').execute()
      print('This user's display name is: %s' % thisuser['displayName'])

      blogs = service.blogs()

      # Retrieve the list of Blogs this user has write privileges on
      thisusersblogs = blogs.listByUser(userId='self').execute()
      for blog in thisusersblogs['items']:
        print('The blog named '%s' is at: %s' % (blog['name'], blog['url']))

      posts = service.posts()

      # List the posts for each blog this user has
      for blog in thisusersblogs['items']:
        print('The posts for %s:' % blog['name'])
        request = posts.list(blogId=blog['id'])
        while request != None:
          posts_doc = request.execute()
          if 'items' in posts_doc and not (posts_doc['items'] is None):
            for post in posts_doc['items']:
              print('  %s (%s)' % (post['title'], post['url']))
          request = posts.list_next(request, posts_doc)

  except client.AccessTokenRefreshError:
    print ('The credentials have been revoked or expired, please re-run'
      'the application to re-authorize')

if __name__ == '__main__':
  main(sys.argv)

У меня есть запустите этот пример как в PyCharm, так и в терминале, и в то время как код компилируется и выполняется (что больше, чем я мог бы сказать для примера Java!) Я, кажется, не могу проследить, где образец получает свою информацию.

Для примера требуется client_secrets.файл json, который я заполнил своим идентификатором клиента и ключами секретов клиента, полученными из консоли Google API, однако, я не вижу, как образец должен получить данные о текущем пользователе блоггера, так как там, похоже, нет входа в выберите пользователя, введите адрес электронной почты или что-нибудь в этом роде. Служба, по-видимому, получает текущего пользователя, но на самом деле это не так.

Client_secrets.json:

{
  "web": {
    "client_id": "[[INSERT CLIENT ID HERE]]",
    "client_secret": "[[INSERT CLIENT SECRET HERE]]",
    "redirect_uris": [],
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://accounts.google.com/o/oauth2/token"
  }
}

На самом деле, при запуске этого кода, я получаю следующую ошибку:

/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/bin/python2.7 /google-api-python-client-master/samples/blogger/blogger.py
This user's display name is: Unknown
Traceback (most recent call last):
  File "/google-api-python-client-master/samples/blogger/blogger.py", line 83, in <module>
    main(sys.argv)
  File "/google-api-python-client-master/samples/blogger/blogger.py", line 62, in main
    for blog in thisusersblogs['items']:
KeyError: 'items'

Process finished with exit code 1
Если бы кто-то мог помочь мне понять, чего мне не хватает в моем понимании того, как работает этот образец, я бы определенно оценил это. Мой питон определенно заржавел, но я надеюсь поиграть с этим образцом код поможет мне использовать его снова.
1 2

1 ответ:

Пример кода не требует пояснений:

#libraries used to connect with googles api
from oauth2client import client
from googleapiclient import sample_tools


def main(argv):
  # Authenticate and construct service.
  service, flags = sample_tools.init(
      argv, 'blogger', 'v3', __doc__, __file__,
      scope='https://www.googleapis.com/auth/blogger')

Это выше использует поток Oath2, вы перенаправлены и должны аутентифицироваться (по крайней мере, при первом запуске)

 try:

      users = service.users()    #googleapiclient.discovery.Resource object

      # Retrieve this user's profile information
      thisuser = users.get(userId='self').execute()
      print('This user\'s display name is: %s' % thisuser['displayName'])

      blogs = service.blogs()   #googleapiclient.discovery.Resource object

 # Retrieve the list of Blogs this user has write privileges on
      thisusersblogs = blogs.listByUser(userId='self').execute()  #retrieves all blogs from the user (you = self) 
      for blog in thisusersblogs['items']:    #for loop that iterates over a JSON (dictionary) to get key value 'items'
        print('The blog named \'%s\' is at: %s' % (blog['name'], blog['url']))

      posts = service.posts()    #googleapiclient.discovery.Resource object for posts

  # List the posts for each blog this user has
      for blog in thisusersblogs['items']:
        print('The posts for %s:' % blog['name'])  
        request = posts.list(blogId=blog['id'])     #uses #googleapiclient.discovery.Resource object for posts to get blog by id
        while request != None:
          posts_doc = request.execute()
          if 'items' in posts_doc and not (posts_doc['items'] is None):
            for post in posts_doc['items']:
              print('  %s (%s)' % (post['title'], post['url']))
          request = posts.list_next(request, posts_doc)

  except client.AccessTokenRefreshError:
    print ('The credentials have been revoked or expired, please re-run'
      'the application to re-authorize')

if __name__ == '__main__':
  main(sys.argv)

Запуск этого возвращает все ваши сообщения следующим образом:

This user's display name is: "something"
The blog named 'myTest' is at: http://BLOGNAME.blogspot.com/
The posts for myTest:
  POST NAME (http://BLOGNAME.blogspot.com/2016/06/postname.html)

Может быть, вы хотите начать работу с основными запросами, а не с образцами кода, чтобы ознакомиться с API?

Https://developers.google.com/blogger/docs/3.0/using#RetrievingABlog

Начните с основ, Пример:

Получение блога

Вы можете получить информацию для конкретного блога, отправив HTTP-запрос. Получить запрос на URI блога. URI для блога имеет следующие значения формат:

Https://www.googleapis.com/blogger/v3/blogs/blogId

В зависимости от используемой версии pyton вы можете импортировать различные библиотеки для выполнения ваших запросов, например. от http://docs.python-requests.org/en/master/user/quickstart/#make-a-request

import requests

r = requests.get('https://www.googleapis.com/blogger/v3/blogs/blogId')
print r.text

Это должно повторять JSON:

{
  "kind": "blogger#blog",
  "id": "2399953",
  "name": "Blogger Buzz",
  "description": "The Official Buzz from Blogger at Google",
  "published": "2007-04-23T22:17:29.261Z",
  "updated": "2011-08-02T06:01:15.941Z",
  "url": "http://buzz.blogger.com/",
  "selfLink": "https://www.googleapis.com/blogger/v3/blogs/2399953",
  "posts": {
    "totalItems": 494,
    "selfLink": "https://www.googleapis.com/blogger/v3/blogs/2399953/posts"
  },
  "pages": {
    "totalItems": 2,
    "selfLink": "https://www.googleapis.com/blogger/v3/blogs/2399953/pages"
  },
  "locale": {
    "language": "en",
    "country": "",
    "variant": ""
  }
}

Вы, вероятно, хотите проверить https://developers.google.com/blogger/docs/3.0/reference/#Blogs