您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Save and Load Friend Lists for Facebook Lists
当前为
// ==UserScript== // @name Facebook User List Maker // @namespace facebookuserlistmaker // @version 1.3.5 // @author Tophness // @match http://www.facebook.com/* // @match https://www.facebook.com/* // @description Save and Load Friend Lists for Facebook Lists // @require http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // @grant GM_listValues // @run-at document-idle // ==/UserScript== var friendsSelector = 'div[id$="_friends"]'; var friendsSelector2 = 'div[class="uiScrollableAreaContent"]'; var storySelector = 'div[id^="friends_"]'; var storySelector2 = 'div[data-testid="friend_list_item"]'; var storySelector3 = 'a[data-hovercard]'; var users = []; var friendsel; var mutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; function includes(k) { for(var i=0; i < this.length; i++){ if( this[i].name === k || ( this[i].name !== this[i] ) ){ return true; } } return false; } function block(story) { if (!story) { return; } if (story.getElementsByTagName('a').length) { var links = story.getElementsByTagName('a'); for (var i = 0; i < links.length; i++) { if(links[i].outerHTML.indexOf('data-hovercard') != -1){ var uname = links[i].innerText; var uid = links[i].getAttribute('data-hovercard'); uid = uid.substring(uid.indexOf('id=') + 3); if(uid.indexOf('&') == -1){ uid = uid.substring(0, uid.indexOf('"')); } else{ uid = uid.substring(0, uid.indexOf('&')); } if(uname != ""){ var newuser = {}; newuser.name = uname; newuser.id = uid; if(!users.includes(newuser.name)){ users.push(newuser); } } } } } } function block2(link){ if(link.outerHTML.indexOf('data-hovercard') != -1){ var uname = link.innerText; var uid = link.getAttribute('uid'); if(uname != ""){ var newuser = {}; newuser.name = uname; if(uid){ newuser.id = uid; } else{ uid = link.getAttribute('data-hovercard'); uid = uid.substring(uid.indexOf('id=') + 3); if(uid.indexOf('&') == -1){ uid = uid.substring(0, uid.indexOf('"')); } else{ uid = uid.substring(0, uid.indexOf('&')); } newuser.id = uid; } if(!users.includes(newuser.name)){ users.push(newuser); } } } } function process() { if(document.forms.save.dosave.value == "true" && document.forms.save.listname.value != ""){ var stories = document.querySelector(friendsSelector); if (!stories) { return; } var story = stories.querySelectorAll(storySelector); if (!story.length) { story = stories.querySelectorAll(storySelector2); if (!story.length) { return; } } for (var i2 = 0; i2 < story.length; i2++) { block(story[i2]); } GM_setValue(document.forms.save.listname.value, JSON.stringify(users)); } } function processpage() { if(document.forms.save.dosave.value == "true" && document.forms.save.listname.value != ""){ var stories = friendssel; if (!stories || stories == 'div[class="uiScrollableAreaContent"]'){ return; } var story = stories.querySelectorAll(storySelector3); if (!story.length) { return; } for (var i2 = 0; i2 < story.length; i2++) { block2(story[i2]); } GM_setValue(document.forms.save.listname.value, JSON.stringify(users)); } } function waitForEl(selector, callback, timer=100){ var poller1 = setInterval(function(){ $jObject = jQuery(selector); if($jObject.length < 1){ return; } clearInterval(poller1); callback($jObject); },timer); } function uToken(username, id){ var newdiv = document.createElement('span'); newdiv.className = "removable uiToken"; var newdiv2 = document.createElement('span'); newdiv2.className = "uiTokenText"; newdiv2.innerHTML = username; var newdiv3 = document.createElement('input'); newdiv3.name="members[]"; newdiv3.autocomplete="off"; newdiv3.type="hidden"; newdiv3.value = id; var newdiv4 = document.createElement('input'); newdiv4.value=username; newdiv4.name="text_members[]"; newdiv4.autocomplete="off"; newdiv4.type="hidden"; var newdiv5 = document.createElement('a'); newdiv5.href="#"; newdiv5.aria_label="Remove " + username; newdiv5.className="remove uiCloseButton uiCloseButtonSmall"; newdiv.appendChild(newdiv2); newdiv.appendChild(newdiv3); newdiv.appendChild(newdiv4); newdiv.appendChild(newdiv5); document.getElementById('fbFriendListTokenizer').getElementsByClassName('tokenarea')[0].appendChild(newdiv); } function listpaste(){ if(document.getElementById('createListMembers')){ if(document.getElementById('createListname') && document.forms.load.listnames.value){ document.getElementById('createListname').value = document.forms.load.listnames.value; } if(document.getElementById('fbFriendListTokenizer').getElementsByClassName('tokenarea')[0]){ document.getElementById('fbFriendListTokenizer').getElementsByClassName('tokenarea')[0].className = "tokenarea"; } for (var i = 0; i < users.length; i++) { uToken(users[i].name, users[i].id); } } else{ setTimeout(listpaste, 1000); } } function observebody(){ if(document.forms.save.dosave.value == "true"){ var listname = document.forms.save.listname.value.toLowerCase().replace(/[^a-zA-Z0-9]+/g, ""); users = JSON.parse(GM_getValue(listname, "[]")); if(!users){ console.warn("error"); } users.includes = includes; if(location.href.indexOf('bookmarks/lists') != -1 || location.href.indexOf('/friends') != -1){ process(); } else{ processpage(); } } else{ setTimeout(observebody, 1000); } } function loadbegin(){ if(document.forms.load.doload.value == "true"){ users = JSON.parse(GM_getValue(document.forms.load.listnames.value, "[]")); if(!users){ console.warn("error"); } users.includes = includes; if(contentarea.getElementsByClassName('uiHeaderActions')[0].childNodes[0]){ contentarea.getElementsByClassName('uiHeaderActions')[0].childNodes[0].addEventListener('click', listpaste, false); contentarea.getElementsByClassName('uiHeaderActions')[0].childNodes[0].click(); } } else if(document.forms.load.dodelete.value == "true"){ var select = document.forms.load.listnames; GM_deleteValue(select.value); dvalue = select.selectedIndex; select.removeChild(select[dvalue]); } else{ setTimeout(loadbegin, 1000); } } function loadfindpage(el){ var savebut = document.createElement('div'); savebut.innerHTML = '<form name="save"><input type=button onclick="document.forms.save.dosave.value=true;" value="Save List"><input type=text name=listname><input type=hidden name=dosave value="false"></form>'; el.insertAdjacentElement('afterbegin', savebut); var observer = new mutationObserver(processpage); observer.observe(document.querySelector('body'), { 'childList': true, 'subtree': true }); observebody(); } function findpage(){ var divs = document.querySelectorAll(friendsSelector2); var found = false; for (var i = 0; i < divs.length; ++i) { if(divs[i].querySelectorAll(storySelector3).length){ friendssel = divs[i]; found = true; } } if(found){ loadfindpage(friendssel); } else{ setTimeout(findpage, 1000); } } if(location.href.indexOf('bookmarks/lists') != -1){ var contentarea = document.getElementById('contentArea'); waitForEl(contentarea, function() { var loadbut = document.createElement('div'); loadbut.innerHTML = '<form name="load"><input type=button onclick="document.forms.load.doload.value=true;" value="Load List"><input type=hidden name=doload value="false"><input type=hidden name=dodelete value="false"><input type=button onclick="document.forms.load.dodelete.value=true;" value="Delete List"></form>'; var x = document.createElement("select"); x.name="listnames"; var alllists = GM_listValues(); for (var i = 0; i < alllists.length; i++) { var option = document.createElement("option"); option.text = alllists[i]; x.add(option); } contentarea.insertAdjacentElement('afterbegin', loadbut); document.forms.load.appendChild(x); loadbegin(); }); } else if(location.href.indexOf('/friends') != -1){ waitForEl(document.querySelector(friendsSelector), function() { var savebut = document.createElement('div'); savebut.innerHTML = '<form name="save"><input type=button onclick="document.forms.save.dosave.value=true;" value="Save List"><input type=text name=listname><input type=hidden name=dosave value="false"></form>'; document.querySelector(friendsSelector).insertAdjacentElement('afterbegin', savebut); var observer = new mutationObserver(process); observer.observe(document.querySelector('body'), { 'childList': true, 'subtree': true }); observebody(); },500); } else{ findpage(); }