var rule = { 类型: '代理', title: 'iptv', alias: 'iptv代理引擎', desc: '仅代理源纯js写法', host: 'hiker://empty', url: '', searchUrl: '', headers: { 'User-Agent': 'PC_UA', }, searchable: 0, quickSearch: 0, filterable: 0, double: true, play_parse: true, limit: 10, class_name: '', class_url: '', lazy: async function () { }, proxy_rule: async function (params) { let {input, proxyPath, getProxyUrl} = this; // log('proxyPath:', proxyPath); // log('getProxyUrl:', getProxyUrl()); // log('params:', params); let resp_not_found = [404, 'text/plain', 'not found']; if (proxyPath === 'live') { let m3u_text = pathLib.readFile('./iptv/iptv.m3u'); let m3u_api = getProxyUrl().split('?')[0] + 'jsyd'; let m3u_content = m3u_text.replaceAll('http://$api', m3u_api); return [200, 'text/plain', m3u_content] } else if (proxyPath === 'jsyd') { const {p, id} = params; if (!p || !id) { return resp_not_found } const cleanId = id.replace('.m3u8', ''); const authParams = await fHurl(cleanId, p); const redirectUrl = `http://tptvh.mobaibox.com/${p}/lookback/${cleanId}/${cleanId}?${authParams}&Author=DaBenDan`; return [302, null, '', {location: redirectUrl}] } return resp_not_found }, action: async function (action, value) { if (action === 'only_proxy') { return '此源为纯代理源,你直接复制代理地址拿去用就好了' } return `没有动作:${action}的可执行逻辑` }, 推荐: async function () { let {getProxyUrl} = this; let live_url = getProxyUrl().split('?')[0] + 'live'; log('live_url:', live_url); return [{ vod_id: 'only_proxy', vod_name: '这是个纯代理源哦', vod_tag: 'action' }, { vod_id: JSON.stringify({ actionId: '代理地址', id: 'proxy_iptv', type: 'input', title: '直接用的代理m3u链接', value: live_url, }), vod_name: '复制代理地址', vod_tag: 'action' } ] }, 一级: async function () { return [] }, 二级: async function () { return {} }, 搜索: async function () { return [] } } // 模拟 PHP 的 f_curl 函数 const fCurl = async (url, headers = {}, data = null, resolveHosts = null, includeHeaders = false) => { try { const options = { url, method: data ? 'POST' : 'GET', headers, data, validateStatus: () => true, }; if (resolveHosts) { options.headers['Host'] = resolveHosts; } const response = await axios(options); return includeHeaders ? response.headers : response.data; } catch (error) { console.error('Error in fCurl:', error.message); return null; } }; // 模拟 PHP 的 f_hurl 函数 const fHurl = async (id, pt, attempt = 1) => { if (attempt > 3) { throw new Error('404'); } const headers = {'User-Agent': 'okhttp/3.12.0'}; const requestBody = JSON.stringify({ContentID: id}); const response = await fCurl('http://223.105.251.59:33200/EPG/Ott/jsp/Auth.jsp', headers, requestBody); if (!response) { throw new Error('404'); } const auth = response?.AuthCode; if (!auth) { throw new Error('404'); } if (auth === 'accountinfo=') { return fHurl(id, pt, attempt + 1); } const decodedAuth = decodeURIComponent(auth).split(':')[0] + ',END'; return decodedAuth; };