Facebook User List Maker

Save and Load Friend Lists for Facebook Lists

当前为 2017-12-08 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Facebook User List Maker
  3. // @namespace facebookuserlistmaker
  4. // @version 1.4
  5. // @author Tophness
  6. // @match http://www.facebook.com/*
  7. // @match https://www.facebook.com/*
  8. // @description Save and Load Friend Lists for Facebook Lists
  9. // @require http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js
  10. // @grant GM_getValue
  11. // @grant GM_setValue
  12. // @grant GM_deleteValue
  13. // @grant GM_listValues
  14. // @run-at document-idle
  15. // ==/UserScript==
  16.  
  17. var friendsSelector = 'div[id$="_friends"]';
  18. var friendsSelector2 = 'div[role="dialog"]';
  19. var friendsSelector3 = 'div[id="groupsMemberBrowser"]';
  20. var storySelector = 'a[data-hovercard]';
  21. var users = [];
  22. var friendsel;
  23. var saveDiv = '<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>';
  24. var loadDiv = '<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>';
  25. var mutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
  26.  
  27. function includes(k) {
  28. for(var i=0; i < this.length; i++){
  29. if( this[i].name === k ){
  30. return true;
  31. }
  32. }
  33. return false;
  34. }
  35.  
  36. function block(link){
  37. if(link.outerHTML.indexOf('data-hovercard') != -1){
  38. var uname = link.innerText;
  39. var uid = link.getAttribute('uid');
  40. if(uname != "" && !users.includes(uname)){
  41. var newuser = {};
  42. newuser.name = uname;
  43. if(uid){
  44. newuser.id = uid;
  45. }
  46. else{
  47. uid = link.getAttribute('data-hovercard');
  48. uid = uid.substring(uid.indexOf('id=') + 3);
  49. if(uid.indexOf('&') == -1){
  50. uid = uid.substring(0, uid.indexOf('"'));
  51. }
  52. else{
  53. uid = uid.substring(0, uid.indexOf('&'));
  54. }
  55. newuser.id = uid;
  56. }
  57. users.push(newuser);
  58. }
  59. }
  60. }
  61.  
  62. function processFilter(stories){
  63. if (!stories) {
  64. return;
  65. }
  66. var story = stories.querySelectorAll(storySelector);
  67. if (!story.length) {
  68. return;
  69. }
  70. for (var i = 0; i < story.length; i++) {
  71. block(story[i]);
  72. }
  73. }
  74.  
  75. function process() {
  76. if(document.forms.save.dosave.value == "true" && document.forms.save.listname.value != ""){
  77. if(location.href.indexOf('/members') != -1){
  78. processFilter(document.querySelector(friendsSelector3));
  79. }
  80. else if(location.href.indexOf('/friends') != -1){
  81. processFilter(document.querySelector(friendsSelector));
  82. }
  83. else{
  84. processFilter(friendssel);
  85. }
  86. GM_setValue(document.forms.save.listname.value, JSON.stringify(users));
  87. }
  88. }
  89.  
  90. function waitForEl(selector, callback, timer=100){
  91. var poller1 = setInterval(function(){
  92. $jObject = jQuery(selector);
  93. if($jObject.length < 1){
  94. return;
  95. }
  96. clearInterval(poller1);
  97. callback($jObject);
  98. },timer);
  99. }
  100.  
  101. function uToken(username, id){
  102. var newdiv = document.createElement('span');
  103. newdiv.className = "removable uiToken";
  104. var newdiv2 = document.createElement('span');
  105. newdiv2.className = "uiTokenText";
  106. newdiv2.innerHTML = username;
  107. var newdiv3 = document.createElement('input');
  108. newdiv3.name="members[]";
  109. newdiv3.autocomplete="off";
  110. newdiv3.type="hidden";
  111. newdiv3.value = id;
  112. var newdiv4 = document.createElement('input');
  113. newdiv4.value=username;
  114. newdiv4.name="text_members[]";
  115. newdiv4.autocomplete="off";
  116. newdiv4.type="hidden";
  117. var newdiv5 = document.createElement('a');
  118. newdiv5.href="#";
  119. newdiv5.aria_label="Remove " + username;
  120. newdiv5.className="remove uiCloseButton uiCloseButtonSmall";
  121. newdiv.appendChild(newdiv2);
  122. newdiv.appendChild(newdiv3);
  123. newdiv.appendChild(newdiv4);
  124. newdiv.appendChild(newdiv5);
  125. document.getElementById('fbFriendListTokenizer').getElementsByClassName('tokenarea')[0].appendChild(newdiv);
  126. }
  127.  
  128. function listpaste(){
  129. if(document.getElementById('createListMembers')){
  130. if(document.getElementById('createListname') && document.forms.load.listnames.value){
  131. document.getElementById('createListname').value = document.forms.load.listnames.value;
  132. }
  133. if(document.getElementById('fbFriendListTokenizer').getElementsByClassName('tokenarea')[0]){
  134. document.getElementById('fbFriendListTokenizer').getElementsByClassName('tokenarea')[0].className = "tokenarea";
  135. }
  136. for (var i = 0; i < users.length; i++) {
  137. uToken(users[i].name, users[i].id);
  138. }
  139. }
  140. else{
  141. setTimeout(listpaste, 1000);
  142. }
  143. }
  144.  
  145. function observebody(){
  146. if(document.forms.save.dosave.value == "true"){
  147. var listname = document.forms.save.listname.value.toLowerCase().replace(/[^a-zA-Z0-9]+/g, "");
  148. users = JSON.parse(GM_getValue(listname, "[]"));
  149. if(!users){
  150. console.warn("error");
  151. }
  152. users.includes = includes;
  153. process();
  154. }
  155. else{
  156. setTimeout(observebody, 1000);
  157. }
  158. }
  159.  
  160. function loadbegin(){
  161. if(document.forms.load.doload.value == "true"){
  162. users = JSON.parse(GM_getValue(document.forms.load.listnames.value, "[]"));
  163. if(!users){
  164. console.warn("error");
  165. }
  166. users.includes = includes;
  167. if(contentarea.getElementsByClassName('uiHeaderActions')[0].childNodes[0]){
  168. contentarea.getElementsByClassName('uiHeaderActions')[0].childNodes[0].addEventListener('click', listpaste, false);
  169. contentarea.getElementsByClassName('uiHeaderActions')[0].childNodes[0].click();
  170. }
  171. }
  172. else if(document.forms.load.dodelete.value == "true"){
  173. var select = document.forms.load.listnames;
  174. GM_deleteValue(select.value);
  175. dvalue = select.selectedIndex;
  176. select.removeChild(select[dvalue]);
  177. }
  178. else{
  179. setTimeout(loadbegin, 1000);
  180. }
  181. }
  182.  
  183. function startObserver(){
  184. var observer = new mutationObserver(process);
  185. observer.observe(document.querySelector('body'), {
  186. 'childList': true,
  187. 'subtree': true
  188. });
  189. observebody();
  190. }
  191.  
  192. function loadfindpage(el){
  193. var savebut = document.createElement('div');
  194. savebut.innerHTML = saveDiv;
  195. el.insertAdjacentElement('afterbegin', savebut);
  196. startObserver();
  197. }
  198.  
  199. function findpage(){
  200. var divs = document.querySelectorAll(friendsSelector2);
  201. var found = false;
  202. for (var i = 0; i < divs.length; ++i) {
  203. if(divs[i].querySelectorAll(storySelector).length){
  204. friendssel = divs[i];
  205. found = true;
  206. }
  207. }
  208. if(found){
  209. loadfindpage(friendssel);
  210. }
  211. else{
  212. setTimeout(findpage, 1000);
  213. }
  214. }
  215.  
  216. if(location.href.indexOf('bookmarks/lists') != -1){
  217. var contentarea = document.getElementById('contentArea');
  218. waitForEl(contentarea, function() {
  219. var loadbut = document.createElement('div');
  220. loadbut.innerHTML = loadDiv;
  221. var x = document.createElement("select");
  222. x.name="listnames";
  223. var alllists = GM_listValues();
  224. for (var i = 0; i < alllists.length; i++) {
  225. var option = document.createElement("option");
  226. option.text = alllists[i];
  227. x.add(option);
  228. }
  229. contentarea.insertAdjacentElement('afterbegin', loadbut);
  230. document.forms.load.appendChild(x);
  231. loadbegin();
  232. });
  233. }
  234. else if(location.href.indexOf('/friends') != -1){
  235. waitForEl(document.querySelector(friendsSelector), function() {
  236. var savebut = document.createElement('div');
  237. savebut.innerHTML = saveDiv;
  238. document.querySelector(friendsSelector).insertAdjacentElement('afterbegin', savebut);
  239. startObserver();
  240. },500);
  241. }
  242. else if(location.href.indexOf('/members') != -1){
  243. waitForEl(document.querySelector(friendsSelector3), function() {
  244. var savebut = document.createElement('div');
  245. savebut.innerHTML = saveDiv;
  246. document.querySelector(friendsSelector3).insertAdjacentElement('afterbegin', savebut);
  247. startObserver();
  248. },500);
  249. }
  250. else{
  251. findpage();
  252. }