如何在没有转推的情况下嵌入Twitter时间线?

时间:2017-02-22 15:05:16

标签: html search twitter embed

我正在将Twitter时间线嵌入我的网站。然而我的转推正在那里展示,我不希望他们这样做。

有没有简单的方法可以关闭它们?我好像找不到任何

我的搜索查询是MQSERVER。我也试过from:myaccount,没有运气。我可以使用搜索小部件隐藏转推,但未显示超过一周的推文,这在我的情况下是不可接受的。

通过一些CSS魔术隐藏推文也行。我设法找出手动插入

from:myaccount -RT
嵌入式HTML的CSS中的

可以解决问题,但我无法以编程方式进行操作。

5 个答案:

答案 0 :(得分:7)

这很容易。我们将使用例如caitp88帐户演示 如果你想要,你可以跟随她。

正如您在她的个人资料中所看到的,最新的推文是转推 enter image description here

但我们不想转推,对吧?

所以我们去搜索表单并输入X = X[:, None] enter image description here

然后我们从这个搜索创建一个嵌入 enter image description here 窗口小部件配置窗口打开,您只需单击创建窗口小部件

enter image description here

小部件不包含任何转发 在行动: enter image description here

不要忘记将from:caitp88 -RT更改为您自己的Twitter句柄

注意,这是正式的,法律解决方案

答案 1 :(得分:4)

我认为"来自:myaccount -RT"应该工作,正如Medet Tleukabiluly已经提到过的那样。我想添加一些东西:

  1. -RT查询仍会包含引用转发,因为它更像是您自己的推文而不是RT。
  2. 如果您想要完全控制推文,可以尝试TwitterFetcher,它会将推文作为JSON数据返回,而不是嵌入iframe。

答案 2 :(得分:4)

从我的评论中改编

要使用hacky样式注入,只需将以下代码放在脚本标记中即可。这会将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的通知,这些内容可能会发生变化,所以你冒这样的风险,有一天你会在你醒来的时候醒来并转发回你的时间线;)

<强>更新

好的,这是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 });
    });
});

答案 3 :(得分: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);
    });
});

以下是使用此技术对Feed进行并排比较的小提琴:https://jsfiddle.net/cLc84Lrs/2/

答案 4 :(得分:1)

上面有一些关于如何删除转推的答案,但历史数据的问题是,Twitter不会在历史数据中提供超过一周左右的数据。 (相关的stackoverflow问题:Stackoverflow: Getting historical data from twitter

答案是提供历史数据的付费服务(有一些罕见的免费选项)。这些服务的示例是Gnip(使用历史Twitter api)或Followthehashtag(在那里,您可以每天免费搜索一次,自2006年以来最多可提供500条推文但不确定api支持。)