1

私がフォローしているこの 1 つの Twitter アカウントでは、別のタイム ゾーンの軍事時間にツイートを投稿しています。Firefox の GreaseMonkey アドオンで JavaScript を使用して、テキストを適切なタイムゾーンと通常の時間に変更しようとしています。問題は、それを機能させることができないように見えることです。

フォローしているアカウント: https ://twitter.com/pso2_emg_bot

私が使用したスクリプト:

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

スクリプトが検索するすべての時間を含める前に、それを機能させる必要があるだけなので、現時点では不完全です。誰かが私が間違っていたこととそれを修正する方法を教えてくれれば、とても感謝しています.

4

2 に答える 2

2
  • 関数 を定義しましたfunction replaceText()が、その関数を呼び出すスクリプトが何もないため、何も実行されません。
  • 実際には div の配列が含まれるため、このtheDiv方法で innerHTML を設定または設定することはできません。
  • あなたが言及したTwitterページでは、時間は〜ではなく、スクリーンフォントの表示能力の範囲外の文字で区切られています。コピーと貼り付けを使用して、正しく取得してください。
  • 11 行目にも構文エラーがあります。内部にスペースが残っています。theDiv .innerHTML;

Twitter には jQuery がロードされているため、通常の 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);
});
于 2012-12-31T00:09:32.457 に答える
1

いくつかのこと:

  1. ツイートはAJAXを介して追加されるため、AJAX対応のスクリプトを使用する必要があります。以下に、waitForKeyElements()ユーティリティを使用してこれを行う方法を示します。
  2. 使用しないでくださいinnerHTML。それは物事を破滅させます(そしてそれはより遅くなります)。jQueryまたは「DOMテクニック」を使用します(以下にも示されています)。
  3. 正規表現を使用して時間を取得し、何億もの異なる.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];
}
于 2012-12-31T00:57:35.490 に答える