Anton Reshetov

FRONT END DEVELOPER / WEB DESIGNER / WORDPRESS

Instagram парсер на основе YQL

Предисловие

Недавно по работе у меня возникла задача проверить есть ли наличие миниатюры высокого разрешения у нужного видео на YouTube.

Введу политики общего происхождения Same-origin policy сделать кроссдоменный запрос на JavaScript можно только в том случае, когда на домен, на который происходит запрос, разрешил данное действие.

Поэтому для решения задачи был выбран PHP. В итоге задача была решена, но у нее был один недостаток, это не совсем быстрая работа и лишняя нагрузка на сервер.

Я продолжил поиски вариантов решения задач на JavaScript и наткнулся на Yahoo Query Language.

YQL позволяет производить те самые кроссдоменные запросы. Плюс фишка - SQL подобный синтаксис.

В итоге я сделал проверку на JS.

По делу

Я решил переписать PHP парсер для Инстаграм на JS который я использую в проектах для своих клиентов.

В результате получился вот этот скрипт, который Вы можете скачать на GitHub.

function instaScraper(element, username, thumbnails) {
    if (!username) {
        throw new Error('Username is required');
    }
    if (!element) {
        throw new Error('DOM element not selected');
    }
    var instaURL = 'http://instagram.com/' + username;
    var instaPageLink = 'http://instagram.com/p/';
    var thumb = thumbnails || 'display_src';

    // YQL query
    $.getJSON(
        'http://query.yahooapis.com/v1/public/yql?callback=?',
        {
            q: "select * from html where url='" + instaURL + "' and xpath='*'",
            format: 'json'
        },
        function (data) {
            if (data.query.results != null) {
                var queryData = data.query.results.html.body.script["0"].content.replace('window._sharedData = ', '').replace(';', '');
                queryData = $.parseJSON(queryData);
                var item = queryData.entry_data.ProfilePage["0"].user.media.nodes;
                for (var i = 0; i < item.length; i++) {
                    var imgURL = item[i][thumb];
                    var likes = item[i].likes.count;
                    var link = instaPageLink + item[i].code;
                    // Basic bootstrap markup
                    $(element).append('' +
                        '<div class="col-xs-4">' +
                        '<a href="' + link + '">' +
                        '<img src="' + imgURL + '" alt="" class="img-responsive">' +
                        '<p class="text-center">Likes: ' + likes + '</p>' +
                        '</a>' +
                        '</div>');
                }
            } else {
                throw new Error('Non-existing or private account');
            }
        })
}

Использование

instaScraper(element, username[, thumbnails]);