可以代理蘋果ID服務器
const http = require('http');
const https = require('https');
const client = require('https');
const fs = require('fs');
const server_options = {
pfx: fs.readFileSync('appleid.apple.com.pfx'),
//passphrase: 'sample'
};
const server = https.createServer(server_options, (server_req, server_res) => {
//1:有人訪問虛擬代理服務器時
console.log(server_req.url);
const client_options = {};
client_options.hostname = 'appleid.apple.com.akadns.net';
client_options.port = 443;
client_options.method = server_req.method;
client_options.path = server_req.url;
client_options.headers = server_req.headers;
client_options.headers.host = 'appleid.apple.com';
client_options.timeout = 5000;
//2:轉發Header給目標真實的服務器
const client_req = client.request(client_options, (client_res) => {
//3:目標服務器返回Header
server_res.writeHead(client_res.statusCode, client_res.headers);
client_res.on('data', (d) => {
//4:收到目標服務器的數據,並轉發給用戶
server_res.write(d);
});
client_res.on('end', (d) => {
//5:目標服務器數據發完了
server_res.end(d);
});
}).on('error', (e) => {
//6:訪問目標服務器時出錯
console.error(e);
});
server_req.on('data', (data) => {
//7:收到用戶發來的數據,並轉發給目標服務器
console.log(data.toString());
client_req.write(data);
});
server_req.on('end', (data) => {
//8:用戶數據發完了。
client_req.end(data);
});
});
server.on('clientError', (err, socket) => {
socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});
server.on('error', (err, socket) => {
if (err.code === 'EADDRINUSE') {
console.log('綁定地址被占用');
}
});
const options = {};
options['host'] = '0.0.0.0';
options['port'] = 443;
server.listen(options, () => {
console.log('啟動成功');
});
代碼更新。下面這個可以記錄到文件里面去
const http = require('http');
const https = require('https');
const client = require('https');
const fs = require('fs');
const zlib = require('zlib');
/*
const crypto = require('crypto');
const md5 = (str) => {
const md5 = crypto.createHash("md5");
md5.update(str);
return md5.digest('hex');
};
const base64 = (str) => {
const b = new Buffer(str);
return b.toString('base64');
};
//*/
const rootDir = 'data';//文件保存路徑
const server_options = {
pfx: fs.readFileSync('appleid.apple.com.pfx'),
//passphrase: 'sample'
};
const server = https.createServer(server_options, (server_req, server_res) => {
//1:有人訪問虛擬代理服務器時
const url_encoded = encodeURIComponent(server_req.url);
console.log(server_req.url);
fs.writeFileSync(rootDir + '/request_header-' + url_encoded, JSON.stringify(server_req.headers));
const request_output = fs.createWriteStream(rootDir + '/request_body-' + url_encoded);
server_req.pipe(request_output);//將用戶提交的數據寫入文件
const client_options = {};
client_options.hostname = 'appleid.apple.com.akadns.net';
client_options.port = 443;
client_options.method = server_req.method;
client_options.path = server_req.url;
client_options.headers = server_req.headers;
client_options.headers.host = 'appleid.apple.com';
client_options.timeout = 5000;
//2:轉發Header給目標真實的服務器
const client_req = client.request(client_options, (client_res) => {
//3:目標服務器返回Header
fs.writeFileSync(rootDir + '/response_header-' + url_encoded, JSON.stringify(client_res.headers));
const response_output = fs.createWriteStream(rootDir + '/response_body-' + url_encoded);
server_res.writeHead(client_res.statusCode, client_res.headers);
switch (client_res.headers['content-encoding']) {
// or, just use zlib.createUnzip() to handle both cases
case 'gzip':
client_res.pipe(zlib.createGunzip()).pipe(response_output);
break;
case 'deflate':
client_res.pipe(zlib.createInflate()).pipe(response_output);
break;
default:
//目標服務器返回的是純文本,並寫入文件
client_res.pipe(response_output);
break;
}
client_res.on('data', (data) => {
//4:收到目標服務器的數據,並轉發給用戶
server_res.write(data);
});
client_res.on('end', () => {
//5:目標服務器數據發完了
server_res.end();
});
}).on('error', (e) => {
//6:訪問目標服務器時出錯
console.error(e);
});
server_req.on('data', (data) => {
//7:收到用戶發來的數據,並轉發給目標服務器
client_req.write(data);
});
server_req.on('end', () => {
//8:用戶數據發完了。
client_req.end();
});
});
server.on('clientError', (err, socket) => {
socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});
server.on('error', (err, socket) => {
if (err.code === 'EADDRINUSE') {
console.log('綁定地址被占用');
}
});
const options = {};
options['host'] = '0.0.0.0';
options['port'] = 443;
server.listen(options, () => {
console.log('啟動成功');
});
