当前位置: 首页 > 后端技术 > Node.js

为了看P站,也是很辛苦的

时间:2023-04-04 00:04:04 Node.js

参考作者开发的QQ机器人-可以用这个机器人查看P站地图QQ群-Javascript高级爬虫-作者自建群,欢迎加入!P站API国内可用-不好吃的童鞋可以直接吃,免去麻烦添加socks5代理支持,可用。本地验证上一篇介绍了一个可以在国内直接使用的P站API,但是发现有些排名模式没有数据,比如“popularwithmen”(mode=male),导致搜索到的图片不是我想要的是,于是开始在Github上寻找其他解决方案。很容易找到一个pixiv-app-api,浏览器和node.js都可以使用,基于Pixiv官方APP的API。当然,由于众所周知的原因,无法从中国直接访问Pixiv。但是对于码农来说就很难了,只要你用一定的奶就可以了。完全不修改模块内部代码,在调用pixiv-app-api前使用如下代码设置全局代理:process.env.http_proxy='http://127.0.0.1:1080'process.env。https_proxy='http://127.0.0.1:1080'然后在本地验证,好了,可以正常登录查询了!那么,下一步就是如何在服务器上进行。服务器安装某奶客户端。其实某奶的python版有自己的客户端,没错,就是local.py(在子目录下)!但是注意,克隆某奶的manyuser分支,master分支不支持一些参数,比如混淆参数。下面的shell命令行可以后台启动客户端:pythonlocal.py-b127.0.0.1-l1080-s-p-k-m-O-o-dstart其中:某奶服务器IP、服务器端口、密码、加密、协议、混淆,这几个和windows版客户端的几个参数可以一一对应。-b127.0.0.1表示本地代理服务只允许服务器上的本地应用程序使用。如果您不希望您的服务器被扫地出门并反复遭到破坏,请不要将其设置为0.0.0.0。-l1080是本地代理的端口号,socks5代理习惯使用1080端口,当然你也可以改成别的。不过我是用pm2启动的,这样重启后就不用记住这么长的命令行了:pm2start"local.py-b127.0.0.1-l1080-s<某奶服务器IP>-p-k-m-O-ostart"--namemySocks5Proxy启动后可以在服务端使用curl验证:curl-xsocks5h://localhost:1080https://www.google.com上面是curl中使用socks5代理的方法,socks5h的意思是一个milkserver(不是client)负责解析域名。在node.js中使用socks5代理如上一步所示,一个python版的milk客户端只有socks5代理,没有http代理。也就是说,“本地认证”部分采用的简单的更改环境变量的方案是不能直接使用的。有两种方法:使用privoxy将socks5代理转换为http代理。其实最常用的C#版本的Windows客户端就是这种修改pixiv-app-api代码直接使用socks5代理的方案!因为不想引入新的外部依赖,所以选择第二种方式,直接改代码。我分析了pixiv-app-api的源码。它使用axios作为http请求库。axios支持socks5代理。只需安装npm模块socks-proxy-agent。示例代码如下:constSocksProxyAgent=require('socks-proxy-agent')consthttpsAgent=newSocksProxyAgent('socks://127.0.0.1:1080')axios.get('https://www.google.com',{httpsAgent}).then(console.log)神奇修改pixiv-app-api,添加socks5代理支持比较简单:首先确保你已经安装了pixiv-app-api和socks-proxy-agent模块cnpm安装pixiv-app-apisocks-proxy-代理找到node_modules/pixiv-app-api/dist/index.js的第一部分:添加三行代码constbaseURL='https://app-api.pixiv。网/';constSocksProxyAgent=require('socks-proxy-agent');//<<添加一行consthttpsAgent=newSocksProxyAgent('socks://127.0.0.1:1080');//<<添加一行constinstance=axios_1.default.create({baseURL,headers:{'App-OS':'ios','App-OS-Version':'9.3.3','App-Version':'6.0.9',},httpsAgent//<<添加一行});第二节:小修改,增加一个参数constaxiosResponse=awaitaxios_1.default.post('https://oauth.secure.pixiv.net/auth/token',querystring_1.stringify(decamelize_keys_1.default(data)),{headers,httpsAgent});//<<在这一行添加一个httpsAgent参数经过上面的修改,pixiv-app-api终于可以在服务端正常使用了,下面是示例代码,注意调用api只是用来查询插画排名数据,图片其实是从墙内可用的CDN下载的,即i.pixiv.catconstpath=require('path')constrp=require('request-promise')constfs=require('fs-extra')constPixivAppApi=require('pixiv-app-api');(async()=>{constpixiv=newPixivAppApi('pixiv网站账号','pixiv网站密码',{camelcaseKeys:true})letres=awaitpixiv.login()console.log('login:',res)res=awaitpixiv.illustRanking({mode:'week_r18'})constids=res.illusts.map(o=>o.id+'')consturls=res.illusts.map(o=>o.imageUrls.medium).map(u=>u.replace('i.pximg.net','i.pixiv.cat'))res=awaitPromise.all(urls.map(u=>rp.get(u,{encoding:null})))awaitPromise.all(res.map((buf,i)=>{constfn=path.join(__dirname,'pixiv_tmp',ids[i]+'.jpg')returnfs.writeFile(fn,buf)}))})()