1

I successfully duplicated the Tasks API from this video, but I am unable to successfully translate this format to using the YouTube API.

Here is my .py file:

import httplib2
import os
import sys
import jinja2
import webapp2
import logging
import pprint

from oauth2client import tools
from oauth2client.client import flow_from_clientsecrets
from oauth2client.client import OAuth2WebServerFlow
from oauth2client.client import AccessTokenRefreshError
from oauth2client.tools import argparser, run_flow
from oauth2client.appengine import OAuth2Decorator

from apiclient.discovery import build
from google.appengine.ext.webapp import util
from google.appengine.ext.webapp import template

decorator = OAuth2Decorator(
    client_id = '*my client ID*',
    client_secret = '*my client secret*',
    scope='https://www.googleapis.com/auth/youtube')

service = build("youtube", "v3")

class MainHandler(webapp2.RequestHandler):
    @decorator.oauth_required
    def get (self):
        self.response.headers['Content-Type'] = 'text/plain'

        channels_list = service.channels().list(
            mine=True,
            part="id"
        ).execute(http = decorator.http())
        self.response.out.write (pprint.pformat(channels_list))


app = webapp2.WSGIApplication (
        [
            ('/', MainHandler),
            (decorator.callback_path, decorator.callback_handler()),
        ], 
        debug=True)

Here is my Traceback:

Traceback (most recent call last):

  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1535, in __call__

    rv = self.handle_exception(request, response, e)

  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1529, in __call__

    rv = self.router.dispatch(request, response)

  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1278, in default_dispatcher

    return route.handler_adapter(request, response)

  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1102, in __call__

    return handler.dispatch()

  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 572, in dispatch

    return self.handle_exception(e, self.app.debug)

  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 570, in dispatch

    return method(*args, **kwargs)

  File "C:\Users\...\testapp\oauth2client\appengine.py", line 733, in check_oauth

    resp = method(request_handler, *args, **kwargs)

  File "C:\Users\...\testapp\testapp.py", line 35, in get

    ).execute(http = decorator.http())

  File "C:\Users\...\testapp\oauth2client\util.py", line 129, in positional_wrapper

    return wrapped(*args, **kwargs)

  File "C:\Users\...\testapp\apiclient\http.py", line 723, in execute

    raise HttpError(resp, content, uri=self.uri)

HttpError: <HttpError 403 when requesting https://www.googleapis.com/youtube/v3/channels?part=id&mine=true&alt=json returned "Insufficient Permission">

INFO     2015-06-13 12:27:54,515 module.py:788] default: "GET / HTTP/1.1" 500 2278

I have checked and double-checked that I have both the YouTube Data API and YouTube Analytics API enabled this client ID. I have even disabled them and re-enabled to check, but I am still getting this error.

I am new to GAE and its methods, so maybe I am not understanding an error in the Traceback.

One note is that I was getting "ImportError: No module named..." for apiclient, httplib2, oauth2client, and uritemplate, so I moved those folders directly into my app file (and didn't get that error again). Not sure if moving those directly into the folder is causing errors.

sean
  • 3,484
  • 5
  • 27
  • 45

1 Answers1

0

Well I hope I didn't waste anyone's time, but if anyone else has this issue, I found this question, and although I didn't have a memcache issue, I revoked permission for my app from the user account I was using, refreshed the app and gave permission again and now it seems to be working.

I guess this was a Google-side issue. Thanks to anyone who spent the time to read my question.

Community
  • 1
  • 1
sean
  • 3,484
  • 5
  • 27
  • 45
  • Actually this seems to occur randomly, and revoking permissions doesn't always seem to help. It appears that Google's OAuth2 servers may have an issue storing credentials at times for apps run off of localhost. – sean Jun 13 '15 at 22:33