1

Greasemonkey スクリプトは、次のスクリプトのName変数を別のサイトのメンバーのリストと比較し、Name一致しない場合はスクリプトの他の部分を実行できますか?

//alert(Name);
var postHistory = "http://"+regionSlice+".targetforum.com/board/search.php?do=process&searchuser="+Name+"&exactname=1&showposts=1";

var avatar = "http://othersite.com/forum/avatar/" +regionSlice+ "." + Name + ".png"; // creates an avatar

// Replace the old Avatar
$('.user_icon', this).attr('src', avatar);
$('.user_icon', this).wrap('<a href="' + postHistory + '" class="link"></a>');
$('.user_icon', this).attr('width', '80');
$('.user_icon', this).attr('height', '80');
$('.user_icon', this).attr('style', 'position:relative; TOP:7px');

Nameこのコードは、どのレコードとも一致しない場合に以下の部分を実行する場合に最適です。

var postHistory = "http://"+regionSlice+".targetforum.com/board/search.php?do=process&searchuser="+Name+"&exactname=1&showposts=1";
var avatar = "http://othersite.com/forum/avatar/" +regionSlice+ "." + Name + ".png"; // creates an avatar
var noAvatar = "http://other.com/forum/avatar/questionmark.png";

// Replace the old Avatar
    $('.user_icon', this).attr('src', noAvatar);
    $('.user_icon', this).wrap('<a href="' + postHistory + '" class="link"></a>');
    $('.user_icon', this).attr('width', '80');
    $('.user_icon', this).attr('height', '80');
    $('.user_icon', this).attr('style', 'position:relative; TOP:7px');

othersite.com/forum/members.php のメンバーリスト:

<?php
    $con = mysql_connect("host","user","pass");
    if (!$con)
    {
        die('Could not connect: ' . mysql_error());
    }
    mysql_select_db("database", $con);

    $result = mysql_query("SELECT username FROM users ORDER BY ID");

    echo "<table border='0'>
<tr>
<th>UserName</th>
</tr>";

    while($row = mysql_fetch_array($result))
    {
        echo "<tr>";
        echo "<td>" . $row['username'] . "</td>";
        echo "</tr>";
    }
        echo "</table>";

mysql_close($con);
?>

これがそのページの例です。この部分は 1 ページに 1 ~ 10 回表示Nameされるため、1 ~ 10 回チェックされます。「Vortexer」はその一例でName、下の 2 行はuser_icon.

<div id="edit4767039" style="padding:0px 0px 6px 0px">
  <a name="4767039">&nbsp;</a>

  <div class="forum_post post_frame" id="post4767039">
    <div class="post_hidden_message">
       Comment below rating threshold, click <a href="#">here</a> to show it.
    </div>
    <table>
    <tr>
      <td class="left" valign="top" id="currentPost">
        <div class="avatar_top">
          <div class="avatar" style="padding-top:10px;">

            <big>Vortexer</big>
            <a class="photo">

              <img class="user_icon" src="theme/img/unknown_icon.jpg"/>
              <span class="left_orb">??</span>
              <span class="right_orb"><img src="http://irrelevantserver.com/forum/ui/avatar_right_orb_blue.png" alt=""/></span>
            </a>
            <small>Senior Member</small>
          </div>
          <center>
          <a href="//articles/The_Code" target="_blank"><span class="sca_icon" style="align: center"><img src="http://irrelevantserver.com/images/community/community site/SCA_badge.png" alt="This user has accepted the code, click for more information"/></a></span>
          </center>
        </div>
      </td>
      <td class="right" valign="top">
        <table class="right_table">
        <tr>
          <td>
            <div class="message_header">
              <!-- status icon and date -->
              <span>1 Day Ago</span>
              <!-- / status icon and date -->
            </div>
            <div class="post_content" id="post_message_4767039">
              <p>This is forum post content</p>
            </div>
            <div class="message_footer">
              <div class="r_block">
                <span class="post_rating">
                <span class="rating_positive">+3</span>
                </span>
                <a href="ratepost.php?postid=4767039&vote=-1" rel="nofollow" class="vote_down_button">
                  <img src="http://irrelevantserver.com/forum/ui/thumbs_down.png" alt=""/>
                </a>
                <a href="ratepost.php?postid=4767039&vote=1" rel="nofollow" class="vote_up_button">
                  <img src="http://irrelevantserver.com/forum/ui/thumbs_up.png" alt=""/>
                </a>
                <a href="newreply.php?do=newreply&amp;p=4767039" class="quick-reply" rel="nofollow"><img src="http://irrelevantserver.com/forum/ui/message_quote_icon.png" alt="Reply With Quote"/></a>
                <a href="editpost.php?do=editpost&amp;p=4767039" name="vB::QuickEdit::4767039"><img src="http://irrelevantserver.com/forum/ui/edit_icon.png" alt="Edit/Delete Message" class="edit_button"/></a>
              </div>
            </div>
          </td>
        </tr>
        </table>
      </td>
    </tr>
    </table>
  </div>
</div>


名前は次のコードで取得されます。

// Replace everypost's avatar
$('.forum_post').each(function(index) {
    name = $('big', this).html();
    //alert($('big', this).html());
    var Name1 = name.replace("\<font ", "");
    var Name2 = Name1.replace("color\=\"\#c98f1a\"\>", "");
    var Name3 = Name2.replace("color=\"green\"\>", "");
    var Name4 = Name3.replace("color=\"red\"\>", "");
    var Name = Name4.replace("</font>", "");
4

1 に答える 1

1

はい、Name別の Web ページからスクレイピングしたコンテンツと比較できます。クロスドメインのように見えるため、GM_xmlhttpRequestこれを行うには を使用する必要があります。

members.phpの外観から、次のようなテーブルが返されます。

<table>
    <tr><th>UserName</th></tr>
    <tr><td>User A</td></tr>
    <tr><td>User B</td></tr>
    <tr><td>User C</td></tr>
    <tr><td>User D</td></tr>
</table>

何もありません。
(それ以外のものが返される場合、次のコードのセレクターを調整する必要があります。) jsFiddle でその HTML のモックアップを
作成しました。

この Greasemonkey スクリプトをインストールすると、ユーザー名が読み取られることがわかります。

// ==UserScript==
// @name        _Parse simple AJAX page scrape/fetch
// @include     http://stackoverflow.com/*
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @grant       GM_xmlhttpRequest
// ==/UserScript==

GM_xmlhttpRequest ( {
    method:     'GET',
    url:        'http://fiddle.jshell.net/TDcDV/show/',
    onload:     getUsernamesFromAjax
} );

function getUsernamesFromAjax (respObject) {
    var respDoc     = $(respObject.responseText);
    var userNameTDs = respDoc.find ("td");
    var userNames   = userNameTDs.map ( function () {
        return this.textContent;
    } ).get ();

    alert ("The usernames are: " + userNames);
}


(アラート、" The usernames are: User A,User B,User C,User D"。)



さて、Nameデータとの比較に関しては、問題は明確ではありません。

  1. どこNameから来ていますか?
  2. 複数のName値がありますか? もしそうなら、どの.user_iconノードがどのノードに関連していNameますか?

ページ全体へのリンクまたはペーストビン。


更新:
新しい情報に基づいて、スクリプトに実行させたいことは次のとおりです。

  1. アバターを「進行中」の画像 (「throbber」) に置き換えて、AJAX の結果を待っていることをユーザーに知らせます。
    (AJAX は数秒かかる場合があります。)

  2. メンバー リストの外部サイトへの AJAX 要求を起動します。

  3. AJAX がメンバー リストを返すと、次のようになります。

    1. メンバー リストの名前については、アバターを置き換えます。
    2. メンバー リストにない名前については、アバターを「アバターなし」の画像に置き換えます。


これを行う完全なスクリプトを 次に示します。
スクリプトをインストールし、jsbin.com/awaxap/1にアクセスして実際の動作を確認してください。

// ==UserScript==
// @name      _Replace avatars for matching names
// @include   http://jsbin.com/awaxap/*
// @include   http://YOUR_SERVER.COM/YOUR_PATH/*
// @require   http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @resource  waitImg  http://i.cdn.turner.com/money/.element/img/1.0/misc/throbber.gif
// @grant     GM_xmlhttpRequest
// @grant     GM_getResourceURL
// ==/UserScript==

//--- Replace avatars with an "In progress" image.
var waitImgSrc  = GM_getResourceURL ("waitImg");
$("div.forum_post div.avatar img.user_icon").attr ('src',  waitImgSrc);


//--- Fetch the member list.
GM_xmlhttpRequest ( {
    method:     'GET',
    url:        'http://fiddle.jshell.net/TDcDV/show/',
    onload:     changeUserIconsOfMembers
} );


//--- Replace avatars based on name match.
function changeUserIconsOfMembers (respObject) {
    var respDoc     = $(respObject.responseText);
    var userNameTDs = respDoc.find ("td");
    var userNames   = userNameTDs.map ( function () {
        return $.trim (this.textContent.toLowerCase () );
    } ).get ();

    //--- Replace every post's avatar.
    $('div.forum_post').each ( function (index) {
        //-- text() automatically strips out any <font> cruft, if present.
        var Name        = $('div.avatar big', this). text ();
        //-- Standardize name for comparison.
        Name            = $.trim (Name).toLowerCase ();

        var regionSlice = "";   // where's this come from?
        var postHistory = "http://" + regionSlice
                        + ".targetforum.com/board/search.php?do=process&searchuser="
                        + Name + "&exactname=1&showposts=1"
                        ;
        var avatar      = "http://othersite.com/forum/avatar/" + regionSlice
                        + "." + Name + ".png"
                        ; // creates an avatar

        avatar  = "http://i.stack.imgur.com/Nrzn7.jpg"; // Temp avatar upgrade. ;)

        //--- Was the username not found?
        if (userNames.indexOf (Name) === -1 ) {
            avatar      = "http://other.com/forum/avatar/questionmark.png";
            avatar  = "http://i.stack.imgur.com/BbOsC.gif"; // Temp avatar upgrade. ;)
        }

        //--- Replace the old Avatar and give it a link to history.
        var userIcon    = $('div.avatar img.user_icon', this);
        userIcon.attr ( {
            src:        avatar,
            width:      '80',
            height:     '80',
            style:      'position:relative; TOP:7px;'
        } );
        userIcon.wrap ('<a href="' + postHistory + '" class="link"></a>');
    } );
}


ユーザー「Vortexer」は見つかりませんが、「User B」は見つかります。

于 2012-09-24T13:57:54.957 に答える