5

Google の YouTube Data API のサンプル コードはジャンクです。非常に複雑で、oauth リダイレクト フローに結び付けられているため、使用できません。ピップで生に行こうとしてrequestsいて、行き過ぎていません。

次のコードを使用して、(私が知る限り) 指示に正確に従いました。

import json
import os
import sys
import urllib

import requests

payload_file = None
payload = None

print 'Loading Config'

# Get the directory path of this file.  When using any relative file paths make
# sure they are relative to current_dir so that the script can be run from any CWD.
current_dir = os.path.dirname(os.path.abspath(__file__))

# Reads in the config.json file then parses it
config = json.loads(open(os.path.join(current_dir, '..', 'config.json')).read())

print 'Parsing Payload'

for i in range(len(sys.argv)):

    if sys.argv[i] == "--json" and (i + 1) < len(sys.argv):
        payload = json.loads(sys.argv[i + 1])

    elif sys.argv[i] == "-payload" and (i + 1) < len(sys.argv):
        payload_file = sys.argv[i + 1]
        with open(payload_file,'r') as f:
            payload = json.loads(f.read())
        break


print 'Configuring youtube with token {0}'.format(payload['token'])



print 'Downloading video...'

# See how big it is
f = urllib.urlopen(payload['url'])
content_length = int(f.headers["Content-Length"])

# Download it
# urllib.urlretrieve(payload['url'], "video.mp4")

metadata = {
    'snippet' : {
        'title': payload['title'],
        "categoryId": 22
    },
    'status' : {
        "privacyStatus": "public",
        "embeddable": True,
        "license": "youtube"
    }
}

if 'tags' in payload:
    metadata['snippet']['tags'] = payload['tags']

if 'description' in payload:
    metadata['snippet']['description'] = payload['description']


headers = {
    'Authorization' : 'Bearer {0}'.format(payload['token']),
    'Content-Type' : 'application/json; charset=UTF-8',
    'Content-Length' : json.dumps(metadata).__len__(),
    'X-Upload-Content-Length' : content_length,
    'X-Upload-Content-Type' : 'video/*',
}

print 'Attempting to upload video'

print headers

# upload video file
r = requests.post('https://www.googleapis.com/upload/youtube/v3/videos?uploadType=resumable&part=snippet,status', data=metadata, headers=headers);

print "RESPONSE!"
print r.text

# files = {
#     'file': video_file,
# }
# r = requests.post('https://www.googleapis.com/upload/youtube/v3/videos', data={ "video" : video }, headers=headers);

明らかに完了していませんが、メタデータのアップロード要求で次の出力が表示されます。

Loading Config
Parsing Payload
Configuring youtube with token <access-token>
Downloading video...
Attempting to upload video
{'X-Upload-Content-Length': 51998563, 'Content-Length': 578, 'Content-Type': 'application/json; charset=UTF-8', 'X-Upload-Content-Type': 'video/*', 'Authorization': 'Bearer <access-token>'}
RESPONSE!
{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "parseError",
    "message": "Parse Error"
   }
  ],
  "code": 400,
  "message": "Parse Error"
 }
}

このエラーは、「エラー」ドキュメントにも記載されていません。

コードの何が問題になっていますか?

4

2 に答える 2

0

上記は素晴らしいです。追加するだけです: 応答から youtube ID を取得することもできます (将来の使用のために):

cont = json.loads(resp.content)
youtube_id = cont['id'] 
于 2015-01-12T16:53:12.170 に答える