监听事件
可以在视频号发生事件时,触发自定义脚本。本下载器的「插入下载按钮」、「在终端打印访问的视频」,都是基于该能力实现的
目前支持的事件有
onFeed:加载了 feed(首页、详情、直播都会触发)onPCFlowLoaded:首页推荐获取到视频列表onRecommendFeedsLoaded:获取到推荐列表onUserFeedsLoaded:获取到指定用户的部分视频列表onGotoNextFeed:首页推荐切换到下一个视频onGotoPrevFeed:首页推荐切换到上一个视频onFetchFeedProfile:获取到视频详情onFetchLiveProfile:获取到直播详情beforeDownloadMedia:下载视频之前beforeDownloadCover:下载封面之前onMediaDownloaded:视频下载完成onMP3Downloaded:MP3 下载完成onDOMContentLoaded:DOM 完全加载和解析onDOMContentBeforeUnLoaded:DOM 加载完成前(页面即将离开,DOM 仍存在)onWindowLoaded:所有资源加载完成onWindowUnLoaded:页面卸载完成(DOM 即将被销毁)
参数类型可以参考 utils.d.ts
基于上面的事件,可以实现任意的功能,包括但不限于
- 记录所有访问过的视频
- 记录下载过的视频
- 自动下载所有视频
下面给出一个「打印访问过的视频」功能代码示例
打印访问过的视频
在和 wx_video_download.exe 同目录下增加一个 global.js 文件,内容如下
js
// global.js
WXU.onFeed(async (feed) => {
const [err, res] = await WXU.request({
method: "POST",
url: "http://127.0.0.1:1234/api/feed",
body: feed,
});
if (err) {
WXU.error({ msg: err.message });
return;
}
WXU.log({ msg: JSON.stringify(res) });
});该代码实现了在访问视频时,将视频的完整信息,提交到 http://127.0.0.1:1234/api/feed 这个服务
go
// main.go
package main
import (
"io"
"log"
"net/http"
)
func setCORS(w http.ResponseWriter) {
h := w.Header()
h.Set("Access-Control-Allow-Origin", "*")
h.Set("Access-Control-Allow-Methods", "POST, OPTIONS")
h.Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
}
func feedHandler(w http.ResponseWriter, r *http.Request) {
setCORS(w)
if r.Method == http.MethodOptions {
w.WriteHeader(http.StatusNoContent)
return
}
if r.Method != http.MethodPost {
http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)
return
}
body, err := io.ReadAll(r.Body)
if err != nil {
log.Printf("read body error: %v", err)
http.Error(w, "Bad Request", http.StatusBadRequest)
return
}
defer r.Body.Close()
log.Printf("feed: %s", string(body))
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
_, _ = w.Write([]byte(`{"ok":true}`))
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/api/feed", feedHandler)
addr := "127.0.0.1:1234"
log.Printf("HTTP server listening on %s", addr)
if err := http.ListenAndServe(addr, mux); err != nil {
log.Fatalf("server error: %v", err)
}
}上面代码中
go
log.Printf("feed: %s", string(body))就是打印访问的视频完整信息。有了完整信息,可以自己实现保存到数据库、下载视频等任意功能。
如果要实现下载访问过的视频,只需要在上面 log.Printf 处,解析传过来的 body,拿到 url 和 key,下载并解密即可。
下载和解密功能,可以参考本项目 cmd 目录下代码