你只需要配置好自己的bark推送密钥(当然可以自建bark 服务器端更安全),企业微信密钥,以及tgbot token还有tg id等相关,订阅源地址可以改成自己需要的,服务器定期执行,由于论坛这些帖子频率很高,我设置5分钟执行,每执行一次会在root目录下修改sent_links.txt,第一次执行会新建这个txt,主要目的是为了不让他重复发送。
另外我今天早上正在尝试一种零成本的方法(毕竟sh脚本还是需要服务器)去实现也就是部署在cloudflare workers或者pages的形式部署,但一直失败,也是说一下失败的思路吧,我先打算pages去执行xml解析并获取rss订阅源的最新内容,把sent_links.txt存储在cloudflare kv空间,然后实现不断的读取和增减操作,然后再用cloudflare pages去curl推送更新内容,之后也是一直报错,之后我想直接把shell脚本和sent_links.txt都放在GitHub仓库中,然后让cf pages去执行shell脚本,调用GitHub Api去实现不断的读取和增减操作达到更新sent_links.txt,在调用api还是出现问题,希望有熟悉cloudflare workers的佬友在有空的情况下能写一个cf大善人版本的,我也会继续尝试滴!
关于企业微信机器人key获取,tgbot token获取,我在下面贴几个链接,大家自己参考或者自行网上搜索
https://github.com/kxs2018/xiaoym/blob/main/获取企业微信群机器人key.md
https://www.cnblogs.com/xiangdongsheng/p/17261841.html
#!/bin/bash# 配置rss_urls=( "https://rss.nodeseek.com" # RSS 源地址 "https://rss-hub-lzhzones-projects.vercel.app/thepaper/featured" "https://rsshub.rssforever.com/zaobao/realtime/china" "https://linuxdorss.longpink.com/top.xml")bark_url="https://api.day.app/your_key/" # Bark 推送 URLwechat_url="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your_key" # 企业微信 WebHook URLtelegram_bot_token="bot_token" # Telegram Bot Tokentelegram_chat_id="Chat ID" # Telegram Chat IDsent_links_file="/root/sent_links.txt" # 已发送链接存储文件max_wechat_messages=20 # 企业微信每分钟最大推送数sleep_interval=60 # 延迟时间,秒wechat_count=0 # 已发送企业微信消息计数max_first_run_posts=20 # 第一次运行时的最大推送条数max_links_per_feed=100 # 每个订阅源保留的最大链接数# 检查依赖工具for cmd in curl jq xmlstarlet; do if ! command -v "$cmd" &> /dev/null; then echo "错误:未找到 $cmd,请先安装" exit 1 fidone# 创建 sent_links_file 如果不存在if [[ ! -f "$sent_links_file" ]]; then touch "$sent_links_file" echo "创建 sent_links.txt 文件" first_run=trueelse first_run=falsefi# 读取已发送链接到一个数组中declare -A sent_linksif [[ -s "$sent_links_file" ]]; then while IFS='|' read -r rss_url link; do # 跳过空行 [[ -z "$rss_url" || -z "$link" ]] && continue sent_links["$rss_url"]+="$link " done < "$sent_links_file"else echo "sent_links.txt 中未找到历史链接"fi# 用于去除HTML标签的函数strip_tags() { echo "$1" | sed 's/<[^>]*>//g' | tr -d '\r'}# 获取 RSS 并汇总更新内容发送for rss_url in "${rss_urls[@]}"; do echo "正在从 $rss_url 获取 RSS 源" xml=$(curl -s --connect-timeout 10 --max-time 20 "$rss_url") # 检查是否成功获取 RSS 数据 if [[ -z "$xml" ]]; then echo "无法获取 $rss_url 的 RSS 数据,跳过" continue fi titles=($(echo "$xml" | xmlstarlet sel -t -m "//item" -v "title" -n | tr -d '\r')) links=($(echo "$xml" | xmlstarlet sel -t -m "//item" -v "link" -n | tr -d '\r')) descriptions=($(echo "$xml" | xmlstarlet sel -t -m "//item" -v "description" -n | tr -d '\r')) posts_sent=0 updated_links=() telegram_message="" bark_message="" wechat_message="" update_count=0 # 从最新的帖子开始处理,汇总更新内容 for ((i=0; i<${#links[@]}; i++)); do link="${links[$i]}" # 如果该链接已发送过,跳过当前链接 if [[ "${sent_links[$rss_url]}" =~ "$link" ]]; then echo "链接 $link 已发送,跳过" continue fi # 检查首次运行的最大推送限制 if [[ "$first_run" = true && $posts_sent -ge $max_first_run_posts ]]; then echo "首次运行推送限制已达:已处理 $posts_sent 条消息" break fi title="${titles[$i]}" description=$(strip_tags "${descriptions[$i]}") # 过滤掉所有HTML标签 ((update_count++)) # 构建 Telegram 消息(HTML 格式,标题加粗,链接可点击) telegram_message+="$update_count. <b>$title</b>\n<a href=\"$link\">$link</a>\n$description\n\n" # 构建 Bark 和企业微信消息(纯文本格式) bark_message+="$update_count. $title\n$link\n$description\n\n" wechat_message+="$update_count. $title\n$link\n$description\n\n" updated_links+=("$link") ((posts_sent++)) done # 如果有更新,发送汇总消息 if [[ $update_count -gt 0 ]]; then echo "为 $rss_url 找到 $update_count 条更新,发送汇总消息" # 发送到 Bark echo "发送到 Bark: $rss_url 的更新" payload=$(jq -n --arg body "$bark_message" --arg title "RSS 更新: $rss_url" '{body: $body, title: $title, badge: 1, category: "myNotificationCategory", sound: "minuet.caf", icon: "https://day.app/assets/images/avatar.jpg", group: "test"}') curl -s -X POST -H 'Content-Type: application/json; charset=utf-8' -d "$payload" "$bark_url" # 发送到 Telegram echo "发送到 Telegram: $rss_url 的更新" curl -s -X POST "https://api.telegram.org/bot$telegram_bot_token/sendMessage" \ -d chat_id="$telegram_chat_id" \ -d text="<b>RSS 更新: $rss_url</b>\n\n$telegram_message" \ -d parse_mode="HTML" \ --connect-timeout 10 \ --max-time 20 # 发送到企业微信 echo "发送到企业微信: $rss_url 的更新" wechat_payload=$(jq -n --arg text "RSS 更新: $rss_url\n\n$wechat_message" '{msgtype: "text", text: {content: $text}}') response=$(curl -s -X POST -H "Content-Type: application/json" -d "$wechat_payload" "$wechat_url") errcode=$(echo "$response" | jq -r '.errcode') if [[ "$errcode" -eq 45009 ]]; then echo "企业微信消息限制已达上限,暂停 $sleep_interval 秒..." sleep "$sleep_interval" wechat_count=0 # 重试发送企业微信消息 response=$(curl -s -X POST -H "Content-Type: application/json" -d "$wechat_payload" "$wechat_url") fi ((wechat_count++)) # 如果企业微信消息超过限制,延迟发送 if (( wechat_count >= max_wechat_messages )); then echo "企业微信消息限制已达上限,暂停 $sleep_interval 秒..." sleep "$sleep_interval" wechat_count=0 fi else echo "没有新的更新内容需要发送 for $rss_url" fi # 更新链接记录 if [[ ${#updated_links[@]} -gt 0 ]]; then # 保留最新的链接,并限制数量 all_links=(${updated_links[@]} ${sent_links[$rss_url]}) all_links=(${all_links[@]:0:$max_links_per_feed}) sent_links["$rss_url"]="${all_links[@]}" # 将更新后的链接保存到文件 > "$sent_links_file" for url in "${!sent_links[@]}"; do for link in ${sent_links[$url]}; do echo "$url|$link" >> "$sent_links_file" done done fidoneecho "RSS 源处理完成"