Przesyłaj filmy do mojego kanału Youtube bez uwierzytelniania użytkownika za pomocą YoutubeApi v3 i ouath2

Celem mojego zadania jest stworzenie skryptu konsolowego, który wstawi ostatnio przesłane filmy na moją własną stronę na mój własny kanał Youtube. Chcę użyć uwierzytelniania server-to-server, ale YoutubeApi nie obsługuje teraz tego sposobu uwierzytelniania.

Więc moje pytanie brzmi: Jak mogę przesłać wideo na kanał youtube, używając uwierzytelniania OAuth2 ze skryptem konsoli bez pomocy użytkownika? Czy jest jakiś sposób, aby to zrobić bez użycia przestarzałego uwierzytelniania ClientLogin protokół?

Author: eddyce, 2013-10-18

4 answers

Tak ten segment wyjaśnia jak: https://developers.google.com/youtube/v3/guides/moving_to_oauth#standalone

Zasadniczo, przechodzisz raz i zapisujesz żeton stamtąd.

Jeśli nawet chcesz pominąć ten jeden raz, możesz uzyskać token odświeżania w OAuth2 z respektowanymi zakresami i podłączyć go bezpośrednio do kodu, z client secret i id. W ten sposób twój skrypt nie będzie potrzebował przeglądarki internetowej.

Oto film wyjaśnienie tego przepływu pracy krok po kroku.

 9
Author: Ibrahim Ulukaya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-23 18:57:32

Po płycie z YoutubeAPI developer, mamy takie rozwiązanie: nie można zrobić własnej aplikacji SERVER-to-SERVER bez użycia przestarzałego * * * * ClientLogin Auth Protocol Będzie on w pełni przestarzały w Kwiecień, 2014 (ale do kwietnia można go używać).

Więc jeśli chcesz, aby Twoi użytkownicy przesyłali filmy na Twój kanał YT z twojej witryny, powinieneś pracować w schemacie takim jak ten: - Twoi użytkownicy przesyłają filmy do twojej witryny - Ty (lub ktoś inny, kto ma Twoje poświadczenia konta YT) zaimportuj wideo do swojego kanału YT Aby to rozwiązać, możesz łatwo użyć protokołu OAuth2.

 1
Author: Егор Герасимчук,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-07 09:41:10

Oto skrypt do wgrywania filmu przez curl

# WARNING, this works only with GNU grep, if you run this on a mac replace grep with ggrep after 'brew install grep'
# Store our credentials in our home directory with a file called .<script name>
my_creds=.`basename $0`
client_id='YOURCLIENTID'
client_secret='YOURCLIENTSECRET' # really a secret
if [ -s $my_creds ]; then
  # if we already have a token stored, use it
  . $my_creds
  time_now=`date +%s`
else
  scope='https://www.googleapis.com/auth/youtube'

  # Form the request URL
  auth_url="https://accounts.google.com/o/oauth2/auth?client_id=$client_id&scope=$scope&response_type=code&redirect_uri=urn:ietf:wg:oauth:2.0:oob"

  echo "Please go to:"
  echo
  echo "$auth_url"
  echo
  echo "after accepting, enter the code you are given:"
  read auth_code

  # swap authorization code for access and refresh tokens
  auth_result=$(curl -s https://accounts.google.com/o/oauth2/token \
    -H "Content-Type: application/x-www-form-urlencoded" \
    -d code=$auth_code \
    -d client_id=$client_id \
    -d client_secret=$client_secret \
    -d redirect_uri=urn:ietf:wg:oauth:2.0:oob \
    -d grant_type=authorization_code)

  echo COMPLETE ANSWER WAS:
  echo $auth_result

  access_token=$(echo "$auth_result" | \
                 ggrep -Po '"access_token" *: *.*?[^\\]",' | \
                 awk -F'"' '{ print $4 }')
  refresh_token=$(echo "$auth_result" | \
                 ggrep -Po '"refresh_token" *: *.*?[^\\]",*' | \
                 awk -F'"' '{ print $4 }')
  expires_in=$(echo "$auth_result" | \
               ggrep -Po '"expires_in" *: *.*' | \
               awk -F' ' '{ print $3 }' | awk -F',' '{ print $1}')
  time_now=`date +%s`
  expires_at=$((time_now + expires_in - 60))
  echo "access_token=$access_token\nrefresh_token=$refresh_token\nexpires_at=$expires_at" > $my_creds
fi

# if our access token is expired, use the refresh token to get a new one
if [ $time_now -gt $expires_at ]; then
  refresh_result=$(curl -s https://accounts.google.com/o/oauth2/token \
   -H "Content-Type: application/x-www-form-urlencoded" \
   -d refresh_token=$refresh_token \
   -d client_id=$client_id \
   -d client_secret=$client_secret \
   -d grant_type=refresh_token)
  access_token=$(echo "$refresh_result" | \
                 ggrep -Po '"access_token" *: *.*?[^\\]",' | \
                 awk -F'"' '{ print $4 }')
  expires_in=$(echo "$refresh_result" | \
               ggrep -Po '"expires_in" *: *.*' | \
               awk -F' ' '{ print $3 }' | awk -F',' '{ print $1 }')
  time_now=`date +%s`
  expires_at=$(($time_now + $expires_in - 60))
  echo "access_token=$access_token\nrefresh_token=$refresh_token\nexpires_at=$expires_at" > $my_creds
fi


# finally this is the call to upload the video (but I haven't managed to set title and description, you might want to make another call for that)
curl https://www.googleapis.com/upload/youtube/v3/videos?part=snippet \
    -d part='snippet' \
    -d snippet.title='test of a title' \
    -d snippet.description='test of video description' \
    --data-binary "@./small.mp4" \
    -H "Content-Type: application/octet-stream" \
    -H "Authorization: Bearer $access_token"

Aby to zadziałało musisz

ten skrypt jest oparty na tym innym pytanie

Ponadto istnieje ten projekt github , który rozwiązuje problem z Pythonem...

 1
Author: eddyce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:55

Udało mi się przesłać film na mój kanał na YouTube za pomocą następującego skryptu powłoki.

#!/bin/sh

# Upload the given video file to your YouTube channel.

cid_base_url="apps.googleusercontent.com"
client_id="<YOUR_CLIENT_ID>.$cid_base_url"
client_secret="<YOUR_CLIENT_SECRET>"
refresh_token="<YOUR_REFRESH_TOKEN>"
token_url="https://accounts.google.com/o/oauth2/token"
api_base_url="https://www.googleapis.com/upload/youtube/v3"
api_url="$api_base_url/videos?uploadType=resumable&part=snippet"

access_token=$(curl -H "Content-Type: application/x-www-form-urlencoded" -d refresh_token="$refresh_token" -d client_id="$client_id" -d client_secret="$client_secret" -d grant_type="refresh_token" $token_url|awk -F '"' '/access/{print $4}')

auth_header="Authorization: Bearer $access_token"
upload_url=$(curl -I -X POST -H "$auth_header" "$api_url"|awk -F ' |\r'  '/loc/{print $2}'); curl -v -X POST --data-binary "@$1" -H "$auth_header" "$upload_url"

Zapoznaj się z poprzednią odpowiedzią, aby dowiedzieć się, jak uzyskać niestandardowe wartości zmiennych.

 0
Author: dardo82,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-30 12:55:34