Загружайте видео на мой канал Youtube без аутентификации пользователей с помощью YoutubeApi v3 и ouath2
Цель моей задачи - создать консоль script, которая будет вставлять недавно загруженные видео на моем собственном сайте на мой собственный канал Youtube.
Я хочу использовать аутентификацию между серверами, но YoutubeApi не поддерживает этот способ аутентификации.
Итак, мой вопрос: как я могу загрузить видео на канал YouTube, используя аутентификацию oauth2 с помощью консоли script без какой-либо помощи пользователя? Есть ли способ сделать это без использования устаревшего протокола проверки подлинности ClientLogin?
Ответы
Ответ 1
Да, этот сегмент объясняет, как: https://developers.google.com/youtube/v3/guides/moving_to_oauth#standalone
В принципе, вы проходите один раз и сохраняете там токен.
Если вы даже хотите пропустить это одно время, вы можете получить токен обновления в OAuth2 Playground с уважаемыми областями и подключить его непосредственно в ваш код, с секретностью клиента и идентификатором. Таким образом, вашему script не понадобится веб-браузер.
Здесь показано видео, объясняющее этот рабочий процесс.
Ответ 2
После диска с разработчиком YoutubeAPI мы получили такое решение:
НЕВОЗМОЖНО СДЕЛАТЬ СВОЮ СОБСТВЕННУЮ ЗАЯВКУ СЕРВЕРА БЕЗ ИСПОЛЬЗОВАНИЯ DEPRECATED ** ** Протокол ClientLogin Auth Protocol
Он будет полностью устарел на апрель 2014 года (но до апреля его можно использовать).
Итак, если вы хотите, чтобы ваши пользователи загружали видео в ваш канал YT с вашего сайта, вы должны работать в схеме следующим образом:
- Ваши пользователи загружают видео на ваш сайт
- Вы (или кто-то еще, у кого есть ваши учетные данные YT), импортируют видео на ваш канал YT
Чтобы решить эту проблему, вы можете легко использовать протокол OAuth2.
Ответ 3
здесь script для загрузки видео через 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"
чтобы выполнить эту работу, вам нужно
этот script основан на этом другом вопросе
Кроме того, этот проект github, который решает проблему с python...
Ответ 4
Я смог загрузить видео на свой канал на YouTube, используя следующую оболочку script.
#!/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"
Обратитесь к предыдущему ответу о том, как получить ваши пользовательские значения переменных.