Доброго времени суток, пишу парсер инстаграма с использованием его приватного апи, бэкэнд часть по сути уже готова и работает, хотел задать вопрос по поводу того, как связать бэкэнд и клиент. Код следующий и асинхронный:
'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)
Возможно кто подскажет концептуально и если можно ссылки что посмотреть, почитать, с нодой работаю от силы третий день и много чего не знаю. Спасибо