搞科研的同学肯定离不开谷歌学术,谷歌学术搜索是文献搜索下载一大利器。之前实验室开发了一款学术应用,遗留了历史问题,就是没有解决文献搜索的功能,而这个任务最后落在我的身上。我采用的方案就是集成谷歌学术,但是国内的网络环境,你懂的,自然状态下根本就访问不了谷歌学术的,你得翻墙才能访问。你不能期望使用你开发的学术应用都能翻墙访问谷歌学术(虽然搞科研的人电脑翻墙软件肯定都准备好了!),所以呢我还要给谷歌学术搭建一个代理。不仅要集成谷歌学术一键搜索并下载,还要能导入和分享文献到自己开发的应用,获取文献的BIBTEX并导入到自己的学术应用中,就是要在代理中hack谷歌学术的原始响应,注入相关脚本。(关于BIBTEX可以去维基百科脑补一下。)
废话少说,放效果图过来先:
谷歌学术代理
谷歌学术代理默认采用的是node-http-proxy模块实现的,node-http-proxy的使用见博客用node-http-proxy搭建谷歌代理和node-http-proxy的Github地址。有人读到这已经急,Talk is cheap, Show me the code! 好好,博主这就废话少说,放码过来。新鲜热乎的代码如下:
/**
* Created by Jaye on 15/7/11.
*/
var config = require('./config');
var http = require('http');
var https = require('https');
var httpProxy = require('http-proxy');
var url = require('url');
var cookie = require('./cookie');
var util = require('util');
var modifyHtml = require('./modify_html');
var querystring = require('querystring');
var PROXY_PORT = config.proxyPort;
var proxy, server;
var cookieArr = [];
var hl = 'zh-CN';
var injected = "";
// 创建代理服务器
proxy = httpProxy.createProxy();
//处理error
proxy.on('error', function (err,req,res) {
res.writeHead(500, {
'Content-Type': 'text/plain'
});
res.end('Something went wrong. And we are reporting a custom error message.' + err.message);
});
server = http.createServer(function (req, res) {
//载入需要注入的内容
injected = fs.readFileSync('./inject.html', 'utf8');
//解析语言,没有设置默认为zh-CN,重构时可以用url_auth来代替
var query = querystring.parse(url.parse(req.url).query);
if(query){
hl = query.hl?query.hl:'zh-CN';
}
//todo:加入权限认证,调用url_auth中的urlAuth函数进行判断,如果auth为true放行,否则拦截
// var finalUrl = req.url,
var finalUrl = 'https://scholar.google.com',
finalAgent = null,