Facebook add Block App to Newsfeed

Adds block app link to your Facebook newsfeed after each application posted on your feed.

  1. // ==UserScript==
  2. // @name Facebook add Block App to Newsfeed
  3. // @version 1.7.6
  4. // @namespace 81e39bcf0fc5f8bc9fbf174299021d6d
  5. // @description Adds block app link to your Facebook newsfeed after each application posted on your feed.
  6. // @license GNU General Public License version 3 or any later version; https://www.gnu.org/licenses/gpl-3.0.html
  7. // @include https://*.facebook.com/*
  8. // @include http://*.facebook.com/*
  9. // @exclude https://apps.facebook.com/ai.php
  10. // @exclude http://apps.facebook.com/ai.php
  11. // @grant none
  12. // @icon https://monkeyguts.com/icon/119.png
  13. // ==/UserScript==
  14. //Thanks to Mesak (http://userscripts.org/users/mesak) for parts of this
  15. var runtimes = 0;
  16. function checkDocT(){
  17. checkDoc(undefined);
  18. }
  19. function checkDoc(event){
  20. try {
  21. var target = document;
  22. var uri = document.baseURI;
  23. if(event){
  24. target = event.target;
  25. if(!target || target == '[object HTMLScriptElement]' || target == '[object Text]'){
  26. return;
  27. }
  28. uri = target.baseURI;
  29. }
  30.  
  31. if(uri.indexOf('/ai.php') != -1 || uri.indexOf('/apps/application.php?id=') != -1){
  32. return;
  33. }
  34. var aLinkElement = target.getElementsByTagName('a');
  35. var len = aLinkElement.length;
  36. for(x=0;x<len;x++){
  37. var hovercard = aLinkElement[x].getAttribute('data-hovercard');
  38. var href = aLinkElement[x].getAttribute('href');
  39. var ajaxify = aLinkElement[x].getAttribute('ajaxify');
  40. var datagt = aLinkElement[x].getAttribute('data-gt');
  41. var hasblock = aLinkElement[x].getAttribute('hasblock');
  42. var ariahidden = aLinkElement[x].getAttribute('aria-hidden');
  43. var linkinner = aLinkElement[x].innerHTML;
  44. if(hasblock == null){
  45. if(hovercard !== null && hovercard.indexOf('application.php') != -1 && linkinner.indexOf('Play Now') == -1){
  46. if(ariahidden == null){
  47. addBlockIfText(aLinkElement[x], hovercard.match(/id\=(\d+)/)[1], null, null, null);
  48. }
  49. } else if(hovercard !== null && (hovercard.indexOf('/ajax/hovercard/hovercard.php?id=') != -1 || hovercard.indexOf('/ajax/hovercard/application.php?id=') != -1) && href != null && href.indexOf('://apps.facebook.com/') != -1){
  50. if(href.indexOf('type=discovery') != -1){
  51. //assume these types of hovercard.php links have app ids for their ids as in the case of 21 questions
  52. addBlockIfText(aLinkElement[x], hovercard.match(/id\=(\d+)/)[1], null, null, null);
  53. } else {
  54. var found = false;
  55. for(y=x;y>=0;y--){
  56. var aclass = aLinkElement[y].getAttribute('class');
  57. if(aclass == 'uiSelectorButton'){
  58. ajaxify = aLinkElement[y].getAttribute('ajaxify');
  59. //What about more than one?
  60. if(ajaxify.indexOf('hideable_ids\%5B0\%5D\=') != -1){
  61. addBlockIfText(aLinkElement[x], ajaxify.match(/hideable_ids\%5B0\%5D\=(\d+)/)[1], null, null, null);
  62. }
  63. break;
  64. }
  65. }
  66. if(!found){
  67. addBlockIfText(aLinkElement[x], hovercard.match(/id\=(\d+)/)[1], null, null, null);
  68. }
  69. }
  70. } else if(href !== null && datagt !== null && href.indexOf('/apps/application.php?id=') == -1 && href.indexOf('://apps.facebook.com/') != -1 && datagt.indexOf('\"appid\"') != -1){
  71. if(aLinkElement[x].parentNode && aLinkElement[x].parentNode.getAttribute('class').indexOf('imageContainer') == -1 && datagt.indexOf('canvas_bookmarks') == -1){
  72. addBlockLink(aLinkElement[x], datagt.match(/.appid.:.(\d+)/)[1], 'div', 0, 1);
  73. }
  74. } else if(href !== null && datagt !== null && href.indexOf('facebook.com/appcenter/') != -1 && datagt.indexOf('\"appid\"') != -1 && aLinkElement[x].className.indexOf('logo') == -1){
  75. //unsafeWindow.console.log('fb_block test=' + datagt);
  76. if(aLinkElement[x].parentNode && aLinkElement[x].parentNode.getAttribute('class') && aLinkElement[x].parentNode.getAttribute('class').indexOf('imageContainer') == -1 && datagt.indexOf('canvas_bookmarks') == -1){
  77. addBlockIfText(aLinkElement[x], datagt.match(/.appid.:.(\d+)/)[1], null, null, null);
  78. }
  79. } else if(href !== null && href.indexOf('/apps/application.php?id=') != -1){
  80. var httpindex = href.indexOf('http');
  81. var appindex = -1;
  82. if(httpindex == 0){
  83. appindex = href.indexOf('www.facebook.com/apps/application.php?id=');
  84. } else {
  85. appindex = href.indexOf('/apps/application.php?id=');
  86. }
  87. if((appindex == 7 || appindex == 8) && httpindex == 0 || appindex == 0){
  88. if(aLinkElement[x].parentNode.innerHTML.indexOf('Blocking') == 0 && aLinkElement[x].parentNode.parentNode.parentNode.getAttribute('class') == 'dialog_body'){
  89. ignoreLink(aLinkElement[x]);
  90. } else {
  91. addBlockLink(aLinkElement[x], href.match(/id\=(\d+)/)[1], null, null, null);
  92. }
  93. }
  94. } else if(href !== null && href.indexOf('/report.application/?app_id=') != -1 && href.indexOf('http') != 0){
  95. addBlockLink(aLinkElement[x], href.match(/app_id\=(\d+)/)[1], null, null, null);
  96. // } else if(href !== null && href.indexOf('method=permissions.request') != -1 && href.indexOf('uiserver.php?app_id=') != -1){
  97. // addBlockLink(aLinkElement[x], href.match(/uiserver.php?app_id\=(\d+)/)[1], null, null, null);
  98. } else if(ajaxify !== null) {
  99. if(ajaxify.indexOf('/ajax/games/apprequest/apprequest.php?id=') != -1){
  100. addBlockLink(aLinkElement[x], ajaxify.match(/app_id\%5D\=(\d+)/)[1], 'span', 1, null);
  101. } else if(ajaxify.indexOf('/ajax/report.php?') != -1){
  102. addBlockLink(aLinkElement[x], ajaxify.match(/cid\=(\d+)/)[1], null, null, null);
  103. }
  104. } else {
  105. //Not an app link
  106. // if(aLinkElement[x].className.indexOf('layerCancel') != -1 && aLinkElement[x].parentNode.parentNode.previousSibling.previousSibling.innerHTML.indexOf('Block App') == 0){
  107. // unsafeWindow.console.log('found block app button: ' + aLinkElement[x].parentNode.parentNode.previousSibling.previousSibling.innerHTML + ' docurl=' + Document.URL);
  108. // addToggleNeverBlockButton(aLinkElement[x],0);
  109. // }
  110. }
  111. }
  112.  
  113. }
  114. } catch(err) {
  115. if(err.lineNumber){
  116. unsafeWindow.console.log('fb_block err=' + err.message + ' at line ' + err.lineNumber);
  117. } else {
  118. unsafeWindow.console.log('fb_block err=' + err.message);
  119. }
  120. if(err.message == 'target.getElementsByTagName is not a function'){
  121. unsafeWindow.console.log('fb_block err detail=' + target);
  122. }
  123. }
  124. if(!event){
  125. if(runtimes < 15){
  126. runtimes++;
  127. if(runtimes == 15){
  128. window.addEventListener("DOMNodeInserted", checkDoc, false);
  129. runtimes = 30;
  130. }
  131. }
  132. window.setTimeout(checkDocT, 1000 * runtimes);
  133. }
  134. }
  135. //function addToggleNeverBlockButton(Element, app_id){
  136. //}
  137. function addBlockIfText(Element, app_id, placetag, tagcount,inside){
  138. if(Element.firstChild && Element.firstChild.tagName){
  139. if(Element.firstChild.tagName.toLowerCase().indexOf('img') == 0){
  140. return ignoreLink(Element);
  141. }
  142. }
  143. return addBlockLink(Element, app_id, placetag, tagcount,inside);
  144. }
  145. function addBlockLink(Element, app_id, placetag, tagcount,inside){
  146. var aElement=document.createElement('a');
  147. aElement.innerHTML = "Block";
  148. aElement.setAttribute('rel','dialog-post');
  149. aElement.setAttribute('style','display: inline;');
  150. aElement.setAttribute('ajaxify','/ajax/apps/block_app.php?app_id='+app_id+'&type_index=0&source=about&confirm_id=block_app_link');
  151. Element.setAttribute('hasblock','yes');
  152. Element.setAttribute('style','display: inline;');
  153. var placement = Element.nextSibling;
  154. var nodeins = Element.parentNode;
  155. if(placetag !== null){
  156. var elems = Element.getElementsByTagName(placetag);
  157. var len = elems.length;
  158. var tele = (tagcount !== null)?tagcount:0;
  159. if(tele < len){
  160. if(inside != null && inside == 1){
  161. nodeins = elems[tele];
  162. placement = elems[tele].lastChild.nextSibling;
  163. } else {
  164. nodeins = elems[tele].parentNode;
  165. placement = elems[tele].nextSibling;
  166. }
  167. }
  168. }
  169. nodeins.insertBefore(aElement,placement);
  170. var spanElement=document.createElement('span');
  171. spanElement.innerHTML = " \u00B7 ";
  172. nodeins.insertBefore(spanElement,aElement);
  173. }
  174. function ignoreLink(Element){
  175. Element.setAttribute('hasblock','yes');
  176. }
  177. checkDoc();