如果我的术语有误,我深表歉意,我对开发人员来说比较陌生,我正在尝试创建一个由 HTTP 请求触发的 Azure 函数,该请求将 YouTube 视频的 video_id 发送到该函数,然后该函数继续拉取使用 youtube_transcript_api 库将该视频的脚本转换为字符串,并继续将该脚本字符串用于其他目的。我遇到了一个问题,当我在本地调试并使用 video_id 向本地主机发送请求时,YouTube API 能够毫无问题地提取脚本,但是当我将该函数部署到 Azure 中时,我收到此错误
结果:失败异常:TranscriptsDisabled:无法检索视频的文字记录https://www.youtube.com/watch?v=X_uLehv5lOI!这很可能是由以下原因引起的:该视频的字幕被禁用如果您确定所描述的原因不是造成此错误的原因并且应该可以检索文字记录,请在 https://github.com/jdepoix 创建问题/youtube-transcript-api/issues。请添加您正在使用的 youtube_transcript_api 版本,并提供复制错误所需的信息。还要确保没有任何已解决的问题已经描述了您的问题!
使用该链接,您可以看到 video_id 已正确发送,我通过记录 video_id 来确保 HTTP 请求没有任何问题。我大胆猜测这可能是 YouTube API 阻止来自云服务的流量的问题,不确定是否有解决此问题的方法,或者是否有其他服务不会出现此问题。如果其他人遇到过这个问题,请告诉我!
这是我的代码的相关部分的样子...
import azure.functions as func
import logging
app = func.FunctionApp(http_auth_level=func.AuthLevel.FUNCTION)
@app.route(route="azure_function/{video_id}")
def azure_function(req: func.HttpRequest) -> func.HttpResponse:
from openai import OpenAI
import json
from youtube_transcript_api import YouTubeTranscriptApi
video_id = req.route_params.get('video_id', None)
#Input video_id and output a string transcription of audio
def transcribe_video(video_id):
transcript_dict = YouTubeTranscriptApi.get_transcript(video_id)
transcript = ""
for line in transcript_dict:
transcript += line['text'] + " "
return transcript
logging.info("... starting transcription...")
video_transcription = transcribe_video(video_id)
我尝试记录 video_id 以确保它正确地通过 HTTP 请求传递,并且我还尝试在本地运行该函数,该函数确实有效,但是当我部署到 Azure 并运行 HTTP 请求时,我遇到了上述情况500 错误。我感谢任何帮助!
在尝试您的代码时,我在 Azure 中遇到了相同的错误,尽管它可以在本地运行。这是因为 YouTube API 被 Azure 阻止。您需要迁移到具有 YouTube 集成的 Google API,才能使其在 Azure 上运行。
您需要使用应用服务身份验证在 Azure Function App 上配置 Google 登录,并使用
google.oauth2.service_account
与 应用程序连接。
下面是与 YouTube API 集成的 Azure 函数代码,用于检索特定视频的字幕。
import os
import logging
import pprint
import azure.functions as func
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
CLIENT_SECRETS_FILE = "client_secret.json"
SCOPES = ['https://www.googleapis.com/auth/youtube.force-ssl']
API_SERVICE_NAME = 'youtube'
API_VERSION = 'v3'
pp = pprint.PrettyPrinter(indent=2)
def get_authenticated_service():
# Create the flow using the client secrets file and the specified scopes
flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRETS_FILE, SCOPES)
credentials = flow.run_local_server(port=80)
return build(API_SERVICE_NAME, API_VERSION, credentials=credentials)
def list_video_captions(service, video_id):
try:
results = service.captions().list(part='id,snippet', videoId=video_id).execute()
items = results.get('items', [])
if not items:
logging.info('No captions found for this video.')
return 'No captions found for this video.'
else:
captions_info = []
for item in items:
captions_info.append(item)
logging.info('Captions: %s', pprint.pformat(captions_info))
return captions_info
except HttpError as error:
logging.error(f'An error occurred: {error}')
return f'An error occurred: {error}'
def main(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
video_id = req.params.get('video_id')
if not video_id:
return func.HttpResponse(
"Please pass a video_id in the query string.",
status_code=400
)
os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'
service = get_authenticated_service()
captions_info = list_video_captions(service, video_id)
return func.HttpResponse(
body=pprint.pformat(captions_info),
mimetype="application/json",
status_code=200
)
输出
有关更多详细信息,请参阅 GitHub 存储库 和上述文档。