├── spiders ├── fb.js ├── cao.js ├── command.js ├── qb.js ├── wq.js ├── jr.js ├── sn.js ├── kf.js ├── 天天美剧.js ├── hn.js ├── jianshu.js ├── mp4ba.js ├── app.js ├── jiandan.js ├── tip.js ├── dygod.js ├── gt.js ├── v2ex.js ├── zh.js └── xt.js ├── login └── xunLeiYuanCheng.js ├── gt.png ├── hn.jpg ├── sn.png ├── zh.png ├── app.png ├── cao.png ├── icon.png ├── jian.jpg ├── v2ex.png ├── 天天美剧.png ├── dygod.png ├── jiandan.png ├── juejin.png ├── mp4ba.jpg ├── mp4ba.png ├── thunder.scpt ├── qiushibaike.jpg ├── qiushibaike.png ├── kaifazhetoutiao.jpg ├── 556A94A6-EFA5-46E4-92C2-69B3D89FEFFF.png ├── utils ├── recordError.js ├── service.js ├── log.js └── plusOne.js ├── makeAlfredworkflowPackage.sh ├── test └── test.js ├── package.json ├── cache └── init ├── README.md ├── main.js ├── thunderDownload.js └── info.plist /spiders/fb.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /login/xunLeiYuanCheng.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/gt.png -------------------------------------------------------------------------------- /hn.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/hn.jpg -------------------------------------------------------------------------------- /sn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/sn.png -------------------------------------------------------------------------------- /zh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/zh.png -------------------------------------------------------------------------------- /app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/app.png -------------------------------------------------------------------------------- /cao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/cao.png -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/icon.png -------------------------------------------------------------------------------- /jian.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/jian.jpg -------------------------------------------------------------------------------- /v2ex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/v2ex.png -------------------------------------------------------------------------------- /天天美剧.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/天天美剧.png -------------------------------------------------------------------------------- /dygod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/dygod.png -------------------------------------------------------------------------------- /jiandan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/jiandan.png -------------------------------------------------------------------------------- /juejin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/juejin.png -------------------------------------------------------------------------------- /mp4ba.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/mp4ba.jpg -------------------------------------------------------------------------------- /mp4ba.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/mp4ba.png -------------------------------------------------------------------------------- /thunder.scpt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/thunder.scpt -------------------------------------------------------------------------------- /qiushibaike.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/qiushibaike.jpg -------------------------------------------------------------------------------- /qiushibaike.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/qiushibaike.png -------------------------------------------------------------------------------- /kaifazhetoutiao.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/kaifazhetoutiao.jpg -------------------------------------------------------------------------------- /556A94A6-EFA5-46E4-92C2-69B3D89FEFFF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epirus/rio-alfredworkflow/HEAD/556A94A6-EFA5-46E4-92C2-69B3D89FEFFF.png -------------------------------------------------------------------------------- /utils/recordError.js: -------------------------------------------------------------------------------- 1 | var fs=require('fs') 2 | module.exports = function(errorInfo, fileName) { 3 | fs.appendFile('./logs/'+fileName,errorInfo, function(err) { 4 | }); 5 | } 6 | -------------------------------------------------------------------------------- /makeAlfredworkflowPackage.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | zip -r rio.alfredworkflow ./* 3 | zip -r rio.alfredworkflow ./.git 4 | zip rio.zip ./rio.alfredworkflow 5 | mv ./rio.alfredworkflow ~/Desktop/ 6 | mv ./rio.zip ~/Desktop/ 7 | 8 | -------------------------------------------------------------------------------- /utils/service.js: -------------------------------------------------------------------------------- 1 | module.exports = [ 2 | 'tip', 3 | 'v2ex', 4 | 'app', 5 | 'dygod', 6 | 'mp4ba', 7 | 'gt', 8 | 'jiandan', 9 | 'hn', 10 | 'sn', 11 | 'kf', 12 | 'qb', 13 | 'command', 14 | 'xt', 15 | 'zh', 16 | '天天美剧' 17 | ] 18 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | var main = require('../main') 2 | //var thunder = require('../thunderDownload.js') 3 | // main(' dygod dm') // dygod test 4 | // thunder('http://www.ygdy8.net/html/gndy/dyzz/20160518/50993.html') //dygod 5 | // thunder('http://www.mp4ba.com/show.php?hash=b7c2336aa2b352ae038fb4b1e04d79a40ec7532a') //mp4ba 6 | // main(' jiandan latest 3') //jiandan test 7 | //main(' xt latest') //xitujuejin 8 | // main(' zh ty') //zhi hu ri bao 9 | main(' 天天美剧 硅谷') //zhi hu ri bao 10 | -------------------------------------------------------------------------------- /utils/log.js: -------------------------------------------------------------------------------- 1 | var alfredItem = require('alfred-item') 2 | var fs= require('fs') 3 | 4 | module.exports = function(items) { 5 | var xml = new alfredItem(); 6 | for (var i in items) { 7 | var item = items[i] 8 | xml.addItem(item['uid'], item['title'], item['subtitle'], item['icon'], { 9 | autocomplete: item['autocomplete'], 10 | arg: item['arg'], 11 | valid:item['valid']||'YES' 12 | }) 13 | } 14 | console.log(xml.output()) 15 | } 16 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "user.workflow.2A8DBD60-ACEF-49F0-982F-E373D7347F52", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "alfred-item": "^1.0.1", 14 | "cheerio": "^0.20.0", 15 | "fuzzaldrin": "^2.1.0", 16 | "iconv-lite": "^0.4.13", 17 | "request": "^2.72.0", 18 | "scrape-it": "^3.0.1", 19 | "tough-cookie-filestore": "0.0.1" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /utils/plusOne.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs') 2 | module.exports = function(filePath, keyword) { 3 | fs.readFile(filePath, function(err, data) { 4 | if (err) throw err; 5 | var raw = data.toString() 6 | var items = JSON.parse(raw) 7 | for (var i in items) { 8 | if (items[i]['autocomplete'].trim() === keyword) { 9 | items[i]['counter'] += 1 10 | break 11 | } 12 | } 13 | items.sort(function(a, b) { 14 | return b.counter-a.counter 15 | }) 16 | 17 | fs.writeFile(filePath, JSON.stringify(items), function(err) { 18 | if (err) throw err 19 | }) 20 | }) 21 | } 22 | -------------------------------------------------------------------------------- /spiders/cao.js: -------------------------------------------------------------------------------- 1 | var request = require('request') 2 | var scrape = function(url, page) { 3 | 4 | } 5 | 6 | module.exports = { 7 | 'cao': { 8 | ' cao latest': { 9 | title: '最新电影', 10 | icon: 'cao.png', 11 | url: 'https://extraction.import.io/query/extractor/0e52400c-e651-4e8c-a953-eec21e467800?_apikey=&url=http%3A%2F%2Fco.yocl.co%2Fthread0806.php%3Ffid%3D2', 12 | arg:'', 13 | autocomplete: ' cao latest', 14 | valid: 'YES', 15 | uid: 'cao_latest' 16 | }, 17 | }, 18 | ' cao ': function(query) { 19 | var that = this; 20 | var query = query.trim() 21 | log(Object.keys(that[query]).map(function(key) { 22 | plusOne('./cache/init', query) 23 | return that[query][key] 24 | })) 25 | }, 26 | ' cao latest': function(query, page) { 27 | scrape(this[query.trim().split(' ')[0]][query].url, page) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /spiders/command.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs') 2 | var log = require('../utils/log') 3 | var exec = require('child_process').exec 4 | module.exports = { 5 | ' ->reset': function() { 6 | fs.unlink('./cache/init', function(err) { 7 | if (err) { 8 | log([{ 9 | title: 'Rio-Reset', 10 | subtitle: '清理缓存失败', 11 | icon: 'icon.png', 12 | arg: '', 13 | autocomplete: '', 14 | uid: 'command', 15 | }]) 16 | } else { 17 | log([{ 18 | title: 'Rio-Reset', 19 | subtitle: '清理缓存成功', 20 | icon: 'icon.png', 21 | arg: '', 22 | autocomplete: '', 23 | uid: 'command', 24 | }]) 25 | } 26 | }); 27 | }, 28 | ' ->update':function(){ 29 | exec(`git pull origin master > /dev/null 2>&1 &`) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /cache/init: -------------------------------------------------------------------------------- 1 | [{"title":"V2EX","subtitle":"V2EX 是一个关于分享和探索的地方","icon":"v2ex.jpg","arg":"","autocomplete":" v2ex ","uid":"v2ex","counter":0},{"title":"AppShopper 降价","subtitle":"mac · ios 应用降价","icon":"app.jpg","arg":"","autocomplete":" app ","uid":"appshopper","counter":0},{"title":"DyGod 最新电影","subtitle":"展示最新电影","icon":"dygod.jpg","arg":"","autocomplete":" dygod ","uid":"dygod","counter":0},{"title":"Mp4Ba 最新电影","subtitle":"展示最新电视电影","icon":"mp4ba.jpg","arg":"","autocomplete":" mp4ba ","uid":"mp4ba","counter":0},{"title":"Hacker News","subtitle":"Hacker News","icon":"hn.jpg","arg":"","autocomplete":" hn ","uid":"hackernews","counter":0},{"title":"Startup News","subtitle":"Startup News","icon":"sn.jpg","arg":"","autocomplete":" sn ","uid":"startupnews","counter":0},{"title":"Github Trending","subtitle":"github-trending","icon":"gt.jpg","arg":"","autocomplete":" gt ","uid":"githubtrending","counter":0},{"title":"Jian Dan","subtitle":"煎蛋以译介方式传播网络新鲜资讯","icon":"jiandan.jpg","arg":"","autocomplete":" jiandan ","uid":"jiandan","counter":0},{"title":"开发者头条","subtitle":"技术极客的头条新闻","icon":"kaifazhetoutiao.jpg","arg":"","autocomplete":" kf ","uid":"kaifazhetoutiao","counter":0},{"title":"糗事百科","subtitle":"搞笑笑话,糗事百科","icon":"qiushibaike.jpg","arg":"","autocomplete":" qb ","uid":"qiushibaike","counter":0}] -------------------------------------------------------------------------------- /spiders/qb.js: -------------------------------------------------------------------------------- 1 | var log = require('../utils/log.js') 2 | var plusOne=require('../utils/plusOne') 3 | module.exports = { 4 | 'qb': { 5 | ' qb latest': { 6 | title: '糗事百科-首页', 7 | icon: 'qiushibaike.jpg', 8 | arg: 'http://www.qiushibaike.com/hot', 9 | autocomplete: ' qb ', 10 | valid: 'YES', 11 | uid: 'qb_latest' 12 | }, 13 | ' qb pic':{ 14 | title: '糗事百科-图片', 15 | icon: 'qiushibaike.jpg', 16 | arg: 'http://www.qiushibaike.com/pic/', 17 | autocomplete: ' qb ', 18 | valid: 'YES', 19 | uid: 'qb_pic' 20 | }, 21 | ' qb text':{ 22 | title: '糗事百科-文字', 23 | icon: 'qiushibaike.jpg', 24 | arg: 'http://www.qiushibaike.com/textnew/', 25 | autocomplete: ' qb ', 26 | valid: 'YES', 27 | uid: 'qb_text' 28 | } 29 | }, 30 | ' qb ': function(query) { 31 | var that = this; 32 | var query=query.trim() 33 | log(Object.keys(that[query]).map(function(key) { 34 | plusOne('./cache/init',query) 35 | return that[query][key] 36 | })) 37 | }, 38 | ' qb latest': function() { 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Rio -> Read In One 2 | 3 | ### 一个Alfred的插件,可以在插件中阅读一些热门网站的内容. 4 | 5 | # Requirement 6 | 7 | - Node(Version>5.0)->Install->brew install node 8 | - Git->For update plugin from github 9 | 10 | # Download 11 | 12 | [Download](https://github.com/epirus/rio-alfredworkflow/files/292493/rio.zip) 13 | 14 | # Features 15 | 16 | ## Demo1 17 | 18 | ![](https://raw.githubusercontent.com/epirus/i/master/rio-demo.gif) 19 | 20 | ### Use Tab to autocomplete keywords && Shift to preview the webpage 21 | ## Demo2 22 | 23 | ![](https://github.com/epirus/i/blob/master/rio-demo1.gif) 24 | 25 | ### Use Tab to autocomplete keywords && Shift to preview the webpage 26 | 27 | # 已完成的事 28 | 29 | - ~~V2EX~~ 30 | - ~~AppShooper~~ 31 | - ~~电影天堂~~ 32 | - ~~MP4Ba~~ 33 | - ~~Hacker News~~ 34 | - ~~Github Trending~~ 35 | - ~~Startup News~~ 36 | - ~~煎蛋~~ 37 | - ~~开发者头条~~ 38 | - ~~糗事百科(内容质量太差->移除)~~ 39 | - ~~稀土掘金~~ 40 | - ~~知乎日报~~ 41 | - ~~增加天天美剧 ->因为我喜欢<硅谷>~~ 42 | - ~使用中文命名 -> 更加的直观->一个为需求~ 43 | - ~~使用png的背景图片,在Aflred3.0上的效果更好 ->支持毛玻璃~~ 44 | # 要做的事 45 | 46 | - *CaoLiuSheQu 没错我喜欢 47 | - Stocks 48 | - BitCoin 49 | - 子目录的排序 50 | - 加入后台自动抓去内容->可以快速的阅读(调度器) 51 | - 使用open命令替换,迅雷的脚本~讲使用系统默认的软件进行下载 52 | - "http://tech2ipo.com/" 也许是个好网站 53 | 54 | # 妈蛋 55 | 56 | - ~~dygod->preview->url->error~~ 57 | - rio缓存bug 58 | 59 | -------------------------------------------------------------------------------- /spiders/wq.js: -------------------------------------------------------------------------------- 1 | var log = require('../utils/log.js') 2 | var request = require('request') 3 | var plusOne=require('../utils/plusOne') 4 | var scrape = function(url) { 5 | request({ 6 | url: url, 7 | headers: { 8 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36' 9 | } 10 | }, function(error, response, body) { 11 | console.log(body) 12 | }) 13 | } 14 | 15 | scrape('http://api.wanqu.co/api/v2/issue/latest?token=N0sCCGnErjVs3OrCyIgsTg12U00sm1gKCXHtqgLDJRk=') 16 | module.exports = { 17 | 'wq': { 18 | ' wq latest': { 19 | title: '湾区日报', 20 | icon: 'wq.jpg', 21 | arg: 'http://api.wanqu.co/api/v2/issue/latest?token=N0sCCGnErjVs3OrCyIgsTg12U00sm1gKCXHtqgLDJRk=', 22 | autocomplete: ' wq latest', 23 | valid: 'yes', 24 | uid: '0' 25 | } 26 | }, 27 | ' wq ': function(query) { 28 | var that = this; 29 | var query=query.trim() 30 | log(Object.keys(that[query]).map(function(key) { 31 | plusOne('./cache/init',query) 32 | return that[query][key] 33 | })) 34 | }, 35 | ' wq latest': function(query) { 36 | scrape(this[query.trim().split(' ')[0]][query].arg) 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | var extend = require('util')._extend; 2 | var service = require('./utils/service') 3 | var spiderServiceDire = './spiders/' 4 | var recordError = require('./utils/recordError') 5 | var fuzzy = require('fuzzaldrin') 6 | var log = require('./utils/log') 7 | 8 | module.exports = function(query) { 9 | var queryKeywords = new function() {} 10 | queryKeywords.query = query 11 | service.map(function(item) { 12 | try { 13 | extend(queryKeywords, require(spiderServiceDire + item)) 14 | } catch (err) { 15 | recordError('loading--->' + err + '\n', 'error.log') 16 | } 17 | }) 18 | 19 | var page='1' 20 | var querySplit = query.split(' ') 21 | if (querySplit.length === 4) { 22 | query= querySplit.slice(0, 3).join(' ') 23 | page= querySplit.slice(-1)[0] 24 | } 25 | if (query in queryKeywords) { 26 | queryKeywords[query](query,page) 27 | } else { 28 | var t = [] 29 | var prefix = query.trim().split(' ')[0] 30 | try { 31 | fuzzy.filter(Object.keys(queryKeywords[prefix]), query).map(function(item) { 32 | if (item in queryKeywords[prefix]) { 33 | t.push((queryKeywords[prefix][item])) 34 | } 35 | }) 36 | log(t) 37 | } catch (err) { 38 | recordError('service.js maybe not include the crawlers file--->' + err + '\n', 'error.log') 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /thunderDownload.js: -------------------------------------------------------------------------------- 1 | var request = require('request') 2 | var exec = require('child_process').exec 3 | var iconv = require('iconv-lite') 4 | var cheerio = require('cheerio') 5 | 6 | module.exports = function(query) { 7 | //dygod download 8 | if (query.indexOf('dy') > -1) { 9 | request({ 10 | url: query, 11 | encoding: null, 12 | headers: { 13 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36' 14 | } 15 | }, function(error, response, body) { 16 | var html = iconv.decode(body, 'gb2312') 17 | $ = cheerio.load(html, { 18 | decodeEntities: false 19 | }) 20 | var thunderUrl = $('#Zoom a').attr('href') 21 | console.log(thunderUrl) 22 | exec(`open ${thunderUrl}`) 23 | }) 24 | }else if (query.indexOf('mp4ba') > -1) { 25 | request({ 26 | url: query, 27 | headers: { 28 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36' 29 | } 30 | }, function(error, response, body) { 31 | $ = cheerio.load(body, { 32 | decodeEntities: false 33 | }) 34 | var thunderUrl = $('#magnet').attr('href') 35 | console.log(thunderUrl) 36 | exec(`open ${thunderUrl}`) 37 | }) 38 | }else{ 39 | console.log(query) 40 | exec(`open "${query}"`) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /spiders/jr.js: -------------------------------------------------------------------------------- 1 | var log = require('../utils/log.js') 2 | var request = require('request') 3 | var cheerio = require('cheerio') 4 | var plusOne=require('../utils/plusOne') 5 | var scrape = function(url) { 6 | request({ 7 | url:url, 8 | encoding : null , 9 | headers:{ 10 | 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36' 11 | } 12 | }, function(error, response, body) { 13 | var html=iconv.decode(body, 'gb2312') 14 | $ = cheerio.load(html, {decodeEntities: false}) 15 | var items=[] 16 | $('.tbspan').map(function(index,ele){ 17 | items[index]={ 18 | title:$(ele).find('.ulink').text(), 19 | subtitle:$(ele).find('font').text(), 20 | icon:'jr.jpg', 21 | uid:'', 22 | arg:'http://www.ygdy8.net/'+$(ele).find('.ulink').attr('href') 23 | } 24 | }) 25 | log(items) 26 | }) 27 | } 28 | 29 | module.exports = { 30 | 'jr': { 31 | ' jr latest': { 32 | title: '最新电影', 33 | icon: 'jr.jpg', 34 | url: 'http://www.ygdy8.net/html/gndy/dyzz/index.html', 35 | arg:'', 36 | autocomplete: ' jr latest', 37 | valid: 'yes', 38 | uid: 'jr_latest' 39 | } 40 | }, 41 | ' jr ': function(query) { 42 | var that = this; 43 | var query=query.trim() 44 | log(Object.keys(that[query]).map(function(key) { 45 | plusOne('./cache/init',query) 46 | return that[query][key] 47 | })) 48 | }, 49 | ' jr latest': function(query) { 50 | scrape(this[query.trim().split(' ')[0]][query].url) 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /spiders/sn.js: -------------------------------------------------------------------------------- 1 | var scrapeIt = require("scrape-it") 2 | var log = require('../utils/log.js') 3 | var request = require('request') 4 | var cheerio = require('cheerio') 5 | var plusOne = require('../utils/plusOne') 6 | var scrape = function(url) { 7 | request({ 8 | url: url, 9 | headers: { 10 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36' 11 | } 12 | }, function(error, response, body) { 13 | $ = cheerio.load(body, { 14 | decodeEntities: false 15 | }) 16 | var items = [] 17 | $('.title').map(function(index, ele) { 18 | var title = $(ele).find('a').text() 19 | if (title === "More") return 20 | items[index] = { 21 | title: title, 22 | subtitle: '', 23 | icon: 'sn.png', 24 | uid: '', 25 | arg: $(ele).find('a').attr('href') 26 | } 27 | }) 28 | log(items) 29 | }) 30 | } 31 | 32 | module.exports = { 33 | 'sn': { 34 | ' sn latest': { 35 | title: 'Startup News', 36 | icon: 'sn.png', 37 | url: 'http://news.dbanotes.net/', 38 | arg: '', 39 | autocomplete: ' sn latest', 40 | valid: 'yes', 41 | uid: 'sn_latest' 42 | } 43 | }, 44 | ' sn ': function(query) { 45 | var that = this; 46 | var query = query.trim() 47 | log(Object.keys(that[query]).map(function(key) { 48 | plusOne('./cache/init', query) 49 | return that[query][key] 50 | })) 51 | }, 52 | ' sn latest': function(query) { 53 | scrape(this[query.trim().split(' ')[0]][query].url) 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /spiders/kf.js: -------------------------------------------------------------------------------- 1 | var log = require('../utils/log.js') 2 | var request = require('request') 3 | var cheerio = require('cheerio') 4 | var plusOne = require('../utils/plusOne') 5 | var scrape = function(url, page) { 6 | var date = new Date(); 7 | date.setDate(date.getDate() - parseInt(page)) 8 | var url=url+ date.toJSON().slice(0, 10); 9 | request({ 10 | url: url, 11 | headers: { 12 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36' 13 | } 14 | }, function(error, response, body) { 15 | $ = cheerio.load(body, { 16 | decodeEntities: false 17 | }) 18 | var items = [] 19 | $('.post').map(function(index, ele) { 20 | items[index] = { 21 | title: $(ele).find('.title a').text(), 22 | subtitle: '', 23 | icon: 'kaifazhetoutiao.jpg', 24 | uid: '', 25 | arg: $(ele).find('.title a').attr('href') 26 | } 27 | }) 28 | log(items) 29 | }) 30 | } 31 | 32 | module.exports = { 33 | 'kf': { 34 | ' kf latest': { 35 | title: '开发者头条', 36 | icon: 'kaifazhetoutiao.jpg', 37 | url: 'http://toutiao.io/prev/', 38 | arg: '', 39 | autocomplete: ' kf latest', 40 | valid: 'yes', 41 | uid: 'kf_latest' 42 | } 43 | }, 44 | ' kf ': function(query) { 45 | var that = this; 46 | var query = query.trim() 47 | log(Object.keys(that[query]).map(function(key) { 48 | plusOne('./cache/init', query) 49 | return that[query][key] 50 | })) 51 | }, 52 | ' kf latest': function(query, page) { 53 | scrape(this[query.trim().split(' ')[0]][query].url, page) 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /spiders/天天美剧.js: -------------------------------------------------------------------------------- 1 | var log = require('../utils/log.js') 2 | var request = require('request') 3 | var cheerio = require('cheerio') 4 | var plusOne = require('../utils/plusOne') 5 | var scrape = function(url) { 6 | request({ 7 | url: 'https://extraction.import.io/query/extractor/9d8b0ca8-c1be-4a90-81a4-049d8f497cda?_apikey=05517aabfd7841259d17536fa4f4822904ad841e191af123e1547f7a662873e12d54926849b26685dadbceba1b7e668dfa8144f66c8ac661a14001d2d8a7e2dd017564c3b08d1d8e7c4d679c5692f5e0&url=http%3A%2F%2Fcn163.net%2Farchives%2F7698%2F', 8 | headers: { 9 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36' 10 | } 11 | }, function(error, response, body) { 12 | var body = JSON.parse(body) 13 | var items = [] 14 | body.extractorData.data[2].group.map(function(ele, index) { 15 | items[index] = { 16 | title: ele.title[0].text, 17 | subtitle:'' , 18 | icon: '天天美剧.png', 19 | arg:ele.href[0].text 20 | } 21 | }) 22 | log(items) 23 | }) 24 | } 25 | module.exports = { 26 | '天天美剧': { 27 | ' 天天美剧 硅谷': { 28 | title: '硅谷', 29 | icon: '天天美剧.png', 30 | url: 'http://cn163.net/archives/7698/', 31 | arg: '', 32 | autocomplete: ' 天天美剧 硅谷', 33 | valid: 'YES', 34 | uid: '天天美剧_硅谷' 35 | } 36 | }, 37 | ' 天天美剧 ': function(query) { 38 | var that = this; 39 | var query = query.trim() 40 | log(Object.keys(that[query]).map(function(key) { 41 | plusOne('./cache/init', query) 42 | return that[query][key] 43 | })) 44 | }, 45 | ' 天天美剧 硅谷': function(query, page) { 46 | scrape(this[query.trim().split(' ')[0]][query].url) 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /spiders/hn.js: -------------------------------------------------------------------------------- 1 | var scrapeIt = require("scrape-it") 2 | var log = require('../utils/log.js') 3 | var plusOne=require('../utils/plusOne') 4 | var scrape = function(url) { 5 | return scrapeIt(url, { 6 | articles: { 7 | listItem: ".athing", 8 | data: { 9 | autocomplete: { 10 | convert: function() { 11 | return this.query 12 | } 13 | }, 14 | title: ".title>a", 15 | subtitle: ".subtext", 16 | icon: { 17 | convert: function() { 18 | return "hn.jpg" 19 | } 20 | }, 21 | uid: { 22 | convert: function() { 23 | return '' 24 | } 25 | }, 26 | arg: { 27 | selector: ".title>a", 28 | attr: 'href', 29 | convert: function(x) { 30 | return x 31 | } 32 | } 33 | } 34 | } 35 | }).then(function(page) { 36 | log(page.articles) 37 | }); 38 | } 39 | 40 | module.exports = { 41 | 'hn': { 42 | ' hn latest': { 43 | title: 'hacker news', 44 | icon: 'hn.jpg', 45 | url: 'https://news.ycombinator.com/news?p=1', 46 | arg:'', 47 | autocomplete: ' hn latest', 48 | valid: 'yes', 49 | uid: 'hn_latest' 50 | } 51 | }, 52 | ' hn ': function(query) { 53 | var that = this; 54 | var query=query.trim() 55 | log(Object.keys(that[query]).map(function(key) { 56 | plusOne('./cache/init',query) 57 | return that[query][key] 58 | })) 59 | }, 60 | ' hn latest': function(query) { 61 | scrape(this[query.trim().split(' ')[0]][query].url) 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /spiders/jianshu.js: -------------------------------------------------------------------------------- 1 | var scrapeIt = require("scrape-it") 2 | var log = require('../utils/log.js') 3 | var request = require('request') 4 | var cheerio=require('cheerio') 5 | var scrape = function(url) { 6 | request(url, function(error, response, body) { 7 | if (error) { 8 | console.log(error) 9 | } 10 | if (!error && response.statusCode == 200) { 11 | } 12 | }); 13 | 14 | 15 | 16 | return scrapeIt(url, { 17 | articles: { 18 | listItem: ".tbspan", 19 | data: { 20 | autocomplete: { 21 | convert: function() { 22 | return this.query 23 | } 24 | }, 25 | title: ".ulink", 26 | subtitle: "tr:nth-child(4) > td", 27 | icon: { 28 | convert: function() { 29 | return "jianshu.jpg" 30 | } 31 | }, 32 | uid: { 33 | convert: function() { 34 | return '' 35 | } 36 | }, 37 | arg: { 38 | selector: "td:nth-child(2) > b > a", 39 | attr: 'href', 40 | convert: function(x) { 41 | return 'http://www.ygdy8.net/' + x 42 | } 43 | }, 44 | cid: { 45 | selector: ".stars", 46 | attr: 'data-rating', 47 | convert: function(ele) { 48 | return parseFloat('0' + ele) 49 | } 50 | } 51 | } 52 | } 53 | }).then(function(page) { 54 | log(page.articles.sort(function(a, b) { 55 | return b.cid - a.cid 56 | })) 57 | }); 58 | } 59 | 60 | 61 | module.exports = { 62 | 'jianshu': { 63 | ' jianshu rm': { 64 | title: '热门(rm)', 65 | icon: 'jianshu.jpg', 66 | arg: 'http://www.jianshu.com/', 67 | autocomplete: ' jianshu rm', 68 | valid: 'yes', 69 | uid: 'jianshu_rm' 70 | } 71 | }, 72 | ' jianshu ': function() { 73 | var that = this; 74 | log(Object.keys(that['jianshu']).map(function(key) { 75 | return that['jianshu'][key] 76 | })) 77 | }, 78 | ' jianshu rm': function() { 79 | scrape(this['jianshu'][' jianshu rm'].arg) 80 | } 81 | 82 | } 83 | -------------------------------------------------------------------------------- /spiders/mp4ba.js: -------------------------------------------------------------------------------- 1 | var scrapeIt = require("scrape-it") 2 | var log = require('../utils/log.js') 3 | var plusOne=require('../utils/plusOne') 4 | var scrape = function(url,page) { 5 | return scrapeIt(url+page, { 6 | articles: { 7 | listItem: "#data_list>tr", 8 | data: { 9 | autocomplete: { 10 | convert: function() { 11 | return this.query 12 | } 13 | }, 14 | title: { 15 | selector: "td:nth-child(3)>a", 16 | convert:function(ele){ 17 | var item = ele.split('.').slice(0,3) 18 | return item[0]+' ( '+item[1]+' , '+item[2]+' ) ' 19 | } 20 | }, 21 | subtitle: "td:nth-child(2)>a", 22 | icon: { 23 | convert: function() { 24 | return "mp4ba.png" 25 | } 26 | }, 27 | uid: { 28 | convert: function() { 29 | return '0' 30 | } 31 | }, 32 | arg: { 33 | selector: "td:nth-child(3) > a", 34 | attr: 'href', 35 | convert: function(x) { 36 | return 'http://www.mp4ba.com/' + x 37 | } 38 | }, 39 | cid: { 40 | selector: "td:nth-child(6)>span", 41 | convert: function(ele) { 42 | return parseFloat('0' + ele) 43 | } 44 | } 45 | } 46 | } 47 | }).then(function(page) { 48 | log(page.articles.sort(function(a, b) { 49 | return b.cid - a.cid 50 | })) 51 | }); 52 | } 53 | 54 | module.exports = { 55 | 'mp4ba': { 56 | ' mp4ba latest': { 57 | title: '最新电影', 58 | icon: 'mp4ba.png', 59 | url: 'http://www.mp4ba.com/index.php?page=', 60 | arg: '', 61 | autocomplete: ' mp4ba latest', 62 | valid: 'yes', 63 | uid: 'mp4ba_latest' 64 | } 65 | }, 66 | ' mp4ba ': function(query) { 67 | var that = this; 68 | var query=query.trim() 69 | log(Object.keys(that[query]).map(function(key) { 70 | plusOne('./cache/init',query) 71 | return that[query][key] 72 | })) 73 | }, 74 | ' mp4ba latest': function(query,page) { 75 | scrape(this[query.trim().split(' ')[0]][query].url,page) 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /spiders/app.js: -------------------------------------------------------------------------------- 1 | var scrapeIt = require("scrape-it") 2 | var log = require('../utils/log') 3 | var plusOne=require('../utils/plusOne') 4 | var scrape = function(url) { 5 | return scrapeIt(url, { 6 | articles: { 7 | listItem: ".section.app", 8 | data: { 9 | autocomplete: { 10 | convert: function() { 11 | return this.query 12 | } 13 | }, 14 | title: ".dark-links", 15 | subtitle: ".description", 16 | icon: { 17 | convert: function() { 18 | return "app.png" 19 | } 20 | }, 21 | uid: { 22 | convert: function() { 23 | return '' 24 | } 25 | }, 26 | arg: { 27 | selector: ".block-link", 28 | attr: 'href', 29 | convert: function(x) { 30 | return 'http://appshopper.com' + x 31 | } 32 | }, 33 | cid: { 34 | selector: ".stars", 35 | attr: 'data-rating', 36 | convert: function(ele) { 37 | return parseFloat('0' + ele) 38 | } 39 | } 40 | } 41 | } 42 | }).then(function(page) { 43 | log(page.articles.sort(function(a, b) { 44 | return b.cid - a.cid 45 | })) 46 | }); 47 | } 48 | 49 | module.exports = { 50 | 'app': { 51 | ' app ios': { 52 | title: 'ios 应用降价', 53 | icon: 'app.png', 54 | url: 'http://appshopper.com/prices/', 55 | arg:'http://appshopper.com/prices/', 56 | autocomplete: ' app ios', 57 | valid: 'yes', 58 | uid: 'app_ios' 59 | }, 60 | ' app mac': { 61 | title: 'mac 应用降价', 62 | icon: 'app.png', 63 | url: 'http://appshopper.com/mac/prices/', 64 | arg:'http://appshopper.com/mac/prices/', 65 | autocomplete: ' app mac', 66 | valid: 'no', 67 | uid: 'app_mac' 68 | } 69 | }, 70 | ' app ': function() { 71 | var that = this; 72 | log(Object.keys(that['app']).map(function(key) { 73 | plusOne('./cache/init','app') 74 | return that['app'][key] 75 | })) 76 | }, 77 | ' app ios': function() { 78 | scrape(this['app'][' app ios'].url) 79 | }, 80 | ' app mac': function() { 81 | scrape(this['app'][' app mac'].url) 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /spiders/jiandan.js: -------------------------------------------------------------------------------- 1 | var log = require('../utils/log.js') 2 | var cheerio = require('cheerio') 3 | var plusOne = require('../utils/plusOne') 4 | var exec = require('child_process').exec 5 | var scrape = function(url, page) { 6 | var url = url + page; 7 | exec(`curl '${url}' -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,zh-TW;q=0.2' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Cache-Control: max-age=0' -H 'Cookie: 3025734002=ed6a9veaEZNmlb7n1rm2vxhW5TfQllVx22zbep%2BhSg; __auc=54b1d077154ab34a222d8640e08; 4263472310=46d1ZKr%2BhboCizd8heIXF28wIKIftGowTYeWfAdjNw; _gat=1; 3025734002=d2d25nUV5g2VTOuilaBghS8VqmfY2fhtr%2F4h8OnuvA; jdna=596e6fb28c1bb47f949e65e1ae03f7f5#1463455503976; _ga=GA1.2.971625059.1462678713; Hm_lvt_fd93b7fb546adcfbcf80c4fc2b54da2c=1463015763,1463024399,1463161234,1463403830; Hm_lpvt_fd93b7fb546adcfbcf80c4fc2b54da2c=1463455504' -H 'Connection: keep-alive' --compressed`, function(error, stdout, stderr) { 8 | $ = cheerio.load(stdout, { 9 | decodeEntities: false 10 | }) 11 | var items = [] 12 | if (parseInt(page) === 1) { 13 | $('.indexs').map(function(index, ele) { 14 | items[index] = { 15 | title: $(ele).find('h2 a').text(), 16 | subtitle: $(ele).find('strong > a').text(), 17 | icon: 'jiandan.png', 18 | uid: '', 19 | arg: $(ele).find('h2 a').attr('href') 20 | } 21 | }) 22 | log(items) 23 | } 24 | if (parseInt(page) >= 2) { 25 | $('.column').map(function(index, ele) { 26 | items[index] = { 27 | title: $(ele).find('.title2').text(), 28 | subtitle:'', 29 | icon: 'jiandan.png', 30 | arg: $(ele).find('.title2 a').attr('href') 31 | } 32 | }) 33 | log(items) 34 | } 35 | }) 36 | } 37 | 38 | module.exports = { 39 | 'jiandan': { 40 | ' jiandan latest': { 41 | title: '煎蛋-首页', 42 | icon: 'jiandan.png', 43 | url: 'http://jandan.net/page/', 44 | arg: '', 45 | autocomplete: ' jiandan latest', 46 | valid: 'yes', 47 | uid: 'jiandan_latest' 48 | } 49 | }, 50 | ' jiandan ': function(query) { 51 | var that = this; 52 | var query = query.trim() 53 | log(Object.keys(that[query]).map(function(key) { 54 | plusOne('./cache/init', query) 55 | return that[query][key] 56 | })) 57 | }, 58 | ' jiandan latest': function(query, page) { 59 | scrape(this[query.trim().split(' ')[0]][query].url, page) 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /spiders/tip.js: -------------------------------------------------------------------------------- 1 | var log = require('../utils/log') 2 | var fs = require('fs') 3 | var init = [{ 4 | title: 'V2EX', 5 | subtitle: 'V2EX 是一个关于分享和探索的地方', 6 | icon: 'v2ex.png', 7 | arg: '', 8 | autocomplete: ' v2ex ', 9 | uid: 'v2ex', 10 | counter: 0 11 | }, { 12 | title: 'AppShopper 降价', 13 | subtitle: 'mac · ios 应用降价', 14 | icon: 'app.png', 15 | arg: '', 16 | autocomplete: ' app ', 17 | uid: 'appshopper', 18 | counter: 0 19 | }, { 20 | title: 'DyGod 最新电影', 21 | subtitle: '展示最新电影', 22 | icon: 'dygod.png', 23 | arg: '', 24 | autocomplete: ' dygod ', 25 | uid: 'dygod', 26 | counter: 0 27 | }, { 28 | title: 'Mp4Ba 最新电影', 29 | subtitle: '展示最新电视电影', 30 | icon: 'mp4ba.png', 31 | arg: '', 32 | autocomplete: ' mp4ba ', 33 | uid: 'mp4ba', 34 | counter: 0 35 | 36 | }, { 37 | title: 'Hacker News', 38 | subtitle: 'Hacker News', 39 | icon: 'hn.jpg', 40 | arg: '', 41 | autocomplete: ' hn ', 42 | uid: 'hackernews', 43 | counter: 0 44 | 45 | }, { 46 | title: 'Startup News', 47 | subtitle: 'Startup News', 48 | icon: 'sn.png', 49 | arg: '', 50 | autocomplete: ' sn ', 51 | uid: 'startupnews', 52 | counter: 0 53 | }, { 54 | title: 'Github Trending', 55 | subtitle: 'github-trending', 56 | icon: 'gt.png', 57 | arg: '', 58 | autocomplete: ' gt ', 59 | uid: 'githubtrending', 60 | counter: 0 61 | 62 | }, { 63 | title: 'Jian Dan', 64 | subtitle: '煎蛋以译介方式传播网络新鲜资讯', 65 | icon: 'jiandan.png', 66 | arg: '', 67 | autocomplete: ' jiandan ', 68 | uid: 'jiandan', 69 | counter: 0 70 | }, { 71 | title: '开发者头条', 72 | subtitle: '技术极客的头条新闻', 73 | icon: 'kaifazhetoutiao.jpg', 74 | arg: '', 75 | autocomplete: ' kf ', 76 | uid: 'kaifazhetoutiao', 77 | counter: 0 78 | }, { 79 | title: '糗事百科', 80 | subtitle: '搞笑笑话,糗事百科', 81 | icon: 'qiushibaike.png', 82 | arg: '', 83 | autocomplete: ' qb ', 84 | uid: 'qiushibaike', 85 | counter: 0 86 | }, { 87 | title: '稀土掘金', 88 | subtitle: '掘金是中国质量最高的技术分享社区', 89 | icon: 'juejin.png', 90 | arg: '', 91 | autocomplete: ' xt ', 92 | uid: 'xitujuejin', 93 | counter: 0 94 | }, { 95 | title: '知乎日报', 96 | subtitle: '以独有的方式为你提供最高质、最深度、最有收获的阅读体验', 97 | icon: 'zh.png', 98 | arg: '', 99 | autocomplete: ' zh ', 100 | uid: 'zhihuribao', 101 | counter: 0 102 | }, { 103 | title: '天天美剧', 104 | subtitle: '天天美剧网提供最新的美剧高清看', 105 | icon: '天天美剧.png', 106 | arg: '', 107 | autocomplete: ' 天天美剧 ', 108 | uid: '天天美剧', 109 | counter: 0 110 | } 111 | ] 112 | 113 | var fileExists = function(filePath) { 114 | try { 115 | return fs.statSync(filePath).isFile(); 116 | } catch (err) { 117 | return false; 118 | } 119 | } 120 | var filePath = './cache/init' 121 | var initMenu = function(message) { 122 | var message = JSON.stringify(message) 123 | if (fileExists(filePath)) { 124 | //todo ->fix the init problem when add the new service 125 | } else { 126 | fs.writeFile(filePath, message, function() {}) 127 | } 128 | } 129 | 130 | initMenu(init) 131 | 132 | var logFromFile = function(filePath) { 133 | fs.readFile(filePath, function(err, data) { 134 | if (err) throw err; 135 | var raw = data.toString() 136 | log(JSON.parse(raw)) 137 | }) 138 | } 139 | 140 | module.exports = { 141 | ' ': function() { 142 | logFromFile(filePath) 143 | }, 144 | '': function() { 145 | logFromFile(filePath) 146 | }, 147 | '?': function() { 148 | logFromFile(filePath) 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /spiders/dygod.js: -------------------------------------------------------------------------------- 1 | var log = require('../utils/log.js') 2 | var request = require('request') 3 | var cheerio = require('cheerio') 4 | var iconv = require('iconv-lite') 5 | var plusOne = require('../utils/plusOne') 6 | var scrape = function(url, page) { 7 | if (page) { 8 | url = `${url}${page}.html` 9 | } 10 | request({ 11 | url: url, 12 | encoding: null, 13 | headers: { 14 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36' 15 | } 16 | }, function(error, response, body) { 17 | var html = iconv.decode(body, 'gb2312') 18 | $ = cheerio.load(html, { 19 | decodeEntities: false 20 | }) 21 | var items = [] 22 | $('.co_content8 table').map(function(index, ele) { 23 | items[index] = { 24 | title: $(ele).find('tr:nth-child(2) > td:nth-child(2) a').slice(-1).text(), 25 | subtitle: $(ele).find('font').text(), 26 | icon: 'dygod.png', 27 | arg: 'http://www.ygdy8.net/' + $(ele).find('tr:nth-child(2) > td:nth-child(2) a').slice(-1).attr('href') 28 | } 29 | }) 30 | log(items) 31 | }) 32 | } 33 | module.exports = { 34 | 'dygod': { 35 | ' dygod latest': { 36 | title: '最新电影', 37 | icon: 'dygod.png', 38 | url: 'http://www.ygdy8.net/html/gndy/dyzz/list_23_', 39 | arg:'', 40 | autocomplete: ' dygod latest', 41 | valid: 'YES', 42 | uid: 'dygod_latest' 43 | }, 44 | ' dygod gn': { 45 | title: '国内电影', 46 | icon: 'dygod.png', 47 | url: 'http://www.ygdy8.net/html/gndy/china/list_4_', 48 | arg:'', 49 | autocomplete: ' dygod gn', 50 | valid: 'YES', 51 | uid: 'dygod_gn' 52 | }, 53 | ' dygod omdy': { 54 | title: '欧美电影', 55 | icon: 'dygod.png', 56 | url: 'http://www.ygdy8.net/html/gndy/oumei/list_7_', 57 | arg:'', 58 | autocomplete: ' dygod omdy', 59 | valid: 'YES', 60 | uid: 'dygod_gn' 61 | }, 62 | ' dygod rh': { 63 | title: '日韩电影', 64 | icon: 'dygod.png', 65 | url: 'http://www.ygdy8.net/html/gndy/rihan/list_6_', 66 | arg:'', 67 | autocomplete: ' dygod rh', 68 | valid: 'YES', 69 | uid: 'dygod_rh' 70 | }, 71 | ' dygod dm': { 72 | title: '动漫', 73 | icon: 'dygod.png', 74 | url: 'http://www.ygdy8.net/html/dongman/list_16_', 75 | arg:'', 76 | autocomplete: ' dygod dm', 77 | valid: 'YES', 78 | uid: 'dygod_omds' 79 | }, 80 | ' dygod omds': { 81 | title: '欧美电视', 82 | icon: 'dygod.png', 83 | url: 'http://www.ygdy8.net/html/tv/oumeitv/list_9_', 84 | arg:'', 85 | autocomplete: ' dygod omds', 86 | valid: 'YES', 87 | uid: 'dygod_omds' 88 | } 89 | }, 90 | ' dygod ': function(query) { 91 | var that = this; 92 | var query = query.trim() 93 | log(Object.keys(that[query]).map(function(key) { 94 | plusOne('./cache/init', query) 95 | return that[query][key] 96 | })) 97 | }, 98 | ' dygod latest': function(query, page) { 99 | scrape(this[query.trim().split(' ')[0]][query].url, page) 100 | }, 101 | ' dygod gn': function(query, page) { 102 | scrape(this[query.trim().split(' ')[0]][query].url, page) 103 | }, 104 | ' dygod omdy': function(query, page) { 105 | scrape(this[query.trim().split(' ')[0]][query].url, page) 106 | }, 107 | ' dygod omds': function(query, page) { 108 | scrape(this[query.trim().split(' ')[0]][query].url, page) 109 | }, 110 | ' dygod rh': function(query, page) { 111 | scrape(this[query.trim().split(' ')[0]][query].url, page) 112 | }, 113 | ' dygod dm': function(query, page) { 114 | scrape(this[query.trim().split(' ')[0]][query].url, page) 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | bundleid 6 | com.epirus.rio 7 | category 8 | Tools 9 | connections 10 | 11 | 556A94A6-EFA5-46E4-92C2-69B3D89FEFFF 12 | 13 | 14 | destinationuid 15 | E6C7831F-96C8-4629-B44D-FE75A101D93A 16 | modifiers 17 | 0 18 | modifiersubtext 19 | 20 | 21 | 22 | E6C7831F-96C8-4629-B44D-FE75A101D93A 23 | 24 | 25 | destinationuid 26 | A7911D46-D121-43B5-8380-E866EFF508F2 27 | modifiers 28 | 0 29 | modifiersubtext 30 | 31 | 32 | 33 | 34 | createdby 35 | epirus 36 | description 37 | Read in One 38 | disabled 39 | 40 | name 41 | Rio 42 | objects 43 | 44 | 45 | config 46 | 47 | concurrently 48 | 49 | escaping 50 | 127 51 | script 52 | /usr/local/bin/node <<-'CODE' 53 | try { 54 | 55 | require('./thunderDownload.js')("{query}") 56 | 57 | } catch (e) { 58 | 59 | console.log(e.message); 60 | 61 | } 62 | 63 | CODE 64 | 65 | type 66 | 0 67 | 68 | type 69 | alfred.workflow.action.script 70 | uid 71 | E6C7831F-96C8-4629-B44D-FE75A101D93A 72 | version 73 | 0 74 | 75 | 76 | config 77 | 78 | argumenttype 79 | 0 80 | escaping 81 | 126 82 | keyword 83 | rio 84 | queuedelaycustom 85 | 3 86 | queuedelayimmediatelyinitially 87 | 88 | queuedelaymode 89 | 0 90 | queuemode 91 | 1 92 | runningsubtext 93 | Rio is working~ 94 | script 95 | /usr/local/bin/node <<-'CODE' 96 | try { 97 | 98 | require('./main')("{query}") 99 | 100 | } catch (e) { 101 | 102 | console.log(e.message); 103 | 104 | } 105 | 106 | CODE 107 | 108 | subtext 109 | Read In One 110 | title 111 | Read In One 112 | type 113 | 0 114 | withspace 115 | 116 | 117 | type 118 | alfred.workflow.input.scriptfilter 119 | uid 120 | 556A94A6-EFA5-46E4-92C2-69B3D89FEFFF 121 | version 122 | 0 123 | 124 | 125 | config 126 | 127 | autopaste 128 | 129 | clipboardtext 130 | {query} 131 | 132 | type 133 | alfred.workflow.output.clipboard 134 | uid 135 | A7911D46-D121-43B5-8380-E866EFF508F2 136 | version 137 | 0 138 | 139 | 140 | readme 141 | 142 | uidata 143 | 144 | 556A94A6-EFA5-46E4-92C2-69B3D89FEFFF 145 | 146 | ypos 147 | 10 148 | 149 | A7911D46-D121-43B5-8380-E866EFF508F2 150 | 151 | ypos 152 | 10 153 | 154 | E6C7831F-96C8-4629-B44D-FE75A101D93A 155 | 156 | ypos 157 | 10 158 | 159 | 160 | webaddress 161 | https://github.com/epirus 162 | 163 | 164 | -------------------------------------------------------------------------------- /spiders/gt.js: -------------------------------------------------------------------------------- 1 | var scrapeIt = require("scrape-it") 2 | var log = require('../utils/log.js') 3 | var plusOne = require('../utils/plusOne') 4 | var scrape = function(url) { 5 | return scrapeIt(url, { 6 | articles: { 7 | listItem: ".repo-list-item", 8 | data: { 9 | autocomplete: { 10 | convert: function() { 11 | return this.query 12 | } 13 | }, 14 | title: { 15 | selector:".repo-list-name>a", 16 | attr:'href', 17 | convert:function(x){ 18 | return x.slice(1) 19 | } 20 | }, 21 | subtitle:".repo-list-description", 22 | icon: { 23 | convert: function() { 24 | return "gt.png" 25 | } 26 | }, 27 | uid: { 28 | convert: function() { 29 | return '' 30 | } 31 | }, 32 | arg: { 33 | selector: ".repo-list-name>a", 34 | attr: 'href', 35 | convert: function(x) { 36 | return 'https://github.com' + x 37 | } 38 | }, 39 | cid: { 40 | convert: function() { 41 | return 0 42 | } 43 | } 44 | } 45 | } 46 | }).then(function(page) { 47 | log(page.articles.sort(function(a, b) { 48 | return b.cid - a.cid 49 | })) 50 | }); 51 | } 52 | 53 | module.exports = { 54 | 'gt': { 55 | ' gt all': { 56 | title: 'All', 57 | icon: 'gt.png', 58 | url: 'https://github.com/trending/', 59 | autocomplete: ' gt all', 60 | arg:'', 61 | valid: 'yes', 62 | uid: 'gt_all' 63 | }, 64 | ' gt js': { 65 | title: 'JavaScript', 66 | icon: 'gt.png', 67 | url: 'https://github.com/trending/javascript', 68 | autocomplete: ' gt js', 69 | valid: 'yes', 70 | arg:'', 71 | uid: 'gt_js' 72 | }, 73 | ' gt swift': { 74 | title: 'Swift', 75 | icon: 'gt.png', 76 | url: 'https://github.com/trending/swift', 77 | autocomplete: ' gt js', 78 | valid: 'yes', 79 | arg:'', 80 | uid: 'gt_swift' 81 | }, 82 | ' gt go': { 83 | title: 'Go', 84 | icon: 'gt.png', 85 | url: 'https://github.com/trending/go', 86 | autocomplete: ' gt go', 87 | valid: 'yes', 88 | arg:'', 89 | uid: 'gt_go' 90 | }, 91 | ' gt java': { 92 | title: 'Java', 93 | icon: 'gt.png', 94 | url: 'https://github.com/trending/java', 95 | autocomplete: ' gt java', 96 | valid: 'yes', 97 | arg:'', 98 | uid: 'gt_java' 99 | }, 100 | ' gt python': { 101 | title: 'Python', 102 | icon: 'gt.png', 103 | url: 'https://github.com/trending/python', 104 | autocomplete: ' gt python', 105 | valid: 'yes', 106 | arg:'', 107 | uid: 'gt_python' 108 | } 109 | }, 110 | ' gt ': function(query) { 111 | var that = this; 112 | var query = query.trim() 113 | log(Object.keys(that[query]).map(function(key) { 114 | plusOne('./cache/init', query) 115 | return that[query][key] 116 | })) 117 | }, 118 | ' gt all': function(query) { 119 | scrape(this[query.trim().split(' ')[0]][query].url) 120 | }, 121 | ' gt js': function(query) { 122 | scrape(this[query.trim().split(' ')[0]][query].url) 123 | }, 124 | ' gt swift': function(query) { 125 | scrape(this[query.trim().split(' ')[0]][query].url) 126 | }, 127 | ' gt go': function(query) { 128 | scrape(this[query.trim().split(' ')[0]][query].url) 129 | }, 130 | ' gt java': function(query) { 131 | scrape(this[query.trim().split(' ')[0]][query].url) 132 | }, 133 | ' gt python': function(query) { 134 | scrape(this[query.trim().split(' ')[0]][query].url) 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /spiders/v2ex.js: -------------------------------------------------------------------------------- 1 | var scrapeIt = require("scrape-it") 2 | var log = require('../utils/log.js') 3 | var plusOne = require('../utils/plusOne') 4 | var scrape = function(url) { 5 | return scrapeIt(url, { 6 | articles: { 7 | listItem: ".cell.item", 8 | data: { 9 | autocomplete: { 10 | convert: function() { 11 | return " v2ex cy " 12 | } 13 | }, 14 | title: ".item_title a", 15 | subtitle: ".small.fade", 16 | icon: { 17 | convert: function() { 18 | return "v2ex.png" 19 | } 20 | }, 21 | uid: { 22 | convert: function() { 23 | return '' 24 | } 25 | }, 26 | arg: { 27 | selector: ".item_title a", 28 | attr: 'href', 29 | convert: function(x) { 30 | return 'https://v2ex.com' + x 31 | } 32 | }, 33 | } 34 | } 35 | }).then(function(page) { 36 | log(page.articles) 37 | }); 38 | } 39 | module.exports = { 40 | 'v2ex': { 41 | ' v2ex js': { 42 | title: '技术(js)', 43 | icon: 'v2ex.png', 44 | url: 'https://v2ex.com/?tab=tech', 45 | arg:'', 46 | autocomplete: ' v2ex js', 47 | valid: 'yes', 48 | uid: 'v2ex_js' 49 | }, 50 | ' v2ex cy': { 51 | title: '创意(cy)', 52 | icon: 'v2ex.png', 53 | url: 'https://v2ex.com/?tab=play', 54 | arg:'', 55 | autocomplete: ' v2ex cy', 56 | valid: 'no', 57 | uid: 'v2ex_cy' 58 | }, 59 | ' v2ex hw': { 60 | title: '好玩(hw)', 61 | icon: 'v2ex.png', 62 | url: 'https://v2ex.com/?tab=creative', 63 | arg:'', 64 | autocomplete: ' v2ex hw', 65 | valid: 'no', 66 | uid: 'v2ex_hw' 67 | }, 68 | ' v2ex pg': { 69 | title: '苹果(pg)', 70 | icon: 'v2ex.png', 71 | url: 'https://v2ex.com/?tab=apple', 72 | arg:'', 73 | autocomplete: ' v2ex pg', 74 | valid: 'no', 75 | uid: 'v2ex_pg' 76 | }, 77 | ' v2ex gz': { 78 | title: '工作(gz)', 79 | icon: 'v2ex.png', 80 | url: 'https://v2ex.com/?tab=jobs', 81 | arg:'', 82 | autocomplete: ' v2ex gz', 83 | valid: 'no', 84 | uid: 'v2ex_gz' 85 | }, 86 | ' v2ex cs': { 87 | title: '城市(cs)', 88 | icon: 'v2ex.png', 89 | url: 'https://v2ex.com/?tab=city', 90 | arg:'', 91 | autocomplete: ' v2ex cs', 92 | valid: 'no', 93 | uid: 'v2ex_cs' 94 | }, 95 | ' v2ex wd': { 96 | title: '问答(wd)', 97 | icon: 'v2ex.png', 98 | url: 'https://v2ex.com/?tab=qna', 99 | arg:'', 100 | autocomplete: ' v2ex wd', 101 | valid: 'no', 102 | uid: 'v2ex_wd' 103 | }, 104 | ' v2ex zr': { 105 | title: '最热(zr)', 106 | icon: 'v2ex.png', 107 | url: 'https://v2ex.com/?tab=hot', 108 | arg:'', 109 | autocomplete: ' v2ex zr', 110 | valid: 'no', 111 | uid: 'v2ex_zr' 112 | }, 113 | ' v2ex qb': { 114 | title: '全部(qb)', 115 | icon: 'v2ex.png', 116 | url: 'https://v2ex.com/?tab=all', 117 | arg:'', 118 | autocomplete: ' v2ex qb', 119 | valid: 'no', 120 | uid: 'v2ex_qb' 121 | } 122 | }, 123 | ' v2ex ': function(query) { 124 | var that = this; 125 | var query = query.trim() 126 | log(Object.keys(that[query]).map(function(key) { 127 | plusOne('./cache/init', query) 128 | return that[query][key] 129 | })) 130 | }, 131 | ' v2ex js': function(query) { 132 | scrape(this[query.trim().split(' ')[0]][query].url) 133 | }, 134 | ' v2ex cy': function(query) { 135 | scrape(this[query.trim().split(' ')[0]][query].url) 136 | }, 137 | ' v2ex hw': function(query) { 138 | scrape(this[query.trim().split(' ')[0]][query].url) 139 | }, 140 | ' v2ex pg': function(query) { 141 | scrape(this[query.trim().split(' ')[0]][query].url) 142 | }, 143 | ' v2ex gz': function(query) { 144 | scrape(this[query.trim().split(' ')[0]][query].url) 145 | }, 146 | ' v2ex cs': function(query) { 147 | scrape(this[query.trim().split(' ')[0]][query].url) 148 | }, 149 | ' v2ex wd': function(query) { 150 | scrape(this[query.trim().split(' ')[0]][query].url) 151 | }, 152 | ' v2ex zr': function(query) { 153 | scrape(this[query.trim().split(' ')[0]][query].url) 154 | }, 155 | ' v2ex qb': function(query) { 156 | scrape(this[query.trim().split(' ')[0]][query].url) 157 | } 158 | } 159 | -------------------------------------------------------------------------------- /spiders/zh.js: -------------------------------------------------------------------------------- 1 | var log = require('../utils/log.js') 2 | var request = require('request') 3 | var plusOne = require('../utils/plusOne') 4 | var scrape = function(url) { 5 | request({ 6 | url: url 7 | }, function(error, response, body) { 8 | var items = [] 9 | var data = JSON.parse(body) 10 | data.stories.map(function(item) { 11 | items.push({ 12 | title: item.title, 13 | subtitle: '', 14 | icon: 'zh.png', 15 | arg: 'http://daily.zhihu.com/story/' + item.id 16 | }) 17 | }) 18 | log(items) 19 | }) 20 | } 21 | module.exports = { 22 | 'zh': { 23 | ' zh latest': { 24 | title: '知乎最新', 25 | icon: 'zh.png', 26 | url: 'http://news-at.zhihu.com/api/4/news/latest', 27 | arg: '', 28 | autocomplete: ' zh latest', 29 | valid: 'YES', 30 | uid: 'zh_latest' 31 | }, 32 | ' zh xl': { 33 | title: '日常心理学', 34 | icon: 'zh.png', 35 | url: 'http://news-at.zhihu.com/api/4/theme/13', 36 | arg: '', 37 | autocomplete: ' zh xl', 38 | valid: 'YES', 39 | uid: 'zh_latest' 40 | }, 41 | ' zh tj': { 42 | title: '用户推荐日报', 43 | icon: 'zh.png', 44 | url: 'http://news-at.zhihu.com/api/4/theme/12', 45 | arg: '', 46 | autocomplete: ' zh tj', 47 | valid: 'YES', 48 | uid: 'zh_tj' 49 | }, 50 | ' zh dy': { 51 | title: '电影日报', 52 | icon: 'zh.png', 53 | url: 'http://news-at.zhihu.com/api/4/theme/3', 54 | arg: '', 55 | autocomplete: ' zh dy', 56 | valid: 'YES', 57 | uid: 'zh_dy' 58 | }, 59 | 60 | ' zh wl': { 61 | title: '不许无聊', 62 | icon: 'zh.png', 63 | url: 'http://news-at.zhihu.com/api/4/theme/11', 64 | arg: '', 65 | autocomplete: ' zh wl', 66 | valid: 'YES', 67 | uid: 'zh_wl' 68 | }, 69 | 70 | ' zh sj': { 71 | title: '设计日报', 72 | icon: 'zh.png', 73 | url: 'http://news-at.zhihu.com/api/4/theme/4', 74 | arg: '', 75 | autocomplete: ' zh sj', 76 | valid: 'YES', 77 | uid: 'zh_sj' 78 | }, 79 | ' zh gs': { 80 | title: '大公司日报', 81 | icon: 'zh.png', 82 | url: 'http://news-at.zhihu.com/api/4/theme/5', 83 | arg: '', 84 | autocomplete: ' zh gs', 85 | valid: 'YES', 86 | uid: 'zh_gs' 87 | }, 88 | ' zh cj': { 89 | title: '财经日报', 90 | icon: 'zh.png', 91 | url: 'http://news-at.zhihu.com/api/4/theme/6', 92 | arg: '', 93 | autocomplete: ' zh cj', 94 | valid: 'YES', 95 | uid: 'zh_cj' 96 | }, 97 | ' zh aq': { 98 | title: '互联网安全', 99 | icon: 'zh.png', 100 | url: 'http://news-at.zhihu.com/api/4/theme/10', 101 | arg: '', 102 | autocomplete: ' zh aq', 103 | valid: 'YES', 104 | uid: 'zh_aq' 105 | }, 106 | ' zh yx': { 107 | title: '开始游戏', 108 | icon: 'zh.png', 109 | url: 'http://news-at.zhihu.com/api/4/theme/2', 110 | arg: '', 111 | autocomplete: ' zh yx', 112 | valid: 'YES', 113 | uid: 'zh_yx' 114 | }, 115 | ' zh yy': { 116 | title: '音乐日报', 117 | icon: 'zh.png', 118 | url: 'http://news-at.zhihu.com/api/4/theme/7', 119 | arg: '', 120 | autocomplete: ' zh yy', 121 | valid: 'YES', 122 | uid: 'zh_yy' 123 | }, 124 | ' zh dm': { 125 | title: '动漫日报', 126 | icon: 'zh.png', 127 | url: 'http://news-at.zhihu.com/api/4/theme/9', 128 | arg: '', 129 | autocomplete: ' zh dm', 130 | valid: 'YES', 131 | uid: 'zh_dm' 132 | }, 133 | ' zh ty': { 134 | title: '体育日报', 135 | icon: 'zh.png', 136 | url: 'http://news-at.zhihu.com/api/4/theme/8', 137 | arg: '', 138 | autocomplete: ' zh ty', 139 | valid: 'YES', 140 | uid: 'zh_ty' 141 | }, 142 | }, 143 | ' zh ': function(query) { 144 | var that = this; 145 | var query = query.trim() 146 | log(Object.keys(that[query]).map(function(key) { 147 | plusOne('./cache/init', query) 148 | return that[query][key] 149 | })) 150 | }, 151 | ' zh latest': function(query, page) { 152 | scrape(this[query.trim().split(' ')[0]][query].url, page) 153 | }, 154 | ' zh xl': function(query, page) { 155 | scrape(this[query.trim().split(' ')[0]][query].url, page) 156 | }, 157 | ' zh tj': function(query, page) { 158 | scrape(this[query.trim().split(' ')[0]][query].url, page) 159 | }, 160 | 161 | ' zh dy': function(query, page) { 162 | scrape(this[query.trim().split(' ')[0]][query].url, page) 163 | }, 164 | ' zh wl': function(query, page) { 165 | scrape(this[query.trim().split(' ')[0]][query].url, page) 166 | }, 167 | ' zh sj': function(query, page) { 168 | scrape(this[query.trim().split(' ')[0]][query].url, page) 169 | }, 170 | 171 | ' zh gs': function(query, page) { 172 | scrape(this[query.trim().split(' ')[0]][query].url, page) 173 | }, 174 | ' zh cj': function(query, page) { 175 | scrape(this[query.trim().split(' ')[0]][query].url, page) 176 | }, 177 | ' zh aq': function(query, page) { 178 | scrape(this[query.trim().split(' ')[0]][query].url, page) 179 | }, 180 | ' zh yx': function(query, page) { 181 | scrape(this[query.trim().split(' ')[0]][query].url, page) 182 | }, 183 | 184 | ' zh yy': function(query, page) { 185 | scrape(this[query.trim().split(' ')[0]][query].url, page) 186 | }, 187 | 188 | ' zh dm': function(query, page) { 189 | scrape(this[query.trim().split(' ')[0]][query].url, page) 190 | }, 191 | 192 | ' zh ty': function(query, page) { 193 | scrape(this[query.trim().split(' ')[0]][query].url, page) 194 | } 195 | } 196 | -------------------------------------------------------------------------------- /spiders/xt.js: -------------------------------------------------------------------------------- 1 | var log = require('../utils/log.js') 2 | var plusOne = require('../utils/plusOne') 3 | var exec = require('child_process').exec 4 | var scrape = function(url, page, category) { 5 | if (category === '') { 6 | var url = `curl '${url}' -H 'origin: http://gold.xitu.io' -H 'accept-encoding: gzip, deflate' -H 'accept-language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,zh-TW;q=0.2' -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36' -H 'content-type: text/plain' -H 'accept: */*' -H 'referer: http://gold.xitu.io/' --data-binary '{"where":{},"include":"user","limit":${page*30},"skip"${(page-1)*30},"order":"-rankIndex","_method":"GET","_ApplicationId":"mhke0kuv33myn4t4ghuid4oq2hjj12li374hvcif202y5bm6","_ApplicationKey":"mldfccqgjjmsk3xumif9j0qgls0vq6f2g7r3abouitfyboci","_ClientVersion":"js0.6.9","_InstallationId":"8d2b97c8-8367-aede-d657-bf47d6774527"}' --compressed` 7 | } else { 8 | var url = `curl '${url}' -H 'origin: http://gold.xitu.io' -H 'accept-encoding: gzip, deflate' -H 'accept-language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,zh-TW;q=0.2' -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36' -H 'content-type: text/plain' -H 'accept: */*' -H 'referer: http://gold.xitu.io/' --data-binary '{"where":{"category":"${category}"},"include":"user","limit":${page*30},"skip":${(page-1)*30},"order":"-rankIndex","_method":"GET","_ApplicationId":"mhke0kuv33myn4t4ghuid4oq2hjj12li374hvcif202y5bm6","_ApplicationKey":"mldfccqgjjmsk3xumif9j0qgls0vq6f2g7r3abouitfyboci","_ClientVersion":"js0.6.9","_InstallationId":"8d2b97c8-8367-aede-d657-bf47d6774527"}' --compressed` 9 | } 10 | exec(url, function(error, stdout, stderr) { 11 | var json = JSON.parse(stdout) 12 | var items = [] 13 | json.results.map(function(ele, index) { 14 | items[index] = { 15 | title: ele.title, 16 | subtitle: ele.content, 17 | icon: 'juejin.png', 18 | uid: '', 19 | arg: ele.url 20 | } 21 | }) 22 | log(items) 23 | }) 24 | } 25 | module.exports = { 26 | 'xt': { 27 | ' xt latest': { 28 | title: '全部', 29 | icon: 'juejin.png', 30 | url: 'https://api.leancloud.cn/1.1/classes/Entry', 31 | arg: '', 32 | autocomplete: ' xt latest', 33 | uid: 'xt_latest', 34 | category: '' 35 | }, 36 | ' xt frontend': { 37 | title: '前端', 38 | icon: 'juejin.png', 39 | url: 'https://api.leancloud.cn/1.1/classes/Entry', 40 | arg: '', 41 | autocomplete: ' xt frontend', 42 | uid: 'xt_latest', 43 | category: 'frontend' 44 | }, 45 | ' xt android': { 46 | title: 'Android', 47 | icon: 'juejin.png', 48 | url: 'https://api.leancloud.cn/1.1/classes/Entry', 49 | arg: '', 50 | autocomplete: ' xt android', 51 | uid: 'xt_android', 52 | category: 'android' 53 | }, 54 | ' xt design': { 55 | title: '设计', 56 | icon: 'juejin.png', 57 | url: 'https://api.leancloud.cn/1.1/classes/Entry', 58 | arg: '', 59 | autocomplete: ' xt design', 60 | uid: 'xt_design', 61 | category: 'design' 62 | }, 63 | ' xt ios': { 64 | title: 'Ios', 65 | icon: 'juejin.png', 66 | url: 'https://api.leancloud.cn/1.1/classes/Entry', 67 | arg: '', 68 | autocomplete: ' xt ios', 69 | uid: 'xt_ios', 70 | category: 'ios' 71 | }, 72 | ' xt backend': { 73 | title: '后端', 74 | icon: 'juejin.png', 75 | url: 'https://api.leancloud.cn/1.1/classes/Entry', 76 | arg: '', 77 | autocomplete: ' xt backend', 78 | uid: 'xt_backend', 79 | category: 'backend' 80 | }, 81 | ' xt product': { 82 | title: '产品', 83 | icon: 'juejin.png', 84 | url: 'https://api.leancloud.cn/1.1/classes/Entry', 85 | arg: '', 86 | autocomplete: ' xt product', 87 | uid: 'xt_product', 88 | category: 'product' 89 | }, 90 | ' xt freebie': { 91 | title: '工具', 92 | icon: 'juejin.png', 93 | url: 'https://api.leancloud.cn/1.1/classes/Entry', 94 | arg: '', 95 | autocomplete: ' xt freebie', 96 | uid: 'xt_freebie', 97 | category: 'freebie' 98 | }, 99 | ' xt article': { 100 | title: '阅读', 101 | icon: 'juejin.png', 102 | url: 'https://api.leancloud.cn/1.1/classes/Entry', 103 | arg: '', 104 | autocomplete: ' xt article', 105 | uid: 'xt_article', 106 | category: 'article' 107 | } 108 | }, 109 | ' xt ': function(query) { 110 | var that = this; 111 | var query = query.trim() 112 | log(Object.keys(that[query]).map(function(key) { 113 | plusOne('./cache/init', query) 114 | return that[query][key] 115 | })) 116 | }, 117 | ' xt latest': function(query, page) { 118 | var obj = this[query.trim().split(' ')[0]][query] 119 | scrape(obj.url, page, obj.category) 120 | }, 121 | ' xt frontend': function(query, page) { 122 | var obj = this[query.trim().split(' ')[0]][query] 123 | scrape(obj.url, page, obj.category) 124 | }, 125 | ' xt android': function(query, page) { 126 | var obj = this[query.trim().split(' ')[0]][query] 127 | scrape(obj.url, page, obj.category) 128 | }, 129 | ' xt design': function(query, page) { 130 | var obj = this[query.trim().split(' ')[0]][query] 131 | scrape(obj.url, page, obj.category) 132 | }, 133 | ' xt ios': function(query, page) { 134 | var obj = this[query.trim().split(' ')[0]][query] 135 | scrape(obj.url, page, obj.category) 136 | }, 137 | ' xt backend': function(query, page) { 138 | var obj = this[query.trim().split(' ')[0]][query] 139 | scrape(obj.url, page, obj.category) 140 | }, 141 | ' xt product': function(query, page) { 142 | var obj = this[query.trim().split(' ')[0]][query] 143 | scrape(obj.url, page, obj.category) 144 | }, 145 | ' xt freebie': function(query, page) { 146 | var obj = this[query.trim().split(' ')[0]][query] 147 | scrape(obj.url, page, obj.category) 148 | }, 149 | ' xt article': function(query, page) { 150 | var obj = this[query.trim().split(' ')[0]][query] 151 | scrape(obj.url, page, obj.category) 152 | } 153 | } 154 | --------------------------------------------------------------------------------