├── .gitignore ├── README.md ├── app.js ├── lib ├── checkComplete.js ├── config.js ├── download.js ├── filter.js ├── getImagesArray.js ├── pixivLogin.js └── storage.js ├── package-lock.json ├── package.json ├── run.bat ├── run.vbe └── updateLog.md /.gitignore: -------------------------------------------------------------------------------- 1 | /.cookie 2 | /log 3 | /images 4 | /test.js 5 | /test.bat 6 | /redown.bat 7 | /node_modules 8 | /.vscode 9 | /.idea -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### pixivPicker 2 | 3 | 抓取p站每日前50图片 4 | 5 | ### 运行环境 6 | 7 | 使用前需安装nodejs,[官网下载](http://nodejs.org/) 8 | 9 | ### 安装 10 | 11 | * 使用 git 下载 12 | 稳定版 `git clone https://github.com/iMyon/pixivPicker.git` 13 | * 直接下载压缩包 14 | 点击右边的`download zip` 15 | 16 | 下载完成后在解压后的文件夹打开命令行窗口,运行`npm install` 17 | 运行后大概需要下载十多M的东西 18 | 19 | ### 使用说明 20 | 21 | #### 不带参数运行 22 | 23 | 不带参数会保存在设置文件设置的路径里 24 | 25 | * linux 26 | * 命令行运行 `node app.js` 27 | * windows: 28 | * 右键使用nodejs打开`app.js` 29 | 30 | #### 参数列表 31 | 32 | 参数名 | 描述 33 | ----------|------------ 34 | --path | 保存路径 35 | --url | 请求网址,下面有列表 36 | --abbr | 文件夹命名后缀,如 `--abbr=r_18` 则文件存放路径大致如下path/to/2014/4/15_r18 37 | --username| 用户id,用于模拟登录获取cookie 38 | --passwd | 用户密码,用于模拟登录获取cookie 39 | --force | 跳过下载历史记录,强制重新下载,该参数不需要给定值 40 | --skipce | 不下载相册,该参数不需要给定值 41 | 42 | 示例:`node app.js --skipce --path=/home/myon/pixiv` 43 | 44 | ### 设置 45 | 46 | 所有设置都在`lib/config.js`里,比较重要的选项: 47 | 48 | * `saveFolder`: 下载图片保存的路径,可以填绝对或相对路径 49 | * `maxRetryTime`:下载失败重试次数 50 | * `tabPass` :根据tag过滤关键字,满足条件则此图片不下载 51 | * `tabOnly` :根据tag过滤关键字,只下载tag中包含关键字的图片 52 | `tag`可以自行查看log日志文件分析,格式化日志文件可以[点这里](http://jsbeautifier.org/) 53 | * `fetchUrl`:抓取网页的类型,列表 ,参数--url 可以设置的值 54 | * `pixiv_id`:用户id,用于模拟登录获取cookie,参数--username指定了的话则此设置不生效 55 | * `pass`: 用户密码,用于模拟登录获取cookie,参数--passwd指定了的话则此设置不生效 56 | 57 | 说明 | 地址 58 | ----------------|--------------------------------- 59 | 每日 | https://www.pixiv.net/ranking.php?format=json&mode=daily&p=1 60 | 每日r18 | https://www.pixiv.net/ranking.php?format=json&mode=daily_r18&p=1 61 | 每日r18g | https://www.pixiv.net/ranking.php?format=json&mode=daily_r18g&p=1 62 | 每周 | https://www.pixiv.net/ranking.php?format=json&mode=weekly&p=1 63 | 每周r18 | https://www.pixiv.net/ranking.php?format=json&mode=weekly_r18&p=1 64 | 每日 r18g | https://www.pixiv.net/ranking.php?format=json&mode=weekly_r18g&p=1 65 | 男性 | https://www.pixiv.net/ranking.php?format=json&mode=male&p=1 66 | 女性 | https://www.pixiv.net/ranking.php?format=json&mode=female&p=1 67 | 68 | * `formatString`: 命名filename的格式 ,以下面为例子 69 | 如果填写`${user_name} - ${title}` 则输出 `nico - 勿忘草` 70 | 其它字段如下,都是字面意思 71 | 72 | ``` 73 | { 74 | "illust_id": 43014060, 75 | "title": "勿忘草", 76 | "width": 600, 77 | "height": 360, 78 | "date": "2014年04月21日 00:22", 79 | "tags": ["オリジナル", "女の子", "オリジナル100users入り", "青白黒"], 80 | "url": "http:\/\/i2.pixiv.net\/img32\/img\/apo_lovin\/mobile\/43014060_240mw.jpg", 81 | "user_id": 853948, 82 | "user_name": "nico", 83 | "profile_img": "http:\/\/i2.pixiv.net\/img32\/profile\/apo_lovin\/6488174_s.jpg", 84 | "rank": 53, 85 | "yes_rank": 71, 86 | "total_score": 1426, 87 | "view_count": 3673 88 | } 89 | ``` 90 | 91 | 反正就这几个参数,自己拼下 92 | 93 | ##### cookie设置 94 | 95 | ***如果模拟登录获取不到cookie的话可以试试手动填写*** 96 | r18图片需要设置cookie才能下载,没有这个需求的的可无视此项设置 97 | app.js同目录新建`.cookie`(首次运行也会生成一个示例文件,需替换成自己的才能生效)文件,填写pixiv已登录状态的cookie 98 | 99 | ###### 获取cookie的方法 100 | 101 | 小书签:`javascript:alert(document.cookie);void(0);` 102 | 小书签运行方法可参照[各种浏览器运行所谓「JS代码/脚本」的方法](http://tieba.baidu.com/p/1620692564) 103 | 到p站点击,复制粘贴 104 | 105 | 106 | ### 图片保存目录说明 107 | 108 | 默认保存在当前目录下的images目录 ,带参数的话保存在参数指定目录 109 | 以`yyyy/mm/dd${abbr}`结构的目录保存每日图片,期中日期为服务器日期,不是本地日期 110 | 111 | ### 日志说明 112 | 以`yyyy-MM-dd${abbr}.log`形式保存在`log`目录,json格式 113 | 114 | ### 下载指定作者的全部作品 115 | 传递url参数的时候用作者作品页的链接即可下载所有作品,当前版本占内存较大,慎用。 例子: 116 | 命令行执行 `node app.js --url="https://www.pixiv.net/member_illust.php?id=3096443"` 117 | 保存的目录默认是指定path加作者用户名 118 | 119 | ### 设置定时任务 120 | #### windows下设置定时执行的方法 121 | 122 | ##### 1.控制面板找到计划任务,点击创建任务 123 | ![](http://imgsrc.baidu.com/forum/pic/item/06b921381f30e9242db7d2ab4e086e061c95f74e.jpg) 124 | 125 | ##### 2.按图示设置如下 126 | ![](http://imgsrc.baidu.com/forum/pic/item/29891630e924b8993f2f37a26c061d950b7bf64e.jpg) 127 | ###### 新建触发器,图示为每隔20分执行一次,因为只有首次下载比较耗费网速,所以时间间隔任意 128 | ![](http://imgsrc.baidu.com/forum/pic/item/93e9d809b3de9c82ce14b1156e81800a18d84363.png) 129 | 130 | ###### 启动程序填最新版本的run.vbe所在路径(需和app.js同路径) 131 | 这个是后台静默运行run.bat,不会打开命令行窗口的,下载目录可以在run.bat设置 132 | ![](http://imgsrc.baidu.com/forum/pic/item/8ba26a2762d0f7033400dd460afa513d2797c52f.png) 133 | 134 | ###### 条件选任何连接 135 | ![](http://imgsrc.baidu.com/forum/pic/item/b928a0014c086e0684bb71d100087bf40bd1cb4e.jpg) 136 | 137 | #### linux下设置定时任务 138 | `crontab -e` 139 | 具体百度,很简单 140 | 141 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env:node 2 | // Javascript File 3 | //Filename: app.js 4 | //Created: 2014-04-19 02:26:07 5 | //Desc: 主程序入口,执行 node app.js 6 | //Author: Myon, myon.cn@gmail.com 7 | 8 | var fs = require('fs'); 9 | var path = require('path'); 10 | var mkdirp = require('mkdirp'); 11 | var argv = require('optimist').argv; 12 | var storage = require('./lib/storage.js'); 13 | var download = require('./lib/download.js'); 14 | var config = require('./lib/config.js'); 15 | var pixiv = require('./lib/pixivLogin.js'); 16 | var getImages = require('./lib/getImagesArray.js'); 17 | 18 | if(argv.username){ 19 | config.pixiv.login.form.pixiv_id = argv.username; 20 | } 21 | if(argv.passwd){ 22 | config.pixiv.login.form.password = argv.passwd; 23 | } 24 | 25 | //获取cookie 成功后发送getCookie信号 26 | pixiv.login(config.pixiv.login.form); 27 | 28 | if(config.pixiv.fetchUrl.match("https://www.pixiv.net/ranking.php")){ 29 | pixiv.on("getCookie",getImages.rankImages); 30 | } 31 | else{ 32 | pixiv.on("getCookie",getImages.authorImages); 33 | } 34 | getImages.on("getImages",function(images){ 35 | //处理每个图片下载完成信号 36 | (function(){ 37 | var ccount = 0; //已完成数量 38 | var succount = 0; //下载成功 39 | var failcount = 0; //下载失败 40 | download.on("finishADownload",function(image){ 41 | succount++; 42 | ccount++; 43 | image.complete = true; 44 | console.log(" 下载成功 -> " + image.filename + " 剩余 " + (images.length - ccount)); 45 | if(ccount >= images.length){ 46 | download.emit("allFinished"); 47 | } 48 | image.path = path.join(image.basePath,image.filename); 49 | storage.writeLog(logFile,images); //每下载完一个 写入日志 50 | }); 51 | download.on("hasDownloaded",function(image){ 52 | succount++; 53 | ccount++; 54 | console.log("已经下载过 -> " + image.filename + " 剩余 " + (images.length - ccount)); 55 | if(ccount >= images.length){ 56 | download.emit("allFinished"); 57 | } 58 | }); 59 | //404错误处理 60 | download.on('res404',function(image){ 61 | console.warn(" png下载 -> " + image.filename); 62 | image.url = image.url.replace(/\.jpg/,".png"); 63 | image.filename = image.filename.replace(/\.jpg/,".png"); 64 | download.gen(image,path.join(image.basePath, image.filename),pixiv); 65 | }); 66 | //全部下载完成信号处理 67 | download.on('allFinished',function(){ 68 | storage.writeLog(logFile,images); 69 | console.log("下载结束,成功 " + succount + " ,失败 " + failcount); 70 | //显式结束进程 71 | setTimeout(function(){ 72 | process.exit() 73 | },2000); 74 | }); 75 | //处理下载失败/相册下载 76 | download.on('failDownload',function(image){ 77 | if((image.retryTime||0) < config.pixiv.maxRetryTime){ 78 | //下载次数+1 79 | image.retryTime = (image.retryTime||0) + 1; 80 | console.warn(" 重新下载 -> " + image.filename); 81 | download.gen(image,path.join(image.basePath, image.filename),pixiv); 82 | } 83 | else{ 84 | //删除临时文件 85 | var filePath = path.join(image.basePath,image.filename); 86 | try{ 87 | fs.unlinkSync(filePath); 88 | } catch (e) { 89 | 90 | } 91 | ccount++; 92 | if(!image.is_xiangce) 93 | console.warn(" 下载失败 -> " + image.filename + " -> 已达到下载次数限制"); 94 | if(image.is_xiangce && image.xiangce && image.xiangce.length > 1){ 95 | image.complete = true; 96 | image.xiangce.pop(); 97 | succount++; 98 | console.log(" 下载成功 -> " + image.basePath 99 | + " 剩余 " + (images.length - ccount)); 100 | storage.writeLog(logFile,images); 101 | } 102 | else{ 103 | image.complete = false; 104 | failcount++; 105 | } 106 | if(ccount >= images.length){ 107 | download.emit("allFinished"); 108 | } 109 | } 110 | }); 111 | //开始相册下载 112 | download.on("xiangceDownload",function(image){ 113 | if(! image.xiangce){ //没有则创建并初始化 114 | image.xiangce = []; 115 | console.log("画册下载 -> " + image.filename); 116 | // image.url = image.url.replace(/(\.gif|\.jpg|\.jpeg|\.png)$/,"_p" + 0 + ".jpg"); 117 | image.filename = image.url.match(/\/[^\/]+_p([^\/]+)$/)[1]; 118 | image.is_xiangce = true; 119 | image.xiangce_init = true; 120 | //创建目录 121 | image.basePath = path.join(image.basePath,storage.formatFilename(image,config.pixiv.filenameFormat)); 122 | mkdirp.sync(image.basePath); 123 | // 开始下载 124 | download.gen(image,path.join(image.basePath, image.filename),pixiv); 125 | } 126 | else{ 127 | console.log("下载成功 -> " + path.join( 128 | storage.formatFilename(image,config.pixiv.filenameFormat) 129 | ,image.filename 130 | )); 131 | if(image.filename != image.xiangce[image.xiangce.length-1]) 132 | image.xiangce.push(image.filename); 133 | storage.writeLog(logFile,images); 134 | image.filename = image.xiangce.length + ".jpg"; 135 | image.url = image.url.replace(/_p\d+(\.gif|\.jpg|\.jpeg|\.png)$/,"_p" 136 | + image.filename); 137 | download.gen(image,path.join(image.basePath, image.filename),pixiv); 138 | } 139 | }); 140 | })(); 141 | 142 | for(var k=0;k szBuffer.length / 2; --i) 34 | { 35 | if (szBuffer[i - 5] == 68 && szBuffer[i - 4] == 174 && szBuffer[i - 3] == 66 36 | && szBuffer[i - 2] == 96 && szBuffer[i - 1] == 130) 37 | return true; 38 | } 39 | 40 | 41 | } 42 | 43 | else if (szBuffer[0] == 255 && szBuffer[1] == 216) //jpg 44 | { 45 | //标准jpeg最后出现ff d9 46 | if (szBuffer[szBuffer.length - 2] == 255 && szBuffer[szBuffer.length - 1] == 217) 47 | return true; 48 | else 49 | { 50 | //有好多jpg最后被人为补了些字符也能打得开, 算作完整jpg, ffd9出现在近末端 51 | //jpeg开始几个是特殊字节, 所以最后大于10就行了 从最后字符遍历 52 | //有些文件会出现两个ffd9 后半部分ffd9才行 53 | for (var i = szBuffer.length - 2; i > szBuffer.length / 2; --i) 54 | { 55 | //检查有没有ffd9连在一起的 56 | if (szBuffer[i] == 255 && szBuffer[i + 1] == 217) 57 | return true; 58 | } 59 | } 60 | } 61 | } 62 | 63 | emitter.check = check; 64 | module.exports = emitter; -------------------------------------------------------------------------------- /lib/config.js: -------------------------------------------------------------------------------- 1 | // Javascript File 2 | //Filename: config.js 3 | //Created: 2014-04-19 04:00:28 4 | //Desc: 各种设置 5 | //Author: Myon, myon.cn@gmail.com 6 | 7 | module.exports = { 8 | browser: { 9 | chrome: '' // 例:C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe 10 | }, 11 | pixiv:{ 12 | fetchUrl:'https://www.pixiv.net/ranking.php?format=json&mode=daily&p=1', //抓图网页 13 | login:{ 14 | form:{ 15 | pixiv_id: "", //登录名 16 | password: "", //密码 17 | captcha: "", 18 | g_recaptcha_response:"", 19 | post_key: "", 20 | source: "accounts", 21 | ref: '', 22 | return_to: 'https://www.pixiv.net/' 23 | } 24 | }, 25 | //根据tag过滤不喜欢的图片,英文逗号分隔,满足条件的图片pass 26 | // tag的话可以自行分析log日志文件(js-beautify一下) 27 | //!!!!特别提醒:逗号要用英文的逗号,即"," !!!!! 28 | tagPass:"腐,巨人", 29 | //根据tag过滤出包含设置字符的图片,逗号分隔,不满足的图片pass 30 | //不填则不进行过滤 31 | tagOnly: "", 32 | saveFolder:"images", //保存目录 33 | pathAbbr: "", //目录追加内容 34 | logPath:"log", //日志文件目录 35 | //文件命名格式,可用字段详细说明请到github查看 36 | filenameFormat: "${user_name} - ${title}[pid=${illust_id}]", 37 | maxRetryTime:5, //下载失败重下次数 38 | host:"https://www.pixiv.net/", 39 | headers:{ 40 | 'Referer':"https://www.pixiv.net", 41 | 'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.", 42 | }, 43 | cookieFile:".cookie" 44 | }, 45 | //超过时间未完成直接结束进程(毫秒) 46 | timeout:10*60*1000 //10分钟 47 | }; 48 | -------------------------------------------------------------------------------- /lib/download.js: -------------------------------------------------------------------------------- 1 | // Javascript File 2 | //Filename: download.js 3 | //Created: 2014-04-19 03:15:19 4 | //Desc: 下载 5 | //Author: Myon, myon.cn@gmail.com 6 | 7 | var request = require('request'); 8 | var path = require('path'); 9 | var fs = require('fs'); 10 | var config = require('./config.js'); 11 | var events = require('events'); 12 | var checkComplete = require('./checkComplete.js'); 13 | var emitter = new events.EventEmitter(); 14 | 15 | //desc 下载网络文件到本地目录 16 | //param image 包含图片信息的对象 17 | //param dir 文件保存目录 18 | //param pixiv 模拟登录后获得的信息 19 | //return none 20 | var download = function(image,imagepath,pixiv){ 21 | //如果已经下载过则跳过 22 | if(image.complete === true){ 23 | emitter.emit("hasDownloaded",image); 24 | return; 25 | } 26 | //启用cookie 27 | var j = request.jar(); 28 | var rcookie = ""; 29 | j.setCookie(rcookie, image.url); 30 | request( 31 | { 32 | url:image.url, 33 | headers: config.pixiv.headers, 34 | jar:j 35 | }, 36 | function(err,res,body){ 37 | 38 | 39 | //反送404信号并删除错误文件,尝试用png下载 40 | if(res && res.statusCode == 404 && image.url.match(/\.jpg$/)){ 41 | try{ 42 | fs.unlinkSync(imagepath); //删除jpg文件 43 | } catch (e) {} 44 | emitter.emit("res404",image); 45 | return; 46 | } 47 | //403 fobidden 48 | else if(res && res.statCode == 403){ 49 | } 50 | 51 | //发送图片下载完成信号 52 | else if(res && res.statusCode == 200){ 53 | if(image.is_xiangce){ 54 | emitter.emit("xiangceDownload",image); 55 | } 56 | else{ 57 | // emitter.emit("finishADownload",image); 58 | //检查图片完整性 59 | image.path = imagepath; 60 | checkComplete.check(image); 61 | } 62 | } 63 | else{ 64 | // fs.unlink(path.join(dir,image.filename)); //删除文件 65 | emitter.emit("failDownload",image); 66 | return; 67 | } 68 | }).pipe(fs.createWriteStream(imagepath)); 69 | }; 70 | 71 | checkComplete.on("image_complete", function(image){ 72 | emitter.emit("finishADownload",image); 73 | }); 74 | checkComplete.on("image_not_complete", function(image){ 75 | emitter.emit("failDownload",image); 76 | }); 77 | 78 | emitter.gen = download; 79 | module.exports = emitter; 80 | -------------------------------------------------------------------------------- /lib/filter.js: -------------------------------------------------------------------------------- 1 | var config = require('./config.js'); 2 | 3 | module.exports = { 4 | //desc 根據tag篩選 5 | //param item 包含image信息的对象 6 | //return bool 7 | tagFilter:function(item){ 8 | var tagPass = config.pixiv.tagPass.split(","); 9 | var tagOnly = config.pixiv.tagOnly.split(","); 10 | var is_pass = false; //是否跳过这个图片的下载 11 | //tagOnly 12 | if(config.pixiv.tagOnly !== ""){ 13 | for(var k=0;k 1) 90 | { 91 | //是否跳过图册 92 | if(argv.skipce) continue; 93 | tempimg.is_xiangce = true; 94 | } 95 | //跳过动态图 96 | if(tempimg.illust_type == "2"){ 97 | continue; 98 | } 99 | 100 | tempimg.illustSrc = "https://www.pixiv.net/member_illust.php?mode=medium&illust_id=" + item.illust_id; 101 | // tempimg.url = item.url.replace(/^(.*\/)mobile\/(.*)_.*(\..*)$/g,"$1$2$3"); 102 | tempimg.thumbnail = item.url; 103 | if(!tempimg.url.match(/^(https|http):\/\/.*\.net\/.*img-master.*_master\d+.*/)) 104 | throw "原图获取失败,请联系作者修正 https://github.com/iMyon/pixivPicker/issues"; 105 | tempimg.url = item.url.replace(/^(https|http)(:\/\/.*\.net\/)(.*img-master)(.*)(_master\d+)(.*)/, "$1$2img-original$4$6"); 106 | tempimg.filename = storage.formatFilename(tempimg,config.pixiv.filenameFormat) + ".jpg"; 107 | tempimg.basePath = basePath; 108 | //查看是否成功已经下载过该文件 109 | //如果文件下载过则把image对象的替换,complete为true(之后download那边会判断) 110 | //今日 111 | if(logImages){ 112 | for(var j=0;j)/g," ")); 167 | logImages = storage.readLog(logFile); //读取log日志记录的文件 168 | //初始化promise数组 169 | // console.log($('.work').length); 170 | $('.work').each(function(){ 171 | promises.push(getImagePage(config.pixiv.host + $(this).attr("href").replace(/^\//, ''),pixiv)); 172 | }); 173 | var currentPage = $(".page-list .current"); 174 | if(currentPage.length && currentPage.next().length){ 175 | //递归 176 | getAPage(url.replace(/\?.*$/,"") + currentPage.next().find('a').attr("href"), promises); 177 | } 178 | //全部请求完成后集中处理 179 | else{ 180 | if (!promises.length) { 181 | console.error('找不到图片列表,需要先正确登录'); 182 | process.exit(); 183 | } 184 | Promise.all(promises).then(function(){ 185 | emitter.emit("getImages",images); 186 | }); 187 | } 188 | 189 | }); 190 | } 191 | } 192 | ); 193 | })(config.pixiv.fetchUrl, promises); 194 | }; 195 | 196 | 197 | //通过请求图片页面,获取图片详细信息 198 | //@param url 图片页面 199 | //@retrun promise 200 | var getImagePage = function(url,pixiv){ 201 | var promise = new Promise(function(resolve, reject){ 202 | var j = request.jar(); 203 | var rcookie = request.cookie(pixiv.cookie); 204 | j.setCookie(rcookie, config.pixiv.fetchUrl); 205 | request( 206 | { 207 | url:url, 208 | headers: config.pixiv.headers, 209 | jar:j 210 | }, 211 | function(err,res,body){ 212 | var env = require('jsdom').env; 213 | if(body){ 214 | env(body, function (errors, window) { 215 | var $ = require('jquery')(window); 216 | var image = {}; 217 | // image.is_xiangce = !!$('.page-count').length; 218 | image.illust_id = url.match(/illust_id=(\d+)/)[1]; 219 | //跳过动图下载 220 | if($('.player.toggle').length){ 221 | console.warn("已跳过动图下载,pid="+image.illust_id); 222 | resolve(); 223 | return; 224 | } 225 | image.title = $('.works_display img').attr("alt"); 226 | // image.width = $('meta li').eq(1).text().match(/^(\d+)×/)[1]; 227 | // image.height = $('meta li').eq(1).text().match(/×(\d+)/)[1]; 228 | image.date = $('.meta li').eq(0).text(); 229 | image.tags = Array.prototype.map.call($(".tag"),function(x){ 230 | return $(x).text(); 231 | }); 232 | image.url = $(".original-image").attr("data-src"); 233 | //画册 234 | if($('._work.multiple img').length){ 235 | image.url = $('._work.multiple img').attr('src').replace(/^(https|http)(:\/\/.*\.net\/)(.*img-master)(.*)(_master\d+)(.*)/, "$1$2img-original$4$6"); 236 | image.is_xiangce = true; 237 | } 238 | image.user_id = $(".profile .user-name").attr("href").match(/id=(\d+)/)[1]; 239 | image.user_name = $(".profile .user-name").text(); 240 | image.profile_img = $(".user-image").attr("src"); 241 | image.total_score = $(".rated-count").text(); 242 | image.total_score = $(".view-count").text(); 243 | 244 | image.basePath = path.join(config.pixiv.saveFolder, $(".user").text()); 245 | mkdirp.sync(image.basePath); 246 | image.filename = storage.formatFilename(image,config.pixiv.filenameFormat) + ".jpg"; 247 | for(var i=0; i { 43 | await page.waitFor(() => !!document.querySelector('.header-settings'), {timeout: 600000}); 44 | console.log('登陆成功') 45 | const cookies = await page.cookies(); 46 | const cookie= cookies.map(e => `${e.name}=${encodeURIComponent(e.value)}`).join('; '); 47 | fs.writeFileSync(config.pixiv.cookieFile, cookie); 48 | emitter.cookie = cookies.join(); 49 | emitter.emit("getCookie", emitter); 50 | await browser.close(); 51 | })(); 52 | // 等待验证码处理 53 | if (headless) { 54 | (async () => { 55 | await page.waitFor(() => !!document.querySelector('#g-recaptcha'), {timeout: 300000}); 56 | browser.close(); 57 | console.error('自动登陆失败,请手动登陆'); 58 | login(form, false); 59 | })(); 60 | } 61 | await page.waitForSelector('#LoginComponent .input-field:first-of-type'); 62 | await page.click('#LoginComponent .input-field:first-of-type'); 63 | await page.type('#LoginComponent .input-field:first-of-type', form.pixiv_id, {delay: 40}); 64 | await page.click('#LoginComponent .input-field:last-of-type'); 65 | await page.type('#LoginComponent .input-field:last-of-type', form.password, {delay: 40}); 66 | await page.click('#LoginComponent .signup-form__submit'); 67 | } 68 | }); 69 | }; 70 | 71 | async function getHeadlessBrowser(headless) { 72 | console.log(`正在启动${headless ? 'headless': ''}浏览器`) 73 | let path = await locateChrome(); 74 | if (fs.existsSync(path)) { 75 | } else if (fs.existsSync(config.browser.chrome)) { 76 | path = config.browser.chrome; 77 | } else { 78 | console.error('找不到Chrome执行文件路径,请手动设置/lib/config.js配置文件,\n修改browser下面的chrome配置'); 79 | throw -1; 80 | } 81 | return await require('puppeteer-core').launch({ 82 | headless: headless, 83 | executablePath: path, 84 | }) 85 | } 86 | 87 | emitter.login = login; 88 | module.exports = emitter; 89 | -------------------------------------------------------------------------------- /lib/storage.js: -------------------------------------------------------------------------------- 1 | // Javascript File 2 | //Filename: today-path.js 3 | //Created: 2014-04-19 02:30:29 4 | //Desc: 和数据存储相关的函数 5 | //Author: Myon, myon.cn@gmail.com 6 | 7 | var fs = require('fs'); 8 | var mkdirp = require('mkdirp'); 9 | var config = require('./config.js'); 10 | var path = require('path'); 11 | 12 | 13 | //格式化日期输出 14 | Date.prototype.format = function(format) //author: meizz 15 | { 16 | var o = { 17 | "M+" : this.getMonth()+1, //month 18 | "d+" : this.getDate(), //day 19 | "h+" : this.getHours(), //hour 20 | "m+" : this.getMinutes(), //minute 21 | "s+" : this.getSeconds(), //second 22 | "q+" : Math.floor((this.getMonth()+3)/3), //quarter 23 | "S" : this.getMilliseconds() //millisecond 24 | }; 25 | if(/(y+)/.test(format)) format=format.replace(RegExp.$1, 26 | (this.getFullYear()+"").substr(4 - RegExp.$1.length)); 27 | for(var k in o)if(new RegExp("("+ k +")").test(format)) 28 | format = format.replace(RegExp.$1, 29 | RegExp.$1.length==1 ? o[k] : 30 | ("00"+ o[k]).substr((""+ o[k]).length)); 31 | return format; 32 | }; 33 | 34 | //warn 此函数已废弃,直接读请求的json获取 35 | //desc 创建并返回路径 36 | //param none 37 | //return 38 | // 成功创建 - path 39 | // 创建失败 - null 40 | module.exports = { 41 | imagePath:function(){ 42 | var todayPath = new Date().format("yyyy/MM/dd"); 43 | todayPath = path.join(config.pixiv.saveFolder,todayPath); 44 | mkdirp(todayPath,function(err){ 45 | //如果创建目录出错则将path置null 46 | if(err){ 47 | console.log(err); 48 | todayPath = null; 49 | } 50 | }); 51 | return todayPath; 52 | }, 53 | //停用,直接读取p站服务器图片排行日期作为日志文件保存路径 54 | logFile:function(){ 55 | var filename = new Date().format('yyyy-MM-dd') + ".log"; 56 | return path.join(config.pixiv.logPath,filename); 57 | }, 58 | //desc 写入日志文件 59 | //param images images对象文件 60 | //param logFile log文件路径 61 | //return none 62 | writeLog:function(logFile,images){ 63 | var log = {}; 64 | log.date = new Date().format('yyyy-MM-dd hh:mm'); 65 | log.filename = logFile; 66 | log.success = []; //成功下载的 67 | log.fail = []; //下载失败的 68 | for(var i=0;i|\t|\r|\n)/g," "); 108 | return formatString; 109 | } 110 | }; 111 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pixivPicker", 3 | "version": "0.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/runtime": { 8 | "version": "7.4.5", 9 | "resolved": "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.4.5.tgz", 10 | "integrity": "sha1-WCu1MfX53GfS/LaCl5iU914lPxI=", 11 | "requires": { 12 | "regenerator-runtime": "0.13.2" 13 | } 14 | }, 15 | "abab": { 16 | "version": "1.0.4", 17 | "resolved": "http://registry.npm.taobao.org/abab/download/abab-1.0.4.tgz", 18 | "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=" 19 | }, 20 | "acorn": { 21 | "version": "4.0.13", 22 | "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-4.0.13.tgz", 23 | "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" 24 | }, 25 | "acorn-globals": { 26 | "version": "3.1.0", 27 | "resolved": "https://registry.npm.taobao.org/acorn-globals/download/acorn-globals-3.1.0.tgz", 28 | "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", 29 | "requires": { 30 | "acorn": "4.0.13" 31 | } 32 | }, 33 | "agent-base": { 34 | "version": "4.3.0", 35 | "resolved": "https://registry.npm.taobao.org/agent-base/download/agent-base-4.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fagent-base%2Fdownload%2Fagent-base-4.3.0.tgz", 36 | "integrity": "sha1-gWXwHENgCbzK0LHRIvBe13Dvxu4=", 37 | "requires": { 38 | "es6-promisify": "5.0.0" 39 | } 40 | }, 41 | "ajv": { 42 | "version": "6.10.0", 43 | "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-6.10.0.tgz", 44 | "integrity": "sha1-kNDVRDnaWHzX6EO/twRfUL0ivfE=", 45 | "requires": { 46 | "fast-deep-equal": "2.0.1", 47 | "fast-json-stable-stringify": "2.0.0", 48 | "json-schema-traverse": "0.4.1", 49 | "uri-js": "4.2.2" 50 | } 51 | }, 52 | "array-equal": { 53 | "version": "1.0.0", 54 | "resolved": "http://registry.npm.taobao.org/array-equal/download/array-equal-1.0.0.tgz", 55 | "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" 56 | }, 57 | "asap": { 58 | "version": "2.0.6", 59 | "resolved": "http://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz", 60 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" 61 | }, 62 | "asn1": { 63 | "version": "0.2.4", 64 | "resolved": "http://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz", 65 | "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", 66 | "requires": { 67 | "safer-buffer": "2.1.2" 68 | } 69 | }, 70 | "assert-plus": { 71 | "version": "1.0.0", 72 | "resolved": "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", 73 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 74 | }, 75 | "async-limiter": { 76 | "version": "1.0.0", 77 | "resolved": "http://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.0.tgz", 78 | "integrity": "sha1-ePrtjD0HSrgfIrTphdeehzj3IPg=" 79 | }, 80 | "asynckit": { 81 | "version": "0.4.0", 82 | "resolved": "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", 83 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 84 | }, 85 | "aws-sign2": { 86 | "version": "0.7.0", 87 | "resolved": "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz", 88 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 89 | }, 90 | "aws4": { 91 | "version": "1.8.0", 92 | "resolved": "http://registry.npm.taobao.org/aws4/download/aws4-1.8.0.tgz", 93 | "integrity": "sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8=" 94 | }, 95 | "axios": { 96 | "version": "0.19.0", 97 | "resolved": "https://registry.npm.taobao.org/axios/download/axios-0.19.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faxios%2Fdownload%2Faxios-0.19.0.tgz", 98 | "integrity": "sha1-jgm/89kSLhM/e4EByPvdAO09Krg=", 99 | "requires": { 100 | "follow-redirects": "1.5.10", 101 | "is-buffer": "2.0.3" 102 | } 103 | }, 104 | "balanced-match": { 105 | "version": "1.0.0", 106 | "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", 107 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 108 | }, 109 | "bcrypt-pbkdf": { 110 | "version": "1.0.2", 111 | "resolved": "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz", 112 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 113 | "requires": { 114 | "tweetnacl": "0.14.5" 115 | } 116 | }, 117 | "brace-expansion": { 118 | "version": "1.1.11", 119 | "resolved": "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", 120 | "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", 121 | "requires": { 122 | "balanced-match": "1.0.0", 123 | "concat-map": "0.0.1" 124 | } 125 | }, 126 | "buffer-from": { 127 | "version": "1.1.1", 128 | "resolved": "http://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz", 129 | "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=" 130 | }, 131 | "caseless": { 132 | "version": "0.12.0", 133 | "resolved": "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", 134 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 135 | }, 136 | "combined-stream": { 137 | "version": "1.0.8", 138 | "resolved": "https://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.8.tgz", 139 | "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", 140 | "requires": { 141 | "delayed-stream": "1.0.0" 142 | } 143 | }, 144 | "concat-map": { 145 | "version": "0.0.1", 146 | "resolved": "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", 147 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 148 | }, 149 | "concat-stream": { 150 | "version": "1.6.2", 151 | "resolved": "http://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz", 152 | "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", 153 | "requires": { 154 | "buffer-from": "1.1.1", 155 | "inherits": "2.0.4", 156 | "readable-stream": "2.3.6", 157 | "typedarray": "0.0.6" 158 | } 159 | }, 160 | "content-type-parser": { 161 | "version": "1.0.2", 162 | "resolved": "https://registry.npm.taobao.org/content-type-parser/download/content-type-parser-1.0.2.tgz", 163 | "integrity": "sha1-yqvoBiPmNjiyUC/Ux/Ev9M4jUuc=" 164 | }, 165 | "core-util-is": { 166 | "version": "1.0.2", 167 | "resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", 168 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 169 | }, 170 | "cross-spawn": { 171 | "version": "6.0.5", 172 | "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz", 173 | "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", 174 | "requires": { 175 | "nice-try": "1.0.5", 176 | "path-key": "2.0.1", 177 | "semver": "5.7.0", 178 | "shebang-command": "1.2.0", 179 | "which": "1.3.1" 180 | } 181 | }, 182 | "cssom": { 183 | "version": "0.3.6", 184 | "resolved": "http://registry.npm.taobao.org/cssom/download/cssom-0.3.6.tgz", 185 | "integrity": "sha1-+FIGzuBO+oQfPFmCp0uparINZa0=" 186 | }, 187 | "cssstyle": { 188 | "version": "0.2.37", 189 | "resolved": "https://registry.npm.taobao.org/cssstyle/download/cssstyle-0.2.37.tgz", 190 | "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", 191 | "requires": { 192 | "cssom": "0.3.6" 193 | } 194 | }, 195 | "dashdash": { 196 | "version": "1.14.1", 197 | "resolved": "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz", 198 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 199 | "requires": { 200 | "assert-plus": "1.0.0" 201 | } 202 | }, 203 | "debug": { 204 | "version": "3.1.0", 205 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz", 206 | "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", 207 | "requires": { 208 | "ms": "2.0.0" 209 | } 210 | }, 211 | "deep-is": { 212 | "version": "0.1.3", 213 | "resolved": "http://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz", 214 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" 215 | }, 216 | "delayed-stream": { 217 | "version": "1.0.0", 218 | "resolved": "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz", 219 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 220 | }, 221 | "ecc-jsbn": { 222 | "version": "0.1.2", 223 | "resolved": "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz", 224 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 225 | "requires": { 226 | "jsbn": "0.1.1", 227 | "safer-buffer": "2.1.2" 228 | } 229 | }, 230 | "end-of-stream": { 231 | "version": "1.4.1", 232 | "resolved": "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.1.tgz", 233 | "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", 234 | "requires": { 235 | "once": "1.4.0" 236 | } 237 | }, 238 | "es6-promise": { 239 | "version": "2.3.0", 240 | "resolved": "https://registry.npm.taobao.org/es6-promise/download/es6-promise-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fes6-promise%2Fdownload%2Fes6-promise-2.3.0.tgz", 241 | "integrity": "sha1-lu258v2wGZWCKyY92KratnSBgbw=" 242 | }, 243 | "es6-promisify": { 244 | "version": "5.0.0", 245 | "resolved": "http://registry.npm.taobao.org/es6-promisify/download/es6-promisify-5.0.0.tgz", 246 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 247 | "requires": { 248 | "es6-promise": "4.2.8" 249 | }, 250 | "dependencies": { 251 | "es6-promise": { 252 | "version": "4.2.8", 253 | "resolved": "https://registry.npm.taobao.org/es6-promise/download/es6-promise-4.2.8.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fes6-promise%2Fdownload%2Fes6-promise-4.2.8.tgz", 254 | "integrity": "sha1-TrIVlMlyvEBVPSduUQU5FD21Pgo=" 255 | } 256 | } 257 | }, 258 | "escodegen": { 259 | "version": "1.11.1", 260 | "resolved": "http://registry.npm.taobao.org/escodegen/download/escodegen-1.11.1.tgz", 261 | "integrity": "sha1-xIX/jWtM24nif0qFbpHxGEAcpRA=", 262 | "requires": { 263 | "esprima": "3.1.3", 264 | "estraverse": "4.2.0", 265 | "esutils": "2.0.2", 266 | "optionator": "0.8.2", 267 | "source-map": "0.6.1" 268 | } 269 | }, 270 | "esprima": { 271 | "version": "3.1.3", 272 | "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-3.1.3.tgz", 273 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" 274 | }, 275 | "estraverse": { 276 | "version": "4.2.0", 277 | "resolved": "http://registry.npm.taobao.org/estraverse/download/estraverse-4.2.0.tgz", 278 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" 279 | }, 280 | "esutils": { 281 | "version": "2.0.2", 282 | "resolved": "http://registry.npm.taobao.org/esutils/download/esutils-2.0.2.tgz", 283 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" 284 | }, 285 | "execa": { 286 | "version": "1.0.0", 287 | "resolved": "https://registry.npm.taobao.org/execa/download/execa-1.0.0.tgz?cache=0&sync_timestamp=1561976816967&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-1.0.0.tgz", 288 | "integrity": "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=", 289 | "requires": { 290 | "cross-spawn": "6.0.5", 291 | "get-stream": "4.1.0", 292 | "is-stream": "1.1.0", 293 | "npm-run-path": "2.0.2", 294 | "p-finally": "1.0.0", 295 | "signal-exit": "3.0.2", 296 | "strip-eof": "1.0.0" 297 | } 298 | }, 299 | "extend": { 300 | "version": "3.0.2", 301 | "resolved": "http://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz", 302 | "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=" 303 | }, 304 | "extract-zip": { 305 | "version": "1.6.7", 306 | "resolved": "http://registry.npm.taobao.org/extract-zip/download/extract-zip-1.6.7.tgz", 307 | "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", 308 | "requires": { 309 | "concat-stream": "1.6.2", 310 | "debug": "2.6.9", 311 | "mkdirp": "0.5.1", 312 | "yauzl": "2.4.1" 313 | }, 314 | "dependencies": { 315 | "debug": { 316 | "version": "2.6.9", 317 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", 318 | "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", 319 | "requires": { 320 | "ms": "2.0.0" 321 | } 322 | } 323 | } 324 | }, 325 | "extsprintf": { 326 | "version": "1.3.0", 327 | "resolved": "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz", 328 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 329 | }, 330 | "fast-deep-equal": { 331 | "version": "2.0.1", 332 | "resolved": "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz", 333 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" 334 | }, 335 | "fast-json-stable-stringify": { 336 | "version": "2.0.0", 337 | "resolved": "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz", 338 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 339 | }, 340 | "fast-levenshtein": { 341 | "version": "2.0.6", 342 | "resolved": "http://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", 343 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" 344 | }, 345 | "fd-slicer": { 346 | "version": "1.0.1", 347 | "resolved": "http://registry.npm.taobao.org/fd-slicer/download/fd-slicer-1.0.1.tgz", 348 | "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", 349 | "requires": { 350 | "pend": "1.2.0" 351 | } 352 | }, 353 | "follow-redirects": { 354 | "version": "1.5.10", 355 | "resolved": "http://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.5.10.tgz", 356 | "integrity": "sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio=", 357 | "requires": { 358 | "debug": "3.1.0" 359 | } 360 | }, 361 | "forever-agent": { 362 | "version": "0.6.1", 363 | "resolved": "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz", 364 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 365 | }, 366 | "form-data": { 367 | "version": "2.3.3", 368 | "resolved": "http://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz", 369 | "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=", 370 | "requires": { 371 | "asynckit": "0.4.0", 372 | "combined-stream": "1.0.8", 373 | "mime-types": "2.1.24" 374 | } 375 | }, 376 | "foxr": { 377 | "version": "0.9.0", 378 | "resolved": "https://registry.npm.taobao.org/foxr/download/foxr-0.9.0.tgz", 379 | "integrity": "sha1-6VLa/1LyhYc0vsb+CyL0GycYt4M=", 380 | "requires": { 381 | "@babel/runtime": "7.4.5", 382 | "execa": "1.0.0", 383 | "signal-exit": "3.0.2", 384 | "typeon": "0.3.0" 385 | } 386 | }, 387 | "fs.realpath": { 388 | "version": "1.0.0", 389 | "resolved": "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", 390 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 391 | }, 392 | "get-stream": { 393 | "version": "4.1.0", 394 | "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-4.1.0.tgz", 395 | "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=", 396 | "requires": { 397 | "pump": "3.0.0" 398 | } 399 | }, 400 | "getpass": { 401 | "version": "0.1.7", 402 | "resolved": "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz", 403 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 404 | "requires": { 405 | "assert-plus": "1.0.0" 406 | } 407 | }, 408 | "glob": { 409 | "version": "7.1.4", 410 | "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.4.tgz", 411 | "integrity": "sha1-qmCKL2xXetNX4a5aXCbZqNGWklU=", 412 | "requires": { 413 | "fs.realpath": "1.0.0", 414 | "inflight": "1.0.6", 415 | "inherits": "2.0.4", 416 | "minimatch": "3.0.4", 417 | "once": "1.4.0", 418 | "path-is-absolute": "1.0.1" 419 | } 420 | }, 421 | "har-schema": { 422 | "version": "2.0.0", 423 | "resolved": "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz", 424 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 425 | }, 426 | "har-validator": { 427 | "version": "5.1.3", 428 | "resolved": "http://registry.npm.taobao.org/har-validator/download/har-validator-5.1.3.tgz", 429 | "integrity": "sha1-HvievT5JllV2de7ZiTEQ3DUPoIA=", 430 | "requires": { 431 | "ajv": "6.10.0", 432 | "har-schema": "2.0.0" 433 | } 434 | }, 435 | "html-encoding-sniffer": { 436 | "version": "1.0.2", 437 | "resolved": "http://registry.npm.taobao.org/html-encoding-sniffer/download/html-encoding-sniffer-1.0.2.tgz", 438 | "integrity": "sha1-5w2EuU2lOqN14R/jo1G+ZkLKRvg=", 439 | "requires": { 440 | "whatwg-encoding": "1.0.5" 441 | } 442 | }, 443 | "http-signature": { 444 | "version": "1.2.0", 445 | "resolved": "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz", 446 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 447 | "requires": { 448 | "assert-plus": "1.0.0", 449 | "jsprim": "1.4.1", 450 | "sshpk": "1.16.1" 451 | } 452 | }, 453 | "https-proxy-agent": { 454 | "version": "2.2.1", 455 | "resolved": "http://registry.npm.taobao.org/https-proxy-agent/download/https-proxy-agent-2.2.1.tgz", 456 | "integrity": "sha1-UVUpcPoE1yPgTFbQQXjD+SWSu8A=", 457 | "requires": { 458 | "agent-base": "4.3.0", 459 | "debug": "3.1.0" 460 | } 461 | }, 462 | "iconv-lite": { 463 | "version": "0.4.24", 464 | "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz", 465 | "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", 466 | "requires": { 467 | "safer-buffer": "2.1.2" 468 | } 469 | }, 470 | "inflight": { 471 | "version": "1.0.6", 472 | "resolved": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", 473 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 474 | "requires": { 475 | "once": "1.4.0", 476 | "wrappy": "1.0.2" 477 | } 478 | }, 479 | "inherits": { 480 | "version": "2.0.4", 481 | "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz?cache=0&sync_timestamp=1560975547815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.4.tgz", 482 | "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" 483 | }, 484 | "is-buffer": { 485 | "version": "2.0.3", 486 | "resolved": "http://registry.npm.taobao.org/is-buffer/download/is-buffer-2.0.3.tgz", 487 | "integrity": "sha1-Ts8/z3ScvR5HJonhCaxmJhol5yU=" 488 | }, 489 | "is-stream": { 490 | "version": "1.1.0", 491 | "resolved": "https://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz", 492 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 493 | }, 494 | "is-typedarray": { 495 | "version": "1.0.0", 496 | "resolved": "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz", 497 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 498 | }, 499 | "isarray": { 500 | "version": "1.0.0", 501 | "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", 502 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 503 | }, 504 | "isexe": { 505 | "version": "2.0.0", 506 | "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fisexe%2Fdownload%2Fisexe-2.0.0.tgz", 507 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 508 | }, 509 | "isstream": { 510 | "version": "0.1.2", 511 | "resolved": "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz", 512 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 513 | }, 514 | "jquery": { 515 | "version": "2.2.4", 516 | "resolved": "http://registry.npm.taobao.org/jquery/download/jquery-2.2.4.tgz", 517 | "integrity": "sha1-LInWiJterFIqfuoywUUhVZxsvwI=" 518 | }, 519 | "jsbn": { 520 | "version": "0.1.1", 521 | "resolved": "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz", 522 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 523 | }, 524 | "jsdom": { 525 | "version": "9.12.0", 526 | "resolved": "http://registry.npm.taobao.org/jsdom/download/jsdom-9.12.0.tgz", 527 | "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", 528 | "requires": { 529 | "abab": "1.0.4", 530 | "acorn": "4.0.13", 531 | "acorn-globals": "3.1.0", 532 | "array-equal": "1.0.0", 533 | "content-type-parser": "1.0.2", 534 | "cssom": "0.3.6", 535 | "cssstyle": "0.2.37", 536 | "escodegen": "1.11.1", 537 | "html-encoding-sniffer": "1.0.2", 538 | "nwmatcher": "1.4.4", 539 | "parse5": "1.5.1", 540 | "request": "2.88.0", 541 | "sax": "1.2.4", 542 | "symbol-tree": "3.2.2", 543 | "tough-cookie": "2.5.0", 544 | "webidl-conversions": "4.0.2", 545 | "whatwg-encoding": "1.0.5", 546 | "whatwg-url": "4.8.0", 547 | "xml-name-validator": "2.0.1" 548 | } 549 | }, 550 | "json-schema": { 551 | "version": "0.2.3", 552 | "resolved": "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz", 553 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 554 | }, 555 | "json-schema-traverse": { 556 | "version": "0.4.1", 557 | "resolved": "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", 558 | "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=" 559 | }, 560 | "json-stringify-safe": { 561 | "version": "5.0.1", 562 | "resolved": "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz", 563 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 564 | }, 565 | "jsprim": { 566 | "version": "1.4.1", 567 | "resolved": "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz", 568 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 569 | "requires": { 570 | "assert-plus": "1.0.0", 571 | "extsprintf": "1.3.0", 572 | "json-schema": "0.2.3", 573 | "verror": "1.10.0" 574 | } 575 | }, 576 | "levn": { 577 | "version": "0.3.0", 578 | "resolved": "http://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz", 579 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 580 | "requires": { 581 | "prelude-ls": "1.1.2", 582 | "type-check": "0.3.2" 583 | } 584 | }, 585 | "locate-chrome": { 586 | "version": "0.1.1", 587 | "resolved": "https://registry.npm.taobao.org/locate-chrome/download/locate-chrome-0.1.1.tgz", 588 | "integrity": "sha1-XyDR1uyOQJJgO8d9sQ/Zlob6614=", 589 | "requires": { 590 | "es6-promise": "2.3.0", 591 | "queue-async": "1.2.1", 592 | "userhome": "1.0.0" 593 | } 594 | }, 595 | "locate-firefox": { 596 | "version": "0.1.1", 597 | "resolved": "https://registry.npm.taobao.org/locate-firefox/download/locate-firefox-0.1.1.tgz", 598 | "integrity": "sha1-rXw/LHo2h0Te823D3tdnS2AN5D0=", 599 | "requires": { 600 | "es6-promise": "2.3.0", 601 | "queue-async": "1.2.1", 602 | "userhome": "1.0.0" 603 | } 604 | }, 605 | "mime": { 606 | "version": "2.4.4", 607 | "resolved": "https://registry.npm.taobao.org/mime/download/mime-2.4.4.tgz?cache=0&sync_timestamp=1560034758817&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime%2Fdownload%2Fmime-2.4.4.tgz", 608 | "integrity": "sha1-vXuRE1/GsBzePpuuM9ZZtj2IV+U=" 609 | }, 610 | "mime-db": { 611 | "version": "1.40.0", 612 | "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.40.0.tgz", 613 | "integrity": "sha1-plBX6ZjbCQ9zKmj2wnbTh9QSbDI=" 614 | }, 615 | "mime-types": { 616 | "version": "2.1.24", 617 | "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.24.tgz", 618 | "integrity": "sha1-tvjQs+lR77d97eyhlM/20W9nb4E=", 619 | "requires": { 620 | "mime-db": "1.40.0" 621 | } 622 | }, 623 | "minimatch": { 624 | "version": "3.0.4", 625 | "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", 626 | "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", 627 | "requires": { 628 | "brace-expansion": "1.1.11" 629 | } 630 | }, 631 | "minimist": { 632 | "version": "0.0.8", 633 | "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz", 634 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 635 | }, 636 | "mkdirp": { 637 | "version": "0.5.1", 638 | "resolved": "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz", 639 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 640 | "requires": { 641 | "minimist": "0.0.8" 642 | } 643 | }, 644 | "ms": { 645 | "version": "2.0.0", 646 | "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&sync_timestamp=1559842528856&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz", 647 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 648 | }, 649 | "nice-try": { 650 | "version": "1.0.5", 651 | "resolved": "http://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz", 652 | "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=" 653 | }, 654 | "npm-run-path": { 655 | "version": "2.0.2", 656 | "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz", 657 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 658 | "requires": { 659 | "path-key": "2.0.1" 660 | } 661 | }, 662 | "nwmatcher": { 663 | "version": "1.4.4", 664 | "resolved": "https://registry.npm.taobao.org/nwmatcher/download/nwmatcher-1.4.4.tgz", 665 | "integrity": "sha1-IoVjHzSpXw0Dlc2QDJbtObWPNG4=" 666 | }, 667 | "oauth-sign": { 668 | "version": "0.9.0", 669 | "resolved": "http://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz", 670 | "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=" 671 | }, 672 | "once": { 673 | "version": "1.4.0", 674 | "resolved": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz", 675 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 676 | "requires": { 677 | "wrappy": "1.0.2" 678 | } 679 | }, 680 | "optimist": { 681 | "version": "0.6.1", 682 | "resolved": "http://registry.npm.taobao.org/optimist/download/optimist-0.6.1.tgz", 683 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 684 | "requires": { 685 | "minimist": "0.0.8", 686 | "wordwrap": "0.0.3" 687 | }, 688 | "dependencies": { 689 | "wordwrap": { 690 | "version": "0.0.3", 691 | "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.3.tgz", 692 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" 693 | } 694 | } 695 | }, 696 | "optionator": { 697 | "version": "0.8.2", 698 | "resolved": "http://registry.npm.taobao.org/optionator/download/optionator-0.8.2.tgz", 699 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 700 | "requires": { 701 | "deep-is": "0.1.3", 702 | "fast-levenshtein": "2.0.6", 703 | "levn": "0.3.0", 704 | "prelude-ls": "1.1.2", 705 | "type-check": "0.3.2", 706 | "wordwrap": "1.0.0" 707 | } 708 | }, 709 | "p-finally": { 710 | "version": "1.0.0", 711 | "resolved": "https://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz", 712 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 713 | }, 714 | "parse5": { 715 | "version": "1.5.1", 716 | "resolved": "http://registry.npm.taobao.org/parse5/download/parse5-1.5.1.tgz", 717 | "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=" 718 | }, 719 | "path-is-absolute": { 720 | "version": "1.0.1", 721 | "resolved": "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", 722 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 723 | }, 724 | "path-key": { 725 | "version": "2.0.1", 726 | "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz", 727 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 728 | }, 729 | "pend": { 730 | "version": "1.2.0", 731 | "resolved": "http://registry.npm.taobao.org/pend/download/pend-1.2.0.tgz", 732 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" 733 | }, 734 | "performance-now": { 735 | "version": "2.1.0", 736 | "resolved": "http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz", 737 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 738 | }, 739 | "prelude-ls": { 740 | "version": "1.1.2", 741 | "resolved": "http://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz", 742 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" 743 | }, 744 | "process-nextick-args": { 745 | "version": "2.0.1", 746 | "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz", 747 | "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=" 748 | }, 749 | "progress": { 750 | "version": "2.0.3", 751 | "resolved": "http://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz", 752 | "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=" 753 | }, 754 | "promise": { 755 | "version": "8.0.3", 756 | "resolved": "https://registry.npm.taobao.org/promise/download/promise-8.0.3.tgz", 757 | "integrity": "sha1-9ZLgmcbN3AANU47nKDuxkEUrC/Y=", 758 | "requires": { 759 | "asap": "2.0.6" 760 | } 761 | }, 762 | "proxy-from-env": { 763 | "version": "1.0.0", 764 | "resolved": "http://registry.npm.taobao.org/proxy-from-env/download/proxy-from-env-1.0.0.tgz", 765 | "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=" 766 | }, 767 | "psl": { 768 | "version": "1.1.31", 769 | "resolved": "http://registry.npm.taobao.org/psl/download/psl-1.1.31.tgz", 770 | "integrity": "sha1-6aqG0BAbWxBcvpOsa3hM1UcnYYQ=" 771 | }, 772 | "pump": { 773 | "version": "3.0.0", 774 | "resolved": "http://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz", 775 | "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", 776 | "requires": { 777 | "end-of-stream": "1.4.1", 778 | "once": "1.4.0" 779 | } 780 | }, 781 | "punycode": { 782 | "version": "2.1.1", 783 | "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz", 784 | "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=" 785 | }, 786 | "puppeteer-core": { 787 | "version": "1.18.1", 788 | "resolved": "https://registry.npm.taobao.org/puppeteer-core/download/puppeteer-core-1.18.1.tgz", 789 | "integrity": "sha1-N1Sel1Jzt/pFDg+KgCPbYXXtBJo=", 790 | "requires": { 791 | "debug": "4.1.1", 792 | "extract-zip": "1.6.7", 793 | "https-proxy-agent": "2.2.1", 794 | "mime": "2.4.4", 795 | "progress": "2.0.3", 796 | "proxy-from-env": "1.0.0", 797 | "rimraf": "2.6.3", 798 | "ws": "6.2.1" 799 | }, 800 | "dependencies": { 801 | "debug": { 802 | "version": "4.1.1", 803 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", 804 | "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", 805 | "requires": { 806 | "ms": "2.1.2" 807 | } 808 | }, 809 | "ms": { 810 | "version": "2.1.2", 811 | "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz", 812 | "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" 813 | } 814 | } 815 | }, 816 | "qs": { 817 | "version": "6.5.2", 818 | "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz", 819 | "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=" 820 | }, 821 | "queue-async": { 822 | "version": "1.2.1", 823 | "resolved": "https://registry.npm.taobao.org/queue-async/download/queue-async-1.2.1.tgz", 824 | "integrity": "sha1-BYLgHa4lMljPV2/Co125b8qEf28=" 825 | }, 826 | "readable-stream": { 827 | "version": "2.3.6", 828 | "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-2.3.6.tgz", 829 | "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", 830 | "requires": { 831 | "core-util-is": "1.0.2", 832 | "inherits": "2.0.4", 833 | "isarray": "1.0.0", 834 | "process-nextick-args": "2.0.1", 835 | "safe-buffer": "5.1.2", 836 | "string_decoder": "1.1.1", 837 | "util-deprecate": "1.0.2" 838 | } 839 | }, 840 | "regenerator-runtime": { 841 | "version": "0.13.2", 842 | "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.13.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.2.tgz", 843 | "integrity": "sha1-MuWcmm+5saSv8JtJMMotRHc0NEc=" 844 | }, 845 | "request": { 846 | "version": "2.88.0", 847 | "resolved": "http://registry.npm.taobao.org/request/download/request-2.88.0.tgz", 848 | "integrity": "sha1-nC/KT301tZLv5Xx/ClXoEFIST+8=", 849 | "requires": { 850 | "aws-sign2": "0.7.0", 851 | "aws4": "1.8.0", 852 | "caseless": "0.12.0", 853 | "combined-stream": "1.0.8", 854 | "extend": "3.0.2", 855 | "forever-agent": "0.6.1", 856 | "form-data": "2.3.3", 857 | "har-validator": "5.1.3", 858 | "http-signature": "1.2.0", 859 | "is-typedarray": "1.0.0", 860 | "isstream": "0.1.2", 861 | "json-stringify-safe": "5.0.1", 862 | "mime-types": "2.1.24", 863 | "oauth-sign": "0.9.0", 864 | "performance-now": "2.1.0", 865 | "qs": "6.5.2", 866 | "safe-buffer": "5.1.2", 867 | "tough-cookie": "2.4.3", 868 | "tunnel-agent": "0.6.0", 869 | "uuid": "3.3.2" 870 | }, 871 | "dependencies": { 872 | "punycode": { 873 | "version": "1.4.1", 874 | "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", 875 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 876 | }, 877 | "tough-cookie": { 878 | "version": "2.4.3", 879 | "resolved": "http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.4.3.tgz", 880 | "integrity": "sha1-U/Nto/R3g7CSWvoG/587FlKA94E=", 881 | "requires": { 882 | "psl": "1.1.31", 883 | "punycode": "1.4.1" 884 | } 885 | } 886 | } 887 | }, 888 | "rimraf": { 889 | "version": "2.6.3", 890 | "resolved": "http://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz", 891 | "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", 892 | "requires": { 893 | "glob": "7.1.4" 894 | } 895 | }, 896 | "safe-buffer": { 897 | "version": "5.1.2", 898 | "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", 899 | "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" 900 | }, 901 | "safer-buffer": { 902 | "version": "2.1.2", 903 | "resolved": "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz", 904 | "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" 905 | }, 906 | "sax": { 907 | "version": "1.2.4", 908 | "resolved": "http://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz", 909 | "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=" 910 | }, 911 | "semver": { 912 | "version": "5.7.0", 913 | "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.0.tgz", 914 | "integrity": "sha1-eQp89v6lRZuslhELKbYEEtyP+Ws=" 915 | }, 916 | "shebang-command": { 917 | "version": "1.2.0", 918 | "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz", 919 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 920 | "requires": { 921 | "shebang-regex": "1.0.0" 922 | } 923 | }, 924 | "shebang-regex": { 925 | "version": "1.0.0", 926 | "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz", 927 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 928 | }, 929 | "signal-exit": { 930 | "version": "3.0.2", 931 | "resolved": "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz", 932 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 933 | }, 934 | "source-map": { 935 | "version": "0.6.1", 936 | "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", 937 | "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", 938 | "optional": true 939 | }, 940 | "sshpk": { 941 | "version": "1.16.1", 942 | "resolved": "http://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz", 943 | "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", 944 | "requires": { 945 | "asn1": "0.2.4", 946 | "assert-plus": "1.0.0", 947 | "bcrypt-pbkdf": "1.0.2", 948 | "dashdash": "1.14.1", 949 | "ecc-jsbn": "0.1.2", 950 | "getpass": "0.1.7", 951 | "jsbn": "0.1.1", 952 | "safer-buffer": "2.1.2", 953 | "tweetnacl": "0.14.5" 954 | } 955 | }, 956 | "string_decoder": { 957 | "version": "1.1.1", 958 | "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", 959 | "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", 960 | "requires": { 961 | "safe-buffer": "5.1.2" 962 | } 963 | }, 964 | "strip-eof": { 965 | "version": "1.0.0", 966 | "resolved": "https://registry.npm.taobao.org/strip-eof/download/strip-eof-1.0.0.tgz", 967 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" 968 | }, 969 | "symbol-tree": { 970 | "version": "3.2.2", 971 | "resolved": "http://registry.npm.taobao.org/symbol-tree/download/symbol-tree-3.2.2.tgz", 972 | "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" 973 | }, 974 | "tough-cookie": { 975 | "version": "2.5.0", 976 | "resolved": "http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.5.0.tgz", 977 | "integrity": "sha1-zZ+yoKodWhK0c72fuW+j3P9lreI=", 978 | "requires": { 979 | "psl": "1.1.31", 980 | "punycode": "2.1.1" 981 | } 982 | }, 983 | "tr46": { 984 | "version": "0.0.3", 985 | "resolved": "http://registry.npm.taobao.org/tr46/download/tr46-0.0.3.tgz", 986 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 987 | }, 988 | "tunnel-agent": { 989 | "version": "0.6.0", 990 | "resolved": "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz", 991 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 992 | "requires": { 993 | "safe-buffer": "5.1.2" 994 | } 995 | }, 996 | "tweetnacl": { 997 | "version": "0.14.5", 998 | "resolved": "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz", 999 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 1000 | }, 1001 | "type-check": { 1002 | "version": "0.3.2", 1003 | "resolved": "http://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz", 1004 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1005 | "requires": { 1006 | "prelude-ls": "1.1.2" 1007 | } 1008 | }, 1009 | "typedarray": { 1010 | "version": "0.0.6", 1011 | "resolved": "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz", 1012 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1013 | }, 1014 | "typeon": { 1015 | "version": "0.3.0", 1016 | "resolved": "https://registry.npm.taobao.org/typeon/download/typeon-0.3.0.tgz", 1017 | "integrity": "sha1-Ek0Y0rx+ZW+JTa6yw+J3o+zVt7Y=" 1018 | }, 1019 | "uri-js": { 1020 | "version": "4.2.2", 1021 | "resolved": "http://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz", 1022 | "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", 1023 | "requires": { 1024 | "punycode": "2.1.1" 1025 | } 1026 | }, 1027 | "userhome": { 1028 | "version": "1.0.0", 1029 | "resolved": "https://registry.npm.taobao.org/userhome/download/userhome-1.0.0.tgz", 1030 | "integrity": "sha1-tkkf8S0hpecmcd+czIcX4cZojAs=" 1031 | }, 1032 | "util-deprecate": { 1033 | "version": "1.0.2", 1034 | "resolved": "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", 1035 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1036 | }, 1037 | "uuid": { 1038 | "version": "3.3.2", 1039 | "resolved": "http://registry.npm.taobao.org/uuid/download/uuid-3.3.2.tgz", 1040 | "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=" 1041 | }, 1042 | "verror": { 1043 | "version": "1.10.0", 1044 | "resolved": "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz", 1045 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1046 | "requires": { 1047 | "assert-plus": "1.0.0", 1048 | "core-util-is": "1.0.2", 1049 | "extsprintf": "1.3.0" 1050 | } 1051 | }, 1052 | "webidl-conversions": { 1053 | "version": "4.0.2", 1054 | "resolved": "http://registry.npm.taobao.org/webidl-conversions/download/webidl-conversions-4.0.2.tgz", 1055 | "integrity": "sha1-qFWYCx8LazWbodXZ+zmulB+qY60=" 1056 | }, 1057 | "whatwg-encoding": { 1058 | "version": "1.0.5", 1059 | "resolved": "http://registry.npm.taobao.org/whatwg-encoding/download/whatwg-encoding-1.0.5.tgz", 1060 | "integrity": "sha1-WrrPd3wyFmpR0IXWtPPn0nET3bA=", 1061 | "requires": { 1062 | "iconv-lite": "0.4.24" 1063 | } 1064 | }, 1065 | "whatwg-url": { 1066 | "version": "4.8.0", 1067 | "resolved": "http://registry.npm.taobao.org/whatwg-url/download/whatwg-url-4.8.0.tgz", 1068 | "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", 1069 | "requires": { 1070 | "tr46": "0.0.3", 1071 | "webidl-conversions": "3.0.1" 1072 | }, 1073 | "dependencies": { 1074 | "webidl-conversions": { 1075 | "version": "3.0.1", 1076 | "resolved": "http://registry.npm.taobao.org/webidl-conversions/download/webidl-conversions-3.0.1.tgz", 1077 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 1078 | } 1079 | } 1080 | }, 1081 | "which": { 1082 | "version": "1.3.1", 1083 | "resolved": "http://registry.npm.taobao.org/which/download/which-1.3.1.tgz", 1084 | "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", 1085 | "requires": { 1086 | "isexe": "2.0.0" 1087 | } 1088 | }, 1089 | "wordwrap": { 1090 | "version": "1.0.0", 1091 | "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-1.0.0.tgz", 1092 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" 1093 | }, 1094 | "wrappy": { 1095 | "version": "1.0.2", 1096 | "resolved": "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", 1097 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1098 | }, 1099 | "ws": { 1100 | "version": "6.2.1", 1101 | "resolved": "https://registry.npm.taobao.org/ws/download/ws-6.2.1.tgz?cache=0&sync_timestamp=1560788200711&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fws%2Fdownload%2Fws-6.2.1.tgz", 1102 | "integrity": "sha1-RC/fCkftZPWbal2P8TD0dI7VJPs=", 1103 | "requires": { 1104 | "async-limiter": "1.0.0" 1105 | } 1106 | }, 1107 | "xml-name-validator": { 1108 | "version": "2.0.1", 1109 | "resolved": "http://registry.npm.taobao.org/xml-name-validator/download/xml-name-validator-2.0.1.tgz", 1110 | "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=" 1111 | }, 1112 | "yauzl": { 1113 | "version": "2.4.1", 1114 | "resolved": "http://registry.npm.taobao.org/yauzl/download/yauzl-2.4.1.tgz", 1115 | "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", 1116 | "requires": { 1117 | "fd-slicer": "1.0.1" 1118 | } 1119 | } 1120 | } 1121 | } 1122 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pixivPicker", 3 | "version": "0.0.1", 4 | "private": true, 5 | "dependencies": { 6 | "axios": "^0.19.0", 7 | "jquery": "^2.1.1", 8 | "jsdom": "^9.12.0", 9 | "locate-chrome": "^0.1.1", 10 | "mkdirp": "^0.5.1", 11 | "optimist": "^0.6.1", 12 | "promise": "^8.0.1", 13 | "puppeteer-core": "^1.18.1", 14 | "request": "^2.81.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /run.bat: -------------------------------------------------------------------------------- 1 | set imagePath="images" 2 | set url="https://www.pixiv.net/ranking.php?format=json&mode=daily&p=1" 3 | set abbr="_daily" 4 | set username="" 5 | set passwd="" 6 | cd /d %~dp0 7 | node app.js --path=%imagePath% --url=%url% --abbr=%abbr% --username=%username% --passwd=%passwd% 8 | ping window-will-close-in-5-second -n 1 -w 15000 > nul 9 | -------------------------------------------------------------------------------- /run.vbe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iMyon/pixivPicker/78e046d18695759957c459ab6bf43acb70ce7e80/run.vbe -------------------------------------------------------------------------------- /updateLog.md: -------------------------------------------------------------------------------- 1 | ###2014 4 30 `bug` 2 | 使用pixiv服务器上的日期作为log文件的保存文件名,防止过了0点之后重复下载前一天的图片 --------------------------------------------------------------------------------