Реализация парсера инстаграм профилей node.js

237
02 мая 2019, 11:50

Пишу парсер инстаграма с использованием его приватного апи, бэкэнд часть по сути уже готова и работает, хотел задать вопрос по поводу того, как связать бэкэнд и клиент. Код следующий и асинхронный:

'use strict';
var InstagramPrivateAPI = {};
InstagramPrivateAPI = {};
InstagramPrivateAPI.V1 = require(__dirname + '/client/v1');
InstagramPrivateAPI.Helpers = require(__dirname + '/helpers');
var acc = require(__dirname + "/client/v1/account");
var med = require(__dirname + "/client/v1/media")
var Promise = require('../bluebird');
var _ = require('../lodash/');
module.exports = InstagramPrivateAPI;
var Client = require('instagram-private-api').V1;
var device = new Client.Device('instagram');
function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min)) + min;
}
function chunkArray(arr, chunk) {
  var i, j, tmp = [];
  for (i = 0, j = arr.length; i < j; i += chunk) {
    tmp.push(arr.slice(i, i + chunk));
  }
  return tmp;
}

var fs = require('fs');
var proxyArray = fs.readFileSync('proxy.txt').toString().split("\n");
var usernamesArraySource = fs.readFileSync('usernames.txt').toString().split("\n");
var usernamesArraySliced = chunkArray(usernamesArraySource, 50)

//var proxy = "http://" + proxyArray[getRandomInt(0,proxyArray.length)]
//var username = usernamesArray[getRandomInt(0,usernamesArray.length)]
//console.log(proxy)
//console.log(username)
//Client.Request.setProxy(proxy);
//массив json cookies
var arrCookies = [];
fs.readdirSync(__dirname + '/cookies').forEach(file => {
  arrCookies.push(file);
})
var index = arrCookies.indexOf('.DS_Store');
if (index > -1) {
  arrCookies.splice(index, 1);
}

   // console.log("Работаем с аккаунтом: " + arrCookies[0])
    //var storage = new Client.CookieFileStorage(__dirname + '/cookies/' + arrCookies[0]);
    //var proxy = "http://" + proxyArray[getRandomInt(0,proxyArray.length)];
    //Client.Request.setProxy(proxy);

Promise.each(usernamesArraySliced,function(usernamesArray) {
    var p = getRandomInt(0, arrCookies.length)
    var storage = new Client.CookieFileStorage(__dirname + '/cookies/' + arrCookies[p]);
    arrCookies.splice(p, 1)
Client.Session.create(device, storage)
.then(function(session) {
    var proxy = "http://" + proxyArray[getRandomInt(0,proxyArray.length)];
    session.proxyUrl = proxy;
    Promise.each(usernamesArray, function(username) {
acc.searchForUser(session, username)
 //поиск id пользователя
    .then(function(profile) {
        return profile.id
    })
    .then(function(someId) {  //получение промиса lenta
        var feed = new Client.Feed.UserMedia(session, someId);
        var lenta = Promise.mapSeries(_.range(0, 1), function() {
            return feed.get();
        }).then(function(lenta) {
            return {id: someId, fd : lenta}
        })
        return lenta
    })
    .then(function(results) {  //обработка промиса и получение ленты пользователя
        // result should be Media[][]
        var media1 = _.flatten(results.fd);
        var urls1 = _.map(media1, function(medium) {
                //var arr1 = medium.params.images[0].url;
            var arr1 = []
            try {
                arr1 = medium.params.images[0].url
            } catch (err) {
                //console.log("lala")
            }
            return arr1;
            //console.log(medium.params.carouselMedia.images[0].url)
        })
        //console.log(urls1)
        return {id : results.id, linksNoCarousel : urls1, med : media1}
    })
    .then(function(res){
        var urls2 = _.map(res.med, function(medium) {
            var arr2 = []
            try {
                arr2 = medium.params.images[0][0].url
                //console.log(arr2)
            } catch (err) {
            }
            return arr2        
        })
        for (var i = 0; i < 5; i++) {
            if (typeof res.linksNoCarousel[i] == "undefined")
                res.linksNoCarousel[i] = urls2[i];
        }
        var arr3 = []
        for (var i = 0; i < 5; i++) {
            arr3[i] = res.linksNoCarousel[i]
        }
        return {id : res.id, links : arr3}
    })
    .then(function(mediaAndId) {
        acc.getById(session, mediaAndId.id)
            .then(function(account) {
                //console.log(account.params)
                let avatar = account.params.profilePicUrl;
                let username =  account.params.username;
                let fullName = account.params.fullName;
                let bio = account.params.biography;
                let media0 = mediaAndId.links[0];
                let media1 = mediaAndId.links[1];
                let media2 = mediaAndId.links[2];
                let media3 = mediaAndId.links[3];
                let media4 = mediaAndId.links[4];
                console.log(account.params.username)
                /*console.log(fullName);
                console.log(bio);
                console.log(media0);
                console.log(media1);
                console.log(media2);
                console.log(media3);
                console.log(media4);*/   
         })
})
})
})
})

Как я вижу реализацию: пользователь на клиента вставляет допустим 1000 юзернеймов инстаграма, дальше эти юзернеймы отправляются на сервер, проходит какое-то время и сервер отдает необходимую нам инфу, допустим аватарки профилей юзернеймов. Вопрос в следующем: как это организовать - возможно стоит внедрить базы данных в серверную часть node.js и там хранить ссылки на аватарки, которые спарсились, а затем уже из базы отдавать клиенту эти данные или возможно постепенно отдавать данные?

Хочу чтобы на каждой страничке клиента была информация о 200 профилях подряд, дальше был переход на следующую страничку (нумерация 1->2->3->4->5)

Возможно кто подскажет концептуально и если можно ссылки что посмотреть, почитать, с нодой работаю от силы третий день и много чего не знаю. Спасибо

READ ALSO
Открытое аккордеон меню

Открытое аккордеон меню

Есть меню на wordpress, использовал css menu walker для аккордеона, не могу понять как заставить родительский пункт меню быть открытым если открыта дочерняя...

212
Получить время с сервера времени с помощью JS (десктопное приложение nw.js) для проверки подлинности

Получить время с сервера времени с помощью JS (десктопное приложение nw.js) для проверки подлинности

Так уж случилось, что я написал годное приложение на nwjs и теперь требуется его защитить с каким-либо способом

208
Заменить адреса картинок на адреса со старого сайта

Заменить адреса картинок на адреса со старого сайта

Сайт переехал на новый домен, однако не все картинки перенеслись по новым адресамНужно переписать адреса утерянных картинок класса article_image...

169