Files
openit/utils/rm/major.js
GitHub Actions cd995d7629 Hello World
2022-06-30 02:18:52 +00:00

242 lines
8.7 KiB
JavaScript

const Clash = require('clash-proxy');
const axios = require('axios');
const cp = require('child_process');
const path = require("path");
const fs = require("fs");
const parser = require('./parser')
const http = require("http");
const ProgressBar = require('./process-bar')
const config = require("./config");
const os = require("os");
let file = null;
let list = null;
let resList = [];
let finalList = [];
let clash;
async function startClash(){
return new Promise((res,rej)=>{
let subProgress = cp.spawn(getPath('clash'),['-f','./config.yml'],{cwd:path.join(process.cwd())})
subProgress.stdout.on('data',(d)=>{
let dataAfter = Buffer.from(d).toString('utf8')
if(dataAfter.includes('level=info msg="RESTful API listening at: [::]:38888"')){
res()
}
})
})
}
async function convert(){
const base64 = Buffer.from(file, 'utf-8').toString('base64');
http.createServer(((req, res) => {
res.writeHead(200);
res.end(base64)
})).listen(7867);
let result = await axios('http://127.0.0.1:25500/sub?target=clash&remove_emoji=false&url=http%3A%2F%2F127.0.0.1%3A7867%2F');
fs.writeFileSync('config.yml',result.data.replace('7890','6688').replace('7891','6699').replace('9090','38888'))
}
async function startSub(){
return new Promise((res,rej)=>{
let subProgress = cp.spawn(getPath('subconverter'),[],{cwd:path.join(process.cwd(),'./subconverter/'),shell:true})
subProgress.stderr.on('data',(d)=>{
let dataAfter = Buffer.from(d).toString('utf8')
if(dataAfter.includes('Startup completed. Serving HTTP @ http://0.0.0.0:25500')){
res()
}
})
})
}
async function start(){
file = fs.readFileSync('out',"utf-8")
list = parser.read('out')
await startSub();
console.log('Subconverter start ok!!!');
await convert();
console.log('Convert ok!!!');
await startClash();
console.log('Clash ok!!!');
clash = Clash({
secret: '',
api: 'http://127.0.0.1:38888'
});
await axios.patch('http://127.0.0.1:38888/configs',{"mode":"Global"});
await test();
await finish();
process.exit(0);
}
async function test(){
let pb = new ProgressBar('Progressing...', 50);
let num = 0, total = list.length;
for(let i=0;i<list.length;i++){
let proxy = list[i];
proxy.media = {netflix:'',bilibili:'',disney:''}
await axios.put('http://127.0.0.1:38888/proxies/'+encodeURIComponent('🔰 节点选择'),{"name":proxy.name})
//bilibili 港澳台
try{
let res = await axios.get('https://api.bilibili.com/pgc/player/web/playurl?avid=18281381&cid=29892777&qn=0&type=&otype=json&ep_id=183799&fourk=1&fnver=0&fnval=16&session=${randsession}&module=bangumi',{proxy: {
protocol: 'http',
host: '127.0.0.1',
port: 6688,
}});
if(res.data.code === 0){
try{
let res2 = await axios.get('https://api.bilibili.com/pgc/player/web/playurl?avid=50762638&cid=100279344&qn=0&type=&otype=json&ep_id=268176&fourk=1&fnver=0&fnval=16&session=${randsession}&module=bangumi',{proxy: {
protocol: 'http',
host: '127.0.0.1',
port: 6688,
}});
if(res2.data.code === 0 ){
proxy.media.bilibili = 'B(T)'
}else{
proxy.media.bilibili = 'B'
}
}catch(e){
proxy.media.bilibili = 'B'
}
}else{
proxy.media.bilibili = ''
}
}catch(e){
proxy.media.bilibili = ''
}
//netflix
try{
let res = await axios.get('https://www.netflix.com/title/81215567',{proxy: {
protocol: 'http',
host: '127.0.0.1',
port: 6688,
}})
if(res.status === 200 || res.status === 301){
proxy.media.netflix = 'N'
}else{
proxy.media.netflix = 'N(-)'
}
}catch (e){
if(e.response){
if(e.response.status === 404){
proxy.media.netflix = 'N(-)'
}else{
proxy.media.netflix = ''
}
}
}
//disney
try{
let res = await axios.get('https://www.disneyplus.com',{proxy: {
protocol: 'http',
host: '127.0.0.1',
port: 6688,
}})
if(res.status === 200){
proxy.media.disney = 'D'
}else{
proxy.media.disney = ''
}
}catch (e){
proxy.media.disney = ''
}
resList.push(proxy)
pb.render({ completed: i, total: total });
}
pb.render({ completed: total, total: total });
}
async function finish(){
for(let i=0;i<resList.length;i++){
let item = resList[i];
let name = item.name.replace('{{result}}',item.media.netflix+item.media.bilibili+item.media.disney)
switch (item.type){
case 'vmess':
item.data.ps = (name).toString();
finalList.push('vmess://'+Buffer.from(JSON.stringify(item.data),'utf8').toString('base64'));
break
case 'trojan':
finalList.push('trojan://'+item.data+'#'+(name).toString())
break
case 'ss':
finalList.push('ss://'+item.data+'#'+(name).toString())
break
case 'ssr':
finalList.push('ssr://'+Buffer.from(item.data.replace('{name}',Buffer.from((name).toString(),'utf8').toString('base64')),'utf8').toString('base64'));
break
case 'https':
finalList.push('https://'+item.data+'#'+encodeURIComponent(name.toString()))
break
default:
break
}
}
fs.writeFileSync('output',finalList.join('\n'))
}
module.exports = {async start(){
file = fs.readFileSync('out',"utf-8")
list = parser.read('out')
await startSub();
console.log('Subconverter start ok!!!');
await convert();
console.log('Convert ok!!!');
await startClash();
console.log('Clash ok!!!');
clash = Clash({
secret: '',
api: 'http://127.0.0.1:38888'
});
await axios.patch('http://127.0.0.1:38888/configs',{"mode":"Global"});
await test();
await finish();
console.log(' ');
console.log('Successfully finished.Output file:./output');
process.exit(0);
}}
function getPath(i){
switch (i){
case 'clash':
if(os.platform() === 'win32'){
if(os.arch() === 'ia32'){
return './clash/clash-windows-386'
}else if(os.arch() === 'x64'){
return './clash/clash-windows-amd64'
}else{
throw 'Your arch is not supported.Only support x86 and x64.'
}
}else if(os.platform() === 'linux'){
if(os.arch() === 'ia32'){
return path.join(process.cwd()+'/clash/clash-linux-386')
}else if(os.arch() === 'x64'){
return path.join(process.cwd()+'/clash/clash-linux-amd64')
}else{
throw 'Your arch is not supported.Only support x86 and x64.'
}
}else{
throw 'Your OS is not supported.Only support linux and windows.'
}
case 'subconverter':
if(os.platform() === 'win32'){
if(os.arch() === 'ia32'){
return './subconverter/subconverter-ia32.exe'
}else if(os.arch() === 'x64'){
return './subconverter/subconverter-amd64.exe'
}else{
throw 'Your arch is not supported.Only support x86 and x64.'
}
}else if(os.platform() === 'linux'){
if(os.arch() === 'ia32'){
return path.join(process.cwd()+'/subconverter/subconverter-linux32')
}else if(os.arch() === 'x64'){
return path.join(process.cwd()+'/subconverter/subconverter-linux64')
}else{
throw 'Your arch is not supported.Only support x86 and x64.'
}
}else{
throw 'Your OS is not supported.Only support linux and windows.'
}
default:
return null
}
}