Facebook User List Maker

Save and Load Friend Lists for Facebook Lists

目前為 2018-01-14 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name Facebook User List Maker
  3. // @namespace facebookuserlistmaker
  4. // @version 1.4.5
  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="pagelet_group_members"]';
  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){
  77. if(document.forms.save.dosave.value == "true" && document.forms.save.listname.value != ""){
  78. if(location.href.indexOf('/members') != -1){
  79. processFilter(document.querySelector(friendsSelector3));
  80. }
  81. else if(location.href.indexOf('/friends') != -1){
  82. processFilter(document.querySelector(friendsSelector));
  83. }
  84. else{
  85. processFilter(friendssel);
  86. }
  87. GM_setValue(document.forms.save.listname.value, JSON.stringify(users));
  88. }
  89. }
  90. else{
  91. start();
  92. }
  93. }
  94.  
  95. function waitForEl(selector, callback, timer=100){
  96. var poller1 = setInterval(function(){
  97. $jObject = jQuery(selector);
  98. if($jObject.length < 1){
  99. return;
  100. }
  101. clearInterval(poller1);
  102. callback($jObject);
  103. },timer);
  104. }
  105.  
  106. function uToken(username, id){
  107. var newdiv = document.createElement('span');
  108. newdiv.className = "removable uiToken";
  109. var newdiv2 = document.createElement('span');
  110. newdiv2.className = "uiTokenText";
  111. newdiv2.innerHTML = username;
  112. var newdiv3 = document.createElement('input');
  113. newdiv3.name="members[]";
  114. newdiv3.autocomplete="off";
  115. newdiv3.type="hidden";
  116. newdiv3.value = id;
  117. var newdiv4 = document.createElement('input');
  118. newdiv4.value=username;
  119. newdiv4.name="text_members[]";
  120. newdiv4.autocomplete="off";
  121. newdiv4.type="hidden";
  122. var newdiv5 = document.createElement('a');
  123. newdiv5.href="#";
  124. newdiv5.aria_label="Remove " + username;
  125. newdiv5.className="remove uiCloseButton uiCloseButtonSmall";
  126. newdiv.appendChild(newdiv2);
  127. newdiv.appendChild(newdiv3);
  128. newdiv.appendChild(newdiv4);
  129. newdiv.appendChild(newdiv5);
  130. document.getElementById('fbFriendListTokenizer').getElementsByClassName('tokenarea')[0].appendChild(newdiv);
  131. }
  132.  
  133. function listpaste(){
  134. if(document.getElementById('createListMembers')){
  135. if(document.getElementById('createListname') && document.forms.load.listnames.value){
  136. document.getElementById('createListname').value = document.forms.load.listnames.value;
  137. }
  138. if(document.getElementById('fbFriendListTokenizer').getElementsByClassName('tokenarea')[0]){
  139. document.getElementById('fbFriendListTokenizer').getElementsByClassName('tokenarea')[0].className = "tokenarea";
  140. }
  141. for (var i = 0; i < users.length; i++) {
  142. uToken(users[i].name, users[i].id);
  143. }
  144. }
  145. else{
  146. setTimeout(listpaste, 1000);
  147. }
  148. }
  149.  
  150. function observebody(){
  151. if(document.forms.save){
  152. if(document.forms.save.dosave.value == "true"){
  153. var listname = document.forms.save.listname.value.toLowerCase().replace(/[^a-zA-Z0-9]+/g, "");
  154. users = JSON.parse(GM_getValue(listname, "[]"));
  155. if(!users){
  156. console.warn("error");
  157. }
  158. users.includes = includes;
  159. process();
  160. }
  161. else{
  162. setTimeout(observebody, 1000);
  163. }
  164. }
  165. }
  166.  
  167. function loadbegin(){
  168. if(document.forms.load.doload.value == "true"){
  169. users = JSON.parse(GM_getValue(document.forms.load.listnames.value, "[]"));
  170. if(!users){
  171. console.warn("error");
  172. }
  173. users.includes = includes;
  174. if(contentarea.getElementsByClassName('uiHeaderActions')[0].childNodes[0]){
  175. contentarea.getElementsByClassName('uiHeaderActions')[0].childNodes[0].addEventListener('click', listpaste, false);
  176. contentarea.getElementsByClassName('uiHeaderActions')[0].childNodes[0].click();
  177. }
  178. }
  179. else if(document.forms.load.dodelete.value == "true"){
  180. var select = document.forms.load.listnames;
  181. GM_deleteValue(select.value);
  182. dvalue = select.selectedIndex;
  183. select.removeChild(select[dvalue]);
  184. }
  185. else{
  186. setTimeout(loadbegin, 1000);
  187. }
  188. }
  189.  
  190. function startObserver(){
  191. var observer = new mutationObserver(process);
  192. observer.observe(document.querySelector('body'), {
  193. 'childList': true,
  194. 'subtree': true
  195. });
  196. observebody();
  197. }
  198.  
  199. function loadfindpage(el){
  200. if(el.firstChild.id != 'saveDiv'){
  201. var savebut = document.createElement('div');
  202. savebut.id = 'saveDiv';
  203. savebut.innerHTML = saveDiv;
  204. el.insertAdjacentElement('afterbegin', savebut);
  205. startObserver();
  206. }
  207. }
  208.  
  209. function findpage(){
  210. var divs = document.querySelectorAll(friendsSelector2);
  211. var found = false;
  212. for (var i = 0; i < divs.length; ++i) {
  213. if(divs[i].querySelectorAll(storySelector).length){
  214. friendssel = divs[i];
  215. found = true;
  216. }
  217. }
  218. if(found){
  219. loadfindpage(friendssel);
  220. }
  221. else{
  222. setTimeout(findpage, 1000);
  223. }
  224. }
  225.  
  226. function start(){
  227. if(location.href.indexOf('bookmarks/lists') != -1){
  228. var contentarea = document.getElementById('contentArea');
  229. waitForEl(contentarea, function() {
  230. var loadbut = document.createElement('div');
  231. loadbut.innerHTML = loadDiv;
  232. var x = document.createElement("select");
  233. x.name="listnames";
  234. var alllists = GM_listValues();
  235. for (var i = 0; i < alllists.length; i++) {
  236. var option = document.createElement("option");
  237. option.text = alllists[i];
  238. x.add(option);
  239. }
  240. contentarea.insertAdjacentElement('afterbegin', loadbut);
  241. document.forms.load.appendChild(x);
  242. loadbegin();
  243. });
  244. }
  245. else if(location.href.indexOf('/friends') != -1){
  246. waitForEl(document.querySelector(friendsSelector), function() {
  247. loadfindpage(document.querySelector(friendsSelector));
  248. },500);
  249. }
  250. else if(location.href.indexOf('/members') != -1){
  251. waitForEl(document.querySelector(friendsSelector3), function() {
  252. loadfindpage(document.querySelector(friendsSelector3));
  253. },500);
  254. }
  255. else{
  256. findpage();
  257. }
  258. }
  259. start();