del: JSBox
Before Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 65 KiB |
Before Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 7.8 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 9.6 KiB |
Before Width: | Height: | Size: 8.2 KiB |
@ -1,22 +0,0 @@
|
||||
{
|
||||
"info": {
|
||||
"name": "Rules-lhie1",
|
||||
"url": "https://raw.githubusercontent.com/Fndroid/jsbox_script/master/Rules-lhie1/.output/Rules-lhie1.box",
|
||||
"version": "1.8.1",
|
||||
"author": "Fndroid",
|
||||
"website": "https://github.com/Fndroid/jsbox_script/tree/master/Rules-lhie1",
|
||||
"types": 15
|
||||
},
|
||||
"settings": {
|
||||
"minSDKVer": "1.0.0",
|
||||
"minOSVer": "10.0.0",
|
||||
"idleTimerDisabled": false,
|
||||
"autoKeyboardEnabled": false,
|
||||
"keyboardToolbarEnabled": false,
|
||||
"rotateDisabled": false
|
||||
},
|
||||
"widget": {
|
||||
"tintColor": "",
|
||||
"iconColor": ""
|
||||
}
|
||||
}
|
@ -1 +0,0 @@
|
||||
# Custom
|
@ -1,30 +0,0 @@
|
||||
[General]
|
||||
// Auto
|
||||
loglevel = notify
|
||||
dns-server = system,1.2.4.8,223.5.5.5,223.6.6.6
|
||||
skip-proxy = 127.0.0.1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12,100.64.0.0/10,17.0.0.0/8,localhost,*.local,*.crashlytics.com
|
||||
|
||||
// iOS
|
||||
external-controller-access = lhie1@0.0.0.0:6170
|
||||
|
||||
allow-wifi-access = true
|
||||
|
||||
// macOS
|
||||
interface = 0.0.0.0
|
||||
socks-interface = 0.0.0.0
|
||||
port = 8888
|
||||
socks-port = 8889
|
||||
|
||||
enhanced-mode-by-rule = false
|
||||
show-error-page-for-reject = true
|
||||
|
||||
// Auto
|
||||
exclude-simple-hostnames = true
|
||||
ipv6 = true
|
||||
replica = false
|
||||
|
||||
[Replica]
|
||||
hide-apple-request = true
|
||||
hide-crashlytics-request = true
|
||||
hide-udp = false
|
||||
use-keyword-filter = false
|
@ -1 +0,0 @@
|
||||
// custom header rewrite
|
@ -1 +0,0 @@
|
||||
// custom host
|
@ -1,3 +0,0 @@
|
||||
enable = true
|
||||
ca-passphrase = 4B676386
|
||||
ca-p12 = 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
|
@ -1,10 +0,0 @@
|
||||
[Proxy Group]
|
||||
🍃 Proxy = select,🏃 Auto,🚀 Direct,Proxy Header
|
||||
|
||||
🍂 Domestic = select,🚀 Direct,🍃 Proxy
|
||||
|
||||
🍎 Only = select,🚀 Direct,Proxy Header
|
||||
|
||||
☁️ Others = select,🚀 Direct,🍃 Proxy
|
||||
|
||||
🏃 Auto = url-test,ProxyHeader,url = http://www.gstatic.com/generate_204,interval = 1200
|
@ -1 +0,0 @@
|
||||
// custom ssid
|
@ -1 +0,0 @@
|
||||
// custom url rewrite
|
@ -1 +0,0 @@
|
||||
感谢所有可爱的支持者!
|
@ -1,55 +0,0 @@
|
||||
console.clear()
|
||||
|
||||
const app = require('scripts/app')
|
||||
const init = require('scripts/init')
|
||||
const today = require('scripts/today')
|
||||
const extension = require('scripts/extension')
|
||||
const updateUtil = require('scripts/updateUtil')
|
||||
const siri = require('scripts/siri')
|
||||
|
||||
$app.autoKeyboardEnabled = true
|
||||
$app.rotateDisabled = true
|
||||
$app.keyboardToolbarEnabled = true
|
||||
|
||||
let query = $context.query
|
||||
|
||||
$objc('notification').invoke('objectForKey')
|
||||
|
||||
if (query.auto == 1) {
|
||||
app.autoGen()
|
||||
return
|
||||
}
|
||||
|
||||
if ($app.env === $env.today) {
|
||||
today.renderTodayUI()
|
||||
return
|
||||
} else if ($app.env === $env.safari) {
|
||||
extension.renderExtensionUI()
|
||||
return
|
||||
} else if ($app.env === $env.action) {
|
||||
extension.collectRules()
|
||||
return
|
||||
} else if ($app.env === $env.siri) {
|
||||
siri.renderSiriUI()
|
||||
return
|
||||
}
|
||||
|
||||
app.setUpWorkspace()
|
||||
|
||||
init.asyncInitialize()
|
||||
|
||||
app.renderUI()
|
||||
|
||||
updateUtil.getLatestVersion({
|
||||
handler: version => {
|
||||
if (updateUtil.needUpdate(version, updateUtil.getCurVersion())) {
|
||||
$http.get({
|
||||
url: 'https://raw.githubusercontent.com/Fndroid/jsbox_script/master/Rules-lhie1/updateLog.md' + '?t=' + new Date().getTime(),
|
||||
handler: resp => {
|
||||
updateUtil.updateScript(version)
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
}
|
||||
})
|
@ -1 +0,0 @@
|
||||
true
|
@ -1,325 +0,0 @@
|
||||
const app = require('scripts/app')
|
||||
|
||||
const FILE = 'data.js'
|
||||
|
||||
let screenHeight = $device.info.screen.height
|
||||
const screenWidth = $device.info.screen.width
|
||||
|
||||
const iPhoneX = screenWidth == 375 && screenHeight == 812
|
||||
if (iPhoneX) {
|
||||
screenHeight -= 48
|
||||
}
|
||||
|
||||
let renderExtensionUI = function () {
|
||||
const host = $context.safari.items.location.hostname
|
||||
$ui.render({
|
||||
props: {
|
||||
title: "增加规则"
|
||||
},
|
||||
views: [{
|
||||
type: "scroll",
|
||||
props: {
|
||||
id: "mainScrollView",
|
||||
bgcolor: $color("#f0f5f5")
|
||||
},
|
||||
layout: $layout.fill,
|
||||
views: [{
|
||||
type: "label",
|
||||
props: {
|
||||
text: "当前网页路径"
|
||||
},
|
||||
layout: (make, view) => {
|
||||
make.width.equalTo(view.super)
|
||||
make.left.equalTo(5)
|
||||
make.height.equalTo(30)
|
||||
make.top.equalTo(view.super.top).offset(10)
|
||||
}
|
||||
}, {
|
||||
type: "text",
|
||||
props: {
|
||||
editable: false,
|
||||
text: $context.safari.items.baseURI
|
||||
},
|
||||
layout: (make, view) => {
|
||||
make.top.equalTo(view.prev.bottom).offset(5)
|
||||
make.width.equalTo(view.super)
|
||||
make.height.equalTo(60)
|
||||
}
|
||||
}, {
|
||||
type: "label",
|
||||
props: {
|
||||
text: "规则匹配项"
|
||||
},
|
||||
layout: (make, view) => {
|
||||
make.width.equalTo(view.super)
|
||||
make.left.equalTo(5)
|
||||
make.height.equalTo(30)
|
||||
make.top.equalTo(view.prev.bottom).offset(10)
|
||||
}
|
||||
}, {
|
||||
type: "list",
|
||||
props: {
|
||||
rowHeight: 60,
|
||||
id: "styleList",
|
||||
template: {
|
||||
views: [{
|
||||
type: "label",
|
||||
props: {
|
||||
id: "styleName",
|
||||
font: $font("bold", 16)
|
||||
},
|
||||
layout: (make, view) => {
|
||||
make.width.equalTo(view.super)
|
||||
make.height.equalTo(view.super).dividedBy(2)
|
||||
make.left.equalTo(view.super.left).offset(15)
|
||||
make.top.equalTo(view.super.top).offset(5)
|
||||
}
|
||||
}, {
|
||||
type: "label",
|
||||
props: {
|
||||
id: "styleValue",
|
||||
},
|
||||
layout: (make, view) => {
|
||||
make.width.equalTo(view.super)
|
||||
make.height.equalTo(view.super).dividedBy(2)
|
||||
make.left.equalTo(view.super.left).offset(15)
|
||||
make.top.equalTo(view.prev.bottom).offset(-10)
|
||||
}
|
||||
}, {
|
||||
type: "image",
|
||||
props: {
|
||||
id: "styleSelected",
|
||||
bgcolor: $color("#ffffff")
|
||||
},
|
||||
layout: (make, view) => {
|
||||
make.centerY.equalTo(view.super)
|
||||
make.height.width.equalTo(20)
|
||||
make.right.equalTo(view.super.right).offset(-20)
|
||||
}
|
||||
}]
|
||||
}
|
||||
},
|
||||
layout: (make, view) => {
|
||||
make.top.equalTo(view.prev.bottom).offset(5)
|
||||
make.width.equalTo(view.super)
|
||||
make.height.equalTo(0)
|
||||
},
|
||||
events: {
|
||||
didSelect: (sender, indexPath, data) => {
|
||||
let uiData = sender.data.map((i, idx) => {
|
||||
return {
|
||||
styleName: i.styleName,
|
||||
styleValue: i.styleValue,
|
||||
styleSelected: { data: null }
|
||||
}
|
||||
})
|
||||
uiData[indexPath.row].styleSelected = { data: $file.read("assets/selected_icon.png") }
|
||||
sender.data = uiData
|
||||
sender.info = indexPath.row
|
||||
}
|
||||
}
|
||||
}, {
|
||||
type: "label",
|
||||
props: {
|
||||
text: "选择代理"
|
||||
},
|
||||
layout: (make, view) => {
|
||||
make.width.equalTo(view.super)
|
||||
make.left.equalTo(5)
|
||||
make.height.equalTo(30)
|
||||
make.top.equalTo(view.prev.bottom).offset(10)
|
||||
}
|
||||
}, {
|
||||
type: "list",
|
||||
props: {
|
||||
id: "proxyList",
|
||||
rowHeight: 40,
|
||||
template: {
|
||||
views: [{
|
||||
type: "label",
|
||||
props: {
|
||||
id: "proxyName"
|
||||
},
|
||||
layout: (make, view) => {
|
||||
make.centerY.equalTo(view.super)
|
||||
make.width.equalTo(view.super).offset(-80)
|
||||
make.height.equalTo(view.super)
|
||||
make.left.equalTo(view.super.left).offset(15)
|
||||
}
|
||||
}, {
|
||||
type: "image",
|
||||
props: {
|
||||
id: "proxySelected",
|
||||
bgcolor: $color("#ffffff")
|
||||
},
|
||||
layout: (make, view) => {
|
||||
make.centerY.equalTo(view.super)
|
||||
make.height.width.equalTo(20)
|
||||
make.right.equalTo(view.super.right).offset(-20)
|
||||
}
|
||||
}]
|
||||
}
|
||||
},
|
||||
layout: (make, view) => {
|
||||
make.top.equalTo(view.prev.bottom).offset(5)
|
||||
make.width.equalTo(view.super)
|
||||
make.height.equalTo(0)
|
||||
},
|
||||
events: {
|
||||
didSelect: (sender, indexPath, data) => {
|
||||
let uiData = sender.data.map((i, idx) => {
|
||||
return {
|
||||
proxyName: i.proxyName,
|
||||
proxySelected: { data: null }
|
||||
}
|
||||
})
|
||||
uiData[indexPath.row].proxySelected = { data: $file.read("assets/selected_icon.png") }
|
||||
sender.data = uiData
|
||||
sender.info = indexPath.row
|
||||
}
|
||||
}
|
||||
}, {
|
||||
type: "label",
|
||||
props: {
|
||||
text: "添加规则",
|
||||
align: $align.center,
|
||||
bgcolor: $color("#fff")
|
||||
},
|
||||
layout: (make, view) => {
|
||||
make.width.equalTo(view.super)
|
||||
make.height.equalTo(40)
|
||||
make.top.equalTo(view.prev.bottom).offset(20)
|
||||
},
|
||||
events: {
|
||||
tapped: sender => {
|
||||
if ($("styleList").info !== null && $("proxyList").info !== null) {
|
||||
let styleName = $("styleList").data[$("styleList").info].styleName.text
|
||||
let styleValue = $("styleList").data[$("styleList").info].styleValue.text
|
||||
let proxy = $("proxyList").data[$("proxyList").info].proxyName.text
|
||||
let rule = [styleName, styleValue, proxy].join(',')
|
||||
saveRule(rule)
|
||||
$context.close()
|
||||
} else {
|
||||
$ui.alert("请选择匹配项和代理")
|
||||
}
|
||||
}
|
||||
}
|
||||
}]
|
||||
}]
|
||||
})
|
||||
let styles = genStyleDefaultData(host)
|
||||
let styleListHeight = styles.length * 60
|
||||
$("styleList").data = styles
|
||||
$("styleList").updateLayout(make => {
|
||||
make.height.equalTo(styleListHeight)
|
||||
})
|
||||
let savedData = JSON.parse($file.read(FILE).string)
|
||||
let proxyGroup = savedData.proxyGroupSettings.split('\n').filter(i => /^(?!\/|#)[\s\S]+=/.test(i)).map(i => i.split(/[\s]*=/)[0])
|
||||
let flatServerData = savedData.workspace.serverData.reduce((all, cur) => {
|
||||
return {
|
||||
rows: all.rows.concat(cur.rows)
|
||||
}
|
||||
}).rows
|
||||
let proxies = ['🚀 Direct'].concat(proxyGroup, ['REJECT', 'REJECT-TINYGIF'], flatServerData.map(i => i.proxyName.text))
|
||||
let proxiesData = genProxyDefaultData(proxies)
|
||||
let proxiesListHeight = proxiesData.length * 40
|
||||
$("proxyList").data = proxiesData
|
||||
$("proxyList").updateLayout(make => {
|
||||
make.height.equalTo(proxiesListHeight)
|
||||
})
|
||||
resizeScrollView(styleListHeight + proxiesListHeight)
|
||||
|
||||
}
|
||||
|
||||
let resizeScrollView = function (listHeight) {
|
||||
$("mainScrollView").contentSize = $size(screenWidth, 350 + listHeight)
|
||||
}
|
||||
|
||||
let genStyleDefaultData = function (domain) {
|
||||
let dp = domain.split('.')
|
||||
let res = []
|
||||
res.push({
|
||||
styleName: { text: 'DOMAIN' },
|
||||
styleValue: { text: domain }
|
||||
})
|
||||
return res.concat(dp.map((item, idx, obj) => {
|
||||
return {
|
||||
styleName: { text: 'DOMAIN-SUFFIX' },
|
||||
styleValue: { text: obj.slice(idx).join('.') }
|
||||
}
|
||||
}))
|
||||
}
|
||||
|
||||
let saveRule = function (rule) {
|
||||
let data = JSON.parse($file.read(FILE).string)
|
||||
data.customSettings += `\n${rule}\n`
|
||||
$file.write({
|
||||
data: $data({ "string": JSON.stringify(data) }),
|
||||
path: FILE
|
||||
})
|
||||
}
|
||||
|
||||
let genProxyDefaultData = function (proxies) {
|
||||
return proxies.map(i => {
|
||||
return {
|
||||
proxyName: { text: i }
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function collectRules() {
|
||||
let confFile = $context.data.string
|
||||
let surgeReg = /\[Rule\]\n([\s\S]+)\n# Custom/
|
||||
let quanReg = /\[SERVER\]\n([\s\S]+)\n\[SOURCE\]/
|
||||
if (surgeReg.test(confFile)) {
|
||||
let matcher = confFile.match(surgeReg)
|
||||
if (matcher.length === 2) {
|
||||
let rules = matcher[1]
|
||||
saveRule(rules)
|
||||
}
|
||||
$context.close()
|
||||
} else if (quanReg.test(confFile)) {
|
||||
let matcher = confFile.match(quanReg);
|
||||
let serversRaw = matcher[1]
|
||||
let servers = serversRaw.split(/[\r\n]+/).filter(i => /.*?=/.test(i))
|
||||
let serverDataItem = {
|
||||
title: "Quantumult导出节点",
|
||||
url: "",
|
||||
rows: servers.map(server => {
|
||||
return {
|
||||
proxyLink: server,
|
||||
proxyName: {
|
||||
bgcolor: false,
|
||||
text: server.split(/=/)[0].trim()
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
let file = JSON.parse($file.read(FILE).string);
|
||||
let workspace = file.workspace;
|
||||
let serverData = workspace.serverData;
|
||||
serverData.unshift(serverDataItem);
|
||||
let success = $file.write({
|
||||
data: $data({ "string": JSON.stringify(file) }),
|
||||
path: FILE
|
||||
})
|
||||
$ui.alert({
|
||||
title: "导入" + success ? '成功': '失败',
|
||||
message: success ? `已经成功导入${serverDataItem.rows.length}个服务器至脚本,请重启脚本查看` : '文件格式有误',
|
||||
actions: [{
|
||||
title: 'OK',
|
||||
handler: () => {
|
||||
$context.close()
|
||||
}
|
||||
}]
|
||||
});
|
||||
} else {
|
||||
$ui.alert("分享文件不合法")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module.exports = {
|
||||
renderExtensionUI: renderExtensionUI,
|
||||
collectRules: collectRules
|
||||
}
|
@ -1,23 +0,0 @@
|
||||
const knownURLs = [
|
||||
{domain: 'api.rixcloud.io', name: 'rixCloud'},
|
||||
{domain: 'dler.cloud', name: 'Dler Cloud'}
|
||||
]
|
||||
|
||||
function getConfName(url) {
|
||||
let matchConst = knownURLs.find(i => url.indexOf(i.domain) > -1)
|
||||
if (matchConst) {
|
||||
return matchConst.name
|
||||
} else {
|
||||
let path = url.split('?')[0].split('/')
|
||||
let filename = path[path.length - 1]
|
||||
if (filename.indexOf('.conf') == filename.length - 5) {
|
||||
return filename.substring(0, filename.length - 5)
|
||||
} else {
|
||||
return filename
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getConfName: getConfName
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
function asyncInitialize() {
|
||||
updateSpecialReg()
|
||||
}
|
||||
|
||||
function updateSpecialReg() {
|
||||
$http.download({
|
||||
showsProgress: false,
|
||||
url: "https://raw.githubusercontent.com/Fndroid/specialReg/master/specialReg.js?t=" + new Date().getTime()
|
||||
}).then(resp => {
|
||||
if (resp.response.statusCode === 200) {
|
||||
let success = $file.write({
|
||||
data: resp.data,
|
||||
path: "scripts/videoReg.js"
|
||||
});
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
asyncInitialize: asyncInitialize
|
||||
}
|
@ -1,87 +0,0 @@
|
||||
let githubRawReg = /^https:\/\/raw\.githubusercontent\.com\/(.*?)\/(.*?)\/master\/(.*?)$/
|
||||
|
||||
const FILE = 'data.js'
|
||||
|
||||
function getRulesReplacement(content = '') {
|
||||
let advanceSettings = content ? content : JSON.parse($file.read(FILE).string)
|
||||
if (advanceSettings.customSettings) {
|
||||
let cs = advanceSettings.customSettings;
|
||||
let pat = cs.match(/\/\/\s*replacement\s*:\s*(.*?)[\n\r]/);
|
||||
if (pat && pat[1]) {
|
||||
return pat[1];
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function getSoftwareType() {
|
||||
let file = JSON.parse($file.read(FILE).string)
|
||||
let workspace = file.workspace
|
||||
let outputFormat = workspace.outputFormat
|
||||
if (outputFormat === 'Surge 3 TF') {
|
||||
return 0
|
||||
} else if (outputFormat === 'Surge 2') {
|
||||
return 2
|
||||
} else if (outputFormat === 'Quantumult') {
|
||||
return 3
|
||||
}
|
||||
return 1
|
||||
}
|
||||
|
||||
function checkUpdate(oldSha, newSha) {
|
||||
return Object.keys(newSha).some(i => oldSha[i] !== newSha[i])
|
||||
}
|
||||
|
||||
function setFilesSha(sha) {
|
||||
let file = JSON.parse($file.read(FILE).string)
|
||||
file['repoSha'] = sha
|
||||
$file.write({
|
||||
data: $data({ "string": JSON.stringify(file) }),
|
||||
path: FILE
|
||||
})
|
||||
}
|
||||
|
||||
function getFilesSha() {
|
||||
let file = JSON.parse($file.read(FILE).string)
|
||||
return file['repoSha'] || {}
|
||||
}
|
||||
|
||||
function getGitHubFilesSha(params) {
|
||||
params.handler({})
|
||||
}
|
||||
|
||||
function getRepoInfo() {
|
||||
let owner = 'lhie1';
|
||||
let repoName = 'Rules';
|
||||
let filePath = 'Auto';
|
||||
let softwareType = getSoftwareType()
|
||||
if (softwareType === 0) {
|
||||
filePath = 'Auto_New'
|
||||
} else if (softwareType === 3) {
|
||||
filePath = 'Quantumult'
|
||||
}
|
||||
console.log(filePath)
|
||||
let rulesRep = getRulesReplacement();
|
||||
if (rulesRep) {
|
||||
let reg = rulesRep.match(githubRawReg);
|
||||
if (reg && reg.length === 4) {
|
||||
owner = reg[1];
|
||||
repoName = reg[2];
|
||||
filePath = reg[3];
|
||||
}
|
||||
}
|
||||
return { owner, repoName, filePath };
|
||||
}
|
||||
|
||||
function getLatestCommitMessage(params) {
|
||||
params.handler(null)
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
checkUpdate: checkUpdate,
|
||||
getGitHubFilesSha: getGitHubFilesSha,
|
||||
setFilesSha: setFilesSha,
|
||||
getFilesSha: getFilesSha,
|
||||
getLatestCommitMessage: getLatestCommitMessage,
|
||||
getRepoInfo: getRepoInfo
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
const ruleUpdateUtil = require('scripts/ruleUpdateUtil');
|
||||
|
||||
function siriRun() {
|
||||
|
||||
}
|
||||
|
||||
function renderSiriUI() {
|
||||
$intents.height = 100
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
siriRun: siriRun,
|
||||
renderSiriUI: renderSiriUI
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
function pc(x) {
|
||||
let sw = $device.info.screen.width
|
||||
return x * sw / 100
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
pc: pc
|
||||
}
|
@ -1,49 +0,0 @@
|
||||
module.exports = {
|
||||
init: (address, port, clearFirst = true, debug = true) => {
|
||||
var oldLog = console.log;
|
||||
var oldInfo = console.info;
|
||||
var oldWarn = console.warn;
|
||||
var oldError = console.error;
|
||||
let start = clearFirst
|
||||
var socket = $socket.new(`ws://${address}:${port}`);
|
||||
socket.open()
|
||||
console.log = function (obj) {
|
||||
if (debug) {
|
||||
let msg = JSON.stringify({ type: 'log', args: Array.prototype.slice.call(arguments) });
|
||||
start = sendMessage(start, socket, msg);
|
||||
}
|
||||
oldLog.apply(console, arguments);
|
||||
}
|
||||
console.info = function (obj) {
|
||||
if (debug) {
|
||||
let msg = JSON.stringify({ type: 'info', args: Array.prototype.slice.call(arguments) });
|
||||
start = sendMessage(start, socket, msg);
|
||||
}
|
||||
oldInfo.apply(console, arguments);
|
||||
}
|
||||
console.warn = function (obj) {
|
||||
if (debug) {
|
||||
let msg = JSON.stringify({ type: 'warn', args: Array.prototype.slice.call(arguments) });
|
||||
start = sendMessage(start, socket, msg);
|
||||
}
|
||||
oldWarn.apply(console, arguments);
|
||||
}
|
||||
console.error = function (obj) {
|
||||
if (debug) {
|
||||
let msg = JSON.stringify({ type: 'error', args: Array.prototype.slice.call(arguments) });
|
||||
start = sendMessage(start, socket, msg);
|
||||
}
|
||||
oldError.apply(console, arguments);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function sendMessage(start, socket, msg) {
|
||||
if (start) {
|
||||
socket.send(JSON.stringify({ type: "_open" }));
|
||||
start = false;
|
||||
}
|
||||
socket.send(msg);
|
||||
return start;
|
||||
}
|
||||
|
@ -1,60 +0,0 @@
|
||||
function getCurVersion() {
|
||||
let version = $file.read("version.fndroid").string
|
||||
return version
|
||||
}
|
||||
|
||||
function needRestart() {
|
||||
return $http.get({
|
||||
url: 'https://raw.githubusercontent.com/Fndroid/jsbox_script/master/Rules-lhie1/restart.fndroid'
|
||||
})
|
||||
}
|
||||
|
||||
function getLatestVersion(params) {
|
||||
$http.get({
|
||||
url: 'https://raw.githubusercontent.com/Fndroid/jsbox_script/master/Rules-lhie1/version.fndroid' + '?t=' + new Date().getTime(),
|
||||
handler: res => {
|
||||
params.handler(res.data)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function updateScript(version) {
|
||||
let url = 'https://raw.githubusercontent.com/Fndroid/jsbox_script/master/Rules-lhie1/.output/Rules-lhie1.box' + '?t=' + new Date().getTime()
|
||||
const scriptName = $addin.current.name
|
||||
let downloadBox = $http.download({
|
||||
url: url
|
||||
})
|
||||
Promise.all([downloadBox, needRestart()]).then(res => {
|
||||
let box = res[0].data
|
||||
let restart = /true/.test(res[1].data)
|
||||
$addin.save({
|
||||
name: scriptName,
|
||||
data: box,
|
||||
handler: (success) => {
|
||||
if (success) {
|
||||
$ui.toast(`更新完成`)
|
||||
if (restart) {
|
||||
$delay(0.3, () => {
|
||||
$addin.run(scriptName)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function needUpdate(nv, ov) {
|
||||
let getVersionWeight = i => {
|
||||
return i.split('.').map(i => i * 1).reduce((s, i) => s * 100 + i)
|
||||
}
|
||||
return getVersionWeight(nv) > getVersionWeight(ov)
|
||||
}
|
||||
|
||||
|
||||
module.exports = {
|
||||
getCurVersion: getCurVersion,
|
||||
getLatestVersion: getLatestVersion,
|
||||
updateScript: updateScript,
|
||||
needUpdate: needUpdate
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
module.exports = {
|
||||
Netflix: /(?=USER-AGENT,Argo\*,|DOMAIN-SUFFIX,netflix.com,|DOMAIN-SUFFIX,netflix.net,|DOMAIN-SUFFIX,nflxext.com,|DOMAIN-SUFFIX,nflximg.com,|DOMAIN-SUFFIX,nflximg.net,|DOMAIN-SUFFIX,nflxvideo.net,|IP-CIDR,23.246.0.0\/12,|IP-CIDR,37.77.0.0\/12,|IP-CIDR,45.57.0.0\/12,|IP-CIDR,64.120.128.0\/17,|IP-CIDR,66.197.128.0\/17,|IP-CIDR,108.175.0.0\/12,|IP-CIDR,185.2.0.0\/12,|IP-CIDR,185.9.188.0\/22,|IP-CIDR,192.173.64.0\/18,|IP-CIDR,198.38.0.0\/12,|IP-CIDR,198.45.0.0\/12,)[^\n]+/g,
|
||||
Spotify: /(?=PROCESS-NAME,Spotify,|DOMAIN-SUFFIX,spoti.fi,|DOMAIN-KEYWORD,spotify,|USER-AGENT,\*Spotify\*,|DOMAIN-SUFFIX,scdn.co,|DOMAIN-SUFFIX,spotify.com,)[^\n]+/g,
|
||||
YouTube: /(?=USER-AGENT,com.google.ios.youtube\*,|USER-AGENT,YouTube\*,|DOMAIN-SUFFIX,googlevideo.com,|DOMAIN-SUFFIX,youtube.com,|DOMAIN-KEYWORD,youtube,)[^\n]+/g,
|
||||
MytvSUPER: /(?=DOMAIN-KEYWORD,nowtv100,|DOMAIN-KEYWORD,rthklive,|DOMAIN-SUFFIX,mytvsuper.com,|DOMAIN-SUFFIX,tvb.com,)[^\n]+/g,
|
||||
BBC: /(?=USER-AGENT,BBCiPlayer\*,|USER-AGENT,BBCBeacon\*,|DOMAIN-KEYWORD,co.uk,|DOMAIN-KEYWORD,uk-live,|DOMAIN-SUFFIX,bbc.co,|DOMAIN-SUFFIX,bbc.com,|DOMAIN-SUFFIX,bbci.co.uk,|DOMAIN-SUFFIX,bbc.co.uk,|DOMAIN-SUFFIX,vod-hls-uk-live.akamaized.net,)[^\n]+/g,
|
||||
LINE: /(?=DOMAIN-SUFFIX,lin.ee,|DOMAIN-SUFFIX,line.me,|DOMAIN-SUFFIX,line.naver.jp,|DOMAIN-SUFFIX,line-apps.com,|DOMAIN-SUFFIX,line-cdn.net,|DOMAIN-SUFFIX,line-scdn.net,|DOMAIN-SUFFIX,nhncorp.jp,|IP-CIDR,103.2.28.0\/22,|IP-CIDR,119.235.224.0\/21,|IP-CIDR,119.235.232.0\/23,|IP-CIDR,119.235.235.0\/24,|IP-CIDR,119.235.236.0\/23,|IP-CIDR,125.6.146.0\/24,|IP-CIDR,125.6.149.0\/24,|IP-CIDR,125.6.190.0\/24,|IP-CIDR,125.209.208.0\/20,|IP-CIDR,203.104.103.0\/24,|IP-CIDR,203.104.128.0\/20,|IP-CIDR,203.174.66.64\/26,|IP-CIDR,203.174.77.0\/24,)[^\n]+/g,
|
||||
SoundCloud: /(?=USER-AGENT,SoundCloud\*,|DOMAIN-SUFFIX,soundcloud.com,|DOMAIN-SUFFIX,sndcdn.com,)[^\n]+/g,
|
||||
Google: /(?=DOMAIN-SUFFIX,goo.gl,|DOMAIN-SUFFIX,gvt1.com,|DOMAIN-SUFFIX,youtu.be,|DOMAIN-SUFFIX,ytimg.com,|DOMAIN-SUFFIX,ggpht.com,|DOMAIN-KEYWORD,gmail,|DOMAIN-KEYWORD,google,|DOMAIN-KEYWORD,gstatic,|DOMAIN-KEYWORD,youtube,|USER-AGENT,WalletAPP.app\*,|USER-AGENT,Wallet\*iSL\*,|DOMAIN-SUFFIX,google.com,|DOMAIN-SUFFIX,googleapis.com,)[^\n]+/g,
|
||||
PayPal: /(?=USER-AGENT,PayPal\*,|DOMAIN-KEYWORD,paypal,|DOMAIN-SUFFIX,paypal.com,)[^\n]+/g,
|
||||
Microsoft: /(?=USER-AGENT,Microsoft\*,|USER-AGENT,OneDrive\*,|DOMAIN-KEYWORD,microsoft,|DOMAIN-SUFFIX,bing.com,|DOMAIN-SUFFIX,bing.net,|DOMAIN-SUFFIX,cloudappsecurity.com,|DOMAIN-SUFFIX,docs.com,|DOMAIN-SUFFIX,hotmail.com,|DOMAIN-SUFFIX,live.com,|DOMAIN-SUFFIX,live.net,|DOMAIN-SUFFIX,microsoft.com,|DOMAIN-SUFFIX,msedge.net,|DOMAIN-SUFFIX,msn.com,|DOMAIN-SUFFIX,office.com,|DOMAIN-SUFFIX,office.net,|DOMAIN-SUFFIX,office365.com,|DOMAIN-SUFFIX,onedrive.com,|DOMAIN-SUFFIX,onenote.com,|DOMAIN-SUFFIX,onenote.net,|DOMAIN-SUFFIX,onmicrosoft.com,|DOMAIN-SUFFIX,outlook.com,|DOMAIN-SUFFIX,outlookgroups.ms,|DOMAIN-SUFFIX,visualstudio.com,|DOMAIN-SUFFIX,windows.com,|DOMAIN-SUFFIX,windows.net,|DOMAIN-SUFFIX,windowsupdate.com,)[^\n]+/g,
|
||||
YoutubeMusic: /(?=USER-AGENT,\*youtubemusic\*,|USER-AGENT,YouTubeMusic\*,)[^\n]+/g,
|
||||
TVB: /(?=USER-AGENT,mytv\*,|DOMAIN-SUFFIX,mytvsuper.com,|DOMAIN-KEYWORD,nowtv100,|DOMAIN-KEYWORD,rthklive,|DOMAIN-SUFFIX,tvb.com,|USER-AGENT,OTT_iPhone\*,|USER-AGENT,Viu\*,|DOMAIN-SUFFIX,viu.com,)[^\n]+/g,
|
||||
Vidol: /(?=USER-AGENT,Vidol\*,|DOMAIN-SUFFIX,vidol.tv,)[^\n]+/g,
|
||||
Hulu: /(?=DOMAIN-SUFFIX,hulu.com,)[^\n]+/g
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
"OK" = "OK";
|
||||
"DONE" = "Done";
|
||||
"HELLO_WORLD" = "Hello, World!";
|
@ -1,3 +0,0 @@
|
||||
"OK" = "好的";
|
||||
"DONE" = "完成";
|
||||
"HELLO_WORLD" = "你好,世界!";
|
@ -1 +0,0 @@
|
||||
1.9.90
|