Facebook User List Maker

Save and Load Friend Lists for Facebook Lists

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

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