CNode

Nodejs版知乎日报

Nnihgwu发布于12 年前最后回复12 年前30 回复11825 浏览0 收藏

平时爱看知乎日报,写了个最简单的 知乎日报 web版,放在了JAE

2014.05.13更新:更新界面,完善功能,新版本放在了 http://izhihu.jd-app.com (仅在chrome下测试过样式),原版还在 这里 2014.04.13更新:增加了 前一天 功能,移动设备界面适配,采用巧妙的方式规避了时间格式化问题(取消注释即可下载所有历史文件)

代码如下:

var http = require('http');
var fs = require('fs');
var date = '';
function fetchBefore(beforeDate) {
    http.get("http://news.at.zhihu.com/api/1.2/news/before/" + beforeDate, function (res) {
        if (res.statusCode != 200) return;
        var data = '';
        res.setEncoding('utf8');
        res.on('data', function (chunk) {
            data += chunk;
        });
        res.on('end', function () {
            var year = beforeDate.substr(0, 4);
            if (!fs.existsSync(year))    fs.mkdirSync(year);
            fs.writeFile(year + '/' + beforeDate + '.json', data);
            //if (beforeDate != '20130520') fetchBefore(JSON.parse(data).date);  //fetch all the history stories
        });
    });
}
(function fetchLatest() {
    http.get("http://news.at.zhihu.com/api/1.2/news/latest", function (res) {
        if (res.statusCode != 200) return;
        var data = '';
        res.setEncoding('utf8');
        res.on('data', function (chunk) {
            data += chunk;
        });
        res.on('end', function () {
            var json = JSON.parse(data);
            if (date != json.date) {
                date = json.date;
                fetchBefore(date);
            }
            fs.writeFile('latest.json', data);
        });
    });
    setTimeout(fetchLatest, 10 * 60 * 1000);
})();
http.createServer(function (request, response) {
    var url = request.url;
    if (url == '/favicon.ico')   return;
    var file = 'latest.json';
    if (url.length == 16) {
        var path = url.substr(8, 4) + '/' + url.substr(8, 8) + '.json';
        if (fs.existsSync(path))  file = path;
    }
    var data = fs.readFileSync(file);
    var json = JSON.parse(data);
    response.writeHead(200, {'Content-Type': 'text/html;charset=utf-8'});
    response.write('<!doctype html><html><head><title>知乎日报</title>');
    response.write('<meta name="viewport" content="width=device-width,user-scalable=no" />');
    response.write('<style>a{color:#333;text-decoration:none;}body{max-width:600px;margin:10px auto;padding:10px;}</style></head><body>');
    response.write('<h1><a href="/">知乎日报</a> - ' + json.display_date + '</h1>');
    for (var i = 0; i < json.news.length; i++) {
        response.write('<h3><a href="' + json.news[i].share_url + '" target="_blank">' + json.news[i].title + '</a></h3>');
    }
    response.write('<h3><a href="/before/' + json.date + '"><<< 前一天</a></h3>');
    response.write('</body></html>');
    response.end();
}).listen(process.env.PORT || 1337, null);

最初版本

var http = require('http');
var fs = require('fs');
var fetchAt=null;
function writeData(data, response) {
    var json = JSON.parse(data);
    response.writeHead(200, {'Content-Type': 'text/html;charset=utf-8'});
    var title = '知乎日报[' + json.date + ']';
    response.write('<style>a{color:#333;text-decoration:none;}body{width:600px;margin:30px auto 30px;}</style>');
    response.write('<title>' + title + '</title>');
    response.write('<body>');
    response.write('<h1>' + title + '</h1>');
    for (var i = 0; i < json.news.length; i++) {
        response.write('<h3><a href="' + json.news[i].share_url + '" target="_blank">' + json.news[i].title + '</a></h3>');
    }
    response.write('</body>');
    response.end();
}
function fetchData(response) {
    http.get("http://news.at.zhihu.com/api/1.2/news/latest", function (res) {
        if (res.statusCode != 200) return;
        var data = '';
        res.setEncoding('utf8');
        res.on('data', function (chunk) {
            data += chunk;
        });
        res.on('end', function () {
            fs.writeFile('latest.json', data);
            fetchAt = new Date();
            writeData(data, response);
        });
    }).on('error', function (e) {
        response.write("Error: " + e.message);
    });
}
http.createServer(function (request, response) {
    if(request.url == '/favicon.ico')   return;
    if(fetchAt==null||(new Date()-fetchAt)/1000/60>10){
        fetchData(response);
        return;
    }
    var data=fs.readFileSync('latest.json');
    writeData(data, response);
}).listen(process.env.PORT || 1337, null);
查看回复

回复 (30)

J
j4cnodejs#1·12 年前

不错,支持一下!

A
alsotang#2·12 年前

代码真难看。

N
nihgwu#3·12 年前
引用 alsotang代码真难看。

怎么才是好看呢……

N
nihgwu#4·12 年前
J
j4cnodejs#5·12 年前
引用 j4cnodejs不错,支持一下!

@nihgwu 代码MD格式时指定用 ```javascript 会不会好看一点?

J
j4cnodejs#6·12 年前
引用 j4cnodejs不错,支持一下!

@nihgwu 请问,你在去年一文里: http://cnodejs.org/topic/51597cf65dff253b378c9d44 这个源代码能分享一下么?

Z
zilong-thu#7·12 年前

挺好玩。

N
nihgwu#8·12 年前
引用 j4cnodejs不错,支持一下!

@j4cnodejs 我用的 ```js ……

N
nihgwu#9·12 年前
引用 j4cnodejs不错,支持一下!

@j4cnodejs 爬虫代码我发了啊,其他只涉及到页面render

Y
yaochun#10·12 年前

####先支持再细看吧,有想法~

J
j4cnodejs#11·12 年前
引用 j4cnodejs不错,支持一下!

@nihgwu 为啥没有syntax highlight?

J
j4cnodejs#12·12 年前
引用 j4cnodejs不错,支持一下!

@nihgwu 完整的能发我一份么? 想应用geddy到项目中, 看看你曾经填过什么坑

N
nihgwu#13·12 年前
引用 j4cnodejs不错,支持一下!

@j4cnodejs geddy现在应该完善多了吧,我还想换成express再放出来呢。。写得太烂

N
nihgwu#14·12 年前

更新界面,完善功能

J
jingleo#15·12 年前

Nodejs新手,学习一下。PS:没事也爱逛知乎

K
kingapple#16·12 年前

赶脚域名很霸气,和jd有神马关系呢:)

K
kingapple#18·12 年前
引用 kingapple赶脚域名很霸气,和jd有神马关系呢:)

@nihgwu 么么哒,肿么还不睡觉:( 话说楼上开放源码否:)

J
jiyinyiyong#19·12 年前

有意思,, 不过页面的 CSS 应该调下吧, 比较难阅读

N
nihgwu#20·12 年前
引用 jiyinyiyong有意思,, 不过页面的 CSS 应该调下吧, 比较难阅读

就是为了极简,本来连样式都没有了,临时加上去的

N
nihgwu#21·12 年前

更新完善

B
booxood#22·12 年前
引用 jiyinyiyong有意思,, 不过页面的 CSS 应该调下吧, 比较难阅读

@nihgwu 很喜欢这种纯文字的排版~

N
nihgwu#25·12 年前
R
raymond#26·12 年前

+1 同样觉得Css应该调一下

R
raymond#28·12 年前
引用 raymond+1 同样觉得Css应该调一下

@nihgwu 适当的css 能让人阅读起来更舒服

N
nihgwu#29·12 年前
引用 raymond+1 同样觉得Css应该调一下

@Raymond 问题是我觉得现在的就还行啊。。我用iphone ipad pc看着都还行。。

R
raymond#30·12 年前
参与回复
登录后即可参与回复。登录