// ==UserScript== // @name AcFun Area 63 Mobile // @namespace http://tampermonkey.net/ // @version 0.22 // @description 在手机版文章区添加简单的评论区、夜间模式等BUG // @author Approved233 // @icon https://cdn.aixifan.com/ico/favicon.ico // @match *://m.acfun.cn/v/?ac=* // @match *://m.acfun.cn/list/* // @require https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.min.js // @require https://cdn.jsdelivr.net/npm/xhook@1.4.9/dist/xhook.min.js // @require https://cdn.jsdelivr.net/npm/xss@1.0.3/dist/xss.min.js // @grant GM_xmlhttpRequest // @grant GM_addStyle // @run-at document-start // @downloadURL https://update.greasyfork.icu/scripts/381891/AcFun%20Area%2063%20Mobile.user.js // @updateURL https://update.greasyfork.icu/scripts/381891/AcFun%20Area%2063%20Mobile.meta.js // ==/UserScript== var remoteScript = unsafeWindow.document.createElement('script'); remoteScript.src = 'https://cdn.jsdelivr.net/npm/xhook@1.4.9/dist/xhook.min.js?ts='+(+new Date()); remoteScript.defer = true; remoteScript.onload = ()=>{ xhook.before(function (handler) { handler.url = handler.url.replace('http:', 'https:'); console.log(handler); }); }; document.body.appendChild(remoteScript); function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } function hook() { if(!unsafeWindow.Zepto) return false; try{ unsafeWindow.$.ajax = function(options) { console.log('hooked $.ajax for', options.url); if(options.url) options.url = options.url.replace('http:', 'https:'); return jQuery.ajax(Object.assign({}, options)); }; return true; }catch(e){ } return false; } let canHook = false; let intervalId; intervalId = setInterval(()=>{ if(hook()){ canHook = true; } }, 1); (async ()=>{ while(!canHook){ await sleep(1); } GM_xmlhttpRequest({ method: 'GET', headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36", }, url: `http://down.hualuoo.com:66/%E7%A7%81%E4%BA%BA%E4%BA%91/fangsi/acfun/dark.css?_=${GM_info.script.version}`, onload: function (res) { GM_addStyle(res.responseText); } }); if(unsafeWindow.location.pathname === '/list/'){ let system = unsafeWindow.system, a = system.handle, n = system.func, $ = unsafeWindow.$, $$ = unsafeWindow.$$; n.getList = function(e) { var t, s, l, i; switch (l = { sort: 4, pageNo: 1, pageSize: 20 }, $.extend(l, e), !1) { case !($.inArray(a.channelId, function() { var e, n, s, l; for (s = a.channelList, l = [], e = 0, n = s.length; e < n; e++) t = s[e], l.push(t.id); return l }()) > -1): l.parentChannelId = a.channelId; break; default: l.channelIds = isNaN(a.channelId) ? 1 : a.channelId } return (a.sort || config.channel.sort) && (l.sort = a.sort || config.channel.sort), $$("#loading ").html('正在加载数据...').addClass("active"), $.inArray(a.channelId, a.alist) !== -1 && 71 !== a.channelId ? (a.type = "article", $$("#stage").addClass("article"), i = s = '
[comms]评论

[title]

[desc]

') : (a.type = "video", $$("#stage").removeClass("article"), s = '

[title]

UP主:[name]

' + ("article" === a.type ? "点击" : "播放") + ':[views]

', i = '

[title]

UP主:[name]

' + ("article" === a.type ? "点击" : "播放") + ':[views]

'), n.getListData(l).done(function(e) { var t, c, o, r, d, h, m, u, g, p, f, v, I, w, b, N, y, C, _; if (200 === e.code) { if ($$("#stage").hasClass("loading") && $$("#stage").removeClass("loading"), l.recommendSize && e.data.recommendPage && (w = e.data.recommendPage.list, $.isArray(w) && w.length)) { for (b = "", u = h = 0, g = w.length; h < g; u = ++h) t = w[u], t.comments > 9999 && (t.comments = 9999), r = t.contentId.replace("ac", ""), _ = "/v/ac" + r, $.inArray(t.channelId, a.alist) !== -1 && (_ = "/a/ac" + r), C = "/v/?ac=" + r, $.os.wp && $.browser.ie && (C = _), b += i.replace(/\[comms\]/g, "article" === a.type ? t.comments : "").replace("[url]", C).replace("[id]", r).replace("[ac]", r).replace("[num]", u).replace("[image]", $.parseSafe(t.cover)).replace("[title]", $.parseSafe(t.title)).replace("[name]", $.parseSafe(t.user.username)).replace("[views]", $.parsePts(t.views)).replace("[time]", $.parseTime(t.releaseDate)).replace("[ccomms]", t.comments > 999 ? "c" : "a").replace("[desc]", $.parseSafe(null != (N = t.description) ? N.slice(0, 25) : void 0)); $$("#recom .mainer").html(b) } if (o = e.data, f = o.list, $.isArray(f) && f.length) { for (a.totalPageCount || (a.totalPageCount = parseInt(o.totalCount / o.pageSize) + 1), d = "", u = m = 0, p = f.length; m < p; u = ++m) c = f[u], r = c.contentId.replace("ac", ""), C = "/v/?ac=" + r, _ = "/v/ac" + r, $.inArray(c.channelId, a.alist) !== -1 && (_ = "/a/ac" + c.contentId), $.os.wp && $.browser.ie && (C = _), "video" === a.type && (a.contentCount++, I = { id: "cover-" + a.contentCount, img: $.parseSafe(c.cover) }, a.contentList.push(I)), c.comments > 9999 && (c.comments = 9999), d += s.replace(/\[comms\]/g, "article" === a.type ? c.comments : "").replace("[url]", C).replace("[id]", r).replace("[ac]", r).replace("[num]", u).replace("[title]", $.parseSafe(c.title)).replace("[name]", $.parseSafe(c.user.username)).replace("[views]", $.parsePts(c.views)).replace("[time]", $.parseTime(c.releaseDate)).replace("[ccomms]", c.comments > 999 ? "c" : "a").replace("[coverid]", "cover-" + a.contentCount).replace("[desc]", $.parseSafe(null != (y = c.description) ? y.slice(0, 50) : void 0)); return $$("#content .mainer").append('
' + d + "
"), $$("#stage").hasClass("loading") && $$("#stage").removeClass("loading"), a.totalPage > 4 && !$.browser.ie && ( v = window.pageYOffset - a.partHeight), a.firstList ? ($("#btn-more-list").length || $$("#content").append('
'), a.scrollStarted || n.handleScroll(), a.flagMoreList = !1, a.firstList = !1, a.partHeight = $$("#content .mainer").find(".part").height() + 12) : a.flagMoreList = !0, a.pageNo++, a.totalPage++, $$("#loading").removeClass("active"), n.loadImage() } return a.firstList && $("#btn-more-list").length && $("#btn-more-list").hide(), $$("#loading").text("没有更多结果了。") } }).fail(function() { return $$("#loading").html('加载失败(つд⊂)重试'), a.flagMoreList = !0 }) } return; } let urlParams = new URLSearchParams(unsafeWindow.location.search); let acId = urlParams.get('ac'); unsafeWindow.acInvoke.jumpToApp = () => { console.log('hooked jumpToApp'); }; $('.gradient').click(); $('.comment-img').remove(); $('.comment-title').parent().append('
'); $('').appendTo('head').attr({ type: 'text/css', rel: 'stylesheet', href: '//cdn.aixifan.com/acfun-pc/2.5.98/css/comm-floor.min.css' }); $('.to-app-region').each(function() { $(this).insertAfter($(this).parent().find('.content')); }); let regex = /globalConfig\s+=\s+([^}]+})/g; let currentPage, isLoading; GM_xmlhttpRequest({ method: 'GET', headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36", }, url: `https://www.acfun.cn/a/ac${acId}`, onload: function (res) { let html = res.responseText.replace(/\n/g, ' '); $('head').append(``); fetchComment(1); $(window).scroll(function() { if($(window).scrollTop() + $(window).height() == $(document).height()) { fetchComment(currentPage + 1); } }); } }); function fetchComment(page){ if(isLoading) return; currentPage = page; isLoading = true; GM_xmlhttpRequest({ method: 'GET', headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36", }, url: `https://www.acfun.cn/rest/pc-direct/comment/listByFloor?sourceId=${acId}&sourceType=1&page=${currentPage}`, responseType: 'json', onload: function (res) { isLoading = false; let comments = parseFloorList(res.response.commentIds, res.response.commentsMap); buildCommentArea(comments) } }); } function parseFloorList(commentIds, commentsMap){ let alreadyParse = [], finalFloors = []; let maxStacks = 2000; for(let cid of commentIds){ let comment = commentsMap[`c${cid}`]; alreadyParse.push(comment.cid); let r = [{ comment: comment, isRepeated: false, isMainComment: true, isParallel: false }]; let quoteId = comment.quoteId; for(let stack = 0; stack < maxStacks; stack++){ let quoteComment = commentsMap[`c${quoteId}`] if(!quoteComment) break; r.push({ comment: quoteComment, isRepeated: alreadyParse.indexOf(quoteId) >= 0, isMainComment: false, isParallel: stack > 10 }); quoteId = quoteComment.quoteId; } finalFloors.push(r); } return finalFloors; } function buildCommentArea(comments){ let list = $('.comment-list'); comments.forEach(comment => { for(let i in comment){ let subComment = comment[i]; if(i == 0) list.append(buildComment(subComment.comment)); // else { // if(subComment.isRepeated){ // var d = new s(o).getQuotedComment(); // o.isParallel ? i.getNode().before(d.getNode()) : i.getNode().prepend(d.getNode()), // i = d // } // } } }) } function buildComment(comment){ return $('
').addClass('main-comment-item').append($('
  • ').addClass('avatar').append(buildAvatar(comment))).append($('
  • ').addClass('content').append(buildBasicComment(comment))); } function buildBasicComment(comment){ return $('
    ').addClass('comment-item').attr({ 'data-cid': comment.cid }).append(buildNameBar(comment)).append(buildContent(comment)); //, buildContent(comment), buildFooter(comment) } function buildNameBar(comment){ let name = filterXSS(comment.userName), verifiedHtml = ""; if(comment.verified != 0){ let verifiedTitle = ""; switch(comment.verified){ case 1: verifiedTitle = '猴子'; break; case 2: verifiedTitle = '猴山官方认证'; break; case 3: verifiedTitle = '猴山认证' break; } verifiedHtml = `
  • ` } let numberFloorHtml = `
  • #${comment.floor}
  • `; let nameColor = ""; switch(comment.nameRed){ case 1: case 10: nameColor = 'nameRed'; break; case 9: nameColor = 'nameOrange'; break; case 8: nameColor = 'namePurple'; break; } let nameHtml = `
  • ${name}
  • `; return $(`
    `); } function buildContent(comment){ let parseContent = (content = comment.content)=>{ let c = content; c = c.search(/(?:\[[^\]]*?\[)|(?:\][^\[]*?\])/) ? c : c.replace(/\[.*?\]/g, "").replace(/\[|\]/g, ""); c = c.replace(/&/g, "&").replace(/ /g, " ").replace(/'/g, "'").replace(/("|")/g, '"').replace(/>/g, ">").replace(/</g, "<").replace(//g, "").replace(/((\s| )*\r?\n){3,}/g, "\r\n\r\n").replace(/^((\s| )*\r?\n)+/g, "").replace(/((\s| )*\r?\n)+$/g, ""); c = c.replace(/\[p\]/g, "

    ").replace(/\[\/p\]/g, "

    "); c = c.replace(/\[ac\=(\S+?)\](\S+?)\[\/ac\]/g, '$2').replace(/\[aa\=(\S+?)\](\S+?)\[\/aa\]/g, '$2').replace(/\[sm\=(\S+?)\](\S+?)\[\/sm\]/g, '$2').replace(/\[email\](\S+?)\[\/email\]/g, '').replace(/\[wiki\=(\S+?)\](\S+?)\[\/wiki\]/g, '$2'); c = c.replace(/\[emot\=(\S+?)\,(\S+?)\/\]/g, '') c = c.replace(/\[acimg.*?\](.*?)\[\/acimg\]/g, ''); c = c.replace(/\[img\](\S+?)\[\/img\]/g, '').replace(/\[img\=(\S+?)\](\S+?)\[\/img\]/g, function(t, e, i) { var n, o; return n = i.replace(/javascript(:|\s+:)/gi, ""), o = n.match(/.*(acfun.tv|acfun.cn|tudou.acfun.com)/) ? "" : n, '' }), c = c.replace(/\[at\]([\s\S]+?)\[\/at\]/g, '@$1').replace(/\[\/?back.*?\]/g, "").replace(/\[username\]([\s\S]+?)\[\/username\]/g, '$1').replace(/\[.*?\]/g, "").replace(/([\s\W\_])[o|O][n|N]\w+?\s*?\=/g, "$1data-event="), $.trim(content), c = c.replace(/&/g, "&").replace(/[/g, "[").replace(/]/g, "]") return c; } return $(`
    ${parseContent()}
    `) } function buildAvatar(comment){ let defaultAvatar = `${unsafeWindow.globalConfig.oldPath}/style/image/avatar.jpg`, avatar = defaultAvatar; if(comment.headUrl && comment.headUrl.length > 0) avatar = comment.headUrl[0].url; let node = $('').addClass('avatar'); let avatarNode = $('').attr({ class: 'avatar', src: avatar, 'data-name': comment.userName }); avatarNode.one("error", function() { $(this).attr("src", defaultAvatar); }); node.append(avatarNode); if(comment.avatarFrame) node.append($('').addClass('avatar-bg').attr({ src: comment.avatarImage })) return node; } })();