2017-02-22 62 views
23

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

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

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

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

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

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

+1

Доля коды, который впрыскивает стиль, может быть, есть некоторая очевидная ошибка. Хакерный подход с введением стиля работал для меня с этой маленькой мерзостью: 'document.querySelector ('# twitter-widget-0'). ContentDocument.querySelectorAll ('div.timeline-Tweet - isRetweet'). ForEach (node ​​= > node.style = 'display: none;'); ' Предполагая, что временная шкала iframe имеет идентификатор' # twitter-widget-0'. Можно входить в кишки iframe, временные рамки iframe считаются как из одного домена. Во-вторых, я не знаю, разрешают ли лицензии виджетов Twitter для таких манипуляций. – gaa

+0

Привет, спасибо за это! У меня действительно не было никакого кода, так как я понятия не имею о JS. Сейчас я пытаюсь, и это не работает, даже если идентификатор совпадает с вашим. Как мне вставить это? Я использовал '' – Guido

+0

Кроме того, если вы опубликуете это как рабочий ответ, я бы определенно его принял. – Guido

ответ

4

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

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

// 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 
      } 
     }) 
    }); 
}); 

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

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

Еще одно замечание

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


Update

нормально здесь v2, прослушивающие обновления s на 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 }); 
    }); 
}); 
+1

Это не обрабатывает новые ретвиты после того, как виджет настроен (я предполагаю, что он показывает новые твиты), это почему я пошел с инъекцией CSS в свой ответ. – Bewusstsein

+0

Вы правы! Я думал об этом изначально и почему-то не замечал этого в конце ... Мы могли бы дополнительно подключить 'MutationObserver' к' ol' в фрейме и установить прослушивание изменений 'childList', а затем повторно выполнить скрытие, но я думаю, что вытащить эти дополнительные границы таким образом поднимаются так, как он взломан к силе двух;) попробует просто проверить, как это плохо получается;] – gaa

+0

Возможно, для этого есть API-интерфейс Twitter API, но на самом деле это то, что CSS хорошо , не нужно перекомплементировать :) – Bewusstsein

7

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

Как вы можете видеть в своем профиле, последний твит является Retweet enter image description here

Но дон «Не хочу ретвитов, не так ли?

Так мы идем искать форму и тип from:caitp88 -RT enter image description here

Затем мы создаем встраивании из этого поиска enter image description here виджет открывает окно настроек, просто нажмите на создать виджет

enter image description here

Виджет не содержит ретвитов
В действии: enter image description here

Не забудьте изменить caitp88 на свою твиттер ручку

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

+0

Извините, просто отредактировал этот вопрос. Я думал, что упомянул, что пытался, и это не работает для меня, потому что твиты старше недели не показываются. Любой способ обойти это? – Guido

+0

@Guido нет другого варианта, _tweets старше недели не отображается_, возможно, у вашей учетной записи нет новых твитов, в любом случае попробуйте разные учетные записи, чтобы убедиться, что 'div.timeline-Tweet - isRetweet' не может использоваться на iframe –

+0

В моей учетной записи нет новых твитов. Мы редко чирикаем, но мы хотим, чтобы наши полные сроки на нашем сайте. Мы можем сделать это через список твиттеров, но показывая ретвиты. Думаю, я СОЛ? :) – Guido

4

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

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

Вот как это сделать, используя свой 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/

1

У вас есть несколько ответов выше о том, как удалить ретвиты, но проблема на исторических данных, что твиттер не выдавайте данные более чем за неделю или около того в исторических данных. (связанный с вопросом stackoverflow: Stackoverflow: Getting historical data from twitter)

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

 Смежные вопросы

  • Нет связанных вопросов^_^