2014-10-07 4 views
2

Вопрос должен быть как загрузить видео пользователей на их канал YouTube?Как загрузить мое видео на другие каналы в API YouTube

для этого я использую использования API YouTube V3 и быстрый поиск от Google я нашел ниже код

client_secrets.json

{ 
    "web": { 
    "client_id": "[[INSERT CLIENT ID HERE]]", 
    "client_secret": "[[INSERT CLIENT SECRET HERE]]", 
    "redirect_uris": [], 
    "auth_uri": "https://accounts.google.com/o/oauth2/auth", 
    "token_uri": "https://accounts.google.com/o/oauth2/token" 
    } 
} 

из терминала

python upload_video.py --file="/tmp/test_video_file.flv" 
         --title="Summer vacation in California" 
         --description="Had a great time surfing in Santa Cruz" 
         --keywords="surfing,Santa Cruz" 
         --category="22" 
         --privacyStatus="private" 

Как загрузить свое видео на другие каналы в YouTube API

Полный рабочий образец для upload_video.py сценария приведен ниже:

#!/usr/bin/python 

import httplib 
import httplib2 
import os 
import random 
import sys 
import time 

from apiclient.discovery import build 
from apiclient.errors import HttpError 
from apiclient.http import MediaFileUpload 
from oauth2client.file import Storage 
from oauth2client.client import flow_from_clientsecrets 
from oauth2client.tools import run 
from optparse import OptionParser 


# Explicitly tell the underlying HTTP transport library not to retry, since 
# we are handling retry logic ourselves. 
httplib2.RETRIES = 1 

# Maximum number of times to retry before giving up. 
MAX_RETRIES = 10 

# Always retry when these exceptions are raised. 
RETRIABLE_EXCEPTIONS = (httplib2.HttpLib2Error, IOError, httplib.NotConnected, 
    httplib.IncompleteRead, httplib.ImproperConnectionState, 
    httplib.CannotSendRequest, httplib.CannotSendHeader, 
    httplib.ResponseNotReady, httplib.BadStatusLine) 

# Always retry when an apiclient.errors.HttpError with one of these status 
# codes is raised. 
RETRIABLE_STATUS_CODES = [500, 502, 503, 504] 

# CLIENT_SECRETS_FILE, name of a file containing the OAuth 2.0 information for 
# this application, including client_id and client_secret. You can acquire an 
# ID/secret pair from the API Access tab on the Google APIs Console 
# http://code.google.com/apis/console#access 
# For more information about using OAuth2 to access Google APIs, please visit: 
# https://developers.google.com/accounts/docs/OAuth2 
# For more information about the client_secrets.json file format, please visit: 
# https://developers.google.com/api-client-library/python/guide/aaa_client_secrets 
# Please ensure that you have enabled the YouTube Data API for your project. 
CLIENT_SECRETS_FILE = "client_secrets.json" 

# A limited OAuth 2 access scope that allows for uploading files, but not other 
# types of account access. 
YOUTUBE_UPLOAD_SCOPE = "https://www.googleapis.com/auth/youtube.upload" 
YOUTUBE_API_SERVICE_NAME = "youtube" 
YOUTUBE_API_VERSION = "v3" 

# Helpful message to display if the CLIENT_SECRETS_FILE is missing. 
MISSING_CLIENT_SECRETS_MESSAGE = """ 
WARNING: Please configure OAuth 2.0 

To make this sample run you will need to populate the client_secrets.json file 
found at: 

    %s 

with information from the APIs Console 
https://code.google.com/apis/console#access 

For more information about the client_secrets.json file format, please visit: 
https://developers.google.com/api-client-library/python/guide/aaa_client_secrets 
""" % os.path.abspath(os.path.join(os.path.dirname(__file__), 
            CLIENT_SECRETS_FILE)) 

def get_authenticated_service(): 
    flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE, scope=YOUTUBE_UPLOAD_SCOPE, 
    message=MISSING_CLIENT_SECRETS_MESSAGE) 

    storage = Storage("%s-oauth2.json" % sys.argv[0]) 
    credentials = storage.get() 

    if credentials is None or credentials.invalid: 
    credentials = run(flow, storage) 

    return build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, 
    http=credentials.authorize(httplib2.Http())) 


def initialize_upload(options): 
    youtube = get_authenticated_service() 

    tags = None 
    if options.keywords: 
    tags = options.keywords.split(",") 

    insert_request = youtube.videos().insert(
    part="snippet,status", 
    body=dict(
     snippet=dict(
     title=options.title, 
     description=options.description, 
     tags=tags, 
     categoryId=options.category 
    ), 
     status=dict(
     privacyStatus=options.privacyStatus 
    ) 
    ), 
    # chunksize=-1 means that the entire file will be uploaded in a single 
    # HTTP request. (If the upload fails, it will still be retried where it 
    # left off.) This is usually a best practice, but if you're using Python 
    # older than 2.6 or if you're running on App Engine, you should set the 
    # chunksize to something like 1024 * 1024 (1 megabyte). 
    media_body=MediaFileUpload(options.file, chunksize=-1, resumable=True) 
) 

    resumable_upload(insert_request) 


def resumable_upload(insert_request): 
    response = None 
    error = None 
    retry = 0 
    while response is None: 
    try: 
     print "Uploading file..." 
     status, response = insert_request.next_chunk() 
     if 'id' in response: 
     print "'%s' (video id: %s) was successfully uploaded." % (
      options.title, response['id']) 
     else: 
     exit("The upload failed with an unexpected response: %s" % response) 
    except HttpError, e: 
     if e.resp.status in RETRIABLE_STATUS_CODES: 
     error = "A retriable HTTP error %d occurred:\n%s" % (e.resp.status, 
                  e.content) 
     else: 
     raise 
    except RETRIABLE_EXCEPTIONS, e: 
     error = "A retriable error occurred: %s" % e 

    if error is not None: 
     print error 
     retry += 1 
     if retry > MAX_RETRIES: 
     exit("No longer attempting to retry.") 

     max_sleep = 2 ** retry 
     sleep_seconds = random.random() * max_sleep 
     print "Sleeping %f seconds and then retrying..." % sleep_seconds 
     time.sleep(sleep_seconds) 


if __name__ == '__main__': 
    parser = OptionParser() 
    parser.add_option("--file", dest="file", help="Video file to upload") 
    parser.add_option("--title", dest="title", help="Video title", 
    default="Test Title") 
    parser.add_option("--description", dest="description", 
    help="Video description", 
    default="Test Description") 
    parser.add_option("--category", dest="category", 
    help="Numeric video category. " + 
     "See https://developers.google.com/youtube/v3/docs/videoCategories/list", 
    default="22") 
    parser.add_option("--keywords", dest="keywords", 
    help="Video keywords, comma separated", default="") 
    parser.add_option("--privacyStatus", dest="privacyStatus", 
    help="Video privacy status: public, private or unlisted", 
    default="public") 
    (options, args) = parser.parse_args() 

    if options.file is None or not os.path.exists(options.file): 
    exit("Please specify a valid file using the --file= parameter.") 
    else: 
    initialize_upload(options) 

Вопрос 1:

Как интегрироваться с функцией просмотра django?

нравится, когда пользователь обращается к localhost:8000/upload, а затем просматривает & submit button next google будет запрашивать учетные данные пользователя после успешного входа в систему, которое будет загружено на имя пользователя youtube channel. Для этого, как интегрировать выше кода Джанго зрения FUNTION

Вопрос 2:

Как изменить ниже команду, чтобы просмотреть

python upload_video.py --file="/tmp/test_video_file.flv" 
          --title="Summer vacation in California" 
          --description="Had a great time surfing in Santa Cruz" 
          --keywords="surfing,Santa Cruz" 
          --category="22" 
          --privacyStatus="private" 

ответ

2

Ни в коем случае, чтобы сделать это, как вы не можете получить КЛИЕНТ SECRET файл пользователя, пока он не дает

  • client_id
  • client_secr и др

А вот что Google говорит

Предупреждение: Держите ваш клиент секрет частной. Если кто-то получает секрет вашего клиента, он может использовать его для использования вашей квоты, взимания сборов с вашего проекта Google APIs Console и запроса доступа к пользовательским данным.

+0

Нет .. Я не хочу моего пользователя 'CLLIENT SECRET File'. У меня есть секретный файл клиента на моем собственном сервере. Все, что я хочу, - это когда пользователь нажимает кнопку «Загрузить», когда выбирает файл, а затем появляется экран универсального входа google, запрашивает имя пользователя и пароль, а затем файл будет нажимать на указанное имя пользователя. Канал youtube. –

+2

. В вашем случае вы должны получить токен доступа и получить авторизованный токен от пользователя для загрузки от его имени проверьте эту ссылку google api, это должно быть разрешено на этом https://developers.google.com/youtube/2.0/developers_guide_protocol_oauth2 –

+0

Как и в случае с ответами, используя API, предоставленный Google, и Файл JSON для хранения данных является неправильным способом для этого. Вы должны хранить client_id и client_secret (предоставленные Google) в базе данных или в файле настроек Django. Затем вам необходимо предоставить представление (или использовать одну из библиотек, которые я предложил выше), которая принимает эти значения и выполняет рукопожатие OAuth, это даст вам access_token, который вы можете использовать для публикации видео в качестве пользователя (как они теперь вам дали разрешение на это). –

1

Вы почти наверняка найдете это проще, используя библиотеку, такую ​​как python-social-auth или django-allauth, лично я бы использовал python-social-auth, но, как вы, кажется, только начинаете использовать Django django-allauth ,

https://github.com/pennersr/django-allauth

Существует хороший учебник, который проведет вас через него:

http://www.sarahhagstrom.com/2013/09/the-missing-django-allauth-tutorial/

Что касается превращения этого сценария в представление, просто назвать его изнутри любого зрения Джанго, вы должны проверьте, зарегистрирован ли пользователь в Google, если они затем используют маркер доступа, хранящийся в базе данных. Если нет, вы должны перенаправить их на шаблон URL-адреса входа в Google, предоставляемый django-allauth.

+0

до сих пор я пытался, и теперь он почти работает, можете ли вы когда-нибудь сказать «invalid_grant» –

+0

Это может быть связано: http://stackoverflow.com/questions/10576386/invalid-grant-trying-to-get-oauth -token-from-google вы можете предоставить дополнительную информацию. Когда вы получаете эти ошибки, что вы пробовали? –

+0

да я посмотрел .. кажется создан json файл '" refresh_token ": null,' only .. я не знаю, как это получить .. –

0

Сохраните файл upload_video.py в своем видеоприложении.

В вашем view.py попробуйте следующее после поста формы:

form_upload = VideoForm(request.POST, request.FILES) 

    if form_upload.is_valid(): 
     uploaded_video = form_upload.save(commit=True) 

     # send this file to youtube 
     credentials = get_authenticated_service(uploaded_video) 
     initialize_upload(credentials, uploaded_video) 

В видео models.py

file_on_server = models.FileField(max_length=100, null=True, blank=True) 

    auth_host_name = 'localhost' 
    noauth_local_webserver = True 
    auth_host_port = [8080, 8090] 
    logging_level = 'ERROR' 
    category = 23 
    privacyStatus = 'public' 

    @property 
    def file(self): 
     return self.file_on_server.path 

Под Google Developer Console:

  • Создайте идентификатор клиента Google OAuth для родное приложение не веб-приложение.
  • Загрузите JSON в свое видео приложение.

После отправки вы должны получить следующее сообщение в консоли:

Uploading file... 
Video id '' was successfully uploaded. 
Смежные вопросы