Javascript 我如何在Twitter上更改推文中的文本?

Javascript 我如何在Twitter上更改推文中的文本?,javascript,twitter,replace,greasemonkey,Javascript,Twitter,Replace,Greasemonkey,我关注的一个推特账户在不同时区的军事时间发布推特。我正在尝试使用javascript和Firefox中的GreaseMonkey插件将文本更改为适当的时区和固定时间。问题是我似乎无法让它工作 我跟踪的帐户: 我使用的脚本: // ==UserScript== // @name PSO2 Emg Bot Script // @namespace Twitter // @description Convert time to EST // @include https:/

我关注的一个推特账户在不同时区的军事时间发布推特。我正在尝试使用javascript和Firefox中的GreaseMonkey插件将文本更改为适当的时区和固定时间。问题是我似乎无法让它工作

我跟踪的帐户:

我使用的脚本:

// ==UserScript==
// @name        PSO2 Emg Bot Script
// @namespace   Twitter
// @description Convert time to EST
// @include     https://twitter.com/*
// @version     1
// ==/UserScript==

function replaceText(){
var theDiv = document.getElementsByClassName("js-tweet-text");
var theText = theDiv .innerHTML;

// Replace words
theText = theText.replace("4:00~4:30", "2:00 P.M. ~ 2:30 P.M.");
theText = theText.replace("14:00~14:30", "12:00 A.M. ~ 12:30 A.M.");
theText = theText.replace("15:00~15:30", "1:00 A.M. ~ 1:30 A.M.");
theText = theText.replace("16:00~16:30", "2:00 A.M. ~ 2:30 A.M.");

theDiv.innerHTML = theText;
}
目前它还不完整,因为我只需要在包含脚本搜索的所有时间之前让它工作。如果有人能告诉我我做错了什么以及如何改正,我将不胜感激。

  • 您已经定义了一个函数,
    function replaceText()
    ,但是 脚本中没有调用该函数的内容,因此没有 执行
  • 请注意,div实际上将包含一个div数组,因此不能通过这种方式设置或设置它的innerHTML
  • 在您提到的twitter页面中,时间由一个字符分隔,该字符不是~,而是屏幕字体无法显示的字符。使用“复制+粘贴”来正确获取该信息
  • 第11行还有一个语法错误,在
    theDiv.innerHTML中留下了一个空格
Twitter加载了jQuery,因此在您的情况下,使用jQuery可能比使用vanilla JS更容易

//...
// ==/UserScript==

var $ = unsafeWindow.$;
var theDivs = $(".js-tweet-text");

theDivs.each(function(){
    var theText = $(this).text();

    theText = theText.replace("7:00~7:30", "7:00 P.M. ~ 7:30 P.M.");
    //other replacements you want to make.
    //consider using a regular expression instead of one line for each hour.
    $(this).text(theText);
});
有几件事:

  • tweet是通过AJAX添加的,因此您需要使用AJAX感知脚本。下面,我将演示如何使用
  • 不要使用
    innerHTML
    。它会破坏一切(再加上速度较慢)。使用或“DOM技术”(如下所示)
  • 使用regex获取时间,这样就不需要大量不同的
    .replace()
    语句
  • 总而言之,这里是一个完整的工作脚本:

    // ==UserScript==
    // @name        _PSO2 Emg Bot Script
    // @namespace   Twitter
    // @description Convert time to EST
    // @include     https://twitter.com/*
    // @require     http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
    // @require     https://gist.github.com/raw/2625891/waitForKeyElements.js
    // @grant       GM_addStyle
    // ==/UserScript==
    /*- The @grant directive is needed to work around a design change
        introduced in GM 1.0.   It restores the sandbox.
    */
    
    waitForKeyElements ("p.js-tweet-text", ChangeSpecialTimeStrs);
    
    function ChangeSpecialTimeStrs (jNode) {
        var node    = jNode[0];
    
        //-- Search only in the first-level text nodes of this paragraph.
        for (var K = 0, numC = node.childNodes.length;  K < numC;  ++K) {
            var childNode = node.childNodes[K];
            if (childNode.nodeType === Node.TEXT_NODE) {
                if (childNode.nodeValue.length > 8)  {
                    //-- Anything shorter can't have our kind of string.
                    childNode.nodeValue  = childNode.nodeValue.replace (
                        /*-- This matches strings like: "5:00~15:30"
                            Where "~" may be unicode FF5E
                        */
                        /\b(\d{1,2}):(\d{2})(?:~|\uFF5E)(\d{1,2}):(\d{2})\b/gi,
                        shiftHourStr
                    );
                }
            }
        }
    }
    
    function shiftHourStr (
        matchedStr,                 //- Housekeeping supplied by .replace()
        hour1Str, minute1Str,       //- Payload vals from () groups
        hour2Str, minute2Str,       //- Payload vals from () groups
        matchOffset, totalString    //- Housekeeping supplied by .replace()
    ) {
        //-- Return a string with a format like: "12:00 A.M. ~ 12:30 A.M."
        const tzOffsetHours = 10;
        var newHr1Arry      = getHourOffset (hour1Str, tzOffsetHours);
        var newHr2Arry      = getHourOffset (hour2Str, tzOffsetHours);
        var outputStr       = newHr1Arry[0]     //-- Hour value
                            + ":" + minute1Str
                            + newHr1Arry[1]     //-- AM or PM
                            + " ~ "
                            + newHr2Arry[0]     //-- Hour value
                            + ":" + minute2Str
                            + newHr2Arry[1]     //-- AM or PM
                            ;
        return outputStr;
    };
    
    function getHourOffset (hourVal, hoursOffset) {
        var amPmStr     = "A.M.";
        var newHourVal  = parseInt (hourVal, 10) + hoursOffset;
    
        if (newHourVal > 23) {
            newHourVal -= 24;
        }
        if (newHourVal >= 12) {
            newHourVal -= 12;
            amPmStr     = "P.M.";
        }
        if (newHourVal == 0) {
            newHourVal  = 12;
            amPmStr     = "A.M.";
        }
        return [newHourVal, " " + amPmStr];
    }
    
    /==UserScript==
    //@name\u PSO2 Emg Bot脚本
    //@namespace-Twitter
    //@description将时间转换为EST
    //@包括https://twitter.com/*
    //@需要http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
    //@需要https://gist.github.com/raw/2625891/waitForKeyElements.js
    //@grant GM_addStyle
    //==/UserScript==
    /*-需要@grant指令来解决设计变更
    在GM 1.0中引入。它会恢复沙箱。
    */
    WaitForkEyements(“p.js-tweet-text”,ChangeSpecialTimesTR);
    函数更改专用项TRS(jNode){
    var node=jNode[0];
    //--仅在本段落的第一级文本节点中搜索。
    对于(var K=0,numC=node.childNodes.length;K8){
    //--短一点的都不能有我们的那种线。
    childNode.nodeValue=childNode.nodeValue.replace(
    /*--这匹配字符串,如:“5:00~15:30”
    其中“~”可以是unicode FF5E
    */
    /\b(\d{1,2}):(\d{2})(?:~\uFF5E)(\d{1,2}):(\d{2})\b/gi,
    移位器
    );
    }
    }
    }
    }
    函数移位器(
    matchedStr,//-内务管理由.replace()提供
    小时1STR,分钟1STR,//-来自()组的有效负载VAL
    小时2STR,分钟2STR,//-来自()组的有效负载VAL
    matchOffset,totalString/-内务管理由.replace()提供
    ) {
    //--返回一个字符串,格式如下:“12:00 a.M.~12:30 a.M.”
    常数Tzoffethours=10;
    var newHr1Arry=gethourofset(hour1Str,tzoffethours);
    var newHr2Arry=gethourofset(hour2Str,tzoffethours);
    var outputStr=newHr1Arry[0]/--小时值
    +“:”+分钟1STR
    +新HR1警报[1]/--AM或PM
    + " ~ "
    +newHr2Arry[0]/--小时值
    +“:”+minute2Str
    +newHr2Arry[1]/--AM或PM
    ;
    返回outputStr;
    };
    函数gethourofset(hourVal、hoursfset){
    var amPmStr=“A.M.”;
    var newHourVal=parseInt(hourVal,10)+hourscoffset;
    如果(newHourVal>23){
    newHourVal-=24;
    }
    如果(newHourVal>=12){
    newHourVal-=12;
    amPmStr=“P.M.”;
    }
    如果(newHourVal==0){
    newHourVal=12;
    amPmStr=“A.M.”;
    }
    返回[newHourVal,“+amPmStr];
    }
    
    “军事时间”?你是说正常时间吗?你能详细说明一下这一点吗:在你提到的twitter页面中,时间由一个字符分隔,这个字符不是~,而是屏幕字体显示能力之外的东西。使用“复制+粘贴”来正确获取该信息。因为我复制并粘贴了原始脚本中的时间,这让我相信浏览器会自动转换角色。此外,您提供的脚本在greasemonkey中似乎不起作用。实际上,无需担心。我只需要重新安装脚本。非常感谢你。