由于各家机场不一样,如果需要更多的支持,给我发邮件告诉我订阅地址我帮你适配,当然非常小众或者魔改的不适配,只适配大众的,或者在下面自己更新这个代码,在下面给出更新后的版本,这个脚本过几天就提交 pull request,
直接scp到你的路由器中 lua xxx.lua 即可
对比 shell 脚本加了很多智能判断。
并且针对 shell 脚本有 io 上更彻底的优化,shell的 io 太重了,处理这种字符串的东西会很累。
可读性和可扩展性也比shell好很多。
使用脚本除了网络 io 时间外,基本本身处理时间非常之快,几乎可以无视。
有BUG下面跟帖直接反馈即可
#!/usr/bin/lua
------------------------------------------------
-- This file is part of the luci-app-ssr-plus subscribe.lua
-- @author William Chan <[email protected]>
------------------------------------------------
require 'nixio'
require 'luci.util'
require 'luci.jsonc'
require 'luci.sys'
-- these global functions are accessed all the time by the event handler
-- so caching them is worth the effort
local tinsert = table.insert
local ssub, slen, schar, srep, sbyte, sformat, sgsub =
string.sub, string.len, string.char, string.rep, string.byte, string.format, string.gsub
local cache = {}
local nodeResult = setmetatable({}, { __index = cache }) -- update result
local name = 'shadowsocksr'
local uciType = 'servers'
local ucic = luci.model.uci.cursor()
local proxy = ucic:get_first(name, 'server_subscribe', 'proxy', '0')
local subscribe_url = ucic:get_first(name, 'server_subscribe', 'subscribe_url', {})
local log = function(...)
print(os.date("%Y-%m-%d %H:%M:%S ") .. table.concat({ ... }, " "))
end
-- 分割字符串
local function split(full, sep)
full = full:gsub("%z", "") -- 这里不是很清楚 有时候结尾带个\0
local off, result = 1, {}
while true do
local nEnd = full:find(sep, off)
if not nEnd then
local res = ssub(full, off, slen(full))
if #res > 0 then -- 过滤掉 \0
tinsert(result, res)
end
break
else
tinsert(result, ssub(full, off, nEnd - 1))
off = nEnd + slen(sep)
end
end
return result
end
-- urlencode
local function get_urlencode(c)
return sformat("%%%02X", sbyte(c))
end
local function urlEncode(szText)
local str = szText:gsub("([^0-9a-zA-Z ])", get_urlencode)
str = str:gsub(" ", "+")
return str
end
local function get_urldecode(h)
return schar(tonumber(h, 16))
end
local function UrlDecode(szText)
return szText:gsub("+", " "):gsub("%%(%x%x)", get_urldecode)
end
-- trim
local function trim(text)
if not text or text == "" then
return ""
end
return (sgsub(text, "^%s*(.-)%s*$", "%1"))
end
-- md5
local function md5(content)
local stdout = luci.sys.exec('echo \"' .. urlEncode(content) .. '\" | md5sum | cut -d \" \" -f1')
-- assert(nixio.errno() == 0)
return trim(stdout)
end
-- base64
local function base64Decode(text, safe)
local raw = text
if not text then return '' end
text = text:gsub("%z", "")
if safe then
text = text:gsub("_", "/")
text = text:gsub("-", "+")
local mod4 = #text % 4
text = text .. string.sub('====', mod4 + 1)
end
local result = nixio.bin.b64decode(text)
if result then
return result:gsub("%z", "")
else
return raw
end
end
-- 处理数据
local function processData(szType, content)
local result = {
auth_enable = '0',
switch_enable = '1',
type = szType,
local_port = 1234,
timeout = 60, -- 不太确定 好像是死的
fast_open = 0,
kcp_enable = 0,
kcp_port = 0,
kcp_param = '--nocomp'
}
local hash
if type(content) == 'string' then
hash = md5(content)
else
hash = md5(luci.jsonc.stringify(content))
end
result.hashkey = hash
if szType == 'ssr' then
local dat = split(content, "/\\?")
local hostInfo = split(dat[1], ':')
result.server = hostInfo[1]
result.server_port = hostInfo[2]
result.protocol = hostInfo[3]
result.encrypt_method = hostInfo[4]
result.obfs = hostInfo[5]
result.password = base64Decode(hostInfo[6], true)
local params = {}
for k, v in pairs(split(dat[2], '&')) do
local t = split(v, '=')
params[t[1]] = t[2]
end
result.obfs_param = base64Decode(params.bfsparam, true)
result.protocol_param = base64Decode(params.protoparam, true)
local group = base64Decode(params.group, true)
if group then
result.alias = "[" .. group .. "] "
end
result.alias = result.alias .. base64Decode(params.remarks, true)
elseif szType == 'vmess' then
local info = luci.jsonc.parse(content)
result.type = 'v2ray'
result.server = info.add
result.server_port = info.port
result.tcp_guise = "none"
result.transport = info.net
result.alter_id = info.aid
result.vmess_id = info.id
result.alias = info.ps
result.ws_host = info.host
result.ws_path = info.path
result.h2_host = info.host
result.h2_path = info.path
if not info.security then
result.security = "auto"
end
if info.tls == "tls" or info.tls == "1" then
result.tls = "1"
else
result.tls = "0"
end
elseif szType == "ss" then
local info = content:sub(1, content:find("#") - 1)
local alias = content:sub(content:find("#") + 1, #content)
local hostInfo = split(base64Decode(info, true), "@")
local host = split(hostInfo[2], ":")
local userinfo = base64Decode(hostInfo[1], true)
local method = userinfo:sub(1, userinfo:find(":") - 1)
local password = userinfo:sub(userinfo:find(":") + 1, #userinfo)
result.alias = UrlDecode(alias)
result.type = "ss"
result.server = host[1]
if host[2]:find("/\\?") then
local query = split(host[2], "/\\?")
result.server_port = query[1]
-- local params = {}
-- for k, v in pairs(split(query[2], '&')) do
-- local t = split(v, '=')
-- params[t[1]] = t[2]
-- end
-- 这里似乎没什么用 我看数据结构没有写插件的支持 先抛弃
else
result.server_port = host[2]
end
result.encrypt_method_ss = method
result.password = password
elseif szType == "ssd" then
result.type = "ss"
result.server = content.server
result.server_port = content.port
result.password = content.password
result.encrypt_method_ss = content.encryption
result.alias = "[" .. content.airport .. "] " .. content.remarks
end
return result, hash
end
-- wget
local function wget(url)
local stdout = luci.sys.exec('wget-ssl --user-agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" --no-check-certificate -t 3 -T 10 -O- "' .. url .. '"')
return trim(stdout)
end
local execute = function()
-- exec
do
-- subscribe_url = {'https://www.google.comc'}
if proxy == '0' then -- 不使用代理更新的话先暂停
log('服务正在暂停')
luci.sys.init.stop(name)
end
for k, url in ipairs(subscribe_url) do
local raw = wget(url)
if #raw > 0 then
local node, szType
local groupHash = md5(url)
cache[groupHash] = {}
tinsert(nodeResult, {})
local index = #nodeResult
-- SSD 似乎是这种格式 ssd:// 开头的
if raw:find('ssd://') then
szType = 'ssd'
local nEnd = select(2, raw:find('ssd://'))
node = base64Decode(raw:sub(nEnd + 1, #raw), true)
node = luci.jsonc.parse(node)
local extra = {
airport = node.airport,
port = node.port,
encryption = node.encryption,
password = node.password
}
local servers = {}
-- SS里面包着 干脆直接这样
for _, server in ipairs(node.servers) do
tinsert(servers, setmetatable(server, { __index = extra }))
end
node = servers
else
-- ssd 外的格式
node = split(base64Decode(raw, true), "\n")
end
for _, v in ipairs(node) do
if v then
local result, hash
if szType == 'ssd' then
result, hash = processData(szType, v)
elseif not szType then
local dat = split(v, "://")
if dat and dat[1] and dat[2] then
if dat[1] == 'ss' then
result, hash = processData(dat[1], dat[2])
else
result, hash = processData(dat[1], base64Decode(dat[2], true))
end
end
else
log('跳过未知类型: ' .. szType)
end
-- log(hash, result)
if hash and result then
if result.alias:find("过期时间") or
result.alias:find("剩余流量") or
result.alias:find("QQ群") or
result.alias:find("官网") or
result.server == ''
then
log('丢弃无效节点: ' .. result.type ..' 节点, ' .. result.alias)
else
log('成功解析: ' .. result.type ..' 节点, ' .. result.alias)
result.grouphashkey = groupHash
tinsert(nodeResult[index], result)
cache[groupHash][hash] = nodeResult[index][#nodeResult[index]]
end
end
end
end
log('成功解析节点数量: ' ..#node)
end
end
end
-- diff
do
assert(next(nodeResult), "node result is empty")
local add, del = 0, 0
ucic:foreach(name, uciType, function(old)
if old.grouphashkey or old.hashkey then -- 没有 hash 的不参与删除
if not nodeResult[old.grouphashkey] or not nodeResult[old.grouphashkey][old.hashkey] then
ucic:delete(name, old['.name'])
del = del + 1
else
local dat = nodeResult[old.grouphashkey][old.hashkey]
ucic:tset(name, old['.name'], dat)
-- 标记一下
setmetatable(nodeResult[old.grouphashkey][old.hashkey], { __index = { _ignore = true } })
end
else
log('忽略手动添加的节点: ' .. old.alias)
end
end)
for k, v in ipairs(nodeResult) do
for kk, vv in ipairs(v) do
if not vv._ignore then
local section = ucic:add(name, uciType)
ucic:tset(name, section, vv)
add = add + 1
end
end
end
ucic:commit(name)
-- 如果服务器已经不见了把帮换一个
local globalServer = ucic:get_first(name, 'global', 'global_server', '')
local firstServer = ucic:get_first(name, uciType)
if not ucic:get(name, globalServer) then
if firstServer then
ucic:set(name, ucic:get_first(name, 'global'), 'global_server', firstServer)
ucic:commit(name)
log('当前主服务器已更新,正在自动更换。')
end
end
if firstServer then
luci.sys.call("/etc/init.d/" .. name .." restart > /dev/null 2>&1 &") -- 不加&的话日志会出现的更早
else
luci.sys.call("/etc/init.d/" .. name .." stop > /dev/null 2>&1 &") -- 不加&的话日志会出现的更早
end
log('新增节点数量: ' ..add, '删除节点数量: ' .. del)
log('更新成功服务正在启动')
end
end
if subscribe_url and #subscribe_url > 0 then
xpcall(execute, function(e)
log(e)
log(debug.traceback())
log('发生错误, 正在恢复服务')
local firstServer = ucic:get_first(name, uciType)
if firstServer then
luci.sys.call("/etc/init.d/" .. name .." restart > /dev/null 2>&1 &") -- 不加&的话日志会出现的更早
else
luci.sys.call("/etc/init.d/" .. name .." stop > /dev/null 2>&1 &") -- 不加&的话日志会出现的更早
end
end)
end
@coolsnowwolf
是个很好的建议,目前的 shell 虽然已经很成熟,但是订阅超过 100 个节点在低性能设备上很容易超时(7620 单核之类),但重新造轮子也可能有新的bug,大家可以帮助提交下意见
小白路过,进来学习一番
不如还是整合到界面操作里,每次都用命令行去更新不够用户友好
不如还是整合到界面操作里,每次都用命令行去更新不够用户友好
只是测试的 整合的话看这个 #2726
因为要确保支持各大机场 很多机场搞事情 各种奇奇怪怪的订阅链接
今天测试了一下订阅,好像出现解析错误
2020-01-11 21:24:55 Shadowsocks/ShadowsocksR 1 Threads Started!
[C]: ?
/usr/share/shadowsocksr/subscribe.lua:284: in main chunk
[C]: in function 'xpcall'
/usr/share/shadowsocksr/subscribe.lua:206: in function
/usr/share/shadowsocksr/subscribe.lua:79: in function 'base64Decode'
/usr/share/shadowsocksr/subscribe.lua:293: in function
2020-01-11 21:24:53 stack traceback:
2020-01-11 21:24:53 更新失败服务正在恢复
2020-01-11 21:24:53 发生错误, 正在恢复服务

好像是解析节点有问题,测试节点:
ss://[email protected]:1111#%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1
今天测试了一下订阅,好像出现解析错误
2020-01-11 21:24:55 Shadowsocks/ShadowsocksR 1 Threads Started!
[C]: ?
/usr/share/shadowsocksr/subscribe.lua:284: in main chunk
[C]: in function 'xpcall'
/usr/share/shadowsocksr/subscribe.lua:206: in function
/usr/share/shadowsocksr/subscribe.lua:79: in function 'base64Decode'
/usr/share/shadowsocksr/subscribe.lua:293: in function
2020-01-11 21:24:53 stack traceback:
2020-01-11 21:24:53 更新失败服务正在恢复
2020-01-11 21:24:53 发生错误, 正在恢复服务
好像是解析节点有问题,测试节点:
ss://[email protected]:1111#%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1
方便把订阅链接发给我吗?
邮件 我帮你改一下
这个不是解析错误 是没支持 ss的我不知道什么格式 这看起来 有urlencode 和base64 不知是否所有ss都这样
今天测试了一下订阅,好像出现解析错误
2020-01-11 21:24:55 Shadowsocks/ShadowsocksR 1 Threads Started!
[C]: ?
/usr/share/shadowsocksr/subscribe.lua:284: in main chunk
[C]: in function 'xpcall'
/usr/share/shadowsocksr/subscribe.lua:206: in function
/usr/share/shadowsocksr/subscribe.lua:79: in function 'base64Decode'
/usr/share/shadowsocksr/subscribe.lua:293: in function
2020-01-11 21:24:53 stack traceback:
2020-01-11 21:24:53 更新失败服务正在恢复
2020-01-11 21:24:53 发生错误, 正在恢复服务
好像是解析节点有问题,测试节点:
ss://[email protected]:1111#%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1方便把订阅链接发给我吗?
邮件 我帮你改一下
这个不是解析错误 是没支持 ss的我不知道什么格式 这看起来 有urlencode 和base64 不知是否所有ss都这样
订阅连接内容有涉及到某些信息,所以不是很方便分享
循环是正常的,只是按你说的,不支持这个格式的
单条内容大致是ss://base64编码的加密方式和密码(例如:aes-128-gcm:12345678)@服务器地址:端口号#urlencode的节点备注
你发几个例子给我即可 我明天处理
发自我的iPhone
------------------ 原始邮件 ------------------
发件人: caicaicai21 <[email protected]>
发送时间: 2020年1月12日 00:44
收件人: coolsnowwolf/lede <[email protected]>
抄送: William Chan <[email protected]>, Author <[email protected]>
主题: 回复:[coolsnowwolf/lede] luci-app-ssr-plus 彻底解决更新订阅慢的问题,顺便兼容SSD节点 (#2721)
今天测试了一下订阅,好像出现解析错误
2020-01-11 21:24:55 Shadowsocks/ShadowsocksR 1 Threads Started!
[C]: ?
/usr/share/shadowsocksr/subscribe.lua:284: in main chunk
[C]: in function 'xpcall'
/usr/share/shadowsocksr/subscribe.lua:206: in function
/usr/share/shadowsocksr/subscribe.lua:79: in function 'base64Decode'
/usr/share/shadowsocksr/subscribe.lua:293: in function
2020-01-11 21:24:53 stack traceback:
2020-01-11 21:24:53 更新失败服务正在恢复
2020-01-11 21:24:53 发生错误, 正在恢复服务
好像是解析节点有问题,测试节点:
ss://[email protected]:1111#%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1方便把订阅链接发给我吗?
邮件 我帮你改一下
这个不是解析错误 是没支持 ss的我不知道什么格式 这看起来 有urlencode 和base64 不知是否所有ss都这样
这是ss协议sip002格式的链接,关于sip002格式的相关信息可以查看这里:https://shadowsocks.org/en/spec/SIP002-URI-Scheme.html
今天测试了一下订阅,好像出现解析错误
2020-01-11 21:24:55 Shadowsocks/ShadowsocksR 1 Threads Started!
[C]: ?
/usr/share/shadowsocksr/subscribe.lua:284: in main chunk
[C]: in function 'xpcall'
/usr/share/shadowsocksr/subscribe.lua:206: in function
/usr/share/shadowsocksr/subscribe.lua:79: in function 'base64Decode'
/usr/share/shadowsocksr/subscribe.lua:293: in function
2020-01-11 21:24:53 stack traceback:
2020-01-11 21:24:53 更新失败服务正在恢复
2020-01-11 21:24:53 发生错误, 正在恢复服务
好像是解析节点有问题,测试节点:
ss://[email protected]:1111#%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1方便把订阅链接发给我吗?
邮件 我帮你改一下
这个不是解析错误 是没支持 ss的我不知道什么格式 这看起来 有urlencode 和base64 不知是否所有ss都这样这是ss协议sip002格式的链接,关于sip002格式的相关信息可以查看这里:https://shadowsocks.org/en/spec/SIP002-URI-Scheme.html
谢谢 这样就知道了 不是很麻烦 我下午回来改
我编译的这个订阅功能没有问题。就是隔一段时间 出现err /usr/bin/ssr-redir[22369]: server recv:
Connection reset peer,从定向链接被节点重置。那位大侠知道怎么回事吗?
在 2020年1月12日星期日,hzjnet notifications@github.com 写道:
太好了,谢谢大家
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/coolsnowwolf/lede/issues/2721?email_source=notifications&email_token=AOFZAKV2U7E2KZHQBWEYZQ3Q5JJE3A5CNFSM4KEKLNBKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEIWNOWI#issuecomment-573364057,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AOFZAKSYTXWSBN2B6C6G6HLQ5JJE3ANCNFSM4KEKLNBA
.
昨天晚上用的好好的 今天早上起来就发现一大堆错误日志,前面的已经被覆盖了 看不到了,
Sun Jan 12 08:31:28 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:31:40 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:31:58 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:32:10 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:32:28 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:32:40 2020 user.notice shadowsocksr: ssr local error.restart!
......
我编译的这个订阅功能没有问题。就是隔一段时间 出现err /usr/bin/ssr-redir[22369]: server recv: Connection reset peer,从定向链接被节点重置。那位大侠知道怎么回事吗? 在 2020年1月12日星期日,hzjnet notifications@github.com 写道:
…
昨天晚上用的好好的 今天早上起来就发现一大堆错误日志,前面的已经被覆盖了 看不到了,
Sun Jan 12 08:31:28 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:31:40 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:31:58 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:32:10 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:32:28 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:32:40 2020 user.notice shadowsocksr: ssr local error.restart!
......
手动点击下更新订阅 如果依然这个错误 可以把订阅链接发给我看一下
我编译的这个订阅功能没有问题。就是隔一段时间 出现err /usr/bin/ssr-redir[22369]: server recv: Connection reset peer,从定向链接被节点重置。那位大侠知道怎么回事吗? 在 2020年1月12日星期日,hzjnet notifications@github.com 写道:
…
你这个 。。嗯 你懂的
我编译的这个订阅功能没有问题。就是隔一段时间 出现err /usr/bin/ssr-redir[22369]: server recv: Connection reset peer,从定向链接被节点重置。那位大侠知道怎么回事吗? 在 2020年1月12日星期日,hzjnet notifications@github.com 写道:
…
太好了,谢谢大家 — You are receiving this because you commented. Reply to this email directly, view it on GitHub <#2721?email_source=notifications&email_token=AOFZAKV2U7E2KZHQBWEYZQ3Q5JJE3A5CNFSM4KEKLNBKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEIWNOWI#issuecomment-573364057>, or unsubscribe https://github.com/notifications/unsubscribe-auth/AOFZAKSYTXWSBN2B6C6G6HLQ5JJE3ANCNFSM4KEKLNBA .
被强制断开了,它会自动重新连接,可能是机场的问题,也有可能是GFW的问题,反正是正常的,不需要理会。
我编译的这个订阅功能没有问题。就是隔一段时间 出现err /usr/bin/ssr-redir[22369]: server recv: Connection reset peer,从定向链接被节点重置。那位大侠知道怎么回事吗? 在 2020年1月12日星期日,hzjnet [email protected] 写道:
…昨天晚上用的好好的 今天早上起来就发现一大堆错误日志,前面的已经被覆盖了 看不到了,
Sun Jan 12 08:31:28 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:31:40 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:31:58 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:32:10 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:32:28 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:32:40 2020 user.notice shadowsocksr: ssr local error.restart!
......手动点击下更新订阅 如果依然这个错误 可以把订阅链接发给我看一下
问题找到了,不是订阅的锅,是我socks5代理设置的问题
好的
发自我的iPhone
------------------ 原始邮件 ------------------
发件人: EnnawYang <[email protected]>
发送时间: 2020年1月12日 09:08
收件人: coolsnowwolf/lede <[email protected]>
抄送: William Chan <[email protected]>, Author <[email protected]>
主题: 回复:[coolsnowwolf/lede] luci-app-ssr-plus 彻底解决更新订阅慢的问题,顺便兼容SSD节点 (#2721)
我编译的这个订阅功能没有问题。就是隔一段时间 出现err /usr/bin/ssr-redir[22369]: server recv: Connection reset peer,从定向链接被节点重置。那位大侠知道怎么回事吗? 在 2020年1月12日星期日,hzjnet [email protected] 写道:
…
昨天晚上用的好好的 今天早上起来就发现一大堆错误日志,前面的已经被覆盖了 看不到了,
Sun Jan 12 08:31:28 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:31:40 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:31:58 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:32:10 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:32:28 2020 user.notice shadowsocksr: ssr local error.restart!
Sun Jan 12 08:32:40 2020 user.notice shadowsocksr: ssr local error.restart!
......
手动点击下更新订阅 如果依然这个错误 可以把订阅链接发给我看一下
问题找到了,不是订阅的锅,是我socks5代理设置的问题
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub, or unsubscribe.
今天测试了一下订阅,好像出现解析错误
2020-01-11 21:24:55 Shadowsocks/ShadowsocksR 1 Threads Started!
[C]: ?
/usr/share/shadowsocksr/subscribe.lua:284: in main chunk
[C]: in function 'xpcall'
/usr/share/shadowsocksr/subscribe.lua:206: in function
/usr/share/shadowsocksr/subscribe.lua:79: in function 'base64Decode'
/usr/share/shadowsocksr/subscribe.lua:293: in function
2020-01-11 21:24:53 stack traceback:
2020-01-11 21:24:53 更新失败服务正在恢复
2020-01-11 21:24:53 发生错误, 正在恢复服务
好像是解析节点有问题,测试节点:
ss://[email protected]:1111#%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1
已经更新 看是否可以
今天测试了一下订阅,好像出现解析错误
2020-01-11 21:24:55 Shadowsocks/ShadowsocksR 1 Threads Started!
[C]: ?
/usr/share/shadowsocksr/subscribe.lua:284: in main chunk
[C]: in function 'xpcall'
/usr/share/shadowsocksr/subscribe.lua:206: in function
/usr/share/shadowsocksr/subscribe.lua:79: in function 'base64Decode'
/usr/share/shadowsocksr/subscribe.lua:293: in function
2020-01-11 21:24:53 stack traceback:
2020-01-11 21:24:53 更新失败服务正在恢复
2020-01-11 21:24:53 发生错误, 正在恢复服务
好像是解析节点有问题,测试节点:
ss://[email protected]:1111#%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1已经更新 看是否可以

不行,算了,我把订阅连接发给你吧,邮箱是[email protected]?
今天测试了一下订阅,好像出现解析错误
2020-01-11 21:24:55 Shadowsocks/ShadowsocksR 1 Threads Started!
[C]: ?
/usr/share/shadowsocksr/subscribe.lua:284: in main chunk
[C]: in function 'xpcall'
/usr/share/shadowsocksr/subscribe.lua:206: in function
/usr/share/shadowsocksr/subscribe.lua:79: in function 'base64Decode'
/usr/share/shadowsocksr/subscribe.lua:293: in function
2020-01-11 21:24:53 stack traceback:
2020-01-11 21:24:53 更新失败服务正在恢复
2020-01-11 21:24:53 发生错误, 正在恢复服务
好像是解析节点有问题,测试节点:
ss://[email protected]:1111#%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1已经更新 看是否可以
不行,算了,我把订阅连接发给你吧,邮箱是[email protected]?
对的 因为我测试你上面发的那两条是通了
今天测试了一下订阅,好像出现解析错误
2020-01-11 21:24:55 Shadowsocks/ShadowsocksR 1 Threads Started!
[C]: ?
/usr/share/shadowsocksr/subscribe.lua:284: in main chunk
[C]: in function 'xpcall'
/usr/share/shadowsocksr/subscribe.lua:206: in function
/usr/share/shadowsocksr/subscribe.lua:79: in function 'base64Decode'
/usr/share/shadowsocksr/subscribe.lua:293: in function
2020-01-11 21:24:53 stack traceback:
2020-01-11 21:24:53 更新失败服务正在恢复
2020-01-11 21:24:53 发生错误, 正在恢复服务
好像是解析节点有问题,测试节点:
ss://[email protected]:1111#%E6%B5%8B%E8%AF%95%E6%9C%8D%E5%8A%A1已经更新 看是否可以
不行,算了,我把订阅连接发给你吧,邮箱是[email protected]?对的 因为我测试你上面发的那两条是通了
我怀疑里面夹杂了一些奇怪的东西,base64解码是用网页上的,可能少了一些。
邮件已经发送,注意查收。
@caicaicai21 改是改好了 但是你提供给我的 格式很奇怪我不清楚哪一种才是正确的格式
因为的连接中 包含两种 我先提交上来 你试一下
@caicaicai21 改是改好了 但是你提供给我的 格式很奇怪我不清楚哪一种才是正确的格式
因为的连接中 包含两种 我先提交上来 你试一下

测试通过。有两种格式的话,有一种应该就是其他的信息,例如:剩余流量xxx。
我帮你测过时没问题的
ss的连接太奇怪了 password部分 有些base64有些没有
有些整个连接base64 有些部分字段base64 搞不明白
我帮你测过时没问题的
ss的连接太奇怪了 password部分 有些base64有些没有
有些整个连接base64 有些部分字段base64 搞不明白
每个机场都瞎搞呗,有些又不遵循规则。
我帮你测过时没问题的
ss的连接太奇怪了 password部分 有些base64有些没有
有些整个连接base64 有些部分字段base64 搞不明白
是这样的,ss的链接有两种格式。
一种是最开始就支持的,格式如下:
BASE64 encoded URI format configs:
ss://BASE64-ENCODED-STRING-WITHOUT-PADDING#TAG
也就是对method:password@ip:port部分整体进行一次base64,你可以看这个页面 https://shadowsocks.org/en/config/quick-guide.html
另一种就是新增的sip002格式,只对userinfo部分进行base64。
目前国内机场提供的订阅链接通常都是sip002格式的。
然而因为ss官方客户端都不支持sip002格式,于是机场们单个节点提供链接的时候就又是第一种格式了(目前sspanel的似乎都是这样)…
我发现我进了个坑啊,之前shell处理的应该也没有那么全。
发自我的iPhone
------------------ 原始邮件 ------------------
发件人: adamw92 <[email protected]>
发送时间: 2020年1月12日 16:15
收件人: coolsnowwolf/lede <[email protected]>
抄送: William Chan <[email protected]>, Author <[email protected]>
主题: 回复:[coolsnowwolf/lede] luci-app-ssr-plus 彻底解决更新订阅慢的问题,顺便兼容SSD节点 (#2721)
我帮你测过时没问题的
ss的连接太奇怪了 password部分 有些base64有些没有
有些整个连接base64 有些部分字段base64 搞不明白
是这样的,ss的链接有两种格式。
一种是最开始就支持的,格式如下:
BASE64 encoded URI format configs:
ss://BASE64-ENCODED-STRING-WITHOUT-PADDING#TAG
也就是对method:password@ip:port部分整体进行一次base64,你可以看这个页面 https://shadowsocks.org/en/config/quick-guide.html
另一种就是新增的sip002格式,只对userinfo部分进行base64。
目前国内机场提供的订阅链接通常都是sip002格式的。
然而因为ss官方客户端都不支持sip002格式,于是机场们单个节点提供链接的时候就又是第一种格式了(目前sspanel的似乎都是这样)…
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub, or unsubscribe.
@adamw92 看样子SS是最麻烦的 其他的都还好 怪不得我以前用SS客户端的时候 有些很乱
我发现我进了个坑啊,之前shell处理的应该也没有那么全。 发自我的iPhone
…
------------------ 原始邮件 ------------------ 发件人: adamw92 <[email protected]> 发送时间: 2020年1月12日 16:15 收件人: coolsnowwolf/lede <[email protected]> 抄送: William Chan <[email protected]>, Author <[email protected]> 主题: 回复:[coolsnowwolf/lede] luci-app-ssr-plus 彻底解决更新订阅慢的问题,顺便兼容SSD节点 (#2721) 我帮你测过时没问题的 ss的连接太奇怪了 password部分 有些base64有些没有 有些整个连接base64 有些部分字段base64 搞不明白 是这样的,ss的链接有两种格式。 一种是最开始就支持的,格式如下: BASE64 encoded URI format configs: ss://BASE64-ENCODED-STRING-WITHOUT-PADDING#TAG 也就是对method:password@ip:port部分整体进行一次base64,你可以看这个页面 https://shadowsocks.org/en/config/quick-guide.html 另一种就是新增的sip002格式,只对userinfo部分进行base64。 目前国内机场提供的订阅链接通常都是sip002格式的。 然而因为ss官方客户端都不支持sip002格式,于是机场们单个节点提供链接的时候就又是第一种格式了(目前sspanel的似乎都是这样)… — You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.
之前的shell处理的是sip002格式的,机场们提供的订阅也是sip002。
ssr+插件单独添加节点信息的那里的导入节点链接支持的是普通的ss链接,订阅不需要再支持了…
订阅支持sip002格式就好了,验证的时候也用sip002去验证。
需要sip002格式的订阅用于验证我可以发给你
这个我已经支持了,两种都做了容错处理。
发自我的iPhone
------------------ 原始邮件 ------------------
发件人: adamw92 <[email protected]>
发送时间: 2020年1月12日 21:59
收件人: coolsnowwolf/lede <[email protected]>
抄送: William Chan <[email protected]>, Author <[email protected]>
主题: 回复:[coolsnowwolf/lede] luci-app-ssr-plus 彻底解决更新订阅慢的问题,顺便兼容SSD节点 (#2721)
我发现我进了个坑啊,之前shell处理的应该也没有那么全。 发自我的iPhone
…
------------------ 原始邮件 ------------------ 发件人: adamw92 <[email protected]> 发送时间: 2020年1月12日 16:15 收件人: coolsnowwolf/lede <[email protected]> 抄送: William Chan <[email protected]>, Author <[email protected]> 主题: 回复:[coolsnowwolf/lede] luci-app-ssr-plus 彻底解决更新订阅慢的问题,顺便兼容SSD节点 (#2721) 我帮你测过时没问题的 ss的连接太奇怪了 password部分 有些base64有些没有 有些整个连接base64 有些部分字段base64 搞不明白 是这样的,ss的链接有两种格式。 一种是最开始就支持的,格式如下: BASE64 encoded URI format configs: ss://BASE64-ENCODED-STRING-WITHOUT-PADDING#TAG 也就是对method:password@ip:port部分整体进行一次base64,你可以看这个页面 https://shadowsocks.org/en/config/quick-guide.html 另一种就是新增的sip002格式,只对userinfo部分进行base64。 目前国内机场提供的订阅链接通常都是sip002格式的。 然而因为ss官方客户端都不支持sip002格式,于是机场们单个节点提供链接的时候就又是第一种格式了(目前sspanel的似乎都是这样)… — You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.
之前的shell处理的是sip002格式的,机场们提供的订阅也是sip002。
ssr+插件单独添加节点信息的那里的导入节点链接处理的就是这个格式。
订阅支持sip002格式就好了,验证的时候也用sip002去验证。
需要sip002格式的订阅用于验证我可以发给你
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub, or unsubscribe.
用v2rayN客户端导出的服务器订阅内容不能被解析,报错:
2020-01-13 00:33:57 发生错误, 正在恢复服务
[C]: ?
/usr/share/shadowsocksr/subscribe.lua:284: in main chunk
[C]: in function 'xpcall'
/usr/share/shadowsocksr/subscribe.lua:206: in function
</usr/share/shadowsocksr/subscribe.lua:160>
/usr/share/shadowsocksr/subscribe.lua:79: in function 'base64Decode'
/usr/share/shadowsocksr/subscribe.lua:286: in function
</usr/share/shadowsocksr/subscribe.lua:284>
2020-01-13 00:33:57 stack traceback:
2020-01-13 00:33:57 /usr/share/shadowsocksr/subscribe.lua:79: attempt to index a nil value
2020-01-13 00:33:57 (2.99 MB/s) - written to stdout [441/441]
0K 100% 2.99M=0s
Saving to: 'STDOUT'
Length: 441 [application/octet-stream]
HTTP request sent, awaiting response... 200 OK
之前的shell版本可以识别的虽然也报有一个错误提示 base64: invalid input,但是至少能用
v2rayN客户端导出的服务器订阅内容是这样的:
dm1lc3M6Ly9ldzBLSUNBaWRpSTZJQ0l5SWl3TkNpQWdJbkJ6SWpvZ0luUmxjM1FpTEEwS0lDQWlZV1JrSWpvZ0luZDNkeTVtY21WbE5qWTJOaTV1WlhRaUxBMEtJQ0FpY0c5eWRDSTZJQ0kwTkRNaUxBMEtJQ0FpYVdRaU9pQWlNVE00TW1WbFpHSXRaR0UzWlMwMFpqUm1MVGczWkRRdE1qbGhaREF3WlRneE9EZGlJaXdOQ2lBZ0ltRnBaQ0k2SUNJMk5DSXNEUW9nSUNKdVpYUWlPaUFpZDNNaUxBMEtJQ0FpZEhsd1pTSTZJQ0p1YjI1bElpd05DaUFnSW1odmMzUWlPaUFpSWl3TkNpQWdJbkJoZEdnaU9pQWlMekU0TkRJMU56TTVMeUlzRFFvZ0lDSjBiSE1pT2lBaWRHeHpJZzBLZlE9PQ0K
根据最新的pr修改看是否可以
发自我的iPhone
------------------ 原始邮件 ------------------
发件人: QING LIU <[email protected]>
发送时间: 2020年1月13日 00:44
收件人: coolsnowwolf/lede <[email protected]>
抄送: William Chan <[email protected]>, Author <[email protected]>
主题: 回复:[coolsnowwolf/lede] luci-app-ssr-plus 彻底解决更新订阅慢的问题,顺便兼容SSD节点 (#2721)
用v2rayN客户端导出的服务器订阅内容不能被解析,报错:
2020-01-13 00:33:57 发生错误, 正在恢复服务 [C]: ? /usr/share/shadowsocksr/subscribe.lua:284: in main chunk [C]: in function 'xpcall' /usr/share/shadowsocksr/subscribe.lua:206: in function lua:160> /usr/share/shadowsocksr/subscribe.lua:79: in function 'base64Decode' /usr/share/shadowsocksr/subscribe.lua:286: in function lua:284> 2020-01-13 00:33:57 stack traceback: 2020-01-13 00:33:57 /usr/share/shadowsocksr/subscribe.lua:79: attempt to index a nil value 2020-01-13 00:33:57 (2.99 MB/s) - written to stdout [441/441] 0K 100% 2.99M=0s Saving to: 'STDOUT' Length: 441 [application/octet-stream] HTTP request sent, awaiting response... 200 OK
之前的shell版本可以识别的虽然也报有一个错误提示 base64: invalid input,但是至少能用
v2rayN客户端导出的服务器订阅内容是这样的:
dm1lc3M6Ly9ldzBLSUNBaWRpSTZJQ0l5SWl3TkNpQWdJbkJ6SWpvZ0luUmxjM1FpTEEwS0lDQWlZV1JrSWpvZ0luZDNkeTVtY21WbE5qWTJOaTV1WlhRaUxBMEtJQ0FpY0c5eWRDSTZJQ0kwTkRNaUxBMEtJQ0FpYVdRaU9pQWlNVE00TW1WbFpHSXRaR0UzWlMwMFpqUm1MVGczWkRRdE1qbGhaREF3WlRneE9EZGlJaXdOQ2lBZ0ltRnBaQ0k2SUNJMk5DSXNEUW9nSUNKdVpYUWlPaUFpZDNNaUxBMEtJQ0FpZEhsd1pTSTZJQ0p1YjI1bElpd05DaUFnSW1odmMzUWlPaUFpSWl3TkNpQWdJbkJoZEdnaU9pQWlMekU0TkRJMU56TTVMeUlzRFFvZ0lDSjBiSE1pT2lBaWRHeHpJZzBLZlE9PQ0K
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub, or unsubscribe.
根据最新的pr修改看是否可以 发自我的iPhone
…
------------------ 原始邮件 ------------------ 发件人: QING LIU <[email protected]> 发送时间: 2020年1月13日 00:44 收件人: coolsnowwolf/lede <[email protected]> 抄送: William Chan <[email protected]>, Author <[email protected]> 主题: 回复:[coolsnowwolf/lede] luci-app-ssr-plus 彻底解决更新订阅慢的问题,顺便兼容SSD节点 (#2721) 用v2rayN客户端导出的服务器订阅内容不能被解析,报错: 2020-01-13 00:33:57 发生错误, 正在恢复服务 [C]: ? /usr/share/shadowsocksr/subscribe.lua:284: in main chunk [C]: in function 'xpcall' /usr/share/shadowsocksr/subscribe.lua:206: in function lua:160> /usr/share/shadowsocksr/subscribe.lua:79: in function 'base64Decode' /usr/share/shadowsocksr/subscribe.lua:286: in function lua:284> 2020-01-13 00:33:57 stack traceback: 2020-01-13 00:33:57 /usr/share/shadowsocksr/subscribe.lua:79: attempt to index a nil value 2020-01-13 00:33:57 (2.99 MB/s) - written to stdout [441/441] 0K 100% 2.99M=0s Saving to: 'STDOUT' Length: 441 [application/octet-stream] HTTP request sent, awaiting response... 200 OK 之前的shell版本可以识别的虽然也报有一个错误提示 base64: invalid input,但是至少能用 v2rayN客户端导出的服务器订阅内容是这样的: dm1lc3M6Ly9ldzBLSUNBaWRpSTZJQ0l5SWl3TkNpQWdJbkJ6SWpvZ0luUmxjM1FpTEEwS0lDQWlZV1JrSWpvZ0luZDNkeTVtY21WbE5qWTJOaTV1WlhRaUxBMEtJQ0FpY0c5eWRDSTZJQ0kwTkRNaUxBMEtJQ0FpYVdRaU9pQWlNVE00TW1WbFpHSXRaR0UzWlMwMFpqUm1MVGczWkRRdE1qbGhaREF3WlRneE9EZGlJaXdOQ2lBZ0ltRnBaQ0k2SUNJMk5DSXNEUW9nSUNKdVpYUWlPaUFpZDNNaUxBMEtJQ0FpZEhsd1pTSTZJQ0p1YjI1bElpd05DaUFnSW1odmMzUWlPaUFpSWl3TkNpQWdJbkJoZEdnaU9pQWlMekU0TkRJMU56TTVMeUlzRFFvZ0lDSjBiSE1pT2lBaWRHeHpJZzBLZlE9PQ0K — You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.
试了一下你新pr的,可以解析订阅服务器了,谢谢
好东东 👍
楼主厉害,订阅更新非常快
_-替换为+/后再进行encode因为编码后的+/=字符,标准的Base64并不适合直接放在URL里传输,有一些Base64的变种,它们将+/等符号转换为其他符号(如_-),这样就能安全的在URL中传输(Url Safe)了\n分割的节点信息第一个处理了 第二个不是很清楚现在
发自我的iPhone
------------------ 原始邮件 ------------------
发件人: Max Zhao <[email protected]>
发送时间: 2020年1月13日 17:01
收件人: coolsnowwolf/lede <[email protected]>
抄送: William Chan <[email protected]>, Author <[email protected]>
主题: 回复:[coolsnowwolf/lede] luci-app-ssr-plus 彻底解决更新订阅慢的问题,顺便兼容SSD节点 (#2721)
第一个处理了 第二个不是很清楚现在 发自我的iPhone
…
------------------ 原始邮件 ------------------ 发件人: Max Zhao <[email protected]> 发送时间: 2020年1月13日 17:01 收件人: coolsnowwolf/lede <[email protected]> 抄送: William Chan <[email protected]>, Author <[email protected]> 主题: 回复:[coolsnowwolf/lede] luci-app-ssr-plus 彻底解决更新订阅慢的问题,顺便兼容SSD节点 (#2721)
我的错,看到代码了,第一个处理了,
第二种应该是没处理的,我这触发了个错误
2020-01-13 16:20:29 发生错误, 正在恢复服务
[C]: ?
/usr/share/shadowsocksr/subscribe.lua:328: in main chunk
[C]: in function 'xpcall'
/usr/share/shadowsocksr/subscribe.lua:249: in function </usr/share/shadowsocksr/subscribe.lua:199>
/usr/share/shadowsocksr/subscribe.lua:125: in function 'processData'
/usr/share/shadowsocksr/subscribe.lua:29: in function 'split'
/usr/share/shadowsocksr/subscribe.lua:330: in function </usr/share/shadowsocksr/subscribe.lua:328>
2020-01-13 16:20:29 stack traceback:
2020-01-13 16:20:29 /usr/share/shadowsocksr/subscribe.lua:29: attempt to index local 'full' (a nil value)
我手动修改了一下subscribe.lua中这行代码为node = split(base64Decode(raw, true):gsub(" ", "\n"), "\n")后可以正确处理了
ps: 不会lua 现查的lua的文档,可能处理的不好
没什么大问题 就这样改吧 你提pr
发自我的iPhone
------------------ 原始邮件 ------------------
发件人: Max Zhao <[email protected]>
发送时间: 2020年1月13日 17:45
收件人: coolsnowwolf/lede <[email protected]>
抄送: William Chan <[email protected]>, Author <[email protected]>
主题: 回复:[coolsnowwolf/lede] luci-app-ssr-plus 彻底解决更新订阅慢的问题,顺便兼容SSD节点 (#2721)
我手动修改了一下
subscribe.lua中这行代码为node = split(base64Decode(raw, true):gsub(" ", "\n"), "\n")后可以正确处理了

俺也一样,但是略有不同,这样改还是不行
我手动修改了一下
subscribe.lua中这行代码为node = split(base64Decode(raw, true):gsub(" ", "\n"), "\n")后可以正确处理了
俺也一样,但是略有不同,这样改还是不行
你的情况可能和我的不一样,看错误,你应该使用的是v2ray的订阅链接,其返回内容的json格式可能不对,你可以检查一下
我手动修改了一下
subscribe.lua中这行代码为node = split(base64Decode(raw, true):gsub(" ", "\n"), "\n")后可以正确处理了
俺也一样,但是略有不同,这样改还是不行你的情况可能和我的不一样,看错误,你应该使用的是v2ray的订阅链接,其返回内容的json格式可能不对,你可以检查一下
v2ray 订阅
我手动修改了一下
subscribe.lua中这行代码为node = split(base64Decode(raw, true):gsub(" ", "\n"), "\n")后可以正确处理了
俺也一样,但是略有不同,这样改还是不行
v2ray 订阅 json解析失败了 又是什么独特的格式吗?
可以加入对obfs插件的支援么?
v2ray 订阅 json解析失败了 又是什么独特的格式吗?
不知道,报错虽稍微不同但仍然是这个Bug#2748
各位 剩下的靠你们解决一下 我写好了 trim 函数的 我最近会有些忙
v2ray 订阅 json解析失败了 又是什么独特的格式吗?
不知道,报错虽稍微不同但仍然是这个Bug#2748
已处理
PR #2770
节点为空 应该和trim还有0有关 lua的行为和c是一致的 可以从这个方面排查下
发自我的iPhone
------------------ 原始邮件 ------------------
发件人: Max Zhao <[email protected]>
发送时间: 2020年1月15日 00:16
收件人: coolsnowwolf/lede <[email protected]>
抄送: William Chan <[email protected]>, Author <[email protected]>
主题: 回复:[coolsnowwolf/lede] luci-app-ssr-plus 彻底解决更新订阅慢的问题,顺便兼容SSD节点 (#2721)
v2ray的订阅格式有两个版本了,之前的version 1已经找不到说明了,只有version 2版本的(分享链接格式说明(ver-2))
是否还要继续支持version1的订阅格式
v2ray的订阅格式有两个版本了,之前的version 1已经找不到说明了,只有version 2版本的(分享链接格式说明(ver-2))
是否还要继续支持version1的订阅格式
哈哈 太复杂了 v2ray 我看了之前的 shell 脚本支持的也不全 我看PR有人改了一点
所以为啥机场用 SSR 这么多明白了吧? 因为 SSR 的标准很明确
v2ray的订阅格式有两个版本了,之前的version 1已经找不到说明了,只有version 2版本的([分享链接格式说明(ver-2)]
我找到了这个,不知有没有帮助 添加v2ray订阅ver1格式的支持
@SimonsQiu ssr+本身不支持obfs插件,订阅支持了有啥用?
@SimonsQiu ssr+本身不支持obfs插件,订阅支持了有啥用?
是的,SSR不支持呀。订阅支持没有任何的意义,SS才支持。
Most helpful comment
可以加入对obfs插件的支援么?