QQ手机版链接直接在Safari中打开

大类
Util
技术标签
逆向-JS
优先级
Low
开始日期
Feb 7, 2022
状态
Abandon
Public
Public
最后更新
Feb 7, 2022
QQ手机版打开部分链接时会强制要求用户手动复制链接,非常繁琐。
使用这个Surge Script可以在右上角在Safari中打开时,解析原始url,然后用302跳过去
  • 模式:Http Request
  • 匹配URL:
    • https://c.pc.qq.com/.*\.html\?pfurl=.*
  • 脚本内容:
    • // qq-direct.js let headers = {}; headers['X-Modified-By'] = 'Surge'; // let oriurl = new URL($request.url).searchParame.get("pfurl") let rawurl = undefined try { rawurl = $request.url } catch (e) { } if (!rawurl || rawurl === "http://www.example.com/") { console.log("[qq-direct] debugging") rawurl = 'https://c.pc.qq.com/middlem.html?pfurl=https%3A%2F%2Fstore.askey.com%2Fadt-3.html&gjsublevel=2804&pfuin=1474702730&pfto=mqq.group&type=0&gjlevel=15' } console.log("[qq-direct] rawurl: " + rawurl) let r = new RegExp(/^https:\/\/c.pc.qq.com\/.*?\?pfurl=(?<oriurl>[^&]+?)&/) let oriurl = rawurl.match(r).groups.oriurl function Decode(string, reservedSet) { const strLen = string.length; let result = ""; for (let k = 0; k < strLen; k++) { let chr = string[k]; let str = chr; if (chr === '%') { const start = k; let byte = +`0x${string.slice(k+1, k+3)}`; if (Number.isNaN(byte) || k + 2 >= strLen) throw new URIError; k += 2; if (byte < 0x80) { chr = String.fromCharCode(byte); str = reservedSet.includes(chr) ? string.slice(start, k + 1) : chr; } else { // the most significant bit in byte is 1 let n = Math.clz32(byte ^ 0xFF) - 24; // Position of first right-most 10 in binary if (n < 2 || n > 4) throw new URIError; let value = byte & (0x3F >> n); if (k + (3 * (n - 1)) >= strLen) throw new URIError; for (let j = 1; j < n; j++) { if (string[++k] !== '%') throw new URIError; let byte = +`0x${string.slice(k+1, k+3)}`; if (Number.isNaN(byte) || ((byte & 0xC0) != 0x80)) throw new URIError; k += 2; value = (value<<6) + (byte & 0x3F); } if (value >= 0xD800 && value < 0xE000 || value >= 0x110000) throw new URIError; if (value < 0x10000) { chr = String.fromCharCode(value); str = reservedSet.includes(chr) ? string.slice(start, k + 1) : chr; } else { // value is ≥ 0x10000 const low = ((value - 0x10000) & 0x3FF) + 0xDC00; const high = (((value - 0x10000) >> 10) & 0x3FF) + 0xD800; str = String.fromCharCode(high) + String.fromCharCode(low); } } } result += str; } return result; } let realurl = Decode(oriurl, "") headers['Location'] = realurl console.log("[qq-direct] realurl: " + realurl) $done({ response: { headers: headers, body: '', status: 302 } })