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)