追番

2024年6月27日 · 743 字 · 2 分钟

最简单的期望

每天回到家,在追的,有更新的动漫已经下载到本地,打开电视看就完了。没有APP,没有推送,没有广告,没有卡顿……

实现

硬件设备

  1. 树莓派(7x24工作)

程序设计

   ┌─Docker─────────────────┐
      Flask                           ┌─Docker───────────────┐ 
        接收网站地址                      爬虫网站A           
        返回视频地址         ◄───────────►  检测更新          
                                        获取最新播放地址        
                                        发送请求视频地址        
                                        下载视频            
      Chrome/selenium                 └──────────────────────┘  
        打开网页视频嗅探                                          
                                      ┌─Docker───────────────┐      
      pyvirtualdisplay                  爬虫网站B             
        用于调试           ◄───────────►  检测更新          
        登录验证                        获取最新播放地址      
                                        发送请求视频地址        
                                        下载视频            
                                      └──────────────────────┘      
                                                                    
                                                                    
   └────────────────────────┘

实现逻辑:

  1. 爬虫定时爬取指定页面,检测是否更新
    - 优先 curl/python.requests 请求
    - 备选 chrome 访问
  2. 检测到更新,取出最新一集播放地址 video_url
  3. video_url 提交给 Chrome 嗅探(嗅探功能可以编写 Chrome 插件实现)
  4. 将嗅探到的视频地址,返回给爬虫,爬虫负责下载视频。

待优化:

  1. 下载功能是否应该单独做一个模块
    - 优点:共用,不用每个爬虫都带下载功能。
    - 缺点:需要起服务,可能还需要和爬虫通信。

代码片段

// chrome 插件,视频地址嗅探功能
chrome.webRequest.onBeforeRequest.addListener(
  function(details) {
    console.log("url:", details.url);
    if (details.url.includes("m3u8") || details.url.includes("mp4")){
      chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
          chrome.tabs.sendMessage(tabs[0].id, {url: details.url});
      });
      console.log("cancel ... URL:", details.url);
      // return {cancel : true};
    }
  },
  { urls: ["<all_urls>"] },
  ["requestBody", "blocking"]
);
# pyvirtualdisplay, selenium, 使用
with Display(backend="xvnc", size=(1366, 768), rfbport=5900) as disp:
    options = webdriver.ChromeOptions()
    options.add_argument('--ignore-certificate-errors')
    options.add_argument("--disable-infobars")
    options.add_argument("--disable-gpu")
    options.add_argument("--disable-dev-shm-usage")
    options.add_argument("--no-sandbox")
    options.add_argument('--blink-settings=imagesEnabled=true')
    options.add_extension("ext.zip")  # 插件
    options.add_argument("--user-data-dir=.chrome")
    options.binary_location = "/usr/bin/chromium-browser"
    driver = webdriver.Chrome(chrome_options=options)
    driver.set_window_size(1366, 768)
    # TODO
    driver.quit()

更新

06-30 增加 BiliBili 用户动态

bilibili官方或者野生 api,但是容易被风控。还是用浏览器打开,获取各动态 BV id,然后使用开源工具,下载各视频到本地。

Demo 工程地址