Facebook User List Maker

Save and Load Friend Lists for Facebook Lists

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

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