前言
最近大量导入了一些Youtube的RSS feed到fluent reader里面,由于这个阅读器读Youtube官方的RSS链接信息不显示内嵌视频,所以需要使用RSSHUB制作链接,没有爬取限制所以用官方的就行不需要用自己建的(我建的也读不了Youtube)。
唯一的问题就是Youtube的用户界面链接有多个,有youtube.com/channel的,有youtube.com/@user的。@的这个应该是最近油管说的可以给自己频道直观ID名字的,不是乱码,这样好记。
但是Edge的RSS Radar没有Youtube的RSShub链接,需要自己去文档里面找,找到前缀后找用户的channel ID拼接一下就行了。
所以以前的方法是这样的:
- 对于当前用户界面链接前面加入view-source,进入网页元素页。
- ctrl+f查找,复制”channel_id”
- 找到channel_id后面的那串乱码,那个就是channel_id
- 乱码加入rsshub.app/youtube/channel/后面,整合一下加入RSS阅读器。
这样一个流程有多个复制,重复这样的流程还是比较麻烦的。所以说想要写一段代码解决后患。
这段失败代码的流程是这样的
- 使用selenium打开这个url
- 动态页面里面照这个channel_id
- 提取出来id,和rsshub.app/youtube/channel/整合,输出
这段代码解决了之前更失败的调了好久requests里面代理最后发现信息根本不在静态页面的问题。
但是为什么失败呢?因为打开一个Youtube再关掉要耗费6秒。
更绝望的是在RSShub里面找到了另外一个user的制作方法。
由于现在没有看见链接长.com/c/…这样的形式了,所以现在根本不需要进入网页获取信息了,需要的都在用户链接上面了。
所以最正确的方法是这样的
- 所以如果有关链接长”https://youtube.com/@user” 这样,就把@user放在rsshub.app/youtube/user/后面输出。
- 如果链接长”https://www.youtube.com/channel/UCOITxWWI-Ho7Xn37FKzeZgg” 这样,就把后面的channel_id放在rsshub.app/youtube/channel/后面输出。
很简单的拼接输出
baseSite = 'https://rsshub.app/youtube/' ##输入前缀
user = 'user/' ##确定分类
channel = 'channel/'
url = input("input the youtube channel")
if url.split("/")[-1][0] == '@': ##user类
rssUrl = baseSite + user + url.split("/")[-1]
print(rssUrl)
elif url.split('/')[-2] == 'channel': ##channel类
rssUrl = baseSite + channel + url.split('/')[-1]
print(rssUrl)
## 后面还有一个c类,就是需要selenium解决的问题。但是油管改了之后现在没看见c类了,就删掉了。
于是每一次复制url到程序里面粘贴,复制程序输出的新url到阅读器里面,解决问题。
粘贴板的使用
但是还不够,不够快。
即使是这样,也有两次复制粘贴,若干次鼠标移动。
能不能这样:复制了用户url之后程序直接读取我复制的url,程序自己操作之后又把新的url写入我的复制里面,我就直接粘贴到阅读器里面?一定是可以的。
一番查找之后找到了python 的win32clipboard,一看名字就知道是给处理粘贴板使用的。
方法如下:
import win32clipboard as cb
cb.OpenClipboard() # 打开粘贴板,使得可以被程序操作
data = cb.GetClipboardData(1) #获取当前的粘贴板的数据
cb.SetClipboardData(1,newdata) #把字符串写入当前的粘贴板
cb.CloseClipboard() # 关闭粘贴板
注意事项如下:
- 程序必须使用cb.OpenClipboard()才能访问粘贴板。
- 完成后必须cb.CloseClipboard(),否则粘贴板一直被当前程序占用无法正常使用。
- cb.GetClipboardData(1)得到的数据类型是byte,需要一定的转换才能正常使用。
于是得到了如下的代码:
```python
# main.py
import classify
import win32clipboard as cb
baseSite = 'https://rsshub.app/youtube/'
cb.OpenClipboard() #获取当前粘贴板的url
url = str(cb.GetClipboardData(1)).split("'")[-2]
suffix = classify.youtube(url)
rssUrl = baseSite + suffix
cb.SetClipboardData(cb.CF_UNICODETEXT,rssUrl)#对粘贴板写入新的url
cb.CloseClipboard()
```python
# classify.py
def youtube(url):
user = 'user/'
channel = 'channel/'
if url.split("/")[-1][0] == '@':
rssUrl = user + url.split("/")[-1]
return(rssUrl)
elif url.split('/')[-2] == 'channel':
rssUrl = channel + url.split('/')[-1]
return(rssUrl)
同文件夹写一个bat文件
python main.py
每次复制完链接后双击bat文件,然后直接粘贴到阅读器里面,完成。
后记
应该还有一种更快的方式:打开程序监视粘贴板,有复制url则启动粘贴板修改,这样甚至少一次双击,实现真正的端到端。但是这样对于人的风险太大,万一忘了或者复制了多余的东西整个程序就出错了,是我拖了程序的后腿。