Advertisement
Guest User

2ch API proxy

a guest
Mar 7th, 2015
1,255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/usr/bin/env node
  2.  
  3. var createHmac = require('crypto').createHmac;
  4. var fs = require('fs');
  5. var https = require('https');
  6. var http = require('http');
  7. var path = require('path');
  8. var stringify = require('querystring').stringify;
  9. var url = require('url');
  10.  
  11. var USER_AGENT = 'Monazilla/1.00 (JaneStyle/3.81)';
  12. var APP_KEY = 'aqMBM5paukkx5FOVcSfisMTMj8I4Dm';
  13. var HM_KEY = 'CPGjWLXxFojVtO7tiu3Lrwm1yLqtk1';
  14.  
  15. var PORT = 8088;
  16.  
  17. var sessionFile = path.join(__dirname, 'session.txt');
  18. var sessionExpire = 24 * 60 * 60 * 1000;
  19. var headerList = [
  20.   'accept-encoding',
  21.   'if-modified-since',
  22.   'range'
  23. ];
  24.  
  25. var _sid;
  26.  
  27. function authenticate() {
  28.   var ct = '1234567890';
  29.   var message = APP_KEY + ct;
  30.   var hb = createHmac('sha256', HM_KEY).update(message).digest('hex');
  31.   var data = { ID: '', PW: '', KY: APP_KEY, CT: ct, HB: hb };
  32.   var headers = {
  33.     'User-Agent': 'Monazilla/1.3',
  34.     'X-2ch-UA': 'JaneStyle/3.81',
  35.     'Content-Type': 'application/x-www-form-urlencoded'
  36.   };
  37.   var options = {
  38.     'method': 'POST',
  39.     'hostname': 'api.2ch.net',
  40.     'path': '/v1/auth/',
  41.     'headers': headers
  42.   };
  43.  
  44.   https.request(options, function(response) {
  45.     console.log('POST %s - %s', options.path, response.statusCode);
  46.  
  47.     var writeStream = fs.createWriteStream(sessionFile);
  48.     writeStream.on('close', readSessionFile);
  49.     response.pipe(writeStream);
  50.   }).end(stringify(data));
  51. }
  52.  
  53. function readSessionFile() {
  54.   fs.readFile(sessionFile, { encoding: 'utf8' }, function(err, data) {
  55.     _sid = data.split(':')[1];
  56.   });
  57. }
  58.  
  59. fs.stat(sessionFile, function(err, stat) {
  60.   if (!err && stat && stat.mtime > new Date() - sessionExpire) {
  61.     readSessionFile();
  62.   } else {
  63.     authenticate();
  64.   }
  65. });
  66.  
  67. var proxy = http.createServer(function(req, res) {
  68.   var o = url.parse(req.url);
  69.   if (o.href.match(/http:\/\/(\w+)\.2ch\.net\/(\w+)\/dat\/(\d+)\.dat/)) {
  70.     var server = RegExp.$1;
  71.     var board = RegExp.$2;
  72.     var threadID = RegExp.$3;
  73.  
  74.     var message = '/v1/' + server + '/' + board + '/' + threadID;
  75.     message += _sid + APP_KEY;
  76.     var hobo = createHmac('sha256', HM_KEY).update(message).digest('hex');
  77.     var data = { sid: _sid, hobo: hobo, appkey: APP_KEY };
  78.     var headers = {
  79.       'User-Agent': USER_AGENT,
  80.       'Content-Type': 'application/x-www-form-urlencoded'
  81.     };
  82.     headerList.forEach(function(key) {
  83.       if (key in req.headers) headers[key] = req.headers[key];
  84.     });
  85.     var options = {
  86.       'method': 'POST',
  87.       'hostname': 'api.2ch.net',
  88.       'path': '/v1/' + server + '/' + board + '/' + threadID,
  89.       'headers': headers
  90.     };
  91.  
  92.     return https.request(options, function(response) {
  93.       console.log('POST %s - %s', options.path, response.statusCode);
  94.  
  95.       res.writeHead(response.statusCode, response.headers);
  96.       response.pipe(res);
  97.     }).end(stringify(data));
  98.   }
  99.  
  100.   o.method = req.method;
  101.   o.headers = req.headers;
  102.   req.pipe(http.request(o, function(response) {
  103.     res.writeHead(response.statusCode, response.headers);
  104.     response.pipe(res);
  105.   }));
  106. });
  107.  
  108. proxy.on('clientError', function(err, sock) {
  109.   console.log(err);
  110.   sock.end();
  111. });
  112.  
  113. proxy.listen(PORT, function() {
  114.   console.log('proxy server is listening on port %d', proxy.address().port);
  115. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement