Подтвердить что ты не робот

Как встраивать временную шкалу твиттера без ретвитов?

Я внедряю временную шкалу твиттера на свой сайт. Однако мои ретвиты отображаются там, и я не хочу, чтобы они были.

Есть ли простой способ отключить их? Кажется, я не могу найти

Мой поисковый запрос from:myaccount. Я также пробовал from:myaccount -RT, не повезло. Я могу скрыть ретвиты с помощью виджета поиска, но твиты старше недели не отображаются, что неприемлемо в моем случае.

Скрытие твитов с помощью некоторой магии CSS также будет в порядке. Мне удалось выяснить, что вручную вставлять

div.timeline-Tweet--isRetweet {
  display: none !important;
}

в CSS для встроенного HTML делает трюк, но я не могу сделать это программно.

4b9b3361

Ответ 1

Адаптация из моих комментариев

Чтобы пойти с инъекцией взломанного стиля, просто поместите следующий код в тег script. Это помещает тег https://platform.twitter.com/widgets.js script на вашу страницу, чтобы он больше не нуждался в нем как отдельный тег script.

// widgets script loading taken from Twitter
window.twttr = (function (d, s, id) {
    var js, fjs = d.getElementsByTagName(s)[0],
        t = window.twttr || {};
    if (d.getElementById(id)) return;
    js = d.createElement(s);
    js.id = id;
    js.src = "https://platform.twitter.com/widgets.js";
    fjs.parentNode.insertBefore(js, fjs);

    t._e = [];
    t.ready = function (f) {
        t._e.push(f);
    };

    return t;
}(document, "script", "twitter-wjs"));

twttr.ready(function (twttr) {
    twttr.events.bind("rendered", function (event) {
        var widgetFrame = event.target;
        var retweets = widgetFrame.contentDocument.querySelectorAll('div.timeline-Tweet--isRetweet');
        retweets.forEach(function (node) {
            if (node.parentNode) { // (in)sanity check
                node.parentNode.style = 'display: none;' // hide entire parent li tag
            }
        })
    });
});

Замечание об этом

Мы берем родительский node, так как каждый div.timeline-Tweet--isRetweet находится в теге li, который дает вам границу, поэтому вы попадаете в какую-то странную двойную границу слева после скрытых ретвитов. Я думаю, что нет способа добраться до родителя с помощью селекторов CSS, поэтому мы должны сделать это с помощью кода.

Другое замечание

После взлома сильно зависит от того, как структурировано содержание временных графиков, и те могут измениться без уведомления из Twitter, поэтому вы рискуете здесь, что однажды вы проснетесь с тобой, покажите свои брюки и повторите попытку на временной шкале;)


Обновление

ok здесь v2, которые прослушивают обновления на ol... но после его написания я начинаю понимать чувства Франкенштейна;)

window.twttr = (function (d, s, id) {
    var js, fjs = d.getElementsByTagName(s)[0],
        t = window.twttr || {};
    if (d.getElementById(id)) return;
    js = d.createElement(s);
    js.id = id;
    js.src = "https://platform.twitter.com/widgets.js";
    fjs.parentNode.insertBefore(js, fjs);

    t._e = [];
    t.ready = function (f) {
        t._e.push(f);
    };

    return t;
}(document, "script", "twitter-wjs"));

twttr.ready(function (twttr) {
    twttr.events.bind("rendered", function (event) {
        var frameDoc = event.target.contentDocument;

        // initially hide retweets
        var hideRetweets = function () {
            var retweets = frameDoc.querySelectorAll('div.timeline-Tweet--isRetweet');
            retweets.forEach(function (node) {
                if (node.parentNode && node.parentNode.style !== 'display: none;') { // (in)sanity check
                    node.parentNode.style = 'display: none;' // hide entire parent li tag
                }
            });
        };

        hideRetweets();

        // Twitter widget emitts no events on updates so we hook up ourselves to ol element to listen on it for additions of children
        var watcher = new MutationObserver(function (mutations) {
            // check whether new tweets arrived
            var hasNewTweets = mutations.some(function (mutation) {
                return mutation.addedNodes.length > 0;
            });
            if (hasNewTweets) {
                hideRetweets(); // rescan all tweets as it is easier
            }
        });
        watcher.observe(frameDoc.querySelector('ol.timeline-TweetList'), { childList: true });
    });
});

Ответ 2

Это довольно легко. Мы будем использовать, например, caitp88 учетную запись для демонстрации вы можете последовать за ней, если хотите, тo)

Как вы можете видеть в своем профиле, последний твит - это Retweet введите описание изображения здесь

Но мы не хотим ретвитов, правильно?

Итак, переходим к форме поиска и вводим from:caitp88 -RT введите описание изображения здесь

Затем мы создаем вложение из этого поиска введите описание изображения здесь Откроется окно конфигурации виджета, просто нажмите создать виджет

введите описание изображения здесь

Виджет не будет содержать ретвитов
В бою: введите описание изображения здесь

Не забудьте изменить caitp88 на свой собственный твиттер

И ЗАМЕЧАНИЕ, ЭТО ОФИЦИАЛЬНОЕ, ЮРИДИЧЕСКОЕ РЕШЕНИЕ

Ответ 3

Я думаю, что "из: myaccount -RT" должен работать, как уже упоминал Медет Тлекабилулы. Есть некоторые вещи, которые я хочу добавить:

  • -RT запрос будет по-прежнему включать цитируемые ретвиты, поскольку он больше похож на ваш собственный твит, чем RT.
  • Если вам нужен полный контроль над твитами, вы можете попробовать TwitterFetcher, который возвращает твиты как данные JSON вместо встроенного iframe.

Ответ 4

Здесь можно сделать это с помощью CSS.

Виджет временной шкалы Twitter создает IFrame, в который я вставляю тег стиля, содержащий ваш CSS. Это должно произойти после загрузки виджета.

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

// initialisation copied from Twitter API documentation
window.twttr = (function(d, s, id) {
    var js, fjs = d.getElementsByTagName(s)[0],
        t = window.twttr || {};
    if (d.getElementById(id)) return;
    js = d.createElement(s);
    js.id = id;
    js.src = "https://platform.twitter.com/widgets.js";
    fjs.parentNode.insertBefore(js, fjs);

    t._e = [];
    t.ready = function(f) {
        t._e.push(f);
    };

    return t;
}(document, "script", "twitter-wjs"));

twttr.ready(function(twttr) {
    twttr.events.bind("rendered", function(event) {
        var widgetIframe = event.target;

        var style = widgetIframe.contentDocument.createElement("style");
        style.innerHTML = "div.timeline-Tweet--isRetweet { display: none}";

        widgetIframe.contentDocument.head.appendChild(style);
    });
});

Здесь скрипка с побочным сравнением фида с использованием этой техники: https://jsfiddle.net/cLc84Lrs/2/

Ответ 5

У вас есть несколько ответов выше о том, как удалить ретвиты, но проблема с историческими данными заключается в том, что твиттер не выдаёт данные более чем за неделю или около того в исторических данных. (связанный с вопросом stackoverflow: fooobar.com/info/230006/...)

Ответ на это - это платные услуги, которые предоставляют исторические данные (с некоторыми редкими бесплатными опциями). Пример этих служб: Gnip (с историческим twitter api) или Followthehashtag (там вы можете делать 1 бесплатный поиск в день, который дает до 500 твитов с 2006 года, но не уверен в поддержке api.)