Advertisement
Guest User

Untitled

a guest
Dec 5th, 2016
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. *   SocialMNST 1.0.0
  3. *   Автор: tanckov
  4. *   Версия датируется: 25.11.2016
  5. */
  6.  
  7. // Библиотеки и модули
  8. var http = require('http');
  9. var request = require('request');
  10. var urlutills = require('url');
  11. var _ = require('underscore');
  12. var Promise = require('bluebird');
  13. var Client = require('instagram-private-api').V1;
  14. var querystring = require('querystring');
  15.  
  16. var conf = require('./config');
  17.  
  18. var socialmnst = {
  19.     db: conf.init(),
  20.     isJSON: function(something){
  21.         if (typeof something != 'string')
  22.             something = JSON.stringify(something);
  23.  
  24.         try {
  25.             JSON.parse(something);
  26.             return true;
  27.         } catch (e) {
  28.             return false;
  29.         }
  30.     },
  31.     onlyId: function(arr){
  32.         return _.map(arr, function(user) {
  33.             return user.id;
  34.         });
  35.     },
  36.     applyMode: function(arr, mode){
  37.         switch (mode*1) {
  38.         case 1:
  39.             var new_arr = [];
  40.             for(var i = 0;i<arr.length;i++){
  41.                 if(!arr[i].isPrivate){
  42.                     new_arr[new_arr.length] = arr[i];
  43.                 }
  44.             }
  45.             return new_arr;
  46.         break;
  47.         case 2:
  48.             var new_arr = [];
  49.             for(var i = 0;i<arr.length;i++){
  50.                 if(arr[i].isPrivate){
  51.                     new_arr[new_arr.length] = arr[i];
  52.                 }
  53.             }
  54.             return new_arr;
  55.         break;
  56.         default:
  57.             return arr;
  58.         }
  59.     },
  60.     login: function(login, password, target, step, unFollowDelay, mode, action, per){
  61.         if(!socialmnst.db[login]){
  62.             var device = new Client.Device(login);
  63.             var storage = new Client.CookieFileStorage(__dirname + '/cookies/'+login+'.json');
  64.            
  65.             Client.Session.create(device, storage, login, password).catch(Client.Exceptions.AuthenticationError, function(error){
  66.                 return {'AuthenticationErroror':true};
  67.             }).then(function(session) {
  68.                 if(session.AuthenticationErroror){
  69.                     conf.delete(__dirname + '/cookies/'+login+'.json');
  70.                 } else {
  71.                     socialmnst.db[login] = {
  72.                         'login': login,
  73.                         'password': password,
  74.                         'step': step,
  75.                         'cfg': {
  76.                             'timestamp': Date.now()/1000,
  77.                             'target': target,
  78.                             'referer': 'start',
  79.                             'unFollowDelay': unFollowDelay,
  80.                             'mode': mode,
  81.                             'action': action,
  82.                             'per': per
  83.                         }
  84.                     }
  85.                    
  86.                     socialmnst.core(login, session);
  87.                 }
  88.             })
  89.         } else {
  90.             if(password==0){
  91.                 socialmnst.db[login].cfg.force = true;
  92.             } else {
  93.                 if(socialmnst.db[login].cfg.timestamp<(Date.now()/1000)-30){
  94.                     var device = new Client.Device(login);
  95.                     var storage = new Client.CookieFileStorage(__dirname+'/cookies/'+login+'.json');
  96.                    
  97.                     Client.Session.create(device, storage, login, password).catch(Client.Exceptions.AuthenticationError, function(error){
  98.                         return {'AuthenticationError':true};
  99.                     }).then(function(session) {
  100.                         if(session.AuthenticationErroror){
  101.                             conf.delete(__dirname+'/cookies/'+login+'.json');
  102.                             return;
  103.                         }
  104.                         socialmnst.db[login].password =  password;
  105.                         socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  106.                         socialmnst.db[login].cfg.target = target;
  107.                         socialmnst.db[login].cfg.unFollowDelay = unFollowDelay;
  108.                         socialmnst.db[login].cfg.mode = mode;
  109.                         socialmnst.db[login].cfg.action = action;
  110.                         socialmnst.db[login].cfg.per = per;
  111.                        
  112.                         socialmnst.core(login, session);
  113.                     })
  114.                 }
  115.             }
  116.         }
  117.     },
  118.     core: function(login, session){
  119.         console.log(socialmnst.db[login].step);
  120.         if(!socialmnst.db[login] || socialmnst.db[login].cfg.force){
  121.             delete socialmnst.db[login].cfg.force;
  122.            
  123.             return;
  124.         }
  125.         var check_timestamp = socialmnst.db[login].cfg.timestamp;
  126.         var step = socialmnst.db[login].step;
  127.         switch (step) {
  128.         case 'start':
  129.             Client.Account.searchForUser(session, socialmnst.db[login].cfg.target).then(function(account) {
  130.                 socialmnst.db[login].cfg.targetId = account.id;
  131.                 socialmnst.db[login].cfg.referer = socialmnst.db[login].step;
  132.                 socialmnst.db[login].step = 'getAccountToFollow';
  133.                 setTimeout(function() {
  134.                     if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  135.                         socialmnst.db[login].cfg.force = true;
  136.                     socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  137.                     socialmnst.core(login, session);
  138.                 }, Math.random()*(7000)+0);
  139.             })
  140.         break;
  141.         case 'getAccountToFollow':
  142.             Promise.map(_.range(1), function() {
  143.                 if(!session.__targetFeed){
  144.                     session.__targetFeed = new Client.Feed.AccountFollowing(session, socialmnst.db[login].cfg.targetId);
  145.                     socialmnst.db[login].cfg.getAccountToFollowCount = 0;
  146.                    
  147.                     return session.__targetFeed.get();
  148.                 } else {
  149.                     if(socialmnst.db[login].cfg.getAccountToFollowCount>30 || !session.__targetFeed.isMoreAvailable()){
  150.                         socialmnst.db[login].cfg.referer = socialmnst.db[login].step;
  151.                         socialmnst.db[login].step = 'getNextTarget';
  152.                         delete session.__targetFeed;
  153.                         return;
  154.                     } else{
  155.                         if(step == socialmnst.db[login].cfg.referer) socialmnst.db[login].cfg.getAccountToFollowCount++;
  156.                        
  157.                         return session.__targetFeed.get();
  158.                     }
  159.                 }
  160.             }).then(function(results) {
  161.                 if(socialmnst.db[login].step=='getNextTarget'){
  162.                     setTimeout(function() {
  163.                         if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  164.                             socialmnst.db[login].cfg.force = true;
  165.                         socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  166.                         socialmnst.core(login, session);
  167.                     }, Math.random()*(7000)+0);
  168.                 } else {
  169.                     var arr = _.flatten(results);
  170.                     followList = socialmnst.applyMode(_.map(arr, function(user) {
  171.                         return {id:user.id,isPrivate:user._params.isPrivate};
  172.                     }), socialmnst.db[login].cfg.mode);
  173.                     if(followList.length!=0){
  174.                         if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  175.                             socialmnst.db[login].cfg.force = true;
  176.                         socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  177.                         check_timestamp = socialmnst.db[login].cfg.timestamp;
  178.                         setTimeout(function() {
  179.                             Client.Relationship.getMany(session, socialmnst.onlyId(followList)).then(function(relationship) {
  180.                                 socialmnst.db[login].cfg.followList = [];
  181.                                 for(var i=0;i<relationship.length;i++){
  182.                                     if(!relationship[i]._params.following){
  183.                                         socialmnst.db[login].cfg.followList[socialmnst.db[login].cfg.followList.length] = {
  184.                                             'id': relationship[i].accountId,
  185.                                             'isPrivate': relationship[i]._params.isPrivate
  186.                                         }
  187.                                     }
  188.                                 }
  189.                                 if(socialmnst.db[login].cfg.followList.length==0){
  190.                                     setTimeout(function() {
  191.                                         if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  192.                                             socialmnst.db[login].cfg.force = true;
  193.                                         socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  194.                                         socialmnst.core(login, session);
  195.                                     }, Math.random()*(7000)+0);
  196.                                 } else {
  197.                                     socialmnst.db[login].cfg.referer = socialmnst.db[login].step;
  198.                                     socialmnst.db[login].step = 'follow';
  199.                                     socialmnst.db[login].cfg.getAccountToFollowCount = 0;
  200.                                    
  201.                                     setTimeout(function() {
  202.                                         if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  203.                                             socialmnst.db[login].cfg.force = true;
  204.                                         socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  205.                                         socialmnst.core(login, session);
  206.                                     }, Math.random()*(7000)+0);
  207.                                 }
  208.                             });
  209.                         }, Math.random()*(7000)+0);
  210.                     } else {
  211.                         setTimeout(function() {
  212.                             if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  213.                                 socialmnst.db[login].cfg.force = true;
  214.                             socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  215.                             socialmnst.core(login, session);
  216.                         }, Math.random()*(7000)+0);
  217.                     }
  218.                 }
  219.             });
  220.         break;
  221.         case 'follow':
  222.             socialmnst.db[login].cfg.referer = socialmnst.db[login].step;
  223.             if(socialmnst.db[login].cfg.nextFollow && Date.now()/1000<socialmnst.db[login].cfg.nextFollow){
  224.                 socialmnst.db[login].step = 'followDelay';
  225.                 setTimeout(function() {
  226.                     if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  227.                         socialmnst.db[login].cfg.force = true;
  228.                     socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  229.                     socialmnst.core(login, session);
  230.                 }, Math.random()*(7000)+0);
  231.             } else {
  232.                 socialmnst.db[login].cfg.stackFollowList = socialmnst.db[login].cfg.stackFollowList || [];
  233.                 socialmnst.db[login].cfg.trueFollowList = socialmnst.db[login].cfg.trueFollowList || [];
  234.                 if(socialmnst.db[login].cfg.trueFollowList.length==0){
  235.                     if(socialmnst.db[login].cfg.followList.length==0){
  236.                         socialmnst.db[login].step = 'getAccountToFollow';
  237.                        
  238.                         setTimeout(function() {
  239.                             if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  240.                                 socialmnst.db[login].cfg.force = true;
  241.                             socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  242.                             socialmnst.core(login, session);
  243.                         }, Math.random()*(7000)+0);
  244.                     } else {
  245.                         Client.Account.getById(session, socialmnst.db[login].cfg.followList[0].id).then(function(relationship) {
  246.                             var trigger = relationship._params.followersCount>conf.minFollowersCount;
  247.                             trigger = trigger && relationship._params.followersCount<conf.maxFollowersCount;
  248.                             trigger = trigger && relationship._params.followingsCount>conf.minFollowingsCount;
  249.                             trigger = trigger && relationship._params.followingsCount<conf.maxFollowingsCount;
  250.                             console.log('followersCount: '+relationship._params.followersCount+', followingsCount: '+relationship._params.followingsCount);
  251.                             if(trigger){
  252.                                 if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  253.                                     socialmnst.db[login].cfg.force = true;
  254.                                 socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  255.                                 check_timestamp = socialmnst.db[login].cfg.timestamp;
  256.                                
  257.                                 setTimeout(function() {
  258.                                     Client.Relationship.create(session, socialmnst.db[login].cfg.followList[0].id).catch(Client.Exceptions.ActionSpamError, function(error){
  259.                                         return {'ActionSpamError':true};
  260.                                     }).then(function(relationship) {
  261.                                         if(relationship.ActionSpamError){
  262.                                             socialmnst.db[login].cfg.nextFollow = (Date.now()/1000)+1800;
  263.                                             socialmnst.db[login].step = 'followDelay';
  264.                                             setTimeout(function() {
  265.                                                 if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  266.                                                     socialmnst.db[login].cfg.force = true;
  267.                                                 socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  268.                                                 socialmnst.core(login, session);
  269.                                             }, Math.random()*(7000)+0);
  270.                                         } else {
  271.                                             var stackFollowList = [];
  272.                                             for(var i=0;i<socialmnst.db[login].cfg.stackFollowList.length;i++){
  273.                                                 if(socialmnst.db[login].cfg.stackFollowList[i]>Date.now()/1000|0-socialmnst.db[login].cfg.per)
  274.                                                     stackFollowList[stackFollowList.length] = socialmnst.db[login].cfg.stackFollowList[i];
  275.                                             }
  276.                                             socialmnst.db[login].cfg.stackFollowList = stackFollowList;
  277.                                             socialmnst.db[login].cfg.stackFollowList[socialmnst.db[login].cfg.stackFollowList.length] = Date.now()/1000|0;
  278.                                             if(socialmnst.db[login].cfg.stackFollowList.length>=socialmnst.db[login].cfg.action){
  279.                                                 socialmnst.db[login].cfg.nextFollow = (Date.now()/1000)
  280.                                                 +(socialmnst.db[login].cfg.per-((Date.now()/1000)-socialmnst.db[login].cfg.stackFollowList[0]));
  281.                                                 socialmnst.db[login].cfg.stackFollowList = [];
  282.                                                 socialmnst.db[login].step = 'followDelay';
  283.                                             }
  284.                                             socialmnst.db._cfg.reFollowList[socialmnst.db._cfg.reFollowList.length] = {
  285.                                                 'id': socialmnst.db[login].cfg.followList[0].id,
  286.                                                 'isPrivate': socialmnst.db[login].cfg.followList[0].isPrivate,
  287.                                                 'followedBy': encodeURIComponent(login),
  288.                                                 'targetBy': socialmnst.db[login].cfg.targetId,
  289.                                                 'timestamp': Date.now()/1000|0
  290.                                             };
  291.                                             socialmnst.db[login].cfg.followList.shift();
  292.                                            
  293.                                             if(socialmnst.db[login].cfg.followList.length==0){
  294.                                                 socialmnst.db[login].step = 'getAccountToFollow';
  295.                                                
  296.                                                 setTimeout(function() {
  297.                                                     if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  298.                                                         socialmnst.db[login].cfg.force = true;
  299.                                                     socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  300.                                                     socialmnst.core(login, session);
  301.                                                 }, Math.random()*(7000)+0);
  302.                                             } else {
  303.                                                 setTimeout(function() {
  304.                                                     if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  305.                                                         socialmnst.db[login].cfg.force = true;
  306.                                                     socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  307.                                                     socialmnst.core(login, session);
  308.                                                 }, Math.random()*(7000)+0);
  309.                                             }
  310.                                         }
  311.                                     });
  312.                                 }, Math.random()*(7000)+0);
  313.                             } else {
  314.                                 socialmnst.db[login].cfg.followList.shift();
  315.                                 setTimeout(function() {
  316.                                     if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  317.                                         socialmnst.db[login].cfg.force = true;
  318.                                     socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  319.                                     socialmnst.core(login, session);
  320.                                 }, Math.random()*(7000)+0);
  321.                             }
  322.                         });
  323.                     }
  324.                 } else {
  325.                     Client.Relationship.create(session, socialmnst.db[login].cfg.trueFollowList[0].id).catch(Client.Exceptions.ActionSpamError, function(error){
  326.                         return {'ActionSpamError':true};
  327.                     }).then(function(relationship) {
  328.                         if(relationship.ActionSpamError){
  329.                             socialmnst.db[login].cfg.nextFollow = (Date.now()/1000)+1800;
  330.                             socialmnst.db[login].step = 'followDelay';
  331.                             setTimeout(function() {
  332.                                 if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  333.                                     socialmnst.db[login].cfg.force = true;
  334.                                 socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  335.                                 socialmnst.core(login, session);
  336.                             }, Math.random()*(7000)+0);
  337.                         } else {
  338.                             var stackFollowList = [];
  339.                             for(var i=0;i<socialmnst.db[login].cfg.stackFollowList.length;i++){
  340.                                 if(socialmnst.db[login].cfg.stackFollowList[i]>Date.now()/1000|0-socialmnst.db[login].cfg.per)
  341.                                     stackFollowList[stackFollowList.length] = socialmnst.db[login].cfg.stackFollowList[i];
  342.                             }
  343.                             socialmnst.db[login].cfg.stackFollowList = stackFollowList;
  344.                             socialmnst.db[login].cfg.stackFollowList[socialmnst.db[login].cfg.stackFollowList.length] = Date.now()/1000|0;
  345.                             if(socialmnst.db[login].cfg.stackFollowList.length>=socialmnst.db[login].cfg.action){
  346.                                 socialmnst.db[login].cfg.nextFollow = (Date.now()/1000)
  347.                                 +(socialmnst.db[login].cfg.per-((Date.now()/1000)-socialmnst.db[login].cfg.stackFollowList[0]));
  348.                                 socialmnst.db[login].cfg.stackFollowList = [];
  349.                                 socialmnst.db[login].step = 'followDelay';
  350.                             }
  351.                             socialmnst.db._cfg.reFollowList[socialmnst.db._cfg.reFollowList.length] = {
  352.                                 'id': socialmnst.db[login].cfg.trueFollowList[0].id,
  353.                                 'isPrivate': socialmnst.db[login].cfg.trueFollowList[0].isPrivate,
  354.                                 'followedBy': encodeURIComponent(login),
  355.                                 'targetBy': socialmnst.db[login].cfg.targetId,
  356.                                 'timestamp': Date.now()/1000|0
  357.                             };
  358.                             socialmnst.db[login].cfg.trueFollowList.shift();
  359.                        
  360.                             setTimeout(function() {
  361.                                 if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  362.                                     socialmnst.db[login].cfg.force = true;
  363.                                 socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  364.                                 socialmnst.core(login, session);
  365.                             }, Math.random()*(7000)+0);
  366.                         }
  367.                     });
  368.                 }
  369.             }
  370.         break;
  371.         case 'getNextTarget':
  372.             if(!socialmnst.db[login].cfg.parentTarget){
  373.                 socialmnst.db[login].cfg.parentTarget = socialmnst.db[login].cfg.targetId;
  374.             }
  375.             var parentTarget = encodeURIComponent(socialmnst.db[login].cfg.parentTarget);
  376.             var target = encodeURIComponent(socialmnst.db[login].cfg.targetId);
  377.             var params = 'parentTarget=' + parentTarget +
  378.                         '&target=' + target +
  379.                         '&followedBy=' + encodeURIComponent(login) +
  380.                         '&app=getNextTarget&key='+conf.apiKey;
  381.             var options = {
  382.                 host: 'mpu.96.lt',
  383.                 path: '/api.php?'+params
  384.             };
  385.             function onError(){
  386.                 // HZ
  387.             }
  388.             var req = http.get(options, function(res) {
  389.                 var bodyChunks = '';
  390.                 res.on('data', function(chunk) {
  391.                     bodyChunks+=chunk;
  392.                 }).on('end', function() {
  393.                     if(socialmnst.isJSON(bodyChunks) && res.statusCode==200){
  394.                         var data = JSON.parse(bodyChunks);
  395.                         if(!data.status || data.status!='ok' || data.data.length==0){
  396.                             onError();
  397.                         } else {
  398.                             Client.Relationship.getMany(session, socialmnst.onlyId(data.data)).then(function(relationship) {
  399.                                 socialmnst.db[login].cfg.nextTargetList = [];
  400.                                 for(var i=0;i<relationship.length;i++){
  401.                                     if(relationship[i]._params.following || !relationship[i]._params.isPrivate){
  402.                                         socialmnst.db[login].cfg.nextTargetList[socialmnst.db[login].cfg.nextTargetList.length] = {
  403.                                             'id': relationship[i].accountId,
  404.                                             'isPrivate': relationship[i]._params.isPrivate,
  405.                                             'following': relationship[i]._params.following
  406.                                         }
  407.                                     }
  408.                                 }
  409.                                 if(socialmnst.db[login].cfg.nextTargetList.length==0){
  410.                                     if(data.data.length==20){
  411.                                         socialmnst.db[login].cfg.parentTarget = data.parentTarget;
  412.                                         socialmnst.db[login].cfg.targetId = data.targetId;
  413.                                         setTimeout(function() {
  414.                                             if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  415.                                                 socialmnst.db[login].cfg.force = true;
  416.                                             socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  417.                                             socialmnst.core(login, session);
  418.                                         }, Math.random()*(7000)+0);
  419.                                     } else {
  420.                                         onError();
  421.                                     }
  422.                                 } else {
  423.                                     socialmnst.db[login].cfg.parentTarget = data.parentTarget;
  424.                                     socialmnst.db[login].cfg.targetId = data.targetId;
  425.                                     socialmnst.db[login].cfg.referer = socialmnst.db[login].step;
  426.                                     socialmnst.db[login].step = 'checkNextTarget';
  427.                                    
  428.                                     setTimeout(function() {
  429.                                         if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  430.                                             socialmnst.db[login].cfg.force = true;
  431.                                         socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  432.                                         socialmnst.core(login, session);
  433.                                     }, Math.random()*(7000)+0);
  434.                                 }
  435.                             });
  436.                         }
  437.                     } else {
  438.                         onError();
  439.                     }
  440.                 })
  441.             });
  442.             req.on('error', function(e) {
  443.                 onError();
  444.             });
  445.         break;
  446.         case 'checkNextTarget':
  447.             if(socialmnst.db[login].cfg.nextTargetList.length==0){
  448.                 socialmnst.db[login].cfg.referer = socialmnst.db[login].step;
  449.                 socialmnst.db[login].step = 'getNextTarget';
  450.                 setTimeout(function() {
  451.                     if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  452.                         socialmnst.db[login].cfg.force = true;
  453.                     socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  454.                     socialmnst.core(login, session);
  455.                 }, Math.random()*(7000)+0);
  456.             } else {
  457.                 Client.Account.getById(session, socialmnst.db[login].cfg.nextTargetList[0].id).then(function(relationship) {
  458.                     var trigger = relationship._params.followersCount>conf.minFollowersCount;
  459.                     trigger = trigger && relationship._params.followersCount<conf.maxFollowersCount;
  460.                     trigger = trigger && relationship._params.followingsCount>conf.minFollowingsCount;
  461.                     trigger = trigger && relationship._params.followingsCount<conf.maxFollowingsCount;
  462.                    
  463.                     if(trigger){
  464.                         socialmnst.db[login].cfg.targetId = socialmnst.db[login].cfg.nextTargetList[0].id;
  465.                         delete socialmnst.db[login].cfg.nextTargetList;
  466.                         socialmnst.db[login].cfg.referer = socialmnst.db[login].step;
  467.                         socialmnst.db[login].step = 'getAccountToFollow';
  468.                         setTimeout(function() {
  469.                             if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  470.                                 socialmnst.db[login].cfg.force = true;
  471.                             socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  472.                             socialmnst.core(login, session);
  473.                         }, Math.random()*(7000)+0);
  474.                     } else {
  475.                         socialmnst.db[login].cfg.nextTargetList.shift();
  476.                         socialmnst.db[login].cfg.referer = socialmnst.db[login].step;
  477.                         setTimeout(function() {
  478.                             if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  479.                                 socialmnst.db[login].cfg.force = true;
  480.                             socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  481.                             socialmnst.core(login, session);
  482.                         }, Math.random()*(7000)+0);
  483.                     }
  484.                 });
  485.             }  
  486.         break;
  487.         case 'followDelay':
  488.             socialmnst.db[login].cfg.referer = socialmnst.db[login].step;
  489.             if(Date.now()/1000>=socialmnst.db[login].cfg.nextFollow){
  490.                 delete socialmnst.db[login].cfg.nextFollow;
  491.                 socialmnst.db[login].step = 'follow';
  492.                 setTimeout(function() {
  493.                     if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  494.                         socialmnst.db[login].cfg.force = true;
  495.                     socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  496.                     socialmnst.core(login, session);
  497.                 }, Math.random()*(7000)+0);
  498.             } else {
  499.                 socialmnst.db[login].cfg.trueFollowList = socialmnst.db[login].cfg.trueFollowList || [];
  500.                 var trigger = socialmnst.db[login].cfg.trueFollowList.length<socialmnst.db[login].cfg.action;
  501.                 trigger = trigger || socialmnst.db[login].cfg.trueFollowList.length<socialmnst.db[login].cfg.followList.length;
  502.                 if(trigger){
  503.                     if(socialmnst.db[login].cfg.followList.length!=0){
  504.                         Client.Account.getById(session, socialmnst.db[login].cfg.followList[0].id).then(function(relationship) {
  505.                             var trigger = relationship._params.followersCount>conf.minFollowersCount;
  506.                             trigger = trigger && relationship._params.followersCount<conf.maxFollowersCount;
  507.                             trigger = trigger && relationship._params.followingsCount>conf.minFollowingsCount;
  508.                             trigger = trigger && relationship._params.followingsCount<conf.maxFollowingsCount;
  509.                             if(trigger){
  510.                                 socialmnst.db[login].cfg.trueFollowList[socialmnst.db[login].cfg.trueFollowList.length] = socialmnst.db[login].cfg.followList[0];
  511.                                 socialmnst.db[login].cfg.followList.shift();
  512.                                 setTimeout(function() {
  513.                                     if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  514.                                         socialmnst.db[login].cfg.force = true;
  515.                                     socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  516.                                     socialmnst.core(login, session);
  517.                                 }, Math.random()*(7000)+0);
  518.                             } else {
  519.                                 socialmnst.db[login].cfg.followList.shift();
  520.                                 setTimeout(function() {
  521.                                     if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  522.                                         socialmnst.db[login].cfg.force = true;
  523.                                     socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  524.                                     socialmnst.core(login, session);
  525.                                 }, Math.random()*(7000)+0);
  526.                             }
  527.                         });
  528.                     } else {
  529.                         socialmnst.db[login].step = 'getAccountToFollow';
  530.                        
  531.                         setTimeout(function() {
  532.                             if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  533.                                 socialmnst.db[login].cfg.force = true;
  534.                             socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  535.                             socialmnst.core(login, session);
  536.                         }, Math.random()*(7000)+0);
  537.                     }
  538.                 } else {
  539.                     setTimeout(function() {
  540.                         if(check_timestamp!=socialmnst.db[login].cfg.timestamp)
  541.                             socialmnst.db[login].cfg.force = true;
  542.                         socialmnst.db[login].cfg.timestamp = Date.now()/1000;
  543.                         socialmnst.core(login, session);
  544.                     }, Math.random()*(7000)+0);
  545.                 }
  546.             }
  547.         break;
  548.         }
  549.         socialmnst.db[login].cfg.lastUnfollowListDelay = socialmnst.db[login].cfg.lastUnfollowListDelay || (Date.now()/1000-conf.unFollowListDelay);
  550.         socialmnst.db[login].cfg.unfollowList = socialmnst.db[login].cfg.unfollowList || [];
  551.         socialmnst.db[login].cfg.stackUnfollowList = socialmnst.db[login].cfg.stackUnfollowList || [];
  552.         socialmnst.db[login].cfg.nextUnfollow = socialmnst.db[login].cfg.nextUnfollow || Date.now()/1000;
  553.         if(socialmnst.db[login].cfg.lastUnfollowListDelay<=(Date.now()/1000-conf.unFollowListDelay) && socialmnst.db[login].cfg.unfollowList.length==0){
  554.             var stackUnfollowList = socialmnst.db[login].cfg.stackUnfollowList;
  555.             var params = 'followedBy=' + encodeURIComponent(login) +
  556.                         '&unFollowDelay=' + encodeURIComponent((Date.now()/1000|0)-socialmnst.db[login].cfg.unFollowDelay) +
  557.                         '&app=getUnfollowList&key='+conf.apiKey;
  558.             var post_data = "data="+JSON.stringify({"unfollow":socialmnst.db[login].cfg.stackUnfollowList});
  559.             var options = {
  560.                 host: 'mpu.96.lt',
  561.                 path: '/api.php?'+params,
  562.                 method: 'POST',
  563.                 headers: {
  564.                     'Content-Type': 'application/x-www-form-urlencoded',
  565.                     'Content-Length': Buffer.byteLength(post_data)
  566.                 }
  567.             };
  568.             function onError(){
  569.                 // HZ
  570.             }
  571.             var req = http.request(options, function(res) {
  572.                 res.setEncoding('utf8');
  573.                 var bodyChunks = '';
  574.                 res.on('data', function(chunk) {
  575.                     bodyChunks+=chunk;
  576.                 }).on('end', function() {
  577.                     if(socialmnst.isJSON(bodyChunks) && res.statusCode==200){
  578.                         var data = JSON.parse(bodyChunks);
  579.                         if(!data.status || data.status!='ok'){
  580.                             onError();
  581.                         } else {
  582.                             socialmnst.db[login].cfg.unfollowList = data.data;
  583.                             socialmnst.db[login].cfg.lastUnfollowListDelay = Date.now()/1000;
  584.                             var clearedStackUnfollowList = [];
  585.                             for(var i=0;i<stackUnfollowList.length;i++){
  586.                                 var trigger = true;
  587.                                 for(var k=0;k<socialmnst.db[login].cfg.stackUnfollowList.length;k++){
  588.                                     if(stackUnfollowList[i]==socialmnst.db[login].cfg.stackUnfollowList[k]) trigger = false;
  589.                                 }
  590.                                 if(trigger) clearedStackUnfollowList[clearedStackUnfollowList.length] = stackUnfollowList[i];
  591.                             }
  592.                             socialmnst.db[login].cfg.stackUnfollowList = clearedStackUnfollowList;
  593.                         }
  594.                     } else {
  595.                         onError();
  596.                     }
  597.                 });
  598.             });
  599.             req.on('error', function(e) {
  600.                 onError();
  601.             });
  602.             req.write(post_data);
  603.             req.end();
  604.         } else {
  605.             if(socialmnst.db[login].cfg.unfollowList.length!=0 && socialmnst.db[login].cfg.nextUnfollow<=Date.now()/1000){
  606.                 var id = socialmnst.db[login].cfg.unfollowList[0];
  607.                 socialmnst.db[login].cfg.nextUnfollow = (Date.now()/1000)+socialmnst.db[login].cfg.per/(socialmnst.db[login].cfg.action*1.2);
  608.                 Client.Relationship.destroy(session, id).catch(Client.Exceptions.ActionSpamError, function(error){
  609.                     return {'ActionSpamError':true};
  610.                 }).then(function(relationship) {
  611.                     if(!relationship.ActionSpamError) {
  612.                         socialmnst.db[login].cfg.stackUnfollowList[socialmnst.db[login].cfg.stackUnfollowList.length] = id;
  613.                         var unfollowList = [];
  614.                         for(var i=0;i<socialmnst.db[login].cfg.unfollowList.length;i++){
  615.                             if(socialmnst.db[login].cfg.unfollowList[i]!=id) unfollowList[unfollowList.length] = socialmnst.db[login].cfg.unfollowList[i];
  616.                         }
  617.                         socialmnst.db[login].cfg.unfollowList = unfollowList;
  618.                     }
  619.                 });
  620.             }
  621.         }
  622.     }
  623. };
  624.  
  625. setInterval(function() {
  626.     if(socialmnst.db._cfg.reFollowList && socialmnst.db._cfg.reFollowList.length!=0){
  627.         var params = 'app=regMultiFollow&key='+conf.apiKey;
  628.         var req_data = socialmnst.db._cfg.reFollowList;
  629.         var post_data = "data="+JSON.stringify({"data":req_data});
  630.         var options = {
  631.             host: 'mpu.96.lt',
  632.             path: '/api.php?'+params,
  633.             method: 'POST',
  634.             headers: {
  635.                 'Content-Type': 'application/x-www-form-urlencoded',
  636.                 'Content-Length': Buffer.byteLength(post_data)
  637.             }
  638.         };
  639.         function onError(){
  640.             // HZ
  641.         }
  642.         var req = http.request(options, function(res) {
  643.             res.setEncoding('utf8');
  644.             var bodyChunks = '';
  645.             res.on('data', function(chunk) {
  646.                 bodyChunks+=chunk;
  647.             }).on('end', function() {
  648.                 if(socialmnst.isJSON(bodyChunks) && res.statusCode==200){
  649.                     var data = JSON.parse(bodyChunks);
  650.                     if(!data.status || data.status!='ok'){
  651.                         onError();
  652.                     } else {
  653.                         reFollowList = [];
  654.                         for(var i=0;i<socialmnst.db._cfg.reFollowList.length;i++){
  655.                             var trigger = true;
  656.                             for(var k=0;k<req_data.length;k++){
  657.                                 if(_.isEqual(req_data[k], socialmnst.db._cfg.reFollowList[i])) trigger = false;
  658.                             }
  659.                             if(trigger) reFollowList[reFollowList.length] = socialmnst.db._cfg.reFollowList[i];
  660.                         }
  661.                         socialmnst.db._cfg.reFollowList = reFollowList;
  662.                     }
  663.                 } else {
  664.                     onError();
  665.                 }
  666.             });
  667.         });
  668.         req.on('error', function(e) {
  669.             onError();
  670.         });
  671.         req.write(post_data);
  672.         req.end();
  673.     }
  674. }, conf.regFollowDelay);
  675.  
  676. setInterval(function() {
  677.     conf.save(socialmnst.db);
  678. }, conf.saveDelay);
  679.  
  680.  
  681. function userConnected(req, res){
  682.     res.writeHead(200, {"Content-Type": "text/html"});
  683.     var url = urlutills.parse(req.url, true);
  684.     switch(url.pathname){
  685.         default:
  686.             res.write('<HTML><HEAD><TITLE>Error</TITLE></HEAD><BODY>Bad login</BODY></HTML>');
  687.             break;
  688.         case "/favicon.ico":
  689.             break;
  690.         case "/api":
  691.             if(url.query.login && url.query.password && url.query.target){
  692.                 res.write('<HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>');
  693.                 var unFollowDelay = url.query.unFollowDelay || 86400;
  694.                 var mode = url.query.mode || 1;
  695.                 var action = url.query.action || 50;
  696.                 var per = url.query.per || 3600;
  697.                 socialmnst.login(url.query.login, url.query.password, url.query.target, 'start', unFollowDelay, mode, action, per);
  698.             } else {
  699.                 res.write('<HTML><HEAD><TITLE>Error</TITLE></HEAD><BODY>Bad login</BODY></HTML>');
  700.             }
  701.             break;
  702.     }
  703.     res.end();
  704. }
  705. http.createServer(userConnected).listen(conf.port);
  706. console.log("Сервер запущен");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement