HomeBlogTranscribePlansAPI Keys

PHP 中的 YouTube 转录文本:cURL 在廉价共享主机上

PHP 脚本在共享主机上通过 cURL 获取 YouTube 转录文本

我在我能找到的最便宜的共享主机上测试了这个:PHP 8.1、无 Composer、无 shell 访问、文件通过 FTP 上传,像 2009 年一样。它有效,因为在 PHP 中获取 YouTube 转录文本需要每个主机已经运送了二十年的恰好两件东西——curl 扩展和 json_decode。到本文末尾,你会有一个单文件,取 YouTube URL 并打印标题和转录文本,对 API 可以返回的每个错误有合理的分支。

那个共享托管角度比听起来更重要。爬虫库直接从 YouTube 获取字幕,共享主机 IP 在 YouTube 阻止的第一个范围中——你与数百个其他网站共享一个 IP,其中一些行为不当。完整的混乱在为什么转录文本爬虫被阻止中记录。调用托管 API 绕过所有它:你的主机只与 youtube2text.org 交谈。

脚本

<?php
$videoUrl = "https://www.youtube.com/watch?v=dQw4w9WgXcQ";
$endpoint = "https://youtube2text.org/api/transcribe?url=" . urlencode($videoUrl);

$ch = curl_init($endpoint);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ["x-api-key: " . getenv("YT2TEXT_KEY")],
    CURLOPT_TIMEOUT        => 60,
]);
$raw    = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);

if ($raw === false) {
    exit("Network error\n");
}

$data = json_decode($raw, true);
if ($data === null) {
    exit("Response was not JSON (status $status)\n");
}

if ($status === 200) {
    echo $data["result"]["title"], "\n";
    echo $data["result"]["contentSize"], " characters\n";
    echo substr($data["result"]["content"], 0, 500), "\n";
} else {
    $err = $data["error"];
    if ($err["code"] === "RATE_LIMIT_EXCEEDED") {
        echo "Rate limited. Retry in ", $err["retryAfterSeconds"], " seconds.\n";
    } elseif ($err["code"] === "TRANSCRIPT_UNAVAILABLE") {
        echo "This video has no captions. Nothing to fetch.\n";
    } else {
        echo $err["code"], ": ", $err["message"], "\n";
    }
}

在你的主机控制面板中设置 YT2TEXT_KEY,或者如果你必须硬编码——只是如果你这样做,将文件保留在你的 repo 之外。url 参数需要任何 YouTube URL 格式或裸露 11 字符视频 id,并且有一个可选的 maxChars 参数(默认和最大 150000)用于限制输出。

json_decode 防护不是可选的

那个 $data === null 检查在共享主机上特别赚得它的保留。当主机的代理超时或 mod_security 规则触发时,你得到一个 HTML 错误页面,而不是 JSON——没有防护,你的脚本在三行后数组访问中崩溃,带 useless 消息。在触及形状之前检查解码。

无需账户获得密钥

$demo = json_decode(
    file_get_contents("https://youtube2text.org/api/demo-key"),
    true
);
echo $demo["apiKey"]; // yt_...

诚实细则:演示密钥在请求它的所有人中共享,并允许每个 IP 每月 5 个视频。在共享主机上,那个 IP 也与你的服务器邻居共享,所以将演示密钥视为一个五分钟测试,不是计划。

也值得知道:转录文本来自 YouTube 的字幕轨道,手动或自动生成。英文优先,否则第一个可用语言——禁用字幕的视频返回 TRANSCRIPT_UNAVAILABLE,永久。构建你的循环来跳过那些。

PHP folk 在哪里拿去这个

我从 PHP 开发人员收到的最常见请求是 WordPress 形状:拉转录文本、交给 LLM、发布草稿。整个管道在将 YouTube 视频变成博客文章中覆盖,播客变体在从 YouTube 生成展示笔记

当演示密钥停止足够时,在 youtube2text.org/app/keys 用 Google 登录——无卡无电话号码、一个免费 5 个视频每月的你自己的密钥,从 5.99 美元起付费层。上面的脚本保持逐字相同。