agusrisan / youtubedownloader
一个使用私有API获取YouTube视频的小项目。
Requires
- php: >=7.0
- google/protobuf: 3.11
- guzzlehttp/guzzle: ^7.0.1
This package is auto-updated.
Last update: 2024-09-25 02:48:31 UTC
README
喜欢这个项目吗?通过捐赠支持它
socialAPIS
YoutubeDownloader
这是一个PHP编写的YouTube私有API客户端。
互联网上有多个基于PHP的YouTube下载器,但其中大多数已经多年没有更新,或者它们依赖于youtube-dl本身。
其中每一个,大多数下载器都使用YouTube的前端,然后从YouTube前端响应中提取数据,这在某种程度上是[不好的];
我想构建一个Java安卓应用程序来在后台播放YouTube视频,我在所有网络下载器上遇到了很多问题。
我的意思是,你有一些可以工作的库,但是当YouTube在前端更改某些内容时,它们需要更新,而且,YouTube每月都会定期更改它。
纯PHP编写的YouTube下载器,除了这个之外,不存在。
这是第一个纯PHP编写的可以工作的YouTube下载器。
这个脚本不依赖于除了cURL之外的任何东西。cURL是通过GuzzleHttp使用的。没有JavaScript解释器,没有调用shell...只有纯PHP,没有重依赖。
如果您喜欢这个项目,请随时fork和贡献!
演示
这将每次都工作,您可以有1M个请求,如果YouTube阻止您,只需要求服务器再次注册您,您就有了一个新的密钥,它不会被禁止。
以下是这个示例在浏览器中运行的截图。
这里您可以查看完整的响应。
安装
推荐通过Composer安装。
composer require socialAPIS/youtubedownloader
将FetchPlayer示例复制到您的服务器文件夹并运行它。
使用方法
要使用YouTube的私有API,您首先需要注册。要注册,您可以调用此
$registrationResponse = $yt->registerDevice();
为了节省带宽,您可以保存响应中的id/密钥并将其保存到数据库或其他方法中。
如果您有id/密钥,您可以这样注册
$yt->registerIdKey("id", "key");
$yt = new \YoutubeDownloader\YoutubeDownloader(); $registrationResponse = $yt->registerDevice(); //or $yt->registerIdKey("id", "key");
然后您需要视频id
$playerResponse = $yt->playerRequest->fetch_player_info('video_id_comes_here');
//to se some output you can
echo $playerResponse->serializeToJsonString();
您将获得以下输出
{ "requestData": { "googleVisitorId": "" }, "playerVideos": { "id": 21540, "videos": [ { "id": 17, "videoUrl": "https://r3---sn-vox-n32e.googlevideo.com/videoplayback?expire=1587287354&ei=2sCbXqv1KYmK7gOolJDQAw&ip=146.255.75.42&id=o-ADg-JhQhyb5_HLjBIDhsgPBiCE-m1W1TJEE_ut1_j4L9&itag=17&source=youtube&requiressl=yes&mh=7F&mm=31%2C29&mn=sn-vox-n32e%2Csn-c0q7lnse&ms=au%2Crdu&mv=m&mvi=2&pcm2cms=yes&pl=24&pcm2=no&initcwndbps=462500&vprv=1&mime=video%2F3gpp&gir=yes&clen=4053996&dur=436.256&lmt=1557915191960575&mt=1587265652&fvip=3&c=ANDROID&txp=5431432&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cpcm2%2Cvprv%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJpPlLswRQIgaBWKonzA2at6trESlwPOkW8391wYbwL5mFuI4BT6sd0CIQD3MT2lvaa75iuEtO6AbC1knTEaQu9L9IuqToZPkljMpA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpcm2cms%2Cpl%2Cinitcwndbps&lsig=ALrAebAwRQIgd8KLX0ldFKlRJiY4W9eUFBB6Qhg_HD7aLsF0mjkepsQCIQC8cd38PmQSxaXCiF8rIh_UOb3TxD1DPpuk0MeEJTAeAw%3D%3D", "format": "video/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\"", "size": "small", "sizeFormat": "144p" }, { "id": 18, "videoUrl": "https://r3---sn-vox-n32e.googlevideo.com/videoplayback?expire=1587287354&ei=2sCbXqv1KYmK7gOolJDQAw&ip=146.255.75.42&id=o-ADg-JhQhyb5_HLjBIDhsgPBiCE-m1W1TJEE_ut1_j4L9&itag=18&source=youtube&requiressl=yes&mh=7F&mm=31%2C29&mn=sn-vox-n32e%2Csn-c0q7lnse&ms=au%2Crdu&mv=m&mvi=2&pcm2cms=yes&pl=24&pcm2=no&initcwndbps=462500&vprv=1&mime=video%2Fmp4&gir=yes&clen=35587198&ratebypass=yes&dur=436.233&lmt=1557917191257289&mt=1587265652&fvip=3&c=ANDROID&txp=5431432&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cpcm2%2Cvprv%2Cmime%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&sig=AJpPlLswRQIgW_UDRYl8zmYRNf4fVikpqjenp2l2vMKuiynmChUmCwUCIQD4Q6ggKRo_78nGkXnScL1z9d6Ig4yRap5HKm9QUgyhaw%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpcm2cms%2Cpl%2Cinitcwndbps&lsig=ALrAebAwRQIgd8KLX0ldFKlRJiY4W9eUFBB6Qhg_HD7aLsF0mjkepsQCIQC8cd38PmQSxaXCiF8rIh_UOb3TxD1DPpuk0MeEJTAeAw%3D%3D", "format": "video/mp4; codecs=\"avc1.42001E, mp4a.40.2\"", "size": "medium", "sizeFormat": "360p" }, ... } ...
待办事项列表
- 重构
- 解释加密密钥的准备工作(散列/加密)
- 解释URL和正文签名过程
- 实现搜索/浏览视频
- 实现从响应中获取Google访客ID
- 实现用于持久化数据的接口
许可证
- 相互公共许可证 1.5 (RPL-1.5):https://open-source.org.cn/licenses/RPL-1.5
法律
此代码与YouTube或其任何关联公司或子公司无关,未经授权、维护、赞助或认可。这是一个独立和非官方的API。使用风险自担。