• 欢迎来到THBWiki!如果您是第一次来到这里,请点击右上角注册一个帐户
  • 有任何意见、建议、求助、反馈都可以在 讨论板 提出
  • THBWiki以专业性和准确性为目标,如果你发现了任何确定的错误或疏漏,可在登录后直接进行改正

模块:沙盒/外链平台识别

来自THBWiki
跳到导航 跳到搜索
Lua-Logo.svg 模块文档[创建]
local p = {}

local data = {
    -- 社交平台
    ['微博'] = 'weibo.com',
    ['Facebook'] = 'facebook.com',
    ['Twitter'] = 'twitter.com',
    ['X'] = 'x.com',
    ['QQ群'] = 'jq.qq.com',
    ['Telegram'] = 't.me',

    -- 投稿平台
    ['哔哩哔哩'] = 'bilibili.com',
    ['Youtube'] = 'youtube.com',
    ['Niconico'] = 'nicovideo.jp',
    ['Odysee'] = 'odysee.com',
    ['QQ音乐'] = 'y.qq.com',
    ['网易云音乐'] = 'music.163.com',
    ['Apple Music'] = 'music.apple.com',
    ['酷狗'] = 'kugou.com',
    ['虾米'] = 'xiami.com',
    ['Bandcamp'] = 'bandcamp.com',
    ['Booth'] = 'booth.pm',
    ['SoundCloud'] = 'soundcloud.com',
    ['Pixiv'] = 'pixiv.net',

    -- 通贩平台
    ['Dizzylab'] = 'dizzylab.net',
    ['淘宝'] = 'taobao.com',
    ['Steam'] = 'steampowered.com',
    ['Melonbooks'] = 'melonbooks.co.jp',

    -- 其他平台
    ['Lofter'] = 'lofter.com',
    ['Wordpress'] = 'wordpress.com',
    ['新浪博客'] = 'blog.sina.com.cn',
    ['网易博客'] = 'blog.163.com',
    ['天窗联盟'] = 'doujin.bgm.tv',
    ['Tumblr'] = 'tumblr.com',
    ['Wixsite'] = 'wixsite.com',
    ['Sakura Blog'] = 'sakura.ne.jp',
    ['Jimdo'] = {
        'jimdo.com',
        'jimdofree.com',
        'jimdosite.com'
    },
    ['Fc2'] = 'fc2.com',
    ['Ameba'] = 'ameblo.jp',
}

-- 统一数据格式
for k, v in pairs(data) do
    if type(v) == 'string' then
        data[k] = { v }
    end
end

-- 提取主机名
local function get_hostname(url)
    url = url:lower()
    local host = url:match('^https?://([^:/]+)')
    return host
end

-- 判断 host 是否匹配某个域名
local function match_domain(host, domain)
    return host == domain
        or host:sub(-#domain - 1) == ('.' .. domain)  -- 子域名
end

function p._identify(args)
    local url = args['网址'] or args[1] or ''
    local default = args['名称'] or args[2] or '网站'

    if url == '' then
        return '缺少参数'
    end

    local host = get_hostname(url)

    if not host then
        return '网址错误'
    end

    for name, item in pairs(data) do
        for _, domain in ipairs(item) do
            if match_domain(host, domain) then
                return name
            end
        end
    end

    return default
end

function p.identify(frame)
    local args = frame:getParent().args
    return p._identify(args)
end

return p