您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Very simple script to conveniently see how many points a team gives up
当前为
// ==UserScript== // @name Yahoo Fantasy Football Rank // @author Bijan // @version 4.0 // @description Very simple script to conveniently see how many points a team gives up // @namespace http://albuyeh.com // @match *://football.fantasysports.yahoo.com/* // @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js // @require https://greasyfork.org/scripts/5392-waitforkeyelements/code/WaitForKeyElements.js?version=19641 // @grant GM_xmlhttpRequest // @grant GM_getValue // @grant GM_setValue // @icon http://albuyeh.com/FF/Icon.png // ==/UserScript== /* CHANGELOG v2.4: Accidentaly had St Louis listed as 'Stl' and not 'StL'. This caused the script to break as soon as it saw a player/opposing team on St Louis :P v2.5: I fixed something but forgot what it was v2.6: Made script more versatille. Watched Mad Max. Fixed a lot of issues of script not showing player stats. Had some chicken nuggets too. v2.7: Oops. Fixed for realsies. v2.8: Update waitForKeyElements require to be GreasyFork compliant. Added IDP. Forced redownload v2.9: Made script work on 'Opponents' page v3.0: Fixed bug that would cause browser to not close v3.1: Fixed bug that would cause Game Day Decision to not close v3.2: Added League > Rosters page to allow this script v3.3: Fixed bug where data would not load. As of tomorrow, there will be ranks for 2015 season. v3.4: Force script to load fresh data on update v3.5: Make Opponents page look nice :) v3.6: Add color if a team has won or lost v3.7: Rank data is now coming from 2015 since W1 concluded. v3.8: Bug fixes v3.9: Added more pages to display rank v4.0: Add link to Points Against page on player rank */ //Map Team Name to abbreviation var teamNameList = { "Arizona Cardinals": "Ari", "Atlanta Falcons": "Atl", "Baltimore Ravens": "Bal", "Buffalo Bills": "Buf", "Carolina Panthers": "Car", "Chicago Bears": "Chi", "Cincinnati Bengals": "Cin", "Cleveland Browns": "Cle", "Dallas Cowboys": "Dal", "Denver Broncos": "Den", "Detroit Lions": "Det", "Green Bay Packers": "GB", "Houston Texans": "Hou", "Indianapolis Colts": "Ind", "Jacksonville Jaguars": "Jax", "Kansas City Chiefs": "KC", "Miami Dolphins": "Mia", "Minnesota Vikings": "Min", "New England Patriots": "NE", "New Orleans Saints": "NO", "New York Giants": "NYG", "New York Jets": "NYJ", "Oakland Raiders": "Oak", "Philadelphia Eagles": "Phi", "Pittsburgh Steelers": "Pit", "San Diego Chargers": "SD", "San Francisco 49ers": "SF", "Seattle Seahawks": "Sea", "St. Louis Rams": "StL", "Tampa Bay Buccaneers": "TB", "Tennessee Titans": "Ten", "Washington Redskins": "Was", } var teamNameNumber = { "Ari": "22", "Atl": "1", "Bal": "33", "Buf": "2", "Car": "29", "Chi": "3", "Cin": "4", "Cle": "5", "Dal": "6", "Den": "7", "Det": "8", "GB": "9", "Hou": "34", "Ind": "11", "Jax": "30", "KC": "12", "Mia": "15", "Min": "16", "NE": "17", "NO": "18", "NYG": "19", "NYJ": "20", "Oak": "13", "Phi": "21", "Pit": "23", "SD": "24", "SF": "25", "Sea": "26", "StL": "14", "TB": "27", "Ten": "10", "Was": "28", } const playerPositions = ["QB", "WR", "RB", "TE", "K", "DEF", "DB", "DL", "LB", "DT", "DE", "CB", "S"]; //Positions to fetch data for const numPositions = playerPositions.length; var leagueid = document.URL.split('/')[4]; if(isNaN(leagueid)) leagueid = "326198"; const baseURL = "http://football.fantasysports.yahoo.com/f1/" + leagueid + "/pointsagainst?pos="; //Page to create fetch request to var rankingsTable = {}; //This will be filled by the AJAX parser. var final = {}; //Final table that holds all of the team/position info var result = {}; var numPagesFetched = 0; var tableName = "FF_Array3"; //Display notification of Update var ver = GM_info.script.version; console.log("Starting Yahoo Fantasy Football Rank v" + ver) if (GM_getValue("version", "") < ver) { GM_setValue("version", ver); alert("Updated Yahoo Fantasy Football Rank by Bijan to version v" + ver); GM_setValue (tableName, "") } //Fetch results once per day. var now = new Date(); var currdate = Math.floor(now/8.64e7); if (GM_getValue("date2", "") < currdate || GM_getValue (tableName, "").length == 0) { GM_setValue("date2", currdate); console.log("Fetched results @ :" + currdate); main(); //Go to main() to fetch data } else { console.log("Already fetched data. Continuing to display results"); displayResults(); } function main () { for (var J in playerPositions) { GM_xmlhttpRequest ( { method: "GET", url: baseURL + playerPositions[J], context: playerPositions[J], onload: parseResponse, onerror: function (e) { console.error ('**** error ', e); }, onabort: function (e) { console.error ('**** abort ', e); }, ontimeout: function (e) { console.error ('**** timeout ', e); } } ); } } function parseResponse (response) { var playerPosition = response.context; var parser = new DOMParser (); var ajaxDoc = parser.parseFromString (response.responseText, "text/html"); var statRows = ajaxDoc.querySelectorAll ("#statTable0 > tbody > tr"); var newStatTable = $(statRows).map ( function () { var tblRow = $(this); var teamRank = parseInt (tblRow.find (".rank-indicator").text().trim(), 10); var teamName = teamNameList[tblRow.find ("td:eq(1)").text().trim().split(" vs")[0]]; return [ [teamName, teamRank] ]; } ).get (); numPagesFetched++; console.log ('Fetched page ' + numPagesFetched + ' of ' + numPositions + '.'); /*--- Now loop over the fetched rows and collate them into the master table, depending on playerPosition. */ var columnIdx = playerPositions.indexOf (playerPosition); for (var K in newStatTable) { var teamName = newStatTable[K][0]; var teamRank = newStatTable[K][1]; var teamStats = rankingsTable[teamName] || new Array (numPositions); teamStats[columnIdx] = teamRank; rankingsTable[teamName] = teamStats; } if (numPagesFetched === numPositions) { displayFinalResult (); } } function displayFinalResult () { //Sort team name var sortedTeamNames = Object.keys (rankingsTable).sort ( function (zA, zB) { return zA.localeCompare (zB); } ); //Store team name and rank array in a single array for (var J in sortedTeamNames) { var teamName = sortedTeamNames[J]; if (rankingsTable.hasOwnProperty (teamName) ) { final[teamName] = rankingsTable[teamName] } } //Save array to browser GM_setValue (tableName, JSON.stringify (final) ); displayResults(final) } function getColor(rank) { //Enter #, return color class if (1 <= rank && rank <= 10) color = "F-rank-good"; //Green else if (11 <= rank && rank <= 22) color = "F-rank-neutral"; //Yellow else if (23 <= rank && rank <= 32) color = "F-rank-bad"; //Red return color; } function displayResults(result) { //Get saved results var myList = {}; var myListObj = GM_getValue (tableName, ""); if (myListObj) { myList = JSON.parse (myListObj); } //Check if we have already fetched results for the day if (typeof result === 'undefined') { result = myList; console.log("Loading pre-loaded data");} function delinkChangeStat (jNode) { var raw = jNode[0].innerHTML if ((player = raw.match(/<span class="Fz-xxs">.*? - (\w+)/)) && (opp = raw.match(/(?:vs|\@) (\w+)/))) { var playerIndex = playerPositions.indexOf(player[1]) if( playerIndex != -1) { /* Get rank and modify element to contain color and rank */ var rank = result[opp[1]][playerIndex]; console.log(opp[1] + " gives up the #" + rank + " points to the " + player[1] + " position"); var pointsAgainst = '<a target="_blank" href="http://football.fantasysports.yahoo.com/f1/' + leagueid + '/pointsagainst?pos=' + player[1] +'&ntid=' + teamNameNumber[opp[1]] + '">' jNode.html(jNode.html().replace(opp[1] + "</a>", "</a>" + pointsAgainst + "<span class='" + getColor(rank) + "'>" + opp[1] + " - " + rank + "</span></a>")) /* Add colors if a team has lost or won */ if(jNode.html().indexOf("Final (L)") != -1) { jNode.html(jNode.html().replace("Final (L)","<span class='F-rank-bad'>Final (L)</span>")) } else if(jNode.html().indexOf("Final (W)") != -1) { jNode.html(jNode.html().replace("Final (W)","<span class='F-rank-good'>Final (W)</span>")) } } } } function opponentsPage (jNode) { var posA = jNode[0].querySelectorAll('span.Fz-xxs:not(.ysf-player-status):not(.Px-xxs):not(.F-icon)'); for(i=0; i<posA.length; i++) { var pos = posA[i].innerHTML.split(" ").slice(-1)[0] //QB var oppA = jNode[0].querySelectorAll('.P-xs'); for(i=0; i<oppA.length; i++) { var opp = oppA[i].innerText.trim() //Opposing team without @ var playerIndex = playerPositions.indexOf(pos) var opp_without = opp.replace("@","") if (opp_without != "Bye") { var rank = result[opp_without][playerIndex]; oppA[i].firstElementChild.innerHTML = "<span class='" + getColor(rank) + "'>" + oppA[i].firstElementChild.innerHTML + " - " + rank + "</span></a>" } else { oppA[i].firstElementChild.innerHTML = "<b>" + oppA[i].firstElementChild.innerHTML + "</b>"; } } } $("td.P-xs").css("white-space", "nowrap"); } waitForKeyElements (".Mx-a", delinkChangeStat); waitForKeyElements (".Ov-h", delinkChangeStat); waitForKeyElements (".tablewrap > table > tbody > tr:not(.empty-bench)", opponentsPage); waitForKeyElements (".players > table.Table > tbody > tr", opponentsPage); waitForKeyElements ("[id^='Tst-team-'] > tbody > tr", delinkChangeStat); } // That's it!