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。

程式碼範例

依關鍵字搜尋

下列程式碼範例會呼叫 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。

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)