IMG.TG Discuz 论坛图片上传插件

Discuz 论坛快捷上传图片到 img.tg 并自动返回 BBCode 到文本框中。

  1. // ==UserScript==
  2. // @name IMG.TG Discuz 论坛图片上传插件
  3. // @namespace https://img.tg
  4. // @author Cee
  5. // @version 1.13
  6. // @license GPLv3
  7. // @description Discuz 论坛快捷上传图片到 img.tg 并自动返回 BBCode 到文本框中。
  8. // @grant none
  9. // @include *://www.hostloc.com/*
  10. // @include *://hostloc.com/*
  11. // @include *://keylol.com/*
  12. // @include *://www.right.com.cn/*
  13. // @include *://koolshare.cn/*
  14. // @include *://www.52pojie.cn/*
  15. // @include *://bbs.kafan.cn/*
  16. // @include *://loc.pages.dev/*
  17. // @connect *
  18. // @run-at document-start
  19. // ==/UserScript==
  20.  
  21.  
  22. (function(root){
  23. var nw = root.nw = {};
  24. var stack = [];
  25. var ArrayProto = Array.prototype, ObjProto = Object.prototype;
  26. var hasOwnProperty = ObjProto.hasOwnProperty;
  27.  
  28. var page = {
  29. addStyle : function(css){
  30. var el = document.createElement("style");
  31. el.innerHTML = css;
  32. document.getElementsByTagName('head')[0].appendChild(el);
  33. },
  34. addScript : function(script , pos){
  35. var el = document.createElement("script");
  36. el.textContent = script;
  37. if(typeof pos == 'object'){
  38. pos.appendChild(el);
  39. }
  40. else if(pos == 'head'){
  41. document.getElementsByTagName('head')[0].appendChild(el);
  42. }else{
  43. document.getElementsByTagName('body')[0].appendChild(el);
  44. }
  45. },
  46. addScriptLink : function( data , pos){
  47. var el = document.createElement("script");
  48. for(var i in data){
  49. el.setAttribute(i , data[i]);
  50. }
  51.  
  52. if(typeof pos == 'object'){
  53. pos.appendChild(el);
  54. }
  55. else if(pos == 'head'){
  56. document.getElementsByTagName('head')[0].appendChild(el);
  57. }else{
  58. document.getElementsByTagName('body')[0].appendChild(el);
  59. }
  60. },
  61. addHtml : function(dom){
  62. var el = document.createElement("dom");
  63. el.innerHTML = dom;
  64. document.getElementsByTagName('body')[0].appendChild(el);
  65. }
  66. };
  67.  
  68.  
  69. function $(e){
  70. return document.querySelector(e);
  71. }
  72. function $$(e){
  73. return document.querySelectorAll(e);
  74. }
  75.  
  76. function noop(){
  77.  
  78. }
  79.  
  80. function has(obj, key) {
  81. return obj != null && hasOwnProperty.call(obj, key);
  82. }
  83.  
  84. function key(obj){
  85. var k = [];
  86. for(var i in obj){
  87. if(has(obj , i)) k.push(i);
  88. }
  89. return k;
  90. }
  91.  
  92. function isString(v){
  93. return typeof v === 'string';
  94. }
  95.  
  96. function is(v , b){
  97. return ObjProto.toString.call(v) === "[object "+b+"]";
  98. }
  99.  
  100. function isArray(v){
  101. return is(v , 'Array');
  102. }
  103.  
  104. function isRegExp(v){
  105. return is(v , 'RegExp');
  106. }
  107.  
  108. function isObject(v){
  109. return is(v , 'Object');
  110. }
  111.  
  112. function isFunction(v){
  113. return is(v , 'Function');
  114. }
  115.  
  116. function create(expr , handler){
  117. if(expr && handler){
  118. stack.push({rule:expr , post:handler});
  119. }
  120. else{
  121. stack.push(expr);
  122. }
  123. }
  124.  
  125. function replace(str,obj , format){
  126. return str.replace(RegExp('(?:' + key(obj).join('|').replace(/([\:\'\)\(\{\}])/g,'\\$1') + ')','g') , function(match){
  127. return format ? format(obj[match]) : obj[match];
  128. });
  129. }
  130.  
  131. function toArray(a){
  132. return Array.prototype.slice.call(a);
  133. }
  134.  
  135. function formatLink(newurl , m){
  136. return newurl.replace(/\$(\d+)/g , function($0,$1){
  137. return m[$1];
  138. });
  139. }
  140.  
  141. function hit(obj){
  142. var ret = [];
  143. for(var i in stack){
  144. var rule = stack[i].rule;
  145. if( isRegExp(rule) ){
  146. var m = obj.url.match(rule);
  147. // console.log(stack[i].post,m)
  148. if( m ){
  149. if(isString(stack[i].post)){
  150. ret.push({
  151. redirect : formatLink(stack[i].post , toArray(m))
  152. });
  153. }else{
  154. ret.push({
  155. pre : stack[i].pre || noop,
  156. post : stack[i].post || noop,
  157. args : toArray(m)
  158. });
  159.  
  160. }
  161. }
  162.  
  163. }
  164. else if(isObject(rule)){
  165. var flag = true;
  166. var m = null, ret_t = {};
  167. for(var key in rule){
  168. m = obj[key].match(rule[key]);
  169. if(!m){
  170. flag = false;
  171. break;
  172. }else{
  173. if(m.length>1){
  174. ret_t[key] = toArray(m);
  175. }
  176. }
  177. }
  178. if(flag){
  179. ret.push({
  180. pre : stack[i].pre || noop,
  181. post : stack[i].post || noop,
  182. args : ret_t
  183. });
  184. }
  185. }
  186. else if(isFunction(rule)){
  187. if( rule() ){
  188. ret.push({
  189. pre : stack[i].pre || noop,
  190. post : stack[i].post || noop,
  191. args : {}
  192. });
  193. }
  194. }
  195. else if(isArray(rule)){
  196. var flag = false;
  197. for (var j = rule.length - 1; j >= 0; j--) {
  198. if(obj.url.match(rule[j])){
  199. flag = true;
  200. break;
  201. }
  202. }
  203. if(flag){
  204. ret.push({
  205. pre : stack[i].pre || noop,
  206. post : stack[i].post || noop,
  207. args : {}
  208. });
  209. }
  210. }
  211. }
  212. return ret;
  213. }
  214.  
  215. function init(){
  216. var loc = window.location;
  217.  
  218. var obj = {
  219. url : loc.href,
  220. scheme: loc.protocol.slice(0, -1),
  221. host: loc.hostname,
  222. port: loc.port,
  223. path: loc.pathname,
  224. search: loc.search,
  225. hash: loc.hash
  226. };
  227.  
  228. var handlers = hit(obj);
  229. if(handlers.length){
  230. handlers.forEach(function(handler){
  231. if(handler.redirect){
  232. open(handler.redirect);
  233. }
  234. else if(handler.pre) handler.pre(handler.args);
  235. });
  236. }
  237.  
  238. document.addEventListener('DOMContentLoaded' , function(){
  239. if(handlers.length){
  240. handlers.forEach(function(handler){
  241. if(handler.post) {
  242. console.log(handler.post)
  243. handler.post(handler.args);
  244. }
  245. });
  246. }
  247. })
  248. }
  249.  
  250. function monitor(tag , expr , callback){
  251. var d = tag.split(':');
  252. var evts = {
  253. 'removed':'DOMNodeRemoved',
  254. 'inserted':'DOMNodeInserted',
  255. 'modified':'DOMSubtreeModified'
  256. };
  257.  
  258. tag = d[0];
  259.  
  260. var evt = evts[d[1] || 'modified'];
  261.  
  262. var watch = d[2] === undefined ? false : true;
  263.  
  264. if(isFunction(expr)) {
  265. callback = expr;
  266. expr = null ;
  267. }
  268.  
  269. var matchSpan = function(target , t){
  270. var k = document.createElement('div');
  271. k.appendChild(target.cloneNode(false));
  272. var ret = k.querySelector(t);
  273. k = null;
  274. return ret;
  275. }
  276.  
  277. //return new promise(function(resolve, reject){
  278. var handler = function(event){
  279. var target = event.target;
  280. if(matchSpan(target , tag)){
  281. if(expr){
  282. var m = target.textContent.match(expr);
  283. if(m){
  284. if(callback) callback(m);
  285. if(!watch) document.removeEventListener(evt , handler);
  286. }
  287. }else{
  288. if(callback) callback(target);
  289. if(!watch) document.removeEventListener(evt , handler);
  290. }
  291. }
  292. };
  293. document.addEventListener(evt , handler);
  294. //});
  295. }
  296.  
  297. function open(url){
  298. open_direct(url);
  299. }
  300.  
  301. function open_direct(url){
  302. var link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
  303. link.href = url;
  304. link.click();
  305. }
  306.  
  307. nw.c = create;
  308. nw.m = monitor;
  309. nw.o = open;
  310.  
  311. nw.$ = $;
  312. nw.$$ = $$;
  313. nw.r = replace;
  314.  
  315. nw.init = init;
  316. nw.noop = noop;
  317.  
  318. nw.addStyle = page.addStyle;
  319. nw.addScript = page.addScript;
  320. nw.addScriptLink = page.addScriptLink;
  321. }(this));
  322.  
  323.  
  324. /**
  325. * Discuz image upload to imgtg.com
  326. *
  327. * Author: https://cee.im
  328. *
  329. */
  330.  
  331. nw.c([
  332. /loc\.pages\.dev\/thread/,
  333. /loc\.pages\.dev\/forum\.php\?mod=post/,
  334. /loc\.pages\.dev\/forum\.php\?mod=viewthread/,
  335.  
  336. /hostloc\.com\/thread/,
  337. /hostloc\.com\/forum\.php\?mod=post/,
  338. /hostloc\.com\/forum\.php\?mod=viewthread/,
  339.  
  340. /keylol\.com\/thread/,
  341. /keylol\.com\/forum\.php\?mod=post/,
  342. /keylol\.com\/forum\.php\?mod=viewthread/,
  343.  
  344. /right\.com\.cn\/thread/,
  345. /right\.com\.cn\/forum\.php\?mod=post/,
  346. /right\.com\.cn\/forum\.php\?mod=viewthread/,
  347.  
  348. /koolshare\.cn\/thread/,
  349. /koolshare\.cn\/forum\.php\?mod=post/,
  350. /koolshare\.cn\/forum\.php\?mod=viewthread/,
  351.  
  352. /52pojie\.cn\/thread/,
  353. /52pojie\.cn\/forum\.php\?mod=post/,
  354. /52pojie\.cn\/forum\.php\?mod=viewthread/,
  355.  
  356. /bbs\.kafan\.cn\/thread/,
  357. /bbs\.kafan\.cn\/forum\.php\?mod=post/,
  358. /bbs\.kafan\.cn\/forum\.php\?mod=viewthread/,
  359. ] , function(){
  360.  
  361. nw.addScriptLink({
  362. 'src' : 'https://img.tg/sdk/pup.discuz.js',
  363. });
  364. });
  365.  
  366. //==================================
  367. nw.init();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址