每次使用 YouTube 数据时如何绕过输入验证码来授权我的代码 API v3
How to bypass entering authentication code to authorize my code everytime I use the YouTube Data API v3
所以每次我 运行 我的代码都会在我的终端上显示一个 link ,我必须手动按下并在浏览器上选择我的 Gmail 帐户才能登录并接收授权代码。我必须再次粘贴到我的终端上。
有没有办法跳过这个过程?
我使用的代码:
# -*- coding: utf-8 -*-
# Sample Python code for youtube.videos.update
# See instructions for running these code samples locally:
# https://developers.google.com/explorer-help/guides/code_samples#python
import os
import google_auth_oauthlib.flow
import googleapiclient.discovery
import googleapiclient.errors
scopes = ["https://www.googleapis.com/auth/youtube.force-ssl"]
def main():
# Disable OAuthlib's HTTPS verification when running locally.
# *DO NOT* leave this option enabled in production.
os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"
api_service_name = "youtube"
api_version = "v3"
client_secrets_file = "client_secret_key.json"
# Get credentials and create an API client
flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file(
client_secrets_file, scopes)
credentials = flow.run_console()
youtube = googleapiclient.discovery.build(
api_service_name, api_version, credentials=credentials)
request = youtube.videos().update(
part="id,snippet",
body={
"id": "videoid",
"snippet": {
"title": "XOXOXO",
"description": "Through IDE",
"categoryId": "27"
}
}
)
response = request.execute()
print(response)
if __name__ == "__main__":
main()
确实有可能在第一次 运行 成功通过 OAuth authorization/authentication 流程时保存您的 credentials
对象;然后在每次 运行 程序第 n
次时从该文件加载凭据对象,其中 n >= 2
.
以下是我建议的代码结构:
import os, pickle
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.discovery import build
def pickle_file_name(
api_name = 'youtube',
api_version = 'v3'):
return f'token_{api_name}_{api_version}.pickle'
def load_credentials(
api_name = 'youtube',
api_version = 'v3'):
pickle_file = pickle_file_name(
api_name, api_version)
if not os.path.exists(pickle_file):
return None
with open(pickle_file, 'rb') as token:
return pickle.load(token)
def save_credentials(
cred, api_name = 'youtube',
api_version = 'v3'):
pickle_file = pickle_file_name(
api_name, api_version)
with open(pickle_file, 'wb') as token:
pickle.dump(cred, token)
def create_service(
client_secret_file, scopes,
api_name = 'youtube',
api_version = 'v3'):
print(client_secret_file, scopes,
api_name, api_version,
sep = ', ')
cred = load_credentials(api_name, api_version)
if not cred or not cred.valid:
if cred and cred.expired and cred.refresh_token:
cred.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
client_secret_file, scopes)
cred = flow.run_console()
save_credentials(cred, api_name, api_version)
try:
service = build(api_name, api_version, credentials = cred)
print(api_name, 'service created successfully')
return service
except Exception as e:
print(api_name, 'service creation failed:', e)
return None
def main():
youtube = create_service("client_secret_key.json",
["https://www.googleapis.com/auth/youtube.force-ssl"])
if not youtube: return
request = youtube.videos().update(
part="id,snippet",
body={
"id": "videoid",
"snippet": {
"title": "XOXOXO",
"description": "Through IDE",
"categoryId": "27"
}
}
)
response = request.execute()
print(response)
if __name__ == '__main__':
main()
您必须注意上面代码的以下特点:如果您第二次 运行 您的脚本来自不同的目录而不是您 运行 它第一次,当该(当前)目录不包含凭据 pickle 文件时,脚本将重新启动 OAuth 流程。
现在,如果您已经安装(或愿意安装)软件包 Google Authentication Library for Python、google-auth
,版本 >= 1.21.3(google-auth
v1.3.0 引入 Credentials.from_authorized_user_file
,v1.8.0 引入了 Credentials.to_json
,v1.21.3 修复了后一个函数 w.r.t。它的 class' expiry
成员),那么你可能有你的 credentials
对象保存到 JSON 文本文件并从中加载。
这是执行此操作的代码:
import os, json, io
...
def json_file_name(
api_name = 'youtube',
api_version = 'v3'):
return f'token_{api_name}_{api_version}.json'
def load_credentials(
api_name = 'youtube',
api_version = 'v3'):
cred_file = json_file_name(
api_name, api_version)
if not os.path.exists(cred_file):
return None
from google.oauth2.credentials import Credentials
return Credentials.from_authorized_user_file(cred_file)
def save_credentials(
cred, api_name = 'youtube',
api_version = 'v3'):
cred_file = json_file_name(
api_name, api_version)
with io.open(cred_file, 'w', encoding = 'UTF-8') as json_file:
json_file.write(cred.to_json())
...
所以每次我 运行 我的代码都会在我的终端上显示一个 link ,我必须手动按下并在浏览器上选择我的 Gmail 帐户才能登录并接收授权代码。我必须再次粘贴到我的终端上。
有没有办法跳过这个过程?
我使用的代码:
# -*- coding: utf-8 -*-
# Sample Python code for youtube.videos.update
# See instructions for running these code samples locally:
# https://developers.google.com/explorer-help/guides/code_samples#python
import os
import google_auth_oauthlib.flow
import googleapiclient.discovery
import googleapiclient.errors
scopes = ["https://www.googleapis.com/auth/youtube.force-ssl"]
def main():
# Disable OAuthlib's HTTPS verification when running locally.
# *DO NOT* leave this option enabled in production.
os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"
api_service_name = "youtube"
api_version = "v3"
client_secrets_file = "client_secret_key.json"
# Get credentials and create an API client
flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file(
client_secrets_file, scopes)
credentials = flow.run_console()
youtube = googleapiclient.discovery.build(
api_service_name, api_version, credentials=credentials)
request = youtube.videos().update(
part="id,snippet",
body={
"id": "videoid",
"snippet": {
"title": "XOXOXO",
"description": "Through IDE",
"categoryId": "27"
}
}
)
response = request.execute()
print(response)
if __name__ == "__main__":
main()
确实有可能在第一次 运行 成功通过 OAuth authorization/authentication 流程时保存您的 credentials
对象;然后在每次 运行 程序第 n
次时从该文件加载凭据对象,其中 n >= 2
.
以下是我建议的代码结构:
import os, pickle
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.discovery import build
def pickle_file_name(
api_name = 'youtube',
api_version = 'v3'):
return f'token_{api_name}_{api_version}.pickle'
def load_credentials(
api_name = 'youtube',
api_version = 'v3'):
pickle_file = pickle_file_name(
api_name, api_version)
if not os.path.exists(pickle_file):
return None
with open(pickle_file, 'rb') as token:
return pickle.load(token)
def save_credentials(
cred, api_name = 'youtube',
api_version = 'v3'):
pickle_file = pickle_file_name(
api_name, api_version)
with open(pickle_file, 'wb') as token:
pickle.dump(cred, token)
def create_service(
client_secret_file, scopes,
api_name = 'youtube',
api_version = 'v3'):
print(client_secret_file, scopes,
api_name, api_version,
sep = ', ')
cred = load_credentials(api_name, api_version)
if not cred or not cred.valid:
if cred and cred.expired and cred.refresh_token:
cred.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
client_secret_file, scopes)
cred = flow.run_console()
save_credentials(cred, api_name, api_version)
try:
service = build(api_name, api_version, credentials = cred)
print(api_name, 'service created successfully')
return service
except Exception as e:
print(api_name, 'service creation failed:', e)
return None
def main():
youtube = create_service("client_secret_key.json",
["https://www.googleapis.com/auth/youtube.force-ssl"])
if not youtube: return
request = youtube.videos().update(
part="id,snippet",
body={
"id": "videoid",
"snippet": {
"title": "XOXOXO",
"description": "Through IDE",
"categoryId": "27"
}
}
)
response = request.execute()
print(response)
if __name__ == '__main__':
main()
您必须注意上面代码的以下特点:如果您第二次 运行 您的脚本来自不同的目录而不是您 运行 它第一次,当该(当前)目录不包含凭据 pickle 文件时,脚本将重新启动 OAuth 流程。
现在,如果您已经安装(或愿意安装)软件包 Google Authentication Library for Python、google-auth
,版本 >= 1.21.3(google-auth
v1.3.0 引入 Credentials.from_authorized_user_file
,v1.8.0 引入了 Credentials.to_json
,v1.21.3 修复了后一个函数 w.r.t。它的 class' expiry
成员),那么你可能有你的 credentials
对象保存到 JSON 文本文件并从中加载。
这是执行此操作的代码:
import os, json, io
...
def json_file_name(
api_name = 'youtube',
api_version = 'v3'):
return f'token_{api_name}_{api_version}.json'
def load_credentials(
api_name = 'youtube',
api_version = 'v3'):
cred_file = json_file_name(
api_name, api_version)
if not os.path.exists(cred_file):
return None
from google.oauth2.credentials import Credentials
return Credentials.from_authorized_user_file(cred_file)
def save_credentials(
cred, api_name = 'youtube',
api_version = 'v3'):
cred_file = json_file_name(
api_name, api_version)
with io.open(cred_file, 'w', encoding = 'UTF-8') as json_file:
json_file.write(cred.to_json())
...