Google API OAuth - 上传到YouTube时出现401(未经授权)

3 投票
1 回答
1951 浏览
提问于 2025-04-17 08:41

最近几天,我一直在为用官方的Python库上传电影到YouTube而苦恼。

到目前为止,我已经成功做了以下几件事:

  • 构建了一个请求访问的链接
  • 保存了返回的OAuth密钥,以便后续使用(获取实际的访问令牌)
  • 获取了访问令牌及其相关的密钥,并把它们存储在数据库里。

但是,我尝试的事情却没有成功:

  • 准备和上传视频 - 每次我尝试上传时,都会收到一个错误信息: {'status': 401, 'body': 'Token invalid - Invalid AuthSub token.', 'reason': 'Unauthorized'}

下面是与上述内容相关的代码块:

获取访问请求链接

def GetOAuthToken():
    callback_url = 'http://www.mysite.com/media_sites/oauth_access_token_callback/youtube'
    scope = 'http://gdata.youtube.com'
    secure = False
    session = True

    yt_service.developer_key = YOUTUBE_DEVELOPER_KEY
    yt_service.client_id = YOUTUBE_KEY

    yt_service.SetOAuthInputParameters(gdata.auth.OAuthSignatureMethod.HMAC_SHA1, YOUTUBE_KEY, consumer_secret=YOUTUBE_SECRET)

    req_token = yt_service.FetchOAuthRequestToken(scopes=scope)
    print 'secret: %s' % req_token.secret
    yt_service.SetOAuthToken(req_token)    
    yt_service.SetOAuthToken(req_token)
    return yt_service.GenerateOAuthAuthorizationURL(callback_url=callback_url, )

获取访问令牌

def handle_token():
    scope = 'http://gdata.youtube.com'

    yt_service = gdata.youtube.service.YouTubeService()
    yt_service.developer_key = YOUTUBE_DEVELOPER_KEY
    yt_service.client_id = YOUTUBE_KEY

    yt_service.SetOAuthInputParameters(gdata.auth.OAuthSignatureMethod.HMAC_SHA1, YOUTUBE_KEY, consumer_secret=YOUTUBE_SECRET)


    oauth_token = gdata.auth.OAuthTokenFromUrl('http://www.mysite.com/media_sites/oauth_access_token_callback/youtube?oauth_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
    oauth_token.secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    if oauth_token:
        oauth_token.oauth_input_params = gdata.auth.OAuthInputParams(gdata.auth.OAuthSignatureMethod.HMAC_SHA1, YOUTUBE_KEY, consumer_secret=YOUTUBE_SECRET)
        yt_service.SetOAuthToken(oauth_token)
        access_token = yt_service.UpgradeToOAuthAccessToken()

上传视频

def upload_vid(access_token, access_token_secret):
    my_media_group = gdata.media.Group(
  title=gdata.media.Title(text='My Test Movie'),
  description=gdata.media.Description(description_type='plain',
                                      text='My description'),
  keywords=gdata.media.Keywords(text='cars, funny'),
  category=[gdata.media.Category(
      text='Autos',
      scheme='http://gdata.youtube.com/schemas/2007/categories.cat',
      label='Autos')],
  player=None
)


    yt_service = gdata.youtube.service.YouTubeService()
    yt_service.developer_key = YOUTUBE_DEVELOPER_KEY
    yt_service.client_id = YOUTUBE_KEY

    yt_service.SetOAuthInputParameters(gdata.auth.OAuthSignatureMethod.HMAC_SHA1, YOUTUBE_KEY, consumer_secret=YOUTUBE_SECRET)

    oauth_token = gdata.auth.OAuthToken(key=access_token, secret=access_token_secret, scopes='http://gdata.youtube.com')
    oauth_token.oauth_input_params = gdata.auth.OAuthInputParams(gdata.auth.OAuthSignatureMethod.HMAC_SHA1, YOUTUBE_KEY, consumer_secret=YOUTUBE_SECRET)

    yt_service.SetOAuthToken(oauth_token)

    where = gdata.geo.Where()
    where.set_location((37.0,-122.0))

    video_entry = gdata.youtube.YouTubeVideoEntry(media=my_media_group, geo=where)

    video_file_location = '/home/path/of/myfile.flv'

    new_entry = yt_service.InsertVideoEntry(video_entry, video_file_location)

所以基本上,每次我尝试上传电影时,都会收到401的错误信息。 如果能得到帮助就太好了!

1 个回答

2

最后我解决了这个问题。
在我的情况下,是因为我把一个经过转义的令牌发送给了一个需要原始字符串的方法。

只要确保在发送令牌作为参数之前,它是“未转义”的就可以了。

谷歌的OAuth令牌可能包含一个斜杠,这个斜杠会被转义成%2F。
发送这样的令牌会导致你收到401错误。

撰写回答