我正在尝试创建一个脚本,每当 YouTube 频道上传视频时都会通知我。就像订阅按钮一样
我尝试过的:
我尝试寻找与此相关的文档,并且在此过程中还学习了如何在 Google Cloud 中设置 YouTube V3 API。我发现的最接近的库是 python-youtube 和 youtube-channel-subscribe。
到目前为止我的进展:
我尝试过 youtube-channel-subscribe 但问题是它会打开浏览器然后订阅,而这将不起作用,因为我将在服务器上运行它。我已经浏览了 python-youtube 文档,我认为它没有这方面的功能(我可能是错的)
如有任何帮助,我们将不胜感激。
requests
和 re
。基本上,我们想要监控 YouTube 频道的最新视频。
我们可以通过这几行代码获取任意 YouTube 频道的最新视频的标题、上传日期和观看次数:
import requests
import re
channel = "https://www.youtube.com/user/PewDiePie"
html = requests.get(channel + "/videos").text
info = re.search('(?<={"label":").*?(?="})', html).group()
date = re.search('\d+ \w+ ago.*seconds ', info).group()
print(info)
print(date)
输出:
Reacting To Strangers Secrets by PewDiePie 4 hours ago 11 minutes, 54 seconds 584,062 views
4 hours ago 11 minutes, 54 seconds
您可以将视频的信息(将相对日期转换为绝对日期)存储在数据库中,每当
info
带有数据库中不存在的标题,或者date
带有减去形式的时间时当前日期晚于数据库中的最后日期,则已上传新视频。
YouTube 视频的日期格式已更改,因此上述日期的正则表达式不再有效。然而,
info
仍然包含它。
这是还获取最新视频网址的版本:
import requests
import re
channel = "https://www.youtube.com/user/PewDiePie"
html = requests.get(channel + "/videos").text
info = re.search('(?<={"label":").*?(?="})', html).group()
url = "https://www.youtube.com/watch?v=" + re.search('(?<="videoId":").*?(?=")', html).group()
print(info)
print(url)
输出:
Lot of big changes lately.. by PewDiePie 6 hours ago 22 minutes 723,960 views
https://www.youtube.com/watch?v=psHriqExm6U
就这么简单,
获取它的 URL 并使用 Python Library Beautiful Soup 抓取它。 https://pypi.org/project/beautifulsoup4/。
列出项目
为该文件的第一个版本创建一个 Json 文件(您可以使这变得非常简单,只需采用最新视频的名称)。
无论您喜欢什么时间间隔,再次调用Python scraper进行比较
当 JSON 文件不同时,(如果最新的名称与原始文件的名称不同,则执行 x)对 Zapier 进行 API 调用 https://zapier.com/
让 Zapier 通过 API 调用向您发送变更短信。
上面的代码可以直接在文档中找到。如果您想要一种更完整的抓取方法,可以绕过客户端网站的任何类型的阻止,我会使用代理链接仅供参考。
我的 Discord 机器人也需要该功能,但我找不到利用 YouTube Data API v3 提供的 PubSubHubbub 的 Python 包,这很遗憾。
使用此协议的好处是它非常高效,因为它不需要不断轮询 API,并且您不需要 Google Cloud 的 API 密钥(对于使用 YouTube 数据 API 有配额限制)
因此,我为我自己和其他可能也需要它的人创建了一个新的 python 包。
pip install ytnoti
这是如何使用该包的基本示例:
from ytnoti import YouTubeNotifier, Notification
notifier = YouTubeNotifier()
@notifier.upload()
async def listener(notification: Notification):
print(f"New video from {notification.channel.name}: {notification.video.title}")
notifier.subscribe("UC9EEyg7QBL-stRX-7hTV3ng") # YouTube Channel ID(s)
notifier.run()