Я пытаюсь запрашивать сообщения из Instagram, предоставляя хэштег и временной диапазон (начиная с и до дат). Я использую recent tags endpoint.Записи в Instagram от hashtag и временного диапазона
https://api.instagram.com/v1/tags/{tag-name}/media/recent?access_token=ACCESS-TOKEN
Мой код написан на Node.js с помощью instagram-node
библиотеки (см инлайн комментарии):
// Require the config file
var config = require('../config.js');
// Require and intialize the instagram instance
var ig = require('instagram-node').instagram();
// Set the access token
ig.use({ access_token: config.instagram.access_token });
// We export this function for public use
// hashtag: the hashtag to search for
// minDate: the since date
// maxDate: the until date
// callback: the callback function (err, posts)
module.exports = function (hashtag, minDate, maxDate, callback) {
// Create the posts array (will be concated with new posts from pagination responses)
var posts = [];
// Convert the date objects into timestamps (seconds)
var sinceTime = Math.floor(minDate.getTime()/1000);
var untilTime = Math.floor(maxDate.getTime()/1000);
// Fetch the IG posts page by page
ig.tag_media_recent(hashtag, { count: 50 }, function fetchPosts(err, medias, pagination, remaining, limit) {
// Handle error
if (err) {
return callback(err);
}
// Manually filter by time
var filteredByTime = medias.filter(function (currentPost) {
// Convert the created_time string into number (seconds timestamp)
var createdTime = +currentPost.created_time;
// Check if it's after since date and before until date
return createdTime >= sinceTime && createdTime <= untilTime;
});
// Get the last post on this page
var lastPost = medias[medias.length - 1] || {};
// ...and its timestamp
var lastPostTimeStamp = +(lastPost.created_time || -1);
// ...and its timestamp date object
var lastPostDate = new Date(lastPostTimeStamp * 1000);
// Concat the new [filtered] posts to the big array
posts = posts.concat(filteredByTime);
// Show some output
console.log('found ' + filteredByTime.length + ' new items total: ' + posts.length, lastPostDate);
// Check if the last post is BEFORE until date and there are no new posts in the provided range
if (filteredByTime.length === 0 && lastPostTimeStamp <= untilTime) {
// ...if so, we can callback!
return callback(null, posts);
}
// Navigate to the next page
pagination.next(fetchPosts);
});
};
Начнётся выборки посты с самым последним в в последнюю очередь, и вручную отфильтруйте created_time
. Это работает, но это очень неэффективно, потому что, если мы хотим, например, получать сообщения от года назад, мы должны итерации страниц до тех пор, и это будет использовать множество запросов (вероятно, более 5 к/час, который является пределом скорости).
Есть ли лучший способ сделать этот запрос? Как получить сообщения Instagram, предоставив хэштег и временной диапазон?
Не могли бы вы просто увеличить 'count' захватить значительно большее количество фотографии за раз, чтобы уменьшить * количество * почтовых выборок? Конечно, они были бы намного больше, но что-то вроде этого было бы полезно? –
@NickZ Мы пытались это сделать (я отлаживал это OP), и мы получили максимум 33 элемента/запроса. Итак, 'count' на самом деле не помогает ... :-(Любые другие идеи? Я рад предоставить 50 баллов тому, кто дает хороший ответ.: D –
Вы изучали использование MIN_TAG_ID и MAX_TAG_ID для итерация быстро к намеченной дате? Я могу представить себе метод, который запрашивал бы только одно сообщение за раз, чтобы найти MAX_TAG_ID, который находится непосредственно перед датой. – sbozzie