关于粘贴板的数据

前言

最近大量导入了一些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则启动粘贴板修改,这样甚至少一次双击,实现真正的端到端。但是这样对于人的风险太大,万一忘了或者复制了多余的东西整个程序就出错了,是我拖了程序的后腿。