一个 node ssr 小工具

写了个 node ssr 小工具, 主要是在分享 ssr 的网站上把 base64 图片取下来,
读取里面的 ssr url 。 然后把 url 解码为 ssr 的明文配置。

// ssr

const decodeImage = require(‘jimp‘).read;
const qrcodeReader = require(‘qrcode-reader‘);
const path = url => require(‘path‘).join(__dirname, url)
const log = console.log

new Promise(async () => {
  const html = await get_res(‘https://show.free**.info/‘) // * 号的地方为和谐处理 ^_^
  const ssList = ((await getHtmlSrInfo(html)) || []).filter(item => item.password && item.port)
  console.log(‘ssList‘, ssList)
})

function get_res (url, is_down = false) {
  // 根据 url 获取 res, is_down: 是否下载
  return new Promise((resolve, reject) => {
    require(url.replace(/^(.*):\/\/.*/, ‘$1‘)).get(url, res => {
      const { statusCode } = res;
      let contentLength = parseInt(res.headers[‘content-length‘]);
      if(statusCode !== 200) {
        reject(statusCode)
      }
      let data = ‘‘;
      if(is_down) {
        res.setEncoding(‘binary‘);
      } else {
        res.setEncoding(‘utf8‘);
      }
      res.on(‘data‘, function (chunk) {
        data += chunk;
        if(is_down) {
          let length = ((data.length) / contentLength) * 100;
          let percent = parseInt(((length).toFixed(0)));
          // 终端进度条
          process.stdout.write(`${url.split(‘/‘).slice(-1)[0]} 已下载/总共 = ${data.length}/${contentLength} = ${percent}/100\r`);
        }
      });
      res.on(‘end‘, function () {
        if(!is_down) {
          data.toString(‘utf8‘)
        }
        resolve(data)
      });
    }).setTimeout(3000, () => {
      log(‘超时‘)
      reject(‘‘)
    })
  })
}

function getHtmlSrInfo (html) {
  let str = html
  let imgReg = /<a.*?(?:>|\/>)/gi; // 获取开始标签
  let srcReg = /href=[\‘\"]?(data[^\‘\"]*)[\‘\"]?/i;
  let arr = str.match(imgReg);
  let base64list = []
  for (let index = 0; index < arr.length; index++) {
   let src = arr[index].match(srcReg);
   //获取图片地址
   if(src && src[1]){
     base64list.push(src[1]) // 得到属性
   }
  }

  return Promise.all(base64list.map(img => {
    return new Promise((resolve, reject) => {
      srBase64pngDecode(img, url => {
        resolve({...srDecode(url), img})
      })
    })
  }))
}

// 从 base64 二维码图片中读取信息
function srBase64pngDecode(srBase64png, cb) {
  var base64 = srBase64png
  base64Data = base64.replace(‘data:image/png;base64,‘, ‘‘)
  var buf = Buffer.from(base64Data, ‘base64‘)
  decodeImage(buf, function (err, image) {
    if (!err) {
      let decodeQR = new qrcodeReader();
      decodeQR.callback = function (errorWhenDecodeQR, result) {
        if (result) {
          console.log(‘二维码内容‘, result.result);  //结果
          cb(result.result)
        } else {
          console.log(‘解码二维码错误‘)
        }
      };
      decodeQR.decode(image.bitmap);
    } else {
      console.log(‘渲染图片错误‘)
    }
  });
}

// 解码ssr
function ssrDecode(url) {
  let data = Buffer.from(url.replace(‘ssr://‘, ‘‘), ‘base64‘).toString(‘utf8‘)
  let arr = data.split(‘:‘);
  value = {
    url,
    ip: arr[0],
    port: arr[1].trim(),
    password: Buffer.from(arr[5].split(‘/?‘)[0], ‘base64‘).toString(‘utf8‘),
    obfs: arr[4],
    method: arr[3],
    protocol: arr[2],
  }
  return value
}

// 解码ss
function ssDecode(url) {
  let data = Buffer.from(url.replace(‘ss://‘, ‘‘), ‘base64‘).toString(‘utf8‘)
  let arr = data.split(‘:‘);
  value = {
    url,
    ip: arr[1].split(‘@‘)[1],
    port: arr[2].trim(),
    password: arr[1].split(‘@‘)[0],
    method:  arr[0],
  }
  return value
}

// 解码 ss 或 ssr
function srDecode(url) {
  if (url.startsWith(‘ssr://‘)) {
    return ssrDecode(url)
  } else if (url.startsWith(‘ss://‘)) {
    return ssDecode(url)
  } else if (url === ‘‘) {
    console.log(‘地址为空‘)
  } else {
    console.log(‘地址错误‘)
  }
}

?

原文地址:https://www.cnblogs.com/daysme/p/11143539.html

时间: 2024-10-09 02:03:05

一个 node ssr 小工具的相关文章

node.js小工具——模板生成器

前言 我在做小程序的时候经常要新建页面,而且每个页面就是一个目录,每个目录里面都要创建四个文件. 感觉过于繁琐,写了一个小工具偷懒一下 app.js 1 const fs = require('fs'); 2 const dirName = 'hello'; // your new dir name 3 const url = `./${dirName}`; 4 const init = [ 5 { 6 url: `${url}/${dirName}.js`, 7 content: 'const

Python学习之旅:用Python制作一个打字训练小工具

一.写在前面 说道程序员,你会想到什么呢?有人认为程序员象征着高薪,有人认为程序员都是死肥宅,还有人想到的则是996和 ICU. 别人眼中的程序员:飞快的敲击键盘.酷炫的切换屏幕.各种看不懂的字符代码. 然而现实中的程序员呢?对于很多程序员来说,没有百度和 Google 解决不了的问题,也没有 ctrl + c 和 ctrl + v 实现不了的功能. 那么身为一个程序员,要怎么让自己看起来更加“专业”呢?答案就是加快自己的打字速度了,敲的代码可能是错的,但这个13却是必须装的! 然而还是有不少人

一个看股票的小工具

上图是这个小工具的截图 主要包含以下功能: 1.护眼功能  45分钟进入护眼模式, 3分钟后恢复(如想进入桌面, 双击蓝色的倒计时即可) 2.添加一些提示, 显示在桌面, 便于提醒一些重要的事情 3.桌面透明(通过窗体下的桌面截图实现), 单击文字刷新 4.支持按时间提醒 如 11:00:00 点外卖 18:54:10 关机 (真的会关机哦) 5. 显示关注的股票的实时报价 10秒刷新一次 在配置文件中设置你想看的股票编号哦 示例: Url=http://hq.sinajs.cn/list=s_

看到一个词语提取小工具,分享给有标签、词库需求的同学们

关于词语小工具的描述快戳下面链接~~~ https://forum.huaweicloud.com/thread-8391-1-1.html 不想看文章,想立即试用小工具的,请戳下面~~~http://fe2e6fd859034d40a3269f7b541e31de.apigw.cn-north-1.huaweicloud.com/ 原文地址:http://blog.51cto.com/13716423/2107097

闲来无事,编写一个数据迁移小工具

一.前言 生命不息,折腾不止.近期公司有数据迁移的计划,从Sqlserver迁移到mysql,虽说网上有很多数据迁移方案,但闲着也是闲着,就自己整一个,权当做是练练手了 二.解决思路 整个迁移过程类似于ETL,将数据从来源端经过抽取(extract).转换(transform).加载(load)至目的端.读取并转换sqlserver库数据,将数据解析为csv文件,载入文件到mysql.流程如下: 抽取.转换此过程主要是处理源数据库与目标数据库表字段的映射关系,为了保证程序的通用性,通过配置文件映

教你写一个web远程控制小工具

惯例先上图 晚上躺床上了,发现忘关电脑了,又不想起来关,来用手机控制电脑多好,百度了下,果然一大把.哈,我自己为什么不自己也实现个呢,任意的自己diy.Just do it. 如果不想看如何实现,那么直接用下面的吧: web操控端:http://smallyard.cn/jobhub/ 控制端jar包: http://files.cnblogs.com/files/smallyard/jobhub-client.rar 运行:java -jar joghub-client.jar [你的密码]

给常用电脑人士推荐一个护眼小工具

f.lux创意十足很贴心的一款自动屏幕亮度色彩调节,创意在于会根据时间变化,自动调节电脑屏幕的亮度.色彩,让电脑屏幕始终适合保持在适合阅读的状态.f.lux 会据此判断日出.日落时间,分析出特定时间的光照强度,并以此为依据调节屏幕. 传送门:f.lux

又写了一个pyqt4的小工具主要用来学习

部分代码: # -*- coding: utf-8 -*- """Module implementing PortScan.""" from PyQt4.QtCore import pyqtSignaturefrom PyQt4.QtGui import QDialogfrom PyQt4 import QtGui,QtCorefrom Ui_PortScan import Ui_PortScanimport socketclass PortSc

自制工具:迅速打开一个Node 环境的Playground

需求 经常有这种情况,写代码的时候需要实验种想法,亟需一种playground 环境来玩耍.如果是前端的话可以打开chrome 的控制台,但是如果是Node 的话就比较麻烦了.我要打开我的存放试验代码的目录,创建新目录,创建js 文件,打开编辑器开始写代码.这一系列麻烦的流程直接导致我的生活质量下降.要是可以自动化这个流程就好了.我想要的是在终端敲一个命令然后就帮我把这些事都办了,然后现成的编辑器呈现在我面前,直接开始敲代码. 方案 有了自制工具:上传修改过的文件到指定服务器 的经验,现在我只需