diff --git a/server/app.js b/server/app.js new file mode 100644 index 0000000..80a3c36 --- /dev/null +++ b/server/app.js @@ -0,0 +1,60 @@ +var express = require('express'); +var path = require('path'); +var favicon = require('serve-favicon'); +var logger = require('morgan'); +var cookieParser = require('cookie-parser'); +var bodyParser = require('body-parser'); + +var routes = require('./routes/index'); +var users = require('./routes/users'); + +var app = express(); + +// view engine setup +app.set('views', path.join(__dirname, 'views')); +app.set('view engine', 'jade'); + +// uncomment after placing your favicon in /public +//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); +app.use(logger('dev')); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: false })); +app.use(cookieParser()); +app.use(express.static(path.join(__dirname, 'public'))); + +app.use('/', routes); +app.use('/users', users); + +// catch 404 and forward to error handler +app.use(function(req, res, next) { + var err = new Error('Not Found'); + err.status = 404; + next(err); +}); + +// error handlers + +// development error handler +// will print stacktrace +if (app.get('env') === 'development') { + app.use(function(err, req, res, next) { + res.status(err.status || 500); + res.render('error', { + message: err.message, + error: err + }); + }); +} + +// production error handler +// no stacktraces leaked to user +app.use(function(err, req, res, next) { + res.status(err.status || 500); + res.render('error', { + message: err.message, + error: {} + }); +}); + + +module.exports = app; diff --git a/server/bin/www b/server/bin/www new file mode 100755 index 0000000..753f45b --- /dev/null +++ b/server/bin/www @@ -0,0 +1,90 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var app = require('../app'); +var debug = require('debug')('test:server'); +var http = require('http'); + +/** + * Get port from environment and store in Express. + */ + +var port = normalizePort(process.env.PORT || '3000'); +app.set('port', port); + +/** + * Create HTTP server. + */ + +var server = http.createServer(app); + +/** + * Listen on provided port, on all network interfaces. + */ + +server.listen(port); +server.on('error', onError); +server.on('listening', onListening); + +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val) { + var port = parseInt(val, 10); + + if (isNaN(port)) { + // named pipe + return val; + } + + if (port >= 0) { + // port number + return port; + } + + return false; +} + +/** + * Event listener for HTTP server "error" event. + */ + +function onError(error) { + if (error.syscall !== 'listen') { + throw error; + } + + var bind = typeof port === 'string' + ? 'Pipe ' + port + : 'Port ' + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } +} + +/** + * Event listener for HTTP server "listening" event. + */ + +function onListening() { + var addr = server.address(); + var bind = typeof addr === 'string' + ? 'pipe ' + addr + : 'port ' + addr.port; + debug('Listening on ' + bind); +} diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000..c11b31d --- /dev/null +++ b/server/package.json @@ -0,0 +1,18 @@ +{ + "name": "test", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "node ./bin/www" + }, + "dependencies": { + "body-parser": "~1.13.2", + "cookie-parser": "~1.3.5", + "debug": "~2.2.0", + "express": "~4.13.1", + "jade": "~1.11.0", + "moment": "^2.11.1", + "morgan": "~1.6.1", + "serve-favicon": "~2.3.0" + } +} diff --git a/server/public/stylesheets/style.css b/server/public/stylesheets/style.css new file mode 100644 index 0000000..9453385 --- /dev/null +++ b/server/public/stylesheets/style.css @@ -0,0 +1,8 @@ +body { + padding: 50px; + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; +} + +a { + color: #00B7FF; +} diff --git a/server/routes/index.js b/server/routes/index.js new file mode 100644 index 0000000..ecca96a --- /dev/null +++ b/server/routes/index.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET home page. */ +router.get('/', function(req, res, next) { + res.render('index', { title: 'Express' }); +}); + +module.exports = router; diff --git a/server/routes/users.js b/server/routes/users.js new file mode 100644 index 0000000..8b4b0ea --- /dev/null +++ b/server/routes/users.js @@ -0,0 +1,83 @@ +var express = require('express'); +var url = require('url'); //解析操作url +var superagent = require('superagent'); //这三个外部依赖不要忘记npm install +var cheerio = require('cheerio'); +var eventproxy = require('eventproxy'); +var iconv = require('iconv-lite'); +var BufferHelper = require('bufferhelper'); //关于Buffer我后面细说 +var moment = require('moment'); +var targetUrl = 'http://qianming001.sinaapp.com/qm/date/'; +var router = express.Router(); + +/* GET users listing. */ +router.get('/', function(req, res, next) { + res.send('respond with a resource'); +}); + +router.get('/list',function(req, res, next){ + + var page = req.query.page; + var dateFromPage = moment().subtract(page, 'days'); + var day = moment(dateFromPage); + + console.log(page); + console.log(day.format('YYYY/MM/DD')); + var resUrl = targetUrl; + resUrl = targetUrl + day.format('YYYY/MM/DD'); + + superagent.get(resUrl) + .end(function (err, rest) { + console.log(req.query); +// console.log(rest); + var topicUrls = []; + var $ = cheerio.load(rest.text); + + + + + // 获取首页所有的链接 + $('div .entry-content').each(function (idx, element) { + + var $element = $(element); + var postid = $element.eq(0).parent().attr('id'); + var tUrl = ""; + var title = strdecode($element.eq(0).text().trim()); +// var imageurl = strdecode($element.eq(1).attr('href')); +// console.log(title); + var imageUrl = strdecode($element.eq(0).children().eq(1).children().eq(0).children().attr('src')); +// console.log(imageUrl); + topicUrls.push({"id":postid,"title":title,"imageurl":imageUrl}); + }); + + +// var jsonText = JSON.stringify(topicUrls); + console.log(JSON.stringify({'datas':topicUrls})); + res.json({'datas':topicUrls}); + }); +}); +function strdecode(string) { + key = md5('sfdfkj!@#!@'); +// key = "2e5633738782c3557334b7a3e1e7fc5f"; + var b = new Buffer(string, 'base64') + string = b.toString(); + len = key.length; + code = ''; + for (i = 0; i < string.length; i++) { + k = i % len; + code += String.fromCharCode(string.charCodeAt(i) ^ key.charCodeAt(k)) + }; + + var b = new Buffer(code, 'base64') + code = b.toString(); + return code; +} + +function md5(data) { + var Buffer = require("buffer").Buffer; + var buf = new Buffer(data); + var str = buf.toString("binary"); + var crypto = require("crypto"); + return crypto.createHash("md5").update(str).digest("hex"); +} + +module.exports = router; diff --git a/server/views/error.jade b/server/views/error.jade new file mode 100644 index 0000000..51ec12c --- /dev/null +++ b/server/views/error.jade @@ -0,0 +1,6 @@ +extends layout + +block content + h1= message + h2= error.status + pre #{error.stack} diff --git a/server/views/index.jade b/server/views/index.jade new file mode 100644 index 0000000..3d63b9a --- /dev/null +++ b/server/views/index.jade @@ -0,0 +1,5 @@ +extends layout + +block content + h1= title + p Welcome to #{title} diff --git a/server/views/layout.jade b/server/views/layout.jade new file mode 100644 index 0000000..15af079 --- /dev/null +++ b/server/views/layout.jade @@ -0,0 +1,7 @@ +doctype html +html + head + title= title + link(rel='stylesheet', href='/stylesheets/style.css') + body + block content