独书先生 Menu

Viewing all items for tag nodejs

验证码服务 2Captcha 测评 2022 | 原理 用途 入门

原文:https://lwebapp.com/zh/post/2captcha-review

背景

大家对网页验证码肯定不陌生,几乎所有带有登陆功能的网页或者 APP,都有验证码功能。

验证码不一定每一次登陆都会出现,但是当你登陆多次失败的时候就会让你输入验证码问题答案了,主要是为了防止你恶意登陆其他人的账户。或者有的网站更严格,每一次都会弹出验证码窗口,这种验证码通常为了防止机器人登陆,就像以前的 12306 火车票网站,每次买票的时候都会弹出验证码,而且很难校验成功,确实把脚本拦住了,但是把我们正常用户也拦住了。

Continue reading…

Nodejs Playwright 2Captcha 验证码识别实现自动登陆

原文:https://lwebapp.com/zh/post/bypass-captcha

需求

日常工作当中,为了提高工作效率,我们可能会写脚本来自动执行任务。有些网站因为需要用户登陆,所以脚本的自动登陆功能必不可少。

不过我们在登陆网站的时候经常会出现验证码,验证码的目的就是为了防止机器登陆、自动化脚本操作,那么有没有办法让脚本能自动识别验证码实现登陆呢?

接下来我以 B 站为例给大家讲解下,如何解决自动登陆脚本中最关键的验证码问题。

Continue reading…

Node搭建本地服务器

除了使用 Python搭建本地服务器,还可以前端程序员可以直接使用Node搭建简易服务器

  1. Node.js官网下载对应自己电脑的最新版Node 安装(注意:默认安装不用设置环境变量,否则需要手动配置环境变量)

  2. WIN + R 进入CMD命令行界面 ->  输入:node -v  -> 按Enter , 显示版本号即安装成功

  3. CMD命令行继续输入,

    • Windows输入: npm install anywhere -g
      MAC输入:sudo npm install anywhere -g
  4. CD到你的项目所在的文件夹,输入:anywhere

Node.js学习笔记(4)–Nodejs核心库之Buffer/FileSystem/Stream/Path简单示例总结

1.Buffer(缓冲区)

//Buffer简单示例
//1.创建指定容量的buffer
var buf1 = new Buffer(10);
console.log(buf1);  //Result: <Buffer 88 41 66 ed a0 02 00 00 00 00>

//2.根据数组创建buffer
var buf2 = new Buffer([1,2,3,4,5]);
console.log(buf2);  //Result: <Buffer 01 02 03 04 05>

//3.根据字符串创建buffer
var buf3 = new Buffer('string','utf8');
console.log(buf3); //Result:<Buffer 73 74 72 69 6e 67>
buf3 = new Buffer('string','hex'); //16进制
console.log(buf3); //Result:<Buffer >
//Node.js buffer支持的编码utf8/ascii/utf16le/ucs2/base64/binary/hex

//判断编码是否被支持
console.log(Buffer.isEncoding('ascii')); //Result: true

//判断对象是否是buffer的示例
console.log(Buffer.isBuffer(buf3)); //Resule: true

//获取buffer的字节长度,与编码有关
console.log(Buffer.byteLength('string','hex')); //Resule:3

//连接bufffer,可选参数为最大长度
console.log(Buffer.concat([buf1,buf2,buf3])); //Result:<Buffer f0 a4 99 15 75 01 00 00 d0 a6 01 02 03 04 05>

//将字符串写入buffer
buf1.write('string',0,6,'utf8');
console.log(buf1); //Result:<Buffer 73 74 72 69 6e 67 01 00 00 00>

//将buffer打印出来
console.log(buf1.toString('utf8',0,6)); //Result: string

//将buffer转换为json对象
console.log(buf1.toJSON()); //Result: { type: 'Buffer',
                            //data: [ 115, 116, 114, 105, 110, 103, 0, 0, 0, 0 ] }

//buffer复制
var buf4 = new Buffer(10);
var buf5 = new Buffer('string','utf8');
//将buf5中的第1位开始,第3位结束的内容复制到buf4上的第2位开始的位置
buf5.copy(buf4,2,1,3); //2是buf4的起点,1/3是buf5的起始点/结束点
console.log(buf4.toString('utf8',2,4)); //Result:tr

2.FileSystem(文件系统) / Stream(流) /Path(路径处理)

1)FileSystem 与Stream

var fs = require('fs');
var newFile = './核心库/tpl1.txt';

//追加指定内容到文件
fs.appendFile(newFile,'No.2 New Content','utf8',function (err) {
    if(err){
        console.log(err);
    }
});

//打开文件和关闭文件
fs.open(newFile,'w',0666,function (err,fd) { //打开文件时找出fd,后续用于关闭
   if(err){
       throw err;
   }
   //关闭文件时,第一个参数是文件句柄
    fs.close(fd,function (err) {
        if(err){
            console.log(err);
        }
    })
});

//Stream(流) :创建可读可写流
var rStream = fs.createReadStream(newFile,{bufferSize:200});
var wStream = fs.createWriteStream(newFile,{bufferSize:200});

//判断文件是否存在
//同步方法
console.log(fs.existsSync(newFile)); //Result:true
//异步方法
fs.exists(newFile,function (result) {
   console.log(result);  //Result:true
});

//复制文件,
fs.link(newFile,'./核心库/tpl2.txt',function (err) {
    if(err){console.log(err);}
});

//删除文件
fs.unlink('./核心库/tpl2.txt');

//创建文件夹
fs.mkdir('./核心库/mk',function (err) {
    if(err){
        console.log(err);
    }
});
fs.rmdir('./核心库/mk');

2)FileSystem与Path

var fs = require('fs');
var path = require('path');

//递归遍历文件夹下所有文件
function consoleFiles(dir) {
    var files = fs.readdirSync(dir); //只能读取下一级的所有文件或文件夹名
    files.forEach(function (name) {
        var pathName = path.join(dir,name); // 成为一个完整的目录
        if(fs.statSync(pathName).isDirectory()){
            consoleFiles(pathName); //遇到文件夹使用递归继续往下获取一级,直至获取到文件名
        }else{
            console.log(pathName); //遇到文件名即可输出
        }
    });
}
consoleFiles('./核心库');

3)Path

var path = require('path');
var p = 'https://www.dushusir.com/abc/cde.html';

//路径标准化
var p1 = path.normalize(p);
console.log(p1);  //Result: https:\www.dushusir.com\abc\cde.html
//组合多个路径
console.log(path.join('http://dushusir.com/','abc','../abc')); //Result:http:\dushusir.com\abc

//将相对路径换成绝对路径
console.log(path.resolve('./')); //Result: 向上一层 D:\Code\前端开发技术\Node.js\NodeTest
console.log(path.resolve('../')); //Result: 向上两层 D:\Code\前端开发技术\Node.js

//输出路径的直接上级
console.log(path.dirname(p)); //Result: https://www.dushusir.com/abc
//输出路径的最后一部分
console.log(path.basename(p)); //Result: cde.html

//输出扩展名,以最后一个点开始
console.log(path.extname(p)); // Result: .html
//常量
console.log(path.sep); //Result: \
console.log(path.delimiter); //Result: ;

Node.js学习笔记(3)–Nodejs核心库之timers/util/events简单示例总结

1.Node.js核心库之timers

方法 描述
setTimeout 间隔一定时间后执行方法,执行一次
clearTimeout 清除定时器
setInterval 间隔一定时间执行方法,执行执行
clearInterval 清除定时器
setImmediate 类似setTimeout,将代码加入下一个事件循环
clearImmediate 清除setImmediate。

 

JS:

//setTimeout 和 clearTimeout
var i=0;
function print() {
    console.log(i++);
    timeOut = setTimeout(print,1000);
    if(i>10){
        clearTimeout(timeOut);
    }
}

//第二个参数是间隔时间,单位是毫秒
console.time('l1');
var timeOut = setTimeout(print,1000);
console.timeEnd('l1');

Continue reading…

Node.js学习笔记(2)–Nodejs console (控制台)总结简单示例

方法 描述
log 打印日志,支持格式符号%d,%s,%j,%
info 打印提示信息
error 打印错误信息
warn 打印警告信息
dir 打印对象的方法和属性。
time 计时器,和timeEnd成对使用,计算时间区间。
timeEnd 计时器,和time成对使用,计算时间区间。
trace 跟踪函数的执行过程,一般放在函数内部使用。
assert 断言。语法:console.assert(表达式,错误信息)

Continue reading…

Node.js学习笔记(1)–简单的Nodejs示例,同步异步方法调用

var http = require('http');
var exec = require('child_process').exec;

//定义请求触发时的执行代码
function onRequest(request,response){
    console.log('Accept a request!');
/*    response.write('You send a request!');
    response.end();*/
    async(response);
}

//示例化一个服务器
var server = http.createServer(onRequest);

//设置监听端口
server.listen(8080);

console.log('Server is starting...');

//同步方法
function sync() {
    var time = new Date().getTime();
    while(new Date().getTime()<time + 10000);
}
//异步方法
function async(res) {
    exec('find /',{timeout:1000,maxBuffer:2048},function (err,stdout,stderr) {
        console.log('execute');
        res.writeHead(200,{'Content-Type':'text/plain','charset':'utf-8'});
        res.write(stdout);
        res.write('Find complete');
        res.end();
    });
}