From 3f940a6906779edcbf9a51da825c4ccaa2ab89a5 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Mon, 16 Apr 2018 02:47:09 +0800 Subject: [PATCH] replace express and request with koa and axios --- .eslintrc | 2 +- config.js | 5 + index.js | 64 ++-- middleware/header.js | 14 + middleware/onerror.js | 11 + package.json | 7 +- router.js | 39 ++ routes/all.js | 13 - routes/base.js | 25 -- routes/bilibili/bangumi.js | 66 ++-- routes/bilibili/coin.js | 88 ++--- routes/bilibili/dynamic.js | 121 +++---- routes/bilibili/fav.js | 90 +++-- routes/bilibili/partion.js | 75 ++-- routes/bilibili/video.js | 90 +++-- routes/express/express.js | 68 ++-- routes/jianshu/collection.js | 69 ++-- routes/jianshu/home.js | 67 ++-- routes/jianshu/monthly.js | 67 ++-- routes/jianshu/user.js | 69 ++-- routes/jianshu/weekly.js | 67 ++-- routes/juejin/category.js | 106 +++--- routes/ncm/artist.js | 72 ++-- routes/ncm/playlist.js | 80 ++--- routes/ncm/userplaylist.js | 101 +++--- routes/weibo/user.js | 164 ++++----- routes/zhihu/collection.js | 65 ++-- routes/ziroom/room.js | 89 ++--- utils/mix.js | 7 - utils/redis.js | 29 -- views/rss.art | 2 +- yarn.lock | 664 ++++++++++------------------------- 32 files changed, 1001 insertions(+), 1495 deletions(-) create mode 100644 config.js create mode 100644 middleware/header.js create mode 100644 middleware/onerror.js create mode 100644 router.js delete mode 100644 routes/all.js delete mode 100644 routes/base.js delete mode 100644 utils/mix.js delete mode 100644 utils/redis.js diff --git a/.eslintrc b/.eslintrc index 329beaf50d..be9258aa69 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,7 +1,7 @@ { "extends": "eslint:recommended", "parserOptions": { - "ecmaVersion": 6, + "ecmaVersion": 2017, "sourceType": "module" }, "env": { diff --git a/config.js b/config.js new file mode 100644 index 0000000000..5a65cc3771 --- /dev/null +++ b/config.js @@ -0,0 +1,5 @@ +module.exports = { + port: 1200, + cacheExpire: 5 * 60, + ua: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36', +}; \ No newline at end of file diff --git a/index.js b/index.js index d288321a8b..cbf3cf8c8d 100644 --- a/index.js +++ b/index.js @@ -1,45 +1,37 @@ -const express = require('express'); +const Koa = require('koa'); +const cache = require('koa-redis-cache'); + const logger = require('./utils/logger'); +const config = require('./config'); + +const onerror = require('./middleware/onerror'); +const header = require('./middleware/header.js'); + +const router = require('./router'); + +process.on('uncaughtException', (e) => { + logger.error('uncaughtException: ' + e); +}); logger.info('🍻 RSSHub start! Cheers!'); -const app = express(); +const app = new Koa(); -app.all('*', require('./routes/all')); +// global error handing +app.use(onerror); -// bilibili -app.get('/bilibili/user/video/:uid', require('./routes/bilibili/video')); -app.get('/bilibili/user/fav/:uid', require('./routes/bilibili/fav')); -app.get('/bilibili/user/coin/:uid', require('./routes/bilibili/coin')); -app.get('/bilibili/user/dynamic/:uid', require('./routes/bilibili/dynamic')); -app.get('/bilibili/partion/:tid', require('./routes/bilibili/partion')); -app.get('/bilibili/bangumi/:seasonid', require('./routes/bilibili/bangumi')); +// set header +app.use(header); -// 微博 -app.get('/weibo/user/:uid', require('./routes/weibo/user')); +// cache +app.use(cache({ + expire: config.cacheExpire, + onerror: (e) => { + logger.error('cache error', e); + } +})); -// 网易云音乐 -app.get('/ncm/playlist/:id', require('./routes/ncm/playlist')); -app.get('/ncm/user/playlist/:uid', require('./routes/ncm/userplaylist')); -app.get('/ncm/artist/:id', require('./routes/ncm/artist')); +// router +app.use(router.routes()).use(router.allowedMethods()); -// 掘金 -app.get('/juejin/category/:category', require('./routes/juejin/category')); - -// 自如 -app.get('/ziroom/room/:city/:iswhole/:room/:keyword', require('./routes/ziroom/room')); - -// 快递 -app.get('/express/:company/:number', require('./routes/express/express')); - -// 简书 -app.get('/jianshu/home', require('./routes/jianshu/home')); -app.get('/jianshu/trending/weekly', require('./routes/jianshu/weekly')); -app.get('/jianshu/trending/monthly', require('./routes/jianshu/monthly')); -app.get('/jianshu/collection/:id', require('./routes/jianshu/collection')); -app.get('/jianshu/user/:id', require('./routes/jianshu/user')); - -// 知乎 -app.get('/zhihu/collection/:id', require('./routes/zhihu/collection')); - -app.listen(1200); \ No newline at end of file +app.listen(config.port); \ No newline at end of file diff --git a/middleware/header.js b/middleware/header.js new file mode 100644 index 0000000000..689a13ae51 --- /dev/null +++ b/middleware/header.js @@ -0,0 +1,14 @@ +const logger = require('../utils/logger'); + +module.exports = async (ctx, next) => { + logger.info(`${ctx.url}, user IP: ${ctx.ip}`); + + const headers = { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Headers': 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild', + 'Access-Control-Allow-Methods': 'PUT, POST, GET, DELETE, OPTIONS', + 'Content-Type': 'application/xml; charset=utf-8', + }; + ctx.set(headers); + await next(); +}; \ No newline at end of file diff --git a/middleware/onerror.js b/middleware/onerror.js new file mode 100644 index 0000000000..d59284c8ac --- /dev/null +++ b/middleware/onerror.js @@ -0,0 +1,11 @@ +const logger = require('../utils/logger'); + +module.exports = async (ctx, next) => { + try { + await next(); + } catch (err) { + logger.error('Promise error: ' + err); + ctx.body = 'RSSHub 发生了一些意外: ' + err; + ctx.status = 500; + } +}; \ No newline at end of file diff --git a/package.json b/package.json index 844321fba7..5094b9f632 100644 --- a/package.json +++ b/package.json @@ -19,11 +19,12 @@ "devDependencies": {}, "dependencies": { "art-template": "4.12.2", + "axios": "0.18.0", "cheerio": "1.0.0-rc.2", "eslint": "4.19.1", - "express": "^4.16.3", - "redis": "2.8.0", - "request": "^2.85.0", + "koa": "2.5.0", + "koa-redis-cache": "3.0.0", + "koa-router": "7.4.0", "winston": "3.0.0-rc3" } } diff --git a/router.js b/router.js new file mode 100644 index 0000000000..5df40fb0b9 --- /dev/null +++ b/router.js @@ -0,0 +1,39 @@ +const Router = require('koa-router'); +const router = new Router(); + +// // bilibili +router.get('/bilibili/user/video/:uid', require('./routes/bilibili/video')); +router.get('/bilibili/user/fav/:uid', require('./routes/bilibili/fav')); +router.get('/bilibili/user/coin/:uid', require('./routes/bilibili/coin')); +router.get('/bilibili/user/dynamic/:uid', require('./routes/bilibili/dynamic')); +router.get('/bilibili/partion/:tid', require('./routes/bilibili/partion')); +router.get('/bilibili/bangumi/:seasonid', require('./routes/bilibili/bangumi')); + +// // 微博 +router.get('/weibo/user/:uid', require('./routes/weibo/user')); + +// // 网易云音乐 +router.get('/ncm/playlist/:id', require('./routes/ncm/playlist')); +router.get('/ncm/user/playlist/:uid', require('./routes/ncm/userplaylist')); +router.get('/ncm/artist/:id', require('./routes/ncm/artist')); + +// // 掘金 +router.get('/juejin/category/:category', require('./routes/juejin/category')); + +// // 自如 +router.get('/ziroom/room/:city/:iswhole/:room/:keyword', require('./routes/ziroom/room')); + +// // 快递 +router.get('/express/:company/:number', require('./routes/express/express')); + +// // 简书 +router.get('/jianshu/home', require('./routes/jianshu/home')); +router.get('/jianshu/trending/weekly', require('./routes/jianshu/weekly')); +router.get('/jianshu/trending/monthly', require('./routes/jianshu/monthly')); +router.get('/jianshu/collection/:id', require('./routes/jianshu/collection')); +router.get('/jianshu/user/:id', require('./routes/jianshu/user')); + +// // 知乎 +router.get('/zhihu/collection/:id', require('./routes/zhihu/collection')); + +module.exports = router; \ No newline at end of file diff --git a/routes/all.js b/routes/all.js deleted file mode 100644 index af627a960f..0000000000 --- a/routes/all.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = function (req, res, next) { - res.header('Access-Control-Allow-Origin', '*'); - res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild'); - res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS'); - res.header('Content-Type', 'application/xml; charset=utf-8'); - - if (req.method === 'OPTIONS') { - res.send(200); - } - else { - next(); - } -}; \ No newline at end of file diff --git a/routes/base.js b/routes/base.js deleted file mode 100644 index 0b08e491de..0000000000 --- a/routes/base.js +++ /dev/null @@ -1,25 +0,0 @@ -const logger = require('../utils/logger'); -const redis = require('../utils/redis'); -const mix = require('../utils/mix'); - -module.exports = (options) => { - logger.info(`${options.req.url}, user IP: ${mix.getIp(options.req)}`); - - redis.get(options.req.url, (reply) => { - if (reply) { - options.res.send(reply); - } - else { - try { - options.getHTML((html) => { - redis.set(options.req.url, html); - options.res.send(html); - }); - } - catch (e) { - redis.set(options.req.url, ''); - options.res.send(''); - } - } - }); -}; \ No newline at end of file diff --git a/routes/bilibili/bangumi.js b/routes/bilibili/bangumi.js index c1e5d37a98..6ca1b69636 100644 --- a/routes/bilibili/bangumi.js +++ b/routes/bilibili/bangumi.js @@ -1,46 +1,34 @@ -const request = require('request'); +const axios = require('axios'); const art = require('art-template'); const path = require('path'); -const base = require('../base'); -const mix = require('../../utils/mix'); +const config = require('../../config'); -module.exports = (req, res) => { - const seasonid = req.params.seasonid; +module.exports = async (ctx, next) => { + const seasonid = ctx.params.seasonid; - base({ - req: req, - res: res, - getHTML: (callback) => { - request.get({ - url: `https://bangumi.bilibili.com/jsonp/seasoninfo/${seasonid}.ver?callback=seasonListCallback&jsonp=jsonp&_=${+new Date()}`, - headers: { - 'User-Agent': mix.ua, - 'Referer': `https://bangumi.bilibili.com/anime/${seasonid}/` - } - }, (err, httpResponse, body) => { - let data; - try { - data = JSON.parse(body.match(/^seasonListCallback\((.*)\);$/)[1]); - } - catch (e) { - data = {}; - } - const result = data.result || {}; - - const html = art(path.resolve(__dirname, '../../views/rss.art'), { - title: result.title, - link: `https://bangumi.bilibili.com/anime/${seasonid}/`, - description: result.evaluate, - lastBuildDate: new Date().toUTCString(), - item: result.episodes && result.episodes.map((item) => ({ - title: `第${item.index}话 ${item.index_title}`, - description: `更新时间:${item.update_time}`, - pubDate: new Date(item.update_time).toUTCString(), - link: item.webplay_url - })), - }); - callback(html); - }); + const response = await axios({ + method: 'get', + url: `https://bangumi.bilibili.com/jsonp/seasoninfo/${seasonid}.ver?callback=seasonListCallback&jsonp=jsonp&_=${+new Date()}`, + headers: { + 'User-Agent': config.ua, + 'Referer': `https://bangumi.bilibili.com/anime/${seasonid}/` } }); + + const data = JSON.parse(response.data.match(/^seasonListCallback\((.*)\);$/)[1]).result || {}; + + ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), { + title: data.title, + link: `https://bangumi.bilibili.com/anime/${seasonid}/`, + description: data.evaluate, + lastBuildDate: new Date().toUTCString(), + item: data.episodes && data.episodes.map((item) => ({ + title: `第${item.index}话 ${item.index_title}`, + description: `更新时间:${item.update_time}`, + pubDate: new Date(item.update_time).toUTCString(), + link: item.webplay_url + })), + }); + + next(); }; \ No newline at end of file diff --git a/routes/bilibili/coin.js b/routes/bilibili/coin.js index ff35293b68..28be444989 100644 --- a/routes/bilibili/coin.js +++ b/routes/bilibili/coin.js @@ -1,57 +1,47 @@ -const request = require('request'); +const axios = require('axios'); +const qs = require('querystring'); const art = require('art-template'); const path = require('path'); -const base = require('../base'); -const mix = require('../../utils/mix'); +const config = require('../../config'); -module.exports = (req, res) => { - const uid = req.params.uid; +module.exports = async (ctx, next) => { + const uid = ctx.params.uid; - base({ - req: req, - res: res, - getHTML: (callback) => { - request.post({ - url: 'https://space.bilibili.com/ajax/member/GetInfo', - headers: { - 'User-Agent': mix.ua, - 'Referer': `https://space.bilibili.com/${uid}/`, - 'Origin': 'https://space.bilibili.com' - }, - form: { - mid: uid - } - }, function (err, httpResponse, body) { - const name = JSON.parse(body).data.name; - request.get({ - url: `https://space.bilibili.com/ajax/member/getCoinVideos?mid=${uid}`, - headers: { - 'User-Agent': mix.ua, - 'Referer': `https://space.bilibili.com/${uid}/` - } - }, function (err, httpResponse, body) { - let data; - try { - data = JSON.parse(body); - } - catch (e) { - data = {}; - } + const nameResponse = await axios({ + method: 'post', + url: 'https://space.bilibili.com/ajax/member/GetInfo', + headers: { + 'User-Agent': config.ua, + 'Referer': `https://space.bilibili.com/${uid}/`, + 'Content-Type': 'application/x-www-form-urlencoded', + }, + data: qs.stringify({ + mid: uid + }), + }); + const name = nameResponse.data.data.name; - const html = art(path.resolve(__dirname, '../../views/rss.art'), { - title: `${name} 的 bilibili 投币视频`, - link: `https://space.bilibili.com/${uid}`, - description: `${name} 的 bilibili 投币视频`, - lastBuildDate: new Date().toUTCString(), - item: data.data && data.data.list && data.data.list.map((item) => ({ - title: item.title, - description: `${item.title}
`, - link: `https://www.bilibili.com/video/av${item.stat.aid}` - })), - }); - callback(html); - }); - }); + const response = await axios({ + method: 'get', + url: `https://space.bilibili.com/ajax/member/getCoinVideos?mid=${uid}`, + headers: { + 'User-Agent': config.ua, + 'Referer': `https://space.bilibili.com/${uid}/` } }); + const data = response.data; + + ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), { + title: `${name} 的 bilibili 投币视频`, + link: `https://space.bilibili.com/${uid}`, + description: `${name} 的 bilibili 投币视频`, + lastBuildDate: new Date().toUTCString(), + item: data.data && data.data.list && data.data.list.map((item) => ({ + title: item.title, + description: `${item.title}
`, + link: `https://www.bilibili.com/video/av${item.stat.aid}` + })), + }); + + next(); }; \ No newline at end of file diff --git a/routes/bilibili/dynamic.js b/routes/bilibili/dynamic.js index ea580d4b9f..1f4a24bac4 100644 --- a/routes/bilibili/dynamic.js +++ b/routes/bilibili/dynamic.js @@ -1,74 +1,61 @@ -const request = require('request'); +const axios = require('axios'); const art = require('art-template'); const path = require('path'); -const base = require('../base'); -const mix = require('../../utils/mix'); +const config = require('../../config'); -module.exports = (req, res) => { - const uid = req.params.uid; +module.exports = async (ctx, next) => { + const uid = ctx.params.uid; - base({ - req: req, - res: res, - getHTML: (callback) => { - request.get({ - url: `https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/space_history?host_uid=${uid}`, - headers: { - 'User-Agent': mix.ua, - 'Referer': `https://space.bilibili.com/${uid}/` - } - }, (err, httpResponse, body) => { - let data; - try { - data = JSON.parse(body); - } - catch (e) { - data = {}; - } - const result = data.data && data.data.cards || {}; - - const html = art(path.resolve(__dirname, '../../views/rss.art'), { - title: `${result[0].desc.user_profile.info.uname} 的 bilibili 动态`, - link: `https://space.bilibili.com/${uid}/#/dynamic`, - description: `${result[0].desc.user_profile.info.uname} 的 bilibili 动态`, - lastBuildDate: new Date().toUTCString(), - item: result.map((item) => { - const parsed = JSON.parse(item.card); - const data = parsed.item || parsed; - - // img - let imgHTML = ''; - if (data.pictures) { - for (let i = 0; i < data.pictures.length; i++) { - imgHTML += ``; - } - } - if (data.pic) { - imgHTML += ``; - } - - // link - let link = ''; - if (data.dynamic_id) { - link = `https://t.bilibili.com/${data.dynamic_id}`; - } - else if (data.aid) { - link = `https://www.bilibili.com/video/av${data.aid}`; - } - else if (data.id) { - link = `https://h.bilibili.com/${data.id}`; - } - - return { - title: data.title || data.description || data.content, - description: `${data.desc || data.description || data.content}${imgHTML}`, - pubDate: new Date((data.pubdate || data.upload_time || data.timestamp) * 1000).toUTCString(), - link: link - }; - }), - }); - callback(html); - }); + const response = await axios({ + method: 'get', + url: `https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/space_history?host_uid=${uid}`, + headers: { + 'User-Agent': config.ua, + 'Referer': `https://space.bilibili.com/${uid}/` } }); + const data = response.data.data.cards; + + ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), { + title: `${data[0].desc.user_profile.info.uname} 的 bilibili 动态`, + link: `https://space.bilibili.com/${uid}/#/dynamic`, + description: `${data[0].desc.user_profile.info.uname} 的 bilibili 动态`, + lastBuildDate: new Date().toUTCString(), + item: data.map((item) => { + const parsed = JSON.parse(item.card); + const data = parsed.item || parsed; + + // img + let imgHTML = ''; + if (data.pictures) { + for (let i = 0; i < data.pictures.length; i++) { + imgHTML += ``; + } + } + if (data.pic) { + imgHTML += ``; + } + + // link + let link = ''; + if (data.dynamic_id) { + link = `https://t.bilibili.com/${data.dynamic_id}`; + } + else if (data.aid) { + link = `https://www.bilibili.com/video/av${data.aid}`; + } + else if (data.id) { + link = `https://h.bilibili.com/${data.id}`; + } + + return { + title: data.title || data.description || data.content, + description: `${data.desc || data.description || data.content}${imgHTML}`, + pubDate: new Date((data.pubdate || data.upload_time || data.timestamp) * 1000).toUTCString(), + link: link + }; + }), + }); + + next(); }; \ No newline at end of file diff --git a/routes/bilibili/fav.js b/routes/bilibili/fav.js index f22850327e..2fe50dade9 100644 --- a/routes/bilibili/fav.js +++ b/routes/bilibili/fav.js @@ -1,58 +1,48 @@ -const request = require('request'); +const axios = require('axios'); +const qs = require('querystring'); const art = require('art-template'); const path = require('path'); -const base = require('../base'); -const mix = require('../../utils/mix'); +const config = require('../../config'); -module.exports = (req, res) => { - const uid = req.params.uid; +module.exports = async (ctx, next) => { + const uid = ctx.params.uid; - base({ - req: req, - res: res, - getHTML: (callback) => { - request.post({ - url: 'https://space.bilibili.com/ajax/member/GetInfo', - headers: { - 'User-Agent': mix.ua, - 'Referer': `https://space.bilibili.com/${uid}/`, - 'Origin': 'https://space.bilibili.com' - }, - form: { - mid: uid - } - }, function (err, httpResponse, body) { - const name = JSON.parse(body).data.name; - request.get({ - url: `https://api.bilibili.com/x/v2/fav/video?vmid=${uid}&ps=30&tid=0&keyword=&pn=1&order=fav_time`, - headers: { - 'User-Agent': mix.ua, - 'Referer': `https://space.bilibili.com/${uid}/#/favlist` - } - }, function (err, httpResponse, body) { - let data; - try { - data = JSON.parse(body); - } - catch (e) { - data = {}; - } + const nameResponse = await axios({ + method: 'post', + url: 'https://space.bilibili.com/ajax/member/GetInfo', + headers: { + 'User-Agent': config.ua, + 'Referer': `https://space.bilibili.com/${uid}/`, + 'Content-Type': 'application/x-www-form-urlencoded', + }, + data: qs.stringify({ + mid: uid + }), + }); + const name = nameResponse.data.data.name; - const html = art(path.resolve(__dirname, '../../views/rss.art'), { - title: `${name} 的 bilibili 收藏夹`, - link: `https://space.bilibili.com/${uid}/#/favlist`, - description: `${name} 的 bilibili 收藏夹`, - lastBuildDate: new Date().toUTCString(), - item: data.data && data.data.archives && data.data.archives.map((item) => ({ - title: item.title, - description: `${item.desc}
`, - pubDate: new Date(item.fav_at * 1000).toUTCString(), - link: `https://www.bilibili.com/video/av${item.aid}` - })), - }); - callback(html); - }); - }); + const response = await axios({ + method: 'get', + url: `https://api.bilibili.com/x/v2/fav/video?vmid=${uid}&ps=30&tid=0&keyword=&pn=1&order=fav_time`, + headers: { + 'User-Agent': config.ua, + 'Referer': `https://space.bilibili.com/${uid}/#/favlist` } }); + const data = response.data; + + ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), { + title: `${name} 的 bilibili 收藏夹`, + link: `https://space.bilibili.com/${uid}/#/favlist`, + description: `${name} 的 bilibili 收藏夹`, + lastBuildDate: new Date().toUTCString(), + item: data.data && data.data.archives && data.data.archives.map((item) => ({ + title: item.title, + description: `${item.desc}
`, + pubDate: new Date(item.fav_at * 1000).toUTCString(), + link: `https://www.bilibili.com/video/av${item.aid}` + })), + }); + + next(); }; \ No newline at end of file diff --git a/routes/bilibili/partion.js b/routes/bilibili/partion.js index 59d5e4feef..76b88fde3b 100644 --- a/routes/bilibili/partion.js +++ b/routes/bilibili/partion.js @@ -1,51 +1,38 @@ -const request = require('request'); +const axios = require('axios'); const art = require('art-template'); const path = require('path'); -const base = require('../base'); -const mix = require('../../utils/mix'); +const config = require('../../config'); -module.exports = (req, res) => { - const tid = req.params.tid; +module.exports = async (ctx, next) => { + const tid = ctx.params.tid; - base({ - req: req, - res: res, - getHTML: (callback) => { - request.get({ - url: `https://api.bilibili.com/x/web-interface/newlist?ps=15&rid=${tid}&_=${+new Date()}`, - headers: { - 'User-Agent': mix.ua, - 'Referer': 'https://www.bilibili.com/' - } - }, (err, httpResponse, body) => { - let data; - try { - data = JSON.parse(body); - } - catch (e) { - data = {}; - } - - const list = data.data && data.data.archives; - let name = '未知'; - if (list && list[0] && list[0].tname) { - name = list[0].tname; - } - - const html = art(path.resolve(__dirname, '../../views/rss.art'), { - title: `bilibili ${name}分区`, - link: 'https://www.bilibili.com', - description: `bilibili ${name}分区`, - lastBuildDate: new Date().toUTCString(), - item: list && list.map((item) => ({ - title: `${item.title} - ${item.owner.name}`, - description: `${item.desc}`, - pubDate: new Date(item.pubdate * 1000).toUTCString(), - link: `https://www.bilibili.com/video/av${item.aid}` - })), - }); - callback(html); - }); + const response = await axios({ + method: 'get', + url: `https://api.bilibili.com/x/web-interface/newlist?ps=15&rid=${tid}&_=${+new Date()}`, + headers: { + 'User-Agent': config.ua, + 'Referer': 'https://www.bilibili.com/' } }); + + const list = response.data.data.archives; + let name = '未知'; + if (list && list[0] && list[0].tname) { + name = list[0].tname; + } + + ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), { + title: `bilibili ${name}分区`, + link: 'https://www.bilibili.com', + description: `bilibili ${name}分区`, + lastBuildDate: new Date().toUTCString(), + item: list && list.map((item) => ({ + title: `${item.title} - ${item.owner.name}`, + description: `${item.desc}`, + pubDate: new Date(item.pubdate * 1000).toUTCString(), + link: `https://www.bilibili.com/video/av${item.aid}` + })), + }); + + next(); }; \ No newline at end of file diff --git a/routes/bilibili/video.js b/routes/bilibili/video.js index 2b82a2a039..761e69ffa9 100644 --- a/routes/bilibili/video.js +++ b/routes/bilibili/video.js @@ -1,58 +1,48 @@ -const request = require('request'); +const axios = require('axios'); +const qs = require('querystring'); const art = require('art-template'); const path = require('path'); -const base = require('../base'); -const mix = require('../../utils/mix'); +const config = require('../../config'); -module.exports = (req, res) => { - const uid = req.params.uid; +module.exports = async (ctx, next) => { + const uid = ctx.params.uid; - base({ - req: req, - res: res, - getHTML: (callback) => { - request.post({ - url: 'https://space.bilibili.com/ajax/member/GetInfo', - headers: { - 'User-Agent': mix.ua, - 'Referer': `https://space.bilibili.com/${uid}/`, - 'Origin': 'https://space.bilibili.com' - }, - form: { - mid: uid - } - }, function (err, httpResponse, body) { - const name = JSON.parse(body).data.name; - request.get({ - url: `https://space.bilibili.com/ajax/member/getSubmitVideos?mid=${uid}`, - headers: { - 'User-Agent': mix.ua, - 'Referer': `https://space.bilibili.com/${uid}/`, - } - }, function (err, httpResponse, body) { - let data; - try { - data = JSON.parse(body); - } - catch (e) { - data = {}; - } + const nameResponse = await axios({ + method: 'post', + url: 'https://space.bilibili.com/ajax/member/GetInfo', + headers: { + 'User-Agent': config.ua, + 'Referer': `https://space.bilibili.com/${uid}/`, + 'Content-Type': 'application/x-www-form-urlencoded', + }, + data: qs.stringify({ + mid: uid + }), + }); + const name = nameResponse.data.data.name; - const html = art(path.resolve(__dirname, '../../views/rss.art'), { - title: `${name} 的 bilibili 空间`, - link: `https://space.bilibili.com/${uid}`, - description: `${name} 的 bilibili 空间`, - lastBuildDate: new Date().toUTCString(), - item: data.data && data.data.vlist && data.data.vlist.map((item) => ({ - title: item.title, - description: `${item.description}
`, - pubDate: new Date(item.created * 1000).toUTCString(), - link: `https://www.bilibili.com/video/av${item.aid}` - })), - }); - callback(html); - }); - }); + const response = await axios({ + method: 'get', + url: `https://space.bilibili.com/ajax/member/getSubmitVideos?mid=${uid}`, + headers: { + 'User-Agent': config.ua, + 'Referer': `https://space.bilibili.com/${uid}/` } }); + const data = response.data; + + ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), { + title: `${name} 的 bilibili 空间`, + link: `https://space.bilibili.com/${uid}`, + description: `${name} 的 bilibili 空间`, + lastBuildDate: new Date().toUTCString(), + item: data.data && data.data.vlist && data.data.vlist.map((item) => ({ + title: item.title, + description: `${item.description}
`, + pubDate: new Date(item.created * 1000).toUTCString(), + link: `https://www.bilibili.com/video/av${item.aid}` + })), + }); + + next(); }; \ No newline at end of file diff --git a/routes/express/express.js b/routes/express/express.js index 6739208fa4..a3f2b2b041 100644 --- a/routes/express/express.js +++ b/routes/express/express.js @@ -1,47 +1,35 @@ -const request = require('request'); +const axios = require('axios'); const art = require('art-template'); const path = require('path'); -const base = require('../base'); -const mix = require('../../utils/mix'); +const config = require('../../config'); -module.exports = (req, res) => { - const company = req.params.company; - const number = req.params.number; +module.exports = async (ctx, next) => { + const company = ctx.params.company; + const number = ctx.params.number; - base({ - req: req, - res: res, - getHTML: (callback) => { - request.get({ - url: `https://www.kuaidi100.com/query?type=${company}&postid=${number}`, - headers: { - 'User-Agent': mix.ua, - 'Referer': 'https://www.kuaidi100.com' - } - }, (err, httpResponse, body) => { - let data; - try { - data = JSON.parse(body); - } - catch (e) { - data = {}; - } - const result = data.data || []; - - const html = art(path.resolve(__dirname, '../../views/rss.art'), { - title: `快递 ${company}-${number}`, - link: 'https://www.kuaidi100.com', - description: `快递 ${company}-${number}`, - lastBuildDate: new Date().toUTCString(), - item: result && result.map((item) => ({ - title: item.context, - description: item.context, - pubDate: new Date(item.time || item.ftime).toUTCString(), - link: item.context - })), - }); - callback(html); - }); + const response = await axios({ + method: 'get', + url: `https://www.kuaidi100.com/query?type=${company}&postid=${number}`, + headers: { + 'User-Agent': config.ua, + 'Referer': 'https://www.kuaidi100.com' } }); + + const data = response.data.data; + + ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), { + title: `快递 ${company}-${number}`, + link: 'https://www.kuaidi100.com', + description: `快递 ${company}-${number}`, + lastBuildDate: new Date().toUTCString(), + item: data.map((item) => ({ + title: item.context, + description: item.context, + pubDate: new Date(item.time || item.ftime).toUTCString(), + link: item.context + })), + }); + + next(); }; \ No newline at end of file diff --git a/routes/jianshu/collection.js b/routes/jianshu/collection.js index c76f5e6960..1afee4f8b7 100644 --- a/routes/jianshu/collection.js +++ b/routes/jianshu/collection.js @@ -1,44 +1,41 @@ -const request = require('request'); +const axios = require('axios'); const art = require('art-template'); const path = require('path'); const cheerio = require('cheerio'); -const base = require('../base'); -const mix = require('../../utils/mix'); +const config = require('../../config'); -module.exports = (req, res) => { - const id = req.params.id; +module.exports = async (ctx, next) => { + const id = ctx.params.id; - base({ - req: req, - res: res, - getHTML: (callback) => { - request.get({ - url: `https://www.jianshu.com/c/${id}`, - headers: { - 'User-Agent': mix.ua, - 'Referer': `https://www.jianshu.com/c/${id}` - } - }, (err, httpResponse, body) => { - const $ = cheerio.load(body); - const list = $('.note-list li'); - - const html = art(path.resolve(__dirname, '../../views/rss.art'), { - title: $('title').text(), - link: `https://www.jianshu.com/c/${id}`, - description: $('meta[name="description"]').attr('content') || $('title').text(), - lastBuildDate: new Date().toUTCString(), - item: list && list.map((index, item) => { - item = $(item); - return { - title: item.find('.title').text(), - description: `作者:${item.find('.nickname').text()}
描述:${item.find('.abstract').text()}
`, - pubDate: new Date(item.find('.time').data('shared-at')).toUTCString(), - link: `https://www.jianshu.com${item.find('.title').attr('href')}` - }; - }).get(), - }); - callback(html); - }); + const response = await axios({ + method: 'get', + url: `https://www.jianshu.com/c/${id}`, + headers: { + 'User-Agent': config.ua, + 'Referer': `https://www.jianshu.com/c/${id}` } }); + + const data = response.data; + + const $ = cheerio.load(data); + const list = $('.note-list li'); + + ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), { + title: $('title').text(), + link: `https://www.jianshu.com/c/${id}`, + description: $('meta[name="description"]').attr('content') || $('title').text(), + lastBuildDate: new Date().toUTCString(), + item: list && list.map((index, item) => { + item = $(item); + return { + title: item.find('.title').text(), + description: `作者:${item.find('.nickname').text()}
描述:${item.find('.abstract').text()}
`, + pubDate: new Date(item.find('.time').data('shared-at')).toUTCString(), + link: `https://www.jianshu.com${item.find('.title').attr('href')}` + }; + }).get(), + }); + + next(); }; \ No newline at end of file diff --git a/routes/jianshu/home.js b/routes/jianshu/home.js index 550989e11d..4b49045c19 100644 --- a/routes/jianshu/home.js +++ b/routes/jianshu/home.js @@ -1,42 +1,39 @@ -const request = require('request'); +const axios = require('axios'); const art = require('art-template'); const path = require('path'); const cheerio = require('cheerio'); -const base = require('../base'); -const mix = require('../../utils/mix'); +const config = require('../../config'); -module.exports = (req, res) => { - base({ - req: req, - res: res, - getHTML: (callback) => { - request.get({ - url: 'https://www.jianshu.com', - headers: { - 'User-Agent': mix.ua, - 'Referer': 'https://www.jianshu.com' - } - }, (err, httpResponse, body) => { - const $ = cheerio.load(body); - const list = $('.note-list li'); - - const html = art(path.resolve(__dirname, '../../views/rss.art'), { - title: '简书首页', - link: 'https://www.jianshu.com', - description: $('meta[name="description"]').attr('content'), - lastBuildDate: new Date().toUTCString(), - item: list && list.map((index, item) => { - item = $(item); - return { - title: item.find('.title').text(), - description: `作者:${item.find('.nickname').text()}
描述:${item.find('.abstract').text()}
`, - pubDate: new Date(item.find('.time').data('shared-at')).toUTCString(), - link: `https://www.jianshu.com${item.find('.title').attr('href')}` - }; - }).get(), - }); - callback(html); - }); +module.exports = async (ctx, next) => { + const response = await axios({ + method: 'get', + url: 'https://www.jianshu.com', + headers: { + 'User-Agent': config.ua, + 'Referer': 'https://www.jianshu.com' } }); + + const data = response.data; + + const $ = cheerio.load(data); + const list = $('.note-list li'); + + ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), { + title: '简书首页', + link: 'https://www.jianshu.com', + description: $('meta[name="description"]').attr('content'), + lastBuildDate: new Date().toUTCString(), + item: list && list.map((index, item) => { + item = $(item); + return { + title: item.find('.title').text(), + description: `作者:${item.find('.nickname').text()}
描述:${item.find('.abstract').text()}
`, + pubDate: new Date(item.find('.time').data('shared-at')).toUTCString(), + link: `https://www.jianshu.com${item.find('.title').attr('href')}` + }; + }).get(), + }); + + next(); }; \ No newline at end of file diff --git a/routes/jianshu/monthly.js b/routes/jianshu/monthly.js index f7e0abfa6a..986bd48294 100644 --- a/routes/jianshu/monthly.js +++ b/routes/jianshu/monthly.js @@ -1,42 +1,39 @@ -const request = require('request'); +const axios = require('axios'); const art = require('art-template'); const path = require('path'); const cheerio = require('cheerio'); -const base = require('../base'); -const mix = require('../../utils/mix'); +const config = require('../../config'); -module.exports = (req, res) => { - base({ - req: req, - res: res, - getHTML: (callback) => { - request.get({ - url: 'https://www.jianshu.com/trending/monthly', - headers: { - 'User-Agent': mix.ua, - 'Referer': 'https://www.jianshu.com/trending/monthly' - } - }, (err, httpResponse, body) => { - const $ = cheerio.load(body); - const list = $('.note-list li'); - - const html = art(path.resolve(__dirname, '../../views/rss.art'), { - title: '简书 30 日热门', - link: 'https://www.jianshu.com/trending/monthly', - description: '简书 30 日热门', - lastBuildDate: new Date().toUTCString(), - item: list && list.map((index, item) => { - item = $(item); - return { - title: item.find('.title').text(), - description: `作者:${item.find('.nickname').text()}
描述:${item.find('.abstract').text()}
`, - pubDate: new Date(item.find('.time').data('shared-at')).toUTCString(), - link: `https://www.jianshu.com${item.find('.title').attr('href')}` - }; - }).get(), - }); - callback(html); - }); +module.exports = async (ctx, next) => { + const response = await axios({ + method: 'get', + url: 'https://www.jianshu.com/trending/monthly', + headers: { + 'User-Agent': config.ua, + 'Referer': 'https://www.jianshu.com/trending/monthly' } }); + + const data = response.data; + + const $ = cheerio.load(data); + const list = $('.note-list li'); + + ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), { + title: '简书 30 日热门', + link: 'https://www.jianshu.com/trending/monthly', + description: '简书 30 日热门', + lastBuildDate: new Date().toUTCString(), + item: list && list.map((index, item) => { + item = $(item); + return { + title: item.find('.title').text(), + description: `作者:${item.find('.nickname').text()}
描述:${item.find('.abstract').text()}
`, + pubDate: new Date(item.find('.time').data('shared-at')).toUTCString(), + link: `https://www.jianshu.com${item.find('.title').attr('href')}` + }; + }).get(), + }); + + next(); }; \ No newline at end of file diff --git a/routes/jianshu/user.js b/routes/jianshu/user.js index 19ad730bfd..6ad77062e7 100644 --- a/routes/jianshu/user.js +++ b/routes/jianshu/user.js @@ -1,44 +1,41 @@ -const request = require('request'); +const axios = require('axios'); const art = require('art-template'); const path = require('path'); const cheerio = require('cheerio'); -const base = require('../base'); -const mix = require('../../utils/mix'); +const config = require('../../config'); -module.exports = (req, res) => { - const id = req.params.id; +module.exports = async (ctx, next) => { + const id = ctx.params.id; - base({ - req: req, - res: res, - getHTML: (callback) => { - request.get({ - url: `https://www.jianshu.com/u/${id}`, - headers: { - 'User-Agent': mix.ua, - 'Referer': `https://www.jianshu.com/u/${id}` - } - }, (err, httpResponse, body) => { - const $ = cheerio.load(body); - const list = $('.note-list li'); - - const html = art(path.resolve(__dirname, '../../views/rss.art'), { - title: $('title').text(), - link: `https://www.jianshu.com/u/${id}`, - description: $('meta[name="description"]').attr('content') || $('title').text(), - lastBuildDate: new Date().toUTCString(), - item: list && list.map((index, item) => { - item = $(item); - return { - title: item.find('.title').text(), - description: `作者:${item.find('.nickname').text()}
描述:${item.find('.abstract').text()}
`, - pubDate: new Date(item.find('.time').data('shared-at')).toUTCString(), - link: `https://www.jianshu.com${item.find('.title').attr('href')}` - }; - }).get(), - }); - callback(html); - }); + const response = await axios({ + method: 'get', + url: `https://www.jianshu.com/u/${id}`, + headers: { + 'User-Agent': config.ua, + 'Referer': `https://www.jianshu.com/u/${id}` } }); + + const data = response.data; + + const $ = cheerio.load(data); + const list = $('.note-list li'); + + ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), { + title: $('title').text(), + link: `https://www.jianshu.com/u/${id}`, + description: $('meta[name="description"]').attr('content') || $('title').text(), + lastBuildDate: new Date().toUTCString(), + item: list && list.map((index, item) => { + item = $(item); + return { + title: item.find('.title').text(), + description: `作者:${item.find('.nickname').text()}
描述:${item.find('.abstract').text()}
`, + pubDate: new Date(item.find('.time').data('shared-at')).toUTCString(), + link: `https://www.jianshu.com${item.find('.title').attr('href')}` + }; + }).get(), + }); + + next(); }; \ No newline at end of file diff --git a/routes/jianshu/weekly.js b/routes/jianshu/weekly.js index 49bc1c87f9..ad26c9f5fd 100644 --- a/routes/jianshu/weekly.js +++ b/routes/jianshu/weekly.js @@ -1,42 +1,39 @@ -const request = require('request'); +const axios = require('axios'); const art = require('art-template'); const path = require('path'); const cheerio = require('cheerio'); -const base = require('../base'); -const mix = require('../../utils/mix'); +const config = require('../../config'); -module.exports = (req, res) => { - base({ - req: req, - res: res, - getHTML: (callback) => { - request.get({ - url: 'https://www.jianshu.com/trending/weekly', - headers: { - 'User-Agent': mix.ua, - 'Referer': 'https://www.jianshu.com/trending/weekly' - } - }, (err, httpResponse, body) => { - const $ = cheerio.load(body); - const list = $('.note-list li'); - - const html = art(path.resolve(__dirname, '../../views/rss.art'), { - title: '简书 7 日热门', - link: 'https://www.jianshu.com/trending/weekly', - description: '简书 7 日热门', - lastBuildDate: new Date().toUTCString(), - item: list && list.map((index, item) => { - item = $(item); - return { - title: item.find('.title').text(), - description: `作者:${item.find('.nickname').text()}
描述:${item.find('.abstract').text()}
`, - pubDate: new Date(item.find('.time').data('shared-at')).toUTCString(), - link: `https://www.jianshu.com${item.find('.title').attr('href')}` - }; - }).get(), - }); - callback(html); - }); +module.exports = async (ctx, next) => { + const response = await axios({ + method: 'get', + url: 'https://www.jianshu.com/trending/weekly', + headers: { + 'User-Agent': config.ua, + 'Referer': 'https://www.jianshu.com/trending/weekly' } }); + + const data = response.data; + + const $ = cheerio.load(data); + const list = $('.note-list li'); + + ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), { + title: '简书 7 日热门', + link: 'https://www.jianshu.com/trending/weekly', + description: '简书 7 日热门', + lastBuildDate: new Date().toUTCString(), + item: list && list.map((index, item) => { + item = $(item); + return { + title: item.find('.title').text(), + description: `作者:${item.find('.nickname').text()}
描述:${item.find('.abstract').text()}
`, + pubDate: new Date(item.find('.time').data('shared-at')).toUTCString(), + link: `https://www.jianshu.com${item.find('.title').attr('href')}` + }; + }).get(), + }); + + next(); }; \ No newline at end of file diff --git a/routes/juejin/category.js b/routes/juejin/category.js index 471d6807c8..a494630658 100644 --- a/routes/juejin/category.js +++ b/routes/juejin/category.js @@ -1,70 +1,50 @@ -const request = require('request'); +const axios = require('axios'); const art = require('art-template'); const path = require('path'); -const base = require('../base'); -const mix = require('../../utils/mix'); +const config = require('../../config'); -module.exports = (req, res) => { - const category = req.params.category; +module.exports = async (ctx, next) => { + const category = ctx.params.category; - base({ - req: req, - res: res, - getHTML: (callback) => { - request.get({ - url: 'https://gold-tag-ms.juejin.im/v1/categories', - headers: { - 'User-Agent': mix.ua, - 'Referer': `https://juejin.im/welcome/${category}`, - 'X-Juejin-Client': '', - 'X-Juejin-Src': 'web', - 'X-Juejin-Token': '', - 'X-Juejin-Uid': '' - } - }, function (err, httpResponse, body) { - let data; - try { - data = JSON.parse(body); - } - catch (e) { - data = {}; - } - const cat = data.d && data.d.categoryList && data.d.categoryList.filter((item) => item.title === category)[0]; - if (cat && cat.id) { - request.get({ - url: `https://timeline-merger-ms.juejin.im/v1/get_entry_by_timeline?src=web&limit=20&category=${cat.id}`, - headers: { - 'User-Agent': mix.ua, - 'Referer': `https://juejin.im/welcome/${category}`, - } - }, function (err, httpResponse, body) { - let data; - try { - data = JSON.parse(body); - } - catch (e) { - data = {}; - } - - const html = art(path.resolve(__dirname, '../../views/rss.art'), { - title: `掘金${cat.name}`, - link: `https://juejin.im/welcome/${category}`, - description: `掘金${cat.name}`, - lastBuildDate: new Date().toUTCString(), - item: data.d && data.d.entrylist && data.d.entrylist.map((item) => ({ - title: item.title, - description: `${(item.content || item.summaryInfo || '无描述').replace(/[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f]/g, '')}`, - pubDate: new Date(item.createdAt).toUTCString(), - link: item.originalUrl - })), - }); - callback(html); - }); - } - else { - callback(''); - } - }); + const idResponse = await axios({ + method: 'get', + url: 'https://gold-tag-ms.juejin.im/v1/categories', + headers: { + 'User-Agent': config.ua, + 'Referer': `https://juejin.im/welcome/${category}`, + 'X-Juejin-Client': '', + 'X-Juejin-Src': 'web', + 'X-Juejin-Token': '', + 'X-Juejin-Uid': '' } }); + + const cat = idResponse.data.d.categoryList.filter((item) => item.title === category)[0]; + const id = cat.id; + + const response = await axios({ + method: 'get', + url: `https://timeline-merger-ms.juejin.im/v1/get_entry_by_timeline?src=web&limit=20&category=${id}`, + headers: { + 'User-Agent': config.ua, + 'Referer': `https://juejin.im/welcome/${category}`, + } + }); + + const data = response.data; + + ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), { + title: `掘金${cat.name}`, + link: `https://juejin.im/welcome/${category}`, + description: `掘金${cat.name}`, + lastBuildDate: new Date().toUTCString(), + item: data.d && data.d.entrylist && data.d.entrylist.map((item) => ({ + title: item.title, + description: `${(item.content || item.summaryInfo || '无描述').replace(/[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f]/g, '')}`, + pubDate: new Date(item.createdAt).toUTCString(), + link: item.originalUrl + })), + }); + + next(); }; \ No newline at end of file diff --git a/routes/ncm/artist.js b/routes/ncm/artist.js index 352e6d00df..f72d972af4 100644 --- a/routes/ncm/artist.js +++ b/routes/ncm/artist.js @@ -1,48 +1,36 @@ -const request = require('request'); +const axios = require('axios'); const art = require('art-template'); const path = require('path'); -const base = require('../base'); -const mix = require('../../utils/mix'); +const config = require('../../config'); -module.exports = (req, res) => { - const id = req.params.id; +module.exports = async (ctx, next) => { + const id = ctx.params.id; - base({ - req: req, - res: res, - getHTML: (callback) => { - request.get({ - url: 'https://music.163.com/api/artist/albums/' + id, - headers: { - 'User-Agent': mix.ua, - 'Referer': 'https://music.163.com/' - } - }, (err, httpResponse, body) => { - let data; - try { - data = JSON.parse(body); - } - catch (e) { - data = {}; - } - const result = data; - - const html = art(path.resolve(__dirname, '../../views/rss.art'), { - title: result.artist.name, - link: `https://music.163.com/#/artist/album?id=${id}`, - description: `网易云音乐歌手专辑 - ${result.artist.name}`, - lastBuildDate: new Date().toUTCString(), - item: result.hotAlbums && result.hotAlbums.map((item) => { - const singer = item.artists.length === 1 ? item.artists[0].name : item.artists.reduce((prev, cur) => (prev.name || prev) + '/' + cur.name); - return { - title: `${item.name} - ${singer}`, - description: `歌手:${singer}
专辑:${item.name}
日期:${new Date(item.publishTime).toLocaleDateString()}
`, - link: `https://music.163.com/#/album?id=${item.id}` - }; - }), - }); - callback(html); - }); + const response = await axios({ + method: 'get', + url: `https://music.163.com/api/artist/albums/${id}`, + headers: { + 'User-Agent': config.ua, + 'Referer': 'https://music.163.com/' } }); -}; + + const data = response.data; + + ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), { + title: data.artist.name, + link: `https://music.163.com/#/artist/album?id=${id}`, + description: `网易云音乐歌手专辑 - ${data.artist.name}`, + lastBuildDate: new Date().toUTCString(), + item: data.hotAlbums.map((item) => { + const singer = item.artists.length === 1 ? item.artists[0].name : item.artists.reduce((prev, cur) => (prev.name || prev) + '/' + cur.name); + return { + title: `${item.name} - ${singer}`, + description: `歌手:${singer}
专辑:${item.name}
日期:${new Date(item.publishTime).toLocaleDateString()}
`, + link: `https://music.163.com/#/album?id=${item.id}` + }; + }), + }); + + next(); +}; \ No newline at end of file diff --git a/routes/ncm/playlist.js b/routes/ncm/playlist.js index 5094c027db..4b0e445a4c 100644 --- a/routes/ncm/playlist.js +++ b/routes/ncm/playlist.js @@ -1,51 +1,41 @@ -const request = require('request'); +const axios = require('axios'); +const qs = require('querystring'); const art = require('art-template'); const path = require('path'); -const base = require('../base'); -const mix = require('../../utils/mix'); +const config = require('../../config'); -module.exports = (req, res) => { - const id = req.params.id; +module.exports = async (ctx, next) => { + const id = ctx.params.id; - base({ - req: req, - res: res, - getHTML: (callback) => { - request.post({ - url: 'https://music.163.com/api/v3/playlist/detail', - headers: { - 'User-Agent': mix.ua, - 'Referer': 'https://music.163.com/' - }, - form: { - id: id - } - }, (err, httpResponse, body) => { - let data; - try { - data = JSON.parse(body); - } - catch (e) { - data = {}; - } - const result = data.playlist || {}; - - const html = art(path.resolve(__dirname, '../../views/rss.art'), { - title: result.name, - link: `https://music.163.com/#/playlist?id=${id}`, - description: `网易云音乐歌单 - ${result.name}`, - lastBuildDate: new Date().toUTCString(), - item: result.tracks && result.tracks.map((item) => { - const singer = item.ar.length === 1 ? item.ar[0].name : item.ar.reduce((prev, cur) => (prev.name || prev) + '/' + cur.name); - return { - title: `${item.name} - ${singer}`, - description: `歌手:${singer}
专辑:${item.al.name}
日期:${new Date(item.publishTime).toLocaleDateString()}
`, - link: `https://music.163.com/#/song?id=${item.id}` - }; - }), - }); - callback(html); - }); - } + const response = await axios({ + method: 'post', + url: 'https://music.163.com/api/v3/playlist/detail', + headers: { + 'User-Agent': config.ua, + 'Referer': 'https://music.163.com/', + 'Content-Type': 'application/x-www-form-urlencoded', + }, + data: qs.stringify({ + id: id + }), }); + + const data = response.data.playlist; + + ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), { + title: data.name, + link: `https://music.163.com/#/playlist?id=${id}`, + description: `网易云音乐歌单 - ${data.name}`, + lastBuildDate: new Date().toUTCString(), + item: data.tracks && data.tracks.map((item) => { + const singer = item.ar.length === 1 ? item.ar[0].name : item.ar.reduce((prev, cur) => (prev.name || prev) + '/' + cur.name); + return { + title: `${item.name} - ${singer}`, + description: `歌手:${singer}
专辑:${item.al.name}
日期:${new Date(item.publishTime).toLocaleDateString()}
`, + link: `https://music.163.com/#/song?id=${item.id}` + }; + }), + }); + + next(); }; \ No newline at end of file diff --git a/routes/ncm/userplaylist.js b/routes/ncm/userplaylist.js index d1b2fe7013..de1dd3cbbc 100644 --- a/routes/ncm/userplaylist.js +++ b/routes/ncm/userplaylist.js @@ -1,66 +1,45 @@ -const request = require('request'); +const axios = require('axios'); +const qs = require('querystring'); const art = require('art-template'); const path = require('path'); -const base = require('../base'); -const mix = require('../../utils/mix'); +const config = require('../../config'); -module.exports = (req, res) => { - const uid = req.params.uid; +module.exports = async (ctx, next) => { + const uid = ctx.params.uid; - base({ - req: req, - res: res, - getHTML: (callback) => { - request.post( - { - url: 'http://music.163.com/api/user/playlist', - headers: { - 'User-Agent': mix.ua, - Referer: 'https://music.163.com/' - }, - form: { - uid: uid, - limit: 1000, - offset: 0 - } - }, - (err, httpResponse, body) => { - let data; - try { - data = JSON.parse(body); - } catch (e) { - data = {}; - } - const playlist = data.playlist || [{ creator: {} }]; - - const creator = playlist[0].creator; - - const { nickname, signature } = creator; - - const html = art( - path.resolve(__dirname, '../../views/rss.art'), - { - title: `${nickname} 的所有歌单`, - link: `http://music.163.com/user/home?id=${uid}`, - description: signature, - lastBuildDate: new Date().toUTCString(), - item: - playlist[0].id && - playlist.map((pl) => ({ - title: pl.name, - description: pl.description, - pubDate: new Date( - pl.createTime - ).toUTCString(), - link: `http://music.163.com/playlist?id=${ - pl.id - }` - })) - } - ); - callback(html); - } - ); - } + const response = await axios({ + method: 'post', + url: 'http://music.163.com/api/user/playlist', + headers: { + 'User-Agent': config.ua, + 'Referer': 'https://music.163.com/', + 'Content-Type': 'application/x-www-form-urlencoded', + }, + data: qs.stringify({ + uid: uid, + limit: 1000, + offset: 0 + }), }); -}; + + const playlist = response.data.playlist || [{ creator: {} }]; + + const creator = playlist[0].creator; + + const { nickname, signature } = creator; + + ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), { + title: `${nickname} 的所有歌单`, + link: `http://music.163.com/user/home?id=${uid}`, + description: signature, + lastBuildDate: new Date().toUTCString(), + item: playlist.map((pl) => ({ + title: pl.name, + description: pl.description, + pubDate: new Date(pl.createTime).toUTCString(), + link: `http://music.163.com/playlist?id=${pl.id}` + })) + }); + + next(); +}; \ No newline at end of file diff --git a/routes/weibo/user.js b/routes/weibo/user.js index 25f4036c17..966b77edd4 100644 --- a/routes/weibo/user.js +++ b/routes/weibo/user.js @@ -1,103 +1,83 @@ -const request = require('request'); +const axios = require('axios'); const art = require('art-template'); const path = require('path'); -const base = require('../base'); -const mix = require('../../utils/mix'); +const config = require('../../config'); -module.exports = (req, res) => { - const uid = req.params.uid; +// 格式化每条微博的HTML +function format (status) { + // 长文章的处理 + let temp = status.longText ? status.longText.longTextContent.replace(/\n/g, '
') : status.text; + // 表情图标转换为文字 + temp = temp.replace(/(.*?)<\/span>/g, '$1'); + // 去掉外部链接的图标 + temp = temp.replace(/<\/span><\/i>/g, ''); + // 去掉多余无意义的标签 + temp = temp.replace(//g, ''); + // 最后插入两个空行,让转发的微博排版更加美观一些 + temp += '

'; - base({ - req: req, - res: res, - getHTML: (callback) => { - request.get({ - url: `https://m.weibo.cn/api/container/getIndex?type=uid&value=${uid}`, - headers: { - 'User-Agent': mix.ua, - 'Referer': 'https://m.weibo.cn/' - }, - }, function (err, httpResponse, body) { - let data; - try { - data = JSON.parse(body).data; - } - catch (e) { - data = {}; - } - const name = data.userInfo && data.userInfo.screen_name; - const containerid = data.tabsInfo && data.tabsInfo.tabs && data.tabsInfo.tabs[1] && data.tabsInfo.tabs[1].containerid || ''; + // 处理外部链接 + temp = temp.replace(/https:\/\/weibo\.cn\/sinaurl\/.*?&u=(http.*?")/g, function (match, p1) { + return decodeURIComponent(p1); + }); - request.get({ - url: `https://m.weibo.cn/api/container/getIndex?type=uid&value=${uid}&containerid=${containerid}`, - headers: { - 'User-Agent': mix.ua, - 'Referer': `https://m.weibo.cn/u/${uid}` - }, - }, function (err, httpResponse, body) { - let data; - try { - data = JSON.parse(body); - } - catch (e) { - data = {}; - } + // 处理转发的微博 + if (status.retweeted_status) { + // 当转发的微博被删除时user为null + if (status.retweeted_status.user) { + temp += `转发 @${status.retweeted_status.user.screen_name}: `; + } + // 插入转发的微博 + temp += format(status.retweeted_status); + } - // 格式化每条微博的HTML - function format (status) { - // 长文章的处理 - let temp = status.longText ? status.longText.longTextContent.replace(/\n/g, '
') : status.text; - // 表情图标转换为文字 - temp = temp.replace(/(.*?)<\/span>/g, '$1'); - // 去掉外部链接的图标 - temp = temp.replace(/<\/span><\/i>/g, ''); - // 去掉多余无意义的标签 - temp = temp.replace(//g, ''); - // 最后插入两个空行,让转发的微博排版更加美观一些 - temp += '

'; + // 添加微博配图 + if (status.pics) { + status.pics.forEach(function (item) { + temp += '

'; + }); + } + return temp; +} - // 处理外部链接 - temp = temp.replace(/https:\/\/weibo\.cn\/sinaurl\/.*?&u=(http.*?")/g, function (match, p1) { - return decodeURIComponent(p1); - }); +module.exports = async (ctx, next) => { + const uid = ctx.params.uid; - // 处理转发的微博 - if (status.retweeted_status) { - // 当转发的微博被删除时user为null - if (status.retweeted_status.user) { - temp += `转发 @${status.retweeted_status.user.screen_name}: `; - } - // 插入转发的微博 - temp += format(status.retweeted_status); - } - - // 添加微博配图 - if (status.pics) { - status.pics.forEach(function (item) { - temp += '

'; - }); - } - return temp; - } - - const html = art(path.resolve(__dirname, '../../views/rss.art'), { - title: `${name}的微博`, - link: `http://weibo.com/${uid}/`, - description: `${name}的微博`, - lastBuildDate: new Date().toUTCString(), - item: data.data.cards.filter((item) => item.mblog && !item.mblog.isTop).map((item) => { - const title = item.mblog.text.replace(/<.*?>/g, ''); - return { - title: title.length > 24 ? title.slice(0, 24) + '...' : title, - description: format(item.mblog), - pubDate: new Date(item.mblog.created_at.length === 5 ? `${new Date().getFullYear()}-${item.mblog.created_at}` : item.mblog.created_at).toUTCString(), - link: `https://weibo.com/${uid}/${item.mblog.bid}` - }; - }), - }); - callback(html); - }); - }); + const containerResponse = await axios({ + method: 'get', + url: `https://m.weibo.cn/api/container/getIndex?type=uid&value=${uid}`, + headers: { + 'User-Agent': config.ua, + 'Referer': 'https://m.weibo.cn/' } }); + const name = containerResponse.data.data.userInfo.screen_name; + const containerid = containerResponse.data.data.tabsInfo.tabs[1].containerid; + + const response = await axios({ + method: 'get', + url: `https://m.weibo.cn/api/container/getIndex?type=uid&value=${uid}&containerid=${containerid}`, + headers: { + 'User-Agent': config.ua, + 'Referer': `https://m.weibo.cn/u/${uid}` + } + }); + + ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), { + title: `${name}的微博`, + link: `http://weibo.com/${uid}/`, + description: `${name}的微博`, + lastBuildDate: new Date().toUTCString(), + item: response.data.data.cards.filter((item) => item.mblog && !item.mblog.isTop).map((item) => { + const title = item.mblog.text.replace(/<.*?>/g, ''); + return { + title: title.length > 24 ? title.slice(0, 24) + '...' : title, + description: format(item.mblog), + pubDate: new Date(item.mblog.created_at.length === 5 ? `${new Date().getFullYear()}-${item.mblog.created_at}` : item.mblog.created_at).toUTCString(), + link: `https://weibo.com/${uid}/${item.mblog.bid}` + }; + }), + }); + + next(); }; \ No newline at end of file diff --git a/routes/zhihu/collection.js b/routes/zhihu/collection.js index 09c39b95ef..d232daefa9 100644 --- a/routes/zhihu/collection.js +++ b/routes/zhihu/collection.js @@ -1,42 +1,39 @@ -const request = require('request'); +const axios = require('axios'); const art = require('art-template'); const path = require('path'); const cheerio = require('cheerio'); -const base = require('../base'); -const mix = require('../../utils/mix'); +const config = require('../../config'); -module.exports = (req, res) => { - const id = req.params.id; +module.exports = async (ctx, next) => { + const id = ctx.params.id; - base({ - req: req, - res: res, - getHTML: (callback) => { - request.get({ - url: `https://www.zhihu.com/collection/${id}`, - headers: { - 'User-Agent': mix.ua, - 'Referer': `https://www.zhihu.com/collection/${id}` - } - }, (err, httpResponse, body) => { - const $ = cheerio.load(body); - const list = $('div.zm-item'); - const html = art(path.resolve(__dirname, '../../views/rss.art'), { - title: $('title').text(), - link: `https://www.zhihu.com/collection/${id}`, - description: `${$('#zh-fav-head-description').text()}`, - lastBuildDate: new Date().toUTCString(), - item: list && list.map((index, item) => { - item = $(item); - return { - title: item.find('.zm-item-title a').text(), - description: `内容:${item.find('textarea').text()}`, - link: `https://www.zhihu.com${item.find('.zm-item-title a').attr('href')}` - }; - }).get(), - }); - callback(html); - }); + const response = await axios({ + method: 'get', + url: `https://www.zhihu.com/collection/${id}`, + headers: { + 'User-Agent': config.ua, + 'Referer': `https://www.zhihu.com/collection/${id}` } }); + + const data = response.data; + const $ = cheerio.load(data); + const list = $('div.zm-item'); + + ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), { + title: $('title').text(), + link: `https://www.zhihu.com/collection/${id}`, + description: `${$('#zh-fav-head-description').text()}`, + lastBuildDate: new Date().toUTCString(), + item: list && list.map((index, item) => { + item = $(item); + return { + title: item.find('.zm-item-title a').text(), + description: `内容:${item.find('textarea').text()}`, + link: `https://www.zhihu.com${item.find('.zm-item-title a').attr('href')}` + }; + }).get(), + }); + + next(); }; \ No newline at end of file diff --git a/routes/ziroom/room.js b/routes/ziroom/room.js index eb46b6850b..b15b91626d 100644 --- a/routes/ziroom/room.js +++ b/routes/ziroom/room.js @@ -1,57 +1,46 @@ -const request = require('request'); +const axios = require('axios'); +const qs = require('querystring'); const art = require('art-template'); const path = require('path'); -const base = require('../base'); -const mix = require('../../utils/mix'); +const config = require('../../config'); -module.exports = (req, res) => { - const city = req.params.city || 'sh'; - const keyword = req.params.keyword || ''; - const iswhole = req.params.iswhole || 0; - const room = req.params.room || 1; +module.exports = async (ctx, next) => { + const city = ctx.params.city || 'sh'; + const keyword = ctx.params.keyword || ''; + const iswhole = ctx.params.iswhole || 0; + const room = ctx.params.room || 1; const domain = `${city === 'bj' ? '' : city + '.'}m.ziroom.com`; - base({ - req: req, - res: res, - getHTML: (callback) => { - request.post({ - url: `http://${domain}/list/ajax-get-data`, - headers: { - 'User-Agent': mix.ua, - 'Referer': `http://${domain}/${city.toUpperCase()}/search.html` - }, - form: { - 'recent_money': 0, - 'sort': 0, - 'is_whole': iswhole, - 'room': room, - 'key_word': keyword, - 'step': 0 - } - }, (err, httpResponse, body) => { - let data; - try { - data = JSON.parse(body); - } - catch (e) { - data = {}; - } - const result = data.data || []; - - const html = art(path.resolve(__dirname, '../../views/rss.art'), { - title: `自如的${keyword}${iswhole ? '整租' : '合租'}${room}室房源`, - link: `http://${domain}`, - description: `自如的${keyword}${iswhole ? '整租' : '合租'}${room}室房源`, - lastBuildDate: new Date().toUTCString(), - item: result && result.map((item) => ({ - title: item.title, - description: `${item.room_name}`, - link: `http://${domain}/${city.toUpperCase()}/room/${item.id}.html` - })), - }); - callback(html); - }); - } + const response = await axios({ + method: 'post', + url: `http://${domain}/list/ajax-get-data`, + headers: { + 'User-Agent': config.ua, + 'Referer': `http://${domain}/${city.toUpperCase()}/search.html` + }, + data: qs.stringify({ + 'recent_money': 0, + 'sort': 0, + 'is_whole': iswhole, + 'room': room, + 'key_word': keyword, + 'step': 0 + }), }); + + const data = response.data.data; + + ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), { + title: `自如的${keyword}${iswhole ? '整租' : '合租'}${room}室房源`, + link: `http://${domain}`, + description: `自如的${keyword}${iswhole ? '整租' : '合租'}${room}室房源`, + lastBuildDate: new Date().toUTCString(), + item: data.map((item) => ({ + title: item.title, + description: `${item.room_name}`, + link: `http://${domain}/${city.toUpperCase()}/room/${item.id}.html` + })), + }); + + next(); }; \ No newline at end of file diff --git a/utils/mix.js b/utils/mix.js deleted file mode 100644 index 5b3daa21b9..0000000000 --- a/utils/mix.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - getIp: (req) => req.headers['x-forwarded-for'] || - req.connection.remoteAddress || - req.socket.remoteAddress || - req.connection.socket.remoteAddress, - ua: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36', -}; \ No newline at end of file diff --git a/utils/redis.js b/utils/redis.js deleted file mode 100644 index 2e28ced442..0000000000 --- a/utils/redis.js +++ /dev/null @@ -1,29 +0,0 @@ -const logger = require('./logger'); -const redis = require('redis'); -let client; -if (process.env.REDIS_PORT_6379_TCP_ADDR && process.env.REDIS_PORT_6379_TCP_PORT) { - client = redis.createClient({ - host: process.env.REDIS_PORT_6379_TCP_ADDR, - port: process.env.REDIS_PORT_6379_TCP_PORT - }); -} -else { - client = redis.createClient(); -} - -client.on('error', (err) => { - logger.error('Redis Error ' + err); -}); - -module.exports = { - set: (key, value, time = 5 * 60) => { - client.set(key, value, 'EX', time); - logger.info('Redis Set: ' + key); - }, - get: (key, callback) => { - client.get(key, (err, reply) => { - callback(reply); - }); - }, - client: client -}; \ No newline at end of file diff --git a/views/rss.art b/views/rss.art index e3e37d813d..400cbb2b28 100644 --- a/views/rss.art +++ b/views/rss.art @@ -3,7 +3,7 @@ <![CDATA[{{ title || 'RSSHub' }}]]> {{ link }} - + RSSHub i@html.love zh-cn diff --git a/yarn.lock b/yarn.lock index d36657f119..0775192713 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6,7 +6,7 @@ version "9.6.4" resolved "https://registry.npmjs.org/@types/node/-/node-9.6.4.tgz#0ef7b4cfc3499881c81e0ea1ce61a23f6f4f5b42" -accepts@~1.3.5: +accepts@^1.2.2: version "1.3.5" resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" dependencies: @@ -31,15 +31,6 @@ ajv-keywords@^2.1.0: version "2.1.1" resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" -ajv@^5.1.0: - version "5.2.3" - resolved "http://registry.npm.taobao.org/ajv/download/ajv-5.2.3.tgz#c06f598778c44c6b161abafe3466b81ad1814ed2" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - json-schema-traverse "^0.3.0" - json-stable-stringify "^1.0.1" - ajv@^5.2.3, ajv@^5.3.0: version "5.5.2" resolved "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" @@ -71,16 +62,16 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +any-promise@^1.1.0: + version "1.3.0" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" dependencies: sprintf-js "~1.0.2" -array-flatten@1.1.1: - version "1.1.1" - resolved "http://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - array-union@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -109,31 +100,18 @@ art-template@4.12.2: merge-source-map "^1.0.3" source-map "^0.5.6" -asn1@~0.2.3: - version "0.2.3" - resolved "http://registry.npm.taobao.org/asn1/download/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - async@^2.6.0: version "2.6.0" resolved "https://registry.npmjs.org/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" dependencies: lodash "^4.14.0" -asynckit@^0.4.0: - version "0.4.0" - resolved "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - -aws4@^1.6.0: - version "1.6.0" - resolved "http://registry.npm.taobao.org/aws4/download/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" +axios@0.18.0: + version "0.18.0" + resolved "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" + dependencies: + follow-redirects "^1.3.0" + is-buffer "^1.1.5" babel-code-frame@^6.22.0: version "6.26.0" @@ -147,43 +125,10 @@ balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" -bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" - dependencies: - tweetnacl "^0.14.3" - -body-parser@1.18.2: - version "1.18.2" - resolved "http://registry.npm.taobao.org/body-parser/download/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" - dependencies: - bytes "3.0.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.1" - http-errors "~1.6.2" - iconv-lite "0.4.19" - on-finished "~2.3.0" - qs "6.5.1" - raw-body "2.3.2" - type-is "~1.6.15" - boolbase@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" -boom@4.x.x: - version "4.3.1" - resolved "http://registry.npm.taobao.org/boom/download/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" - dependencies: - hoek "4.x.x" - -boom@5.x.x: - version "5.2.0" - resolved "http://registry.npm.taobao.org/boom/download/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" - dependencies: - hoek "4.x.x" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -195,10 +140,6 @@ buffer-from@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" -bytes@3.0.0: - version "3.0.0" - resolved "http://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - caller-path@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" @@ -216,10 +157,6 @@ camel-case@3.0.x: no-case "^2.2.0" upper-case "^1.1.1" -caseless@~0.12.0: - version "0.12.0" - resolved "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - chalk@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -273,6 +210,12 @@ cli-width@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" +co-redis@2: + version "2.1.1" + resolved "https://registry.npmjs.org/co-redis/-/co-redis-2.1.1.tgz#8bc3717977c9ee5bfb6b28f39ae01bcf724d2dde" + dependencies: + es6-promisify "^4.1.0" + co@^4.6.0: version "4.6.0" resolved "http://registry.npm.taobao.org/co/download/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -319,12 +262,6 @@ colorspace@1.0.x: color "0.8.x" text-hex "0.0.x" -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "http://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" - dependencies: - delayed-stream "~1.0.0" - commander@2.15.x, commander@~2.15.0: version "2.15.1" resolved "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" @@ -342,23 +279,22 @@ concat-stream@^1.6.0: readable-stream "^2.2.2" typedarray "^0.0.6" -content-disposition@0.5.2: +content-disposition@~0.5.0: version "0.5.2" resolved "http://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" -content-type@~1.0.4: +content-type@^1.0.0: version "1.0.4" resolved "http://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" -cookie-signature@1.0.6: - version "1.0.6" - resolved "http://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" +cookies@~0.7.0: + version "0.7.1" + resolved "https://registry.npmjs.org/cookies/-/cookies-0.7.1.tgz#7c8a615f5481c61ab9f16c833731bcb8f663b99b" + dependencies: + depd "~1.1.1" + keygrip "~1.0.2" -cookie@0.3.1: - version "0.3.1" - resolved "http://registry.npm.taobao.org/cookie/download/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@~1.0.0: version "1.0.2" resolved "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -370,12 +306,6 @@ cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" -cryptiles@3.x.x: - version "3.1.2" - resolved "http://registry.npm.taobao.org/cryptiles/download/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" - dependencies: - boom "5.x.x" - css-select@~1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" @@ -389,24 +319,20 @@ css-what@2.1: version "2.1.0" resolved "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" -dashdash@^1.12.0: - version "1.14.1" - resolved "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - -debug@2.6.9: - version "2.6.9" - resolved "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -debug@^3.1.0: +debug@*, debug@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: ms "2.0.0" +debug@0.7.4: + version "0.7.4" + resolved "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" + +deep-equal@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + deep-is@~0.1.3: version "0.1.3" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -423,19 +349,19 @@ del@^2.0.2: pinkie-promise "^2.0.0" rimraf "^2.2.8" -delayed-stream@~1.0.0: +delegates@^1.0.0: version "1.0.0" - resolved "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" -depd@1.1.1, depd@~1.1.1: - version "1.1.1" - resolved "http://registry.npm.taobao.org/depd/download/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" - -depd@~1.1.2: +depd@^1.1.0, depd@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" -destroy@~1.0.4: +depd@~1.1.1: + version "1.1.1" + resolved "http://registry.npm.taobao.org/depd/download/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + +destroy@^1.0.3: version "1.0.4" resolved "http://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" @@ -496,12 +422,6 @@ double-ended-queue@^2.1.0-0: version "2.1.0-0" resolved "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c" -ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - dependencies: - jsbn "~0.1.0" - ee-first@1.1.1: version "1.1.1" resolved "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -512,10 +432,6 @@ enabled@1.0.x: dependencies: env-variable "0.0.x" -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - entities@^1.1.1, entities@~1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" @@ -524,7 +440,21 @@ env-variable@0.0.x: version "0.0.4" resolved "https://registry.npmjs.org/env-variable/-/env-variable-0.0.4.tgz#0d6280cf507d84242befe35a512b5ae4be77c54e" -escape-html@~1.0.3: +error-inject@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" + +es6-promise@^3.2.1: + version "3.3.1" + resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + +es6-promisify@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/es6-promisify/-/es6-promisify-4.1.0.tgz#dbcc1a3e93fdb8e9e709744182b7d2080c03fdb3" + dependencies: + es6-promise "^3.2.1" + +escape-html@~1.0.1: version "1.0.3" resolved "http://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -632,49 +562,6 @@ esutils@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -etag@~1.8.1: - version "1.8.1" - resolved "http://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - -express@^4.16.3: - version "4.16.3" - resolved "https://registry.npmjs.org/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" - dependencies: - accepts "~1.3.5" - array-flatten "1.1.1" - body-parser "1.18.2" - content-disposition "0.5.2" - content-type "~1.0.4" - cookie "0.3.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.1.1" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.2" - path-to-regexp "0.1.7" - proxy-addr "~2.0.3" - qs "6.5.1" - range-parser "~1.2.0" - safe-buffer "5.1.1" - send "0.16.2" - serve-static "1.13.2" - setprototypeof "1.1.0" - statuses "~1.4.0" - type-is "~1.6.16" - utils-merge "1.0.1" - vary "~1.1.2" - -extend@~3.0.1: - version "3.0.1" - resolved "http://registry.npm.taobao.org/extend/download/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - external-editor@^2.0.4: version "2.2.0" resolved "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" @@ -683,10 +570,6 @@ external-editor@^2.0.4: iconv-lite "^0.4.17" tmp "^0.0.33" -extsprintf@1.3.0, extsprintf@^1.2.0: - version "1.3.0" - resolved "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - fast-deep-equal@^1.0.0: version "1.0.0" resolved "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" @@ -716,18 +599,6 @@ file-entry-cache@^2.0.0: flat-cache "^1.2.1" object-assign "^4.0.1" -finalhandler@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.2" - statuses "~1.4.0" - unpipe "~1.0.0" - flat-cache@^1.2.1: version "1.3.0" resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" @@ -737,23 +608,13 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" -forever-agent@~0.6.1: - version "0.6.1" - resolved "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -form-data@~2.3.1: - version "2.3.1" - resolved "http://registry.npm.taobao.org/form-data/download/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" +follow-redirects@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz#d8120f4518190f55aac65bb6fc7b85fcd666d6aa" dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" + debug "^3.1.0" -forwarded@~0.1.2: - version "0.1.2" - resolved "http://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - -fresh@0.5.2: +fresh@^0.5.2: version "0.5.2" resolved "http://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -765,12 +626,6 @@ functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" -getpass@^0.1.1: - version "0.1.7" - resolved "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - dependencies: - assert-plus "^1.0.0" - glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: version "7.1.2" resolved "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" @@ -801,17 +656,6 @@ graceful-fs@^4.1.2: version "4.1.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" -har-schema@^2.0.0: - version "2.0.0" - resolved "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - -har-validator@~5.0.3: - version "5.0.3" - resolved "http://registry.npm.taobao.org/har-validator/download/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" - dependencies: - ajv "^5.1.0" - har-schema "^2.0.0" - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -822,23 +666,10 @@ has-flag@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" -hawk@~6.0.2: - version "6.0.2" - resolved "http://registry.npm.taobao.org/hawk/download/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" - dependencies: - boom "4.x.x" - cryptiles "3.x.x" - hoek "4.x.x" - sntp "2.x.x" - he@1.1.x: version "1.1.1" resolved "https://registry.npmjs.org/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" -hoek@4.x.x: - version "4.2.0" - resolved "http://registry.npm.taobao.org/hoek/download/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" - html-minifier@^3.4.3: version "3.5.13" resolved "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.13.tgz#6bca6d533a7f18a476dc6aeb3d113071ab5c165e" @@ -862,24 +693,23 @@ htmlparser2@^3.9.1: inherits "^2.0.1" readable-stream "^2.0.2" -http-errors@1.6.2, http-errors@~1.6.2: - version "1.6.2" - resolved "http://registry.npm.taobao.org/http-errors/download/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" +http-assert@^1.1.0: + version "1.3.0" + resolved "https://registry.npmjs.org/http-assert/-/http-assert-1.3.0.tgz#a31a5cf88c873ecbb5796907d4d6f132e8c01e4a" dependencies: - depd "1.1.1" + deep-equal "~1.0.1" + http-errors "~1.6.1" + +http-errors@^1.2.8, http-errors@^1.3.1, http-errors@~1.6.1: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + dependencies: + depd "~1.1.2" inherits "2.0.3" - setprototypeof "1.0.3" - statuses ">= 1.3.1 < 2" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" -http-signature@~1.2.0: - version "1.2.0" - resolved "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -iconv-lite@0.4.19, iconv-lite@^0.4.17: +iconv-lite@^0.4.17: version "0.4.19" resolved "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" @@ -921,14 +751,18 @@ inquirer@^3.0.6: strip-ansi "^4.0.0" through "^2.3.6" -ipaddr.js@1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b" +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" +is-generator-function@^1.0.3: + version "1.0.7" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522" + is-keyword-js@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/is-keyword-js/-/is-keyword-js-1.0.3.tgz#ac30dcf35b671f4b27b17f5cb57235126021132d" @@ -957,9 +791,9 @@ is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" -is-typedarray@~1.0.0: - version "1.0.0" - resolved "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" isarray@~1.0.0: version "1.0.0" @@ -969,7 +803,7 @@ isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" -isstream@0.1.x, isstream@~0.1.2: +isstream@0.1.x: version "0.1.2" resolved "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -984,44 +818,87 @@ js-yaml@^3.9.1: argparse "^1.0.7" esprima "^4.0.0" -jsbn@~0.1.0: - version "0.1.1" - resolved "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - json-schema-traverse@^0.3.0: version "0.3.1" resolved "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" -json-schema@0.2.3: - version "0.2.3" - resolved "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "http://registry.npm.taobao.org/json-stable-stringify/download/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" +keygrip@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/keygrip/-/keygrip-1.0.2.tgz#ad3297c557069dea8bcfe7a4fa491b75c5ddeb91" + +koa-compose@^3.0.0: + version "3.2.1" + resolved "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7" dependencies: - jsonify "~0.0.0" + any-promise "^1.1.0" -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" +koa-compose@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/koa-compose/-/koa-compose-4.0.0.tgz#2800a513d9c361ef0d63852b038e4f6f2d5a773c" -jsonify@~0.0.0: - version "0.0.0" - resolved "http://registry.npm.taobao.org/jsonify/download/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsprim@^1.2.2: - version "1.4.1" - resolved "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" +koa-convert@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0" dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" + co "^4.6.0" + koa-compose "^3.0.0" + +koa-is-json@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14" + +koa-redis-cache@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/koa-redis-cache/-/koa-redis-cache-3.0.0.tgz#e4c33ebc9d9c08fd50a669bca4573fabb4b2c584" + dependencies: + co-redis "2" + path-to-regexp "1" + readall "1" + redis "2" + +koa-router@7.4.0: + version "7.4.0" + resolved "https://registry.npmjs.org/koa-router/-/koa-router-7.4.0.tgz#aee1f7adc02d5cb31d7d67465c9eacc825e8c5e0" + dependencies: + debug "^3.1.0" + http-errors "^1.3.1" + koa-compose "^3.0.0" + methods "^1.0.1" + path-to-regexp "^1.1.1" + urijs "^1.19.0" + +koa@2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/koa/-/koa-2.5.0.tgz#b0fbe1e195e43b27588a04fd0be0ddaeca2c154c" + dependencies: + accepts "^1.2.2" + content-disposition "~0.5.0" + content-type "^1.0.0" + cookies "~0.7.0" + debug "*" + delegates "^1.0.0" + depd "^1.1.0" + destroy "^1.0.3" + error-inject "~1.0.0" + escape-html "~1.0.1" + fresh "^0.5.2" + http-assert "^1.1.0" + http-errors "^1.2.8" + is-generator-function "^1.0.3" + koa-compose "^4.0.0" + koa-convert "^1.2.0" + koa-is-json "^1.0.0" + mime-types "^2.0.7" + on-finished "^2.1.0" + only "0.0.2" + parseurl "^1.3.0" + statuses "^1.2.0" + type-is "^1.5.5" + vary "^1.0.0" kuler@0.0.x: version "0.0.0" @@ -1062,44 +939,26 @@ media-typer@0.3.0: version "0.3.0" resolved "http://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" -merge-descriptors@1.0.1: - version "1.0.1" - resolved "http://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - merge-source-map@^1.0.3: version "1.1.0" resolved "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" dependencies: source-map "^0.6.1" -methods@~1.1.2: +methods@^1.0.1: version "1.1.2" resolved "http://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" -mime-db@~1.30.0: - version "1.30.0" - resolved "http://registry.npm.taobao.org/mime-db/download/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" - mime-db@~1.33.0: version "1.33.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" -mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.17: - version "2.1.17" - resolved "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" - dependencies: - mime-db "~1.30.0" - -mime-types@~2.1.18: +mime-types@^2.0.7, mime-types@~2.1.18: version "2.1.18" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" dependencies: mime-db "~1.33.0" -mime@1.4.1: - version "1.4.1" - resolved "http://registry.npm.taobao.org/mime/download/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" - mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -1148,15 +1007,11 @@ nth-check@~1.0.1: dependencies: boolbase "~1.0.0" -oauth-sign@~0.8.2: - version "0.8.2" - resolved "http://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - object-assign@^4.0.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" -on-finished@~2.3.0: +on-finished@^2.1.0: version "2.3.0" resolved "http://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" dependencies: @@ -1178,6 +1033,10 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +only@0.0.2: + version "0.0.2" + resolved "https://registry.npmjs.org/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" + optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" @@ -1205,7 +1064,7 @@ parse5@^3.0.1: dependencies: "@types/node" "*" -parseurl@~1.3.2: +parseurl@^1.3.0: version "1.3.2" resolved "http://registry.npm.taobao.org/parseurl/download/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" @@ -1217,13 +1076,11 @@ path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" -path-to-regexp@0.1.7: - version "0.1.7" - resolved "http://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - -performance-now@^2.1.0: - version "2.1.0" - resolved "http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" +path-to-regexp@1, path-to-regexp@^1.1.1: + version "1.7.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + dependencies: + isarray "0.0.1" pify@^2.0.0: version "2.3.0" @@ -1255,38 +1112,10 @@ progress@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" -proxy-addr@~2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" - dependencies: - forwarded "~0.1.2" - ipaddr.js "1.6.0" - pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" -punycode@^1.4.1: - version "1.4.1" - resolved "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -qs@6.5.1, qs@~6.5.1: - version "6.5.1" - resolved "http://registry.npm.taobao.org/qs/download/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" - -range-parser@~1.2.0: - version "1.2.0" - resolved "http://registry.npm.taobao.org/range-parser/download/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - -raw-body@2.3.2: - version "2.3.2" - resolved "http://registry.npm.taobao.org/raw-body/download/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" - dependencies: - bytes "3.0.0" - http-errors "1.6.2" - iconv-lite "0.4.19" - unpipe "1.0.0" - readable-stream@^2.0.2, readable-stream@^2.2.2: version "2.3.6" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -1299,6 +1128,12 @@ readable-stream@^2.0.2, readable-stream@^2.2.2: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readall@1: + version "1.0.0" + resolved "https://registry.npmjs.org/readall/-/readall-1.0.0.tgz#8b4bfc412e687dbfbb00e0a6ede7e3a0f001b7c7" + dependencies: + debug "0.7.4" + redis-commands@^1.2.0: version "1.3.5" resolved "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.5.tgz#4495889414f1e886261180b1442e7295602d83a2" @@ -1307,7 +1142,7 @@ redis-parser@^2.6.0: version "2.6.0" resolved "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b" -redis@2.8.0: +redis@2: version "2.8.0" resolved "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz#202288e3f58c49f6079d97af7a10e1303ae14b02" dependencies: @@ -1323,33 +1158,6 @@ relateurl@0.2.x: version "0.2.7" resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" -request@^2.85.0: - version "2.85.0" - resolved "https://registry.npmjs.org/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - hawk "~6.0.2" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - stringstream "~0.0.5" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" @@ -1390,7 +1198,7 @@ rx-lite@*, rx-lite@^4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" -safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -1398,37 +1206,6 @@ semver@^5.3.0: version "5.5.0" resolved "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" -send@0.16.2: - version "0.16.2" - resolved "https://registry.npmjs.org/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.6.2" - mime "1.4.1" - ms "2.0.0" - on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.4.0" - -serve-static@1.13.2: - version "1.13.2" - resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.2" - send "0.16.2" - -setprototypeof@1.0.3: - version "1.0.3" - resolved "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" - setprototypeof@1.1.0: version "1.1.0" resolved "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -1453,12 +1230,6 @@ slice-ansi@1.0.0: dependencies: is-fullwidth-code-point "^2.0.0" -sntp@2.x.x: - version "2.0.2" - resolved "http://registry.npm.taobao.org/sntp/download/sntp-2.0.2.tgz#5064110f0af85f7cfdb7d6b67a40028ce52b4b2b" - dependencies: - hoek "4.x.x" - source-map@0.5.x, source-map@^0.5.6: version "0.5.7" resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -1471,31 +1242,13 @@ sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" -sshpk@^1.7.0: - version "1.13.1" - resolved "http://registry.npm.taobao.org/sshpk/download/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jsbn "~0.1.0" - tweetnacl "~0.14.0" - stack-trace@0.0.x: version "0.0.10" resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" -"statuses@>= 1.3.1 < 2": - version "1.3.1" - resolved "http://registry.npm.taobao.org/statuses/download/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - -statuses@~1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" +"statuses@>= 1.4.0 < 2", statuses@^1.2.0: + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" @@ -1510,10 +1263,6 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -stringstream@~0.0.5: - version "0.0.5" - resolved "http://registry.npm.taobao.org/stringstream/download/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - strip-ansi@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -1569,40 +1318,17 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tough-cookie@~2.3.3: - version "2.3.3" - resolved "http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" - dependencies: - punycode "^1.4.1" - triple-beam@^1.0.1: version "1.1.0" resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.1.0.tgz#2ac387c8c4bd04bd26c61df891a6079f8592fe10" -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - type-check@~0.3.2: version "0.3.2" resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" dependencies: prelude-ls "~1.1.2" -type-is@~1.6.15: - version "1.6.15" - resolved "http://registry.npm.taobao.org/type-is/download/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" - dependencies: - media-typer "0.3.0" - mime-types "~2.1.15" - -type-is@~1.6.16: +type-is@^1.5.5: version "1.6.16" resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" dependencies: @@ -1620,38 +1346,22 @@ uglify-js@3.3.x: commander "~2.15.0" source-map "~0.6.1" -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "http://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - upper-case@^1.1.1: version "1.1.3" resolved "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" +urijs@^1.19.0: + version "1.19.1" + resolved "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz#5b0ff530c0cbde8386f6342235ba5ca6e995d25a" + util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" -utils-merge@1.0.1: - version "1.0.1" - resolved "http://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - -uuid@^3.1.0: - version "3.1.0" - resolved "http://registry.npm.taobao.org/uuid/download/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" - -vary@~1.1.2: +vary@^1.0.0: version "1.1.2" resolved "http://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" -verror@1.10.0: - version "1.10.0" - resolved "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - which@^1.2.9: version "1.3.0" resolved "https://registry.npmjs.org/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"