└── instagram_likebot ├── settings.json ├── package.json └── instagram_likebot.js /instagram_likebot/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "smart_like_mode": true, 3 | "sleep_delay": 2200, 4 | "like_depth_per_user": 5, 5 | "instagram_account_username": "", 6 | "instagram_account_password": "", 7 | "instagram_accounts_to_be_liked": ["xenia_sobchak", "volochkova_art"] 8 | } 9 | -------------------------------------------------------------------------------- /instagram_likebot/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Instagram_likebot", 3 | "version": "1.0.0", 4 | "description": "Instagram like bot", 5 | "main": "none", 6 | "dependencies": { 7 | "promise": "", 8 | "log4js": "", 9 | "phantomjs": "^1.9.19", 10 | "selenium-webdriver": "^2.48.2" 11 | }, 12 | "devDependencies": {}, 13 | "scripts": { 14 | }, 15 | "author": "Alexey K", 16 | "license": "" 17 | } 18 | -------------------------------------------------------------------------------- /instagram_likebot/instagram_likebot.js: -------------------------------------------------------------------------------- 1 | // Instagram like bot will help you like any accounts automatically. 2 | // 3 | // Installation: npm install 4 | // edit user-specific variables in settings.json 5 | // node instagram_likebot.js 6 | // 7 | var webdriver = require('selenium-webdriver'), 8 | by = webdriver.By, 9 | Promise = require('promise'), 10 | settings = require('./settings.json'); 11 | 12 | var log4js = require('log4js'); 13 | log4js.loadAppender('file'); 14 | log4js.addAppender(log4js.appenders.file('instabot.log'), 'instabot'); 15 | var logger = log4js.getLogger('instabot'); 16 | logger.setLevel('DEBUG'); 17 | 18 | var xpath_first_photo = '//header/../div/div/div[1]/a[1]'; 19 | var xpath_like_class = '//div[@id="fb-root"]/following-sibling::div[1]/div/div/following-sibling::div[1]/div/article/div[2]/section[2]/a/span'; 20 | var xpath_like_button = '//div[@id="fb-root"]/following-sibling::div[1]/div/div/following-sibling::div[1]/div/article/div[2]/section[2]/a'; 21 | var xpath_nextprev_buttons = '//div[@id="fb-root"]/following-sibling::div[1]/div/div/div/div/*'; 22 | 23 | var browser = new webdriver 24 | .Builder() 25 | .withCapabilities(webdriver.Capabilities.chrome()) 26 | .build(); 27 | 28 | browser.manage().window().setSize(1024, 700); 29 | browser.get('https://www.instagram.com/accounts/login/'); 30 | browser.sleep(settings.sleep_delay); 31 | browser.findElement(by.name('username')).sendKeys(settings.instagram_account_username); 32 | browser.findElement(by.name('password')).sendKeys(settings.instagram_account_password); 33 | browser.findElement(by.xpath('//button')).click(); 34 | browser.sleep(settings.sleep_delay).then(function() { 35 | like_by_nickname(0); 36 | }); 37 | 38 | function like_by_nickname(indexNickname) { 39 | if (indexNickname >= settings.instagram_accounts_to_be_liked.length) { 40 | logger.info('Everything is done. Finishing...'); 41 | browser.quit(); 42 | return; 43 | } 44 | var promise = new Promise(function (resolve, reject) { 45 | browser.sleep(settings.sleep_delay); 46 | logger.info('Doing likes for: ' + settings.instagram_accounts_to_be_liked[indexNickname]); 47 | browser.get('https://instagram.com/' + settings.instagram_accounts_to_be_liked[indexNickname]); 48 | browser.sleep(settings.sleep_delay); 49 | browser.findElement(by.xpath(xpath_first_photo)).click().then(function () { 50 | like(resolve, 0, settings.like_depth_per_user); 51 | }); 52 | }); 53 | promise.then(function() { 54 | indexNickname++; 55 | like_by_nickname(indexNickname); 56 | }); 57 | }; 58 | 59 | function like(resolve, index, max_likes) { 60 | browser.getCurrentUrl().then(function(url) { 61 | logger.debug('Current url: ' + url); 62 | browser.sleep(settings.sleep_delay); 63 | 64 | browser.findElement(by.xpath(xpath_like_class)).getAttribute('class').then(function(classname) { 65 | logger.debug('CSS Classname: ' + classname); 66 | if (settings.smart_like_mode && (classname.indexOf('whiteoutSpriteHeartFull') > 0)) { 67 | logger.info('Already liked. Stopping...'); 68 | resolve(); 69 | return; 70 | } else { 71 | if (classname.indexOf('whiteoutSpriteHeartOpen') > 0) { 72 | browser.findElement(by.xpath(xpath_like_button)).click(); 73 | browser.sleep(settings.sleep_delay); 74 | }; 75 | // Analyzing "Next" button availability 76 | browser.findElements(by.xpath(xpath_nextprev_buttons)).then(function(buttons) { 77 | logger.debug('Buttons: ' + buttons.length + ', Photo Index: ' + index); 78 | if (((index == 0) && (buttons.length == 1)) || (buttons.length == 2)) { 79 | buttons[buttons.length - 1].click().then(function() { 80 | // if we exceed maximum likes depth, stop like this current user. 81 | index++; 82 | if (index == max_likes) { 83 | resolve(); 84 | return; 85 | } 86 | like(resolve, index, max_likes); 87 | }); 88 | } else { 89 | // "Next" button doesn't exist. Stop like this current user. 90 | logger.info('Next button does not exist. Stopping...'); 91 | resolve(); 92 | return; 93 | } 94 | }); 95 | } 96 | }); 97 | }); 98 | } 99 | --------------------------------------------------------------------------------