You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用RSS与Conky定时切换展示TorrentFreak的文章标题?

问题:Conky Lua脚本无法输出TorrentFreak RSS文章标题

希望每5秒展示TorrentFreak.com RSS源中一篇不同的文章标题,已用Lua编写Conky脚本但无输出,脚本及调用方式如下:

原Lua脚本

-- Check if Conky env
if conky == nil then
    os.exit(1)
end

conky.config = {
    use_xft = true,
    font = 'DejaVu Sans:size=10',
    update_interval = 2, -- update every 2sec
}

function conky_rss()
    local rss_url = "https://torrentfreak.com/feed/"

    function get_all_rss_titles()
        local xml = io.popen('curl -s "'..rss_url..'"'):read('*all')

        local xml2lua = require("xml2lua")
        local handler = require("xmlhandler.tree")
        local parser = xml2lua.parser(handler)
        parser:parse(xml)

        local titles = {}
        for _, item in ipairs(handler.root.RSS.Channel.Item) do
            table.insert(titles, item.Title)
        end

        return titles
    end

    function display_next_title()
        local titles = get_all_rss_titles()

        local index = tonumber(os.date('%S')) % #titles + 1
        local title = titles[index]

        return title
    end

    return display_next_title()
end

Conky调用方式

${color1} -> ${color0}${lua /home/Cthulhu/.conky/My_Script/Script_Sources/conky-rss.lua}

解决思路与优化方案

一、排查基础运行问题

  • 检查xml2lua依赖:Conky自带的Lua环境默认没有xml2lua和xmlhandler.tree模块,先手动安装:
    sudo apt install luarocks && sudo luarocks install xml2lua
    
  • 验证curl请求有效性:在终端直接执行curl -s "https://torrentfreak.com/feed/",确认能返回正常XML内容,若请求失败需检查网络连通性。
  • 修正Conky脚本调用格式:Conky调用Lua函数需先加载脚本,再调用函数名。修改Conky配置:
    1. 在conky.config中添加脚本加载项:
      conky.config = {
          use_xft = true,
          font = 'DejaVu Sans:size=10',
          update_interval = 5, -- 改为5秒匹配需求
          lua_load = '/home/Cthulhu/.conky/My_Script/Script_Sources/conky-rss.lua'
      }
      
    2. 修改Conky.text中的调用语句:
      ${color1} -> ${color0}${lua conky_rss}
      

二、修复脚本核心逻辑问题

  • 修正RSS标签大小写:TorrentFreak的RSS源标签为小写(rss/channel/item/title),原脚本用大写标签导致无法提取内容,同时添加错误捕获避免崩溃:
  • 优化RSS请求频率:每次调用都请求RSS效率低,将标题列表缓存到全局变量,定期更新即可。

优化后的完整脚本:

-- Check if Conky env
if conky == nil then
    os.exit(1)
end

conky.config = {
    use_xft = true,
    font = 'DejaVu Sans:size=10',
    update_interval = 5,
    lua_load = '/home/Cthulhu/.conky/My_Script/Script_Sources/conky-rss.lua'
}

-- 全局缓存变量
local cached_titles = {}
local last_update_time = 0
local UPDATE_INTERVAL = 600 -- 每10分钟更新一次RSS

function conky_rss()
    local rss_url = "https://torrentfreak.com/feed/"
    local current_time = os.time()

    -- 定期更新RSS缓存
    if current_time - last_update_time > UPDATE_INTERVAL or #cached_titles == 0 then
        -- 获取RSS内容
        local xml_handle = io.popen('curl -s "' .. rss_url .. '"')
        local xml_content = xml_handle:read('*all')
        xml_handle:close()

        if not xml_content or xml_content == "" then
            return "Failed to fetch RSS"
        end

        -- 安全加载依赖模块
        local ok, xml2lua = pcall(require, "xml2lua")
        if not ok then
            return "Missing xml2lua module"
        end
        local ok, handler = pcall(require, "xmlhandler.tree")
        if not ok then
            return "Missing xmlhandler.tree module"
        end

        -- 解析XML
        local parser = xml2lua.parser(handler)
        local parse_ok, err = pcall(parser.parse, parser, xml_content)
        if not parse_ok then
            return "XML parse error: " .. err
        end

        -- 提取标题(注意小写标签)
        cached_titles = {}
        local items = handler.root.rss and handler.root.rss.channel and handler.root.rss.channel.item
        if items then
            for _, item in ipairs(items) do
                if item.title then
                    table.insert(cached_titles, item.title)
                end
            end
        end
        last_update_time = current_time
    end

    -- 处理空标题列表
    if #cached_titles == 0 then
        return "No articles found"
    end

    -- 每5秒切换标题
    local cycle = math.floor(tonumber(os.date('%S')) / 5)
    local index = cycle % #cached_titles + 1
    return cached_titles[index]
end

三、验证与调试

  • 运行Conky前,先在终端测试脚本:创建测试文件test.lua,添加以下内容执行,确认能输出标题:
    conky = {} -- 模拟Conky环境
    dofile('/home/Cthulhu/.conky/My_Script/Script_Sources/conky-rss.lua')
    print(conky_rss())
    
    执行命令:lua test.lua

内容的提问来源于stack exchange,提问作者Cthulhu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:47:04