在 Azure Function App 中使用 YouTube API 的问题

问题描述 投票:0回答:1

如果我的术语有误,我深表歉意,我对开发人员来说比较陌生,我正在尝试创建一个由 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 错误。我感谢任何帮助!

python azure azure-functions youtube youtube-api
1个回答
0
投票

在尝试您的代码时,我在 Azure 中遇到了相同的错误,尽管它可以在本地运行。这是因为 YouTube API 被 Azure 阻止。您需要迁移到具有 YouTube 集成的 Google API,才能使其在 Azure 上运行。

您需要使用应用服务身份验证在 Azure Function App 上配置 Google 登录,并使用

google.oauth2.service_account
应用程序连接。

  • 使用上述文档,我们在 Google API 控制台中创建了一个应用程序并启用了 YouTube 数据 API
  • 我们需要创建一个 OAuth 客户端 ID 并添加必要的范围来访问 Google 应用程序。

下面是与 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
    )




输出

enter image description here

enter image description here

有关更多详细信息,请参阅 GitHub 存储库 和上述文档。

© www.soinside.com 2019 - 2024. All rights reserved.