App Engine 上的 Python 代码示例

以下 Python 代码示例演示了如何使用 App Engine 进行 YouTube Data API (v3) 调用。您可以从 GitHub 上的 Google App Engine Python 代码示例代码库下载这些代码示例。

您必须在 Google API 控制台中设置项目并获取 API 密钥,才能运行以下代码示例。目前,每个项目都会定义一个设置为 REPLACE_ME 值的 API_KEY 变量。您需要将该值替换为自己的 API 密钥,才能运行示例。

重要提示:若要运行所有这些示例,您必须为与您的 API 密钥关联的项目启用 YouTube Data API (v3) 和 Freebase API。如果您的应用访问的是用户私人数据或渠道数据,您还需要一个 OAuth 2.0 客户端 ID。

创建项目并获取授权凭据

  1. 打开 API 控制台中的“凭据”页面
  2. 此 API 支持两种类型的凭据。 创建适合您项目的凭据: <ph type="x-smartling-placeholder">
      </ph>
    • OAuth 2.0:当您的应用请求非公开用户数据时,该应用必须将 OAuth 2.0 令牌随请求一起发送。要获取令牌,您的应用应先发送客户端 ID(也可能需要发送客户端密钥)。您可以为网页应用、服务账号或已安装应用生成 OAuth 2.0 凭据。

      如需了解详情,请参阅 OAuth 2.0 文档

    • API 密钥: 未提供 OAuth 2.0 令牌的请求必须发送一个 API 键。 该密钥用于标识您的项目,并提供 API 访问权限、配额和报告。

      此 API 支持多种类型的 API 密钥限制。如果您使用的 API 密钥 创建 API 密钥,请在控制台中创建 API 密钥,方法是 点击创建凭据  &gt;API 密钥。您可以先对密钥设定限制,然后再使用 在生产环境中使用,方法是点击限制密钥,然后选择 限制

为保障 API 密钥的安全,请遵循以安全的方式使用 API 密钥的最佳做法

按关键字搜索

以下代码示例调用 API 的 search.list 方法,以检索与特定关键字关联的搜索结果。

import os
import urllib
import webapp2
import jinja2

from apiclient.discovery import build
from optparse import OptionParser

JINJA_ENVIRONMENT
= jinja2.Environment(
    loader
=jinja2.FileSystemLoader(os.path.dirname(__file__)),
    extensions
=['jinja2.ext.autoescape'])

# Set DEVELOPER_KEY to the "API key" value from the Google Developers Console:
# https://console.developers.google.com/project/_/apiui/credential
# Please ensure that you have enabled the YouTube Data API for your project.
DEVELOPER_KEY
= "REPLACE_ME"
YOUTUBE_API_SERVICE_NAME
= "youtube"
YOUTUBE_API_VERSION
= "v3"

class MainHandler(webapp2.RequestHandler):
   
   
def get(self):
       
if DEVELOPER_KEY == "REPLACE_ME":
         
self.response.write("""You must set up a project and get an API key
                                 to run this project.  Please visit
                                 <landing page> to do so."""

       
else:
          youtube
= build(
            YOUTUBE_API_SERVICE_NAME
,
            YOUTUBE_API_VERSION
,
            developerKey
=DEVELOPER_KEY)
          search_response
= youtube.search().list(
            q
="Hello",
            part
="id,snippet",
            maxResults
=5
         
).execute()
       
          videos
= []
          channels
= []
          playlists
= []
       
         
for search_result in search_response.get("items", []):
           
if search_result["id"]["kind"] == "youtube#video":
                videos
.append("%s (%s)" % (search_result["snippet"]["title"],
                  search_result
["id"]["videoId"]))
           
elif search_result["id"]["kind"] == "youtube#channel":
                channels
.append("%s (%s)" % (search_result["snippet"]["title"],
                  search_result
["id"]["channelId"]))
           
elif search_result["id"]["kind"] == "youtube#playlist":
                playlists
.append("%s (%s)" % (search_result["snippet"]["title"],
                  search_result
["id"]["playlistId"]))
       
          template_values
= {
           
'videos': videos,
           
'channels': channels,
           
'playlists': playlists
         
}
       
         
self.response.headers['Content-type'] = 'text/plain'
         
template = JINJA_ENVIRONMENT.get_template('index.html')
         
self.response.write(template.render(template_values))
       
app
= webapp2.WSGIApplication([
 
('/.*', MainHandler),
], debug=True)

按主题搜索

以下代码示例调用 API 的 search.list 方法,以检索与特定 Freebase 主题相关的搜索结果。

import os
import urllib
import webapp2
import jinja2

from apiclient.discovery import build
from optparse import OptionParser

import json

JINJA_ENVIRONMENT
= jinja2.Environment(
    loader
=jinja2.FileSystemLoader(os.path.dirname(__file__)),
    extensions
=['jinja2.ext.autoescape'])

REGISTRATION_INSTRUCTIONS
= """
    You must set up a project and get an API key to run this code. Please see
    the instructions for creating a project and a key at <a
    href="
https://developers.google.com/youtube/registering_an_application"
   
>https://developers.google.com/youtube/registering_an_application</a>.
   
<br><br>
   
Make sure that you have enabled the YouTube Data API (v3) and the Freebase
    API
for your project."""

# Set API_KEY to the "
API key" value from the Google Developers Console:
# https://console.developers.google.com/project/_/apiui/credential
# Please ensure that you have enabled the YouTube Data API and Freebase API
# for your project.
API_KEY = "
REPLACE_ME"
YOUTUBE_API_SERVICE_NAME = "
youtube"
YOUTUBE_API_VERSION = "
v3"
FREEBASE_SEARCH_URL = "
https://www.googleapis.com/freebase/v1/search?%s"
QUERY_TERM
= "dog"

class MainHandler(webapp2.RequestHandler):

 
def get(self):
   
if API_KEY == 'REPLACE_ME':
     
self.response.write(REGISTRATION_INSTRUCTIONS)
   
else:
     
# Present a list of Freebase topic IDs for the query term
     
self.list_topics(QUERY_TERM)

 
def list_topics(self, QUERY_TERM):
   
# Retrieve a list of Freebase topics associated with the query term
    freebase_params
= dict(query=QUERY_TERM, key=API_KEY)
    freebase_url
= FREEBASE_SEARCH_URL % urllib.urlencode(freebase_params)
    freebase_response
= json.loads(urllib.urlopen(freebase_url).read())

   
if len(freebase_response["result"]) == 0:
     
exit("No matching terms were found in Freebase.")

   
# Create a page that shows a select box listing the topics.
   
# When the user selects a topic and submits the form, the
   
# 'post' method below will handle the form submission and
   
# retrieve videos for the selected topic.
    select_topic_page
= ('''
        <html>
          <body>
            <p>The following topics were found:</p>
            <form method="post">
              <select name="topic">
    '''
)
   
for result in freebase_response["result"]:
      select_topic_page
+= ('<option value="' + result["mid"] + '">' +
                            result
.get("name", "Unknown") + '</option>')

    select_topic_page
+= '''
              </select>
              <p><input type="submit" /></p>
            </form>
          </body>
        </html>
    '''


   
# Display the HTML page listing the topic choices.
   
self.response.out.write(select_topic_page)

 
def post(self):
    topic_id
= self.request.get('topic')

   
# Service for calling the YouTube API
    youtube
= build(YOUTUBE_API_SERVICE_NAME,
                    YOUTUBE_API_VERSION
,
                    developerKey
=API_KEY)

   
# Execute the search request using default query term and retrieved topic.
    search_response
= youtube.search().list(
      part
= 'id,snippet',
      type
= 'video',
      topicId
= topic_id
   
).execute()

    videos
= []

   
for search_result in search_response.get("items", []):
      videos
.append(search_result)

    template_values
= {
     
'videos': videos
   
}

   
self.response.headers['Content-type'] = 'text/html'
   
template = JINJA_ENVIRONMENT.get_template('index.html')
   
self.response.write(template.render(template_values))

app
= webapp2.WSGIApplication([
 
('/.*', MainHandler),
], debug=True)

检索频道上传的视频

以下代码示例调用该 API 的 playlistItems.list 方法,以检索上传到指定频道的视频列表。可以通过频道 ID 或频道名称来识别频道。该代码还会调用 channels.list 方法来检索播放列表 ID,此 ID 用于标识频道中上传的视频。

import os
import urllib
import webapp2
import jinja2

from apiclient.discovery import build
from optparse import OptionParser

import json

JINJA_ENVIRONMENT
= jinja2.Environment(
    loader
=jinja2.FileSystemLoader(os.path.dirname(__file__)),
    extensions
=['jinja2.ext.autoescape'])

REGISTRATION_INSTRUCTIONS
= """
    You must set up a project and get an API key to run this code. Please see
    the instructions for creating a project and a key at <a
    href="
https://developers.google.com/youtube/registering_an_application"
   
>https://developers.google.com/youtube/registering_an_application</a>.
   
<br><br>
   
Make sure that you have enabled the YouTube Data API (v3) and the Freebase
    API
for your project."""

# Set API_KEY to the "
API key" value from the Google Developers Console:
# https://console.developers.google.com/project/_/apiui/credential
# Please ensure that you have enabled the YouTube Data API and Freebase API
# for your project.
API_KEY = "
REPLACE_ME"
YOUTUBE_API_SERVICE_NAME = "
youtube"
YOUTUBE_API_VERSION = "
v3"
FREEBASE_SEARCH_URL = "
https://www.googleapis.com/freebase/v1/search?%s"
QUERY_TERM
= "dog"

class MainHandler(webapp2.RequestHandler):

 
def get(self):
   
if API_KEY == 'REPLACE_ME':
     
self.response.write(REGISTRATION_INSTRUCTIONS)
   
else:
     
# Present a list of Freebase topic IDs for the query term
     
self.request_channel()

 
def request_channel(self):
   
# Display a text box where the user can enter a channel name or
   
# channel ID.
    select_channel_page
= '''
        <html>
          <body>
            <p>Which channel'
s videos do you want to see?</p>
           
<form method="post">
             
<p>
               
<select name="channel_type">
                 
<option value="id">Channel ID</option>
                  <option value="name">Channel name</
option>
               
</select>  
                <input name="channel" size="30">
              </
p>
             
<p><input type="submit" /></p>
           
</form>
          </
body>
       
</html>
    '''

    # Display the HTML page that shows the form.
    self.response.out.write(select_channel_page)

  def post(self):
    # Service for calling the YouTube API
    youtube = build(YOUTUBE_API_SERVICE_NAME,
                    YOUTUBE_API_VERSION,
                    developerKey=API_KEY)

    # Use form inputs to create request params for channel details
    channel_type = self.request.get('channel_type')
    channels_response = None
    if channel_type == 'id':
      channels_response = youtube.channels().list(
          id=self.request.get('channel'),
          part='snippet,contentDetails'
      ).execute()
    else:
      channels_response = youtube.channels().list(
          forUsername=self.request.get('channel'),
          part='snippet,contentDetails'
      ).execute()

    channel_name = ''
    videos = []

    for channel in channels_response['items']:
      uploads_list_id = channel['contentDetails']['relatedPlaylists']['uploads']
      channel_name = channel['snippet']['title']
     
      next_page_token = ''
      while next_page_token is not None:
        playlistitems_response = youtube.playlistItems().list(
            playlistId=uploads_list_id,
            part='snippet',
            maxResults=50,
            pageToken=next_page_token
        ).execute()

        for playlist_item in playlistitems_response['items']:
          videos.append(playlist_item)
         
        next_page_token = playlistitems_response.get('tokenPagination', {}).get(
            'nextPageToken')
       
        if len(videos) > 100:
          break

    template_values = {
      'channel_name': channel_name,
      'videos': videos
    }

    self.response.headers['Content-type'] = 'text/
html'
    template = JINJA_ENVIRONMENT.get_template('
index.html')
    self.response.write(template.render(template_values))

app = webapp2.WSGIApplication([
  ('
/.*', MainHandler),
], debug=True)