2016-01-31 12 views
6

Sto codificando per connettermi all'API di YouTube e gli esempi che ho visto usano "esegui" dagli strumenti Oauthlib2 per eseguire flussi di autenticazione. Sembra che qualcosa non funzioni nella mia installazione di venv (l'ho reinstallato come 4 volte) ma non riesce a trovare l'esecuzione ... può essere un problema di versione? Posso importare altre parti della libreria ma non .tools run.Oauth2 lib non può importare il nome 'run'

Il codice:

import httplib2 
import os 
import logging 
from oauth2client import run 
from oauth2client.file import Storage 
# from oauth2client.client import AccessTokenRefreshError 
from googleapiclient.discovery import build 
from oauth2client.client import flow_from_clientsecrets 
from googleapiclient.errors import HttpError 
import json 

CLIENT_SECRETS_FILE = "client_secrets.json" 
YOUTUBE_READ_WRITE_SCOPE = "https://www.googleapis.com/auth/youtube" 
YOUTUBE_API_SERVICE_NAME = "youtube" 
YOUTUBE_API_VERSION = "v3" 
MISSING_CLIENT_SECRETS_MESSAGE = "Missing client secrets file" 


def authenticate(): 
    httplib2.debuglevel = 4 
    flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE, 
            scope=YOUTUBE_READ_WRITE_SCOPE, 
            message=MISSING_CLIENT_SECRETS_MESSAGE) 
    storage = Storage("%s-oauth2.json") 
    credentials = storage.get() 
    if credentials is None or credentials.invalid: 
     print('invalid credentials') 
     credentials = run_flow(flow, storage) 

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

    tags = "classical music", "yehudi mehunin" 
    body = dict(
     snippet=dict(
      title="some title", 
      description="a description", 
      tags=tags, 
      categoryId="4" 
     ), 
     status=dict(
      privacyStatus="Private" 
     ) 
    ) 

    thingy = service.videos().insert(part=",".join(body.keys()), body=None, media_body=MediaFileUpload(
     "1977.mp4", mimetype="video/mp4", chunksize=1024 * 1024, resumable=False)) 

    thingy.execute() 

authenticate() 

errore:

Traceback (most recent call last): File "/home/xavier/Code/autotube/youtube3.py", line 4, in <module> from oauth2client import run ImportError: cannot import name 'run'

risposta

12

sto suggerendo fortemente alla ricerca di un esempio più recente di attuazione oauth2client corrente. Il vecchio metodo run è stato rimosso dalla libreria in agosto 2015 ed è stato sostituito da run_flow() nel modulo strumenti. Importare in questo modo:

from oauth2client import tools 

Poi accedervi utilizzando tools.run_flow().

Update: Per quanto riguarda il follow-up domanda che le bandiere si deve inserire a livello di codice, se non args comando sono disponibili, il trucco è quello di utilizzare una lista vuota args come questo:

flags = tools.argparser.parse_args(args=[]) 
creds = tools.run_flow(flow, storage, flags) 
+1

Grazie. Mi sta chiedendo un argomento flags, ma il mio programma non è basato sulla riga di comando. C'è una soluzione per questo? 'credenziali = run_flow (flusso, archiviazione,?)' – xavier

+0

aggiornato la mia risposta per riflettere la tua domanda f'up – ferdy

+1

Grazie, molto utile :) Voto a modo suo! – xavier

Problemi correlati