请选择 进入手机版 | 继续访问电脑版

北海实用推荐

搜索

联系客服

查看: 765|回复: 0

[Tampermonkey脚本JS] 知乎免登录

[复制链接]

141

主题

147

帖子

654

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
654
发表于 2017-12-9 19:05:34 | 显示全部楼层 |阅读模式
  1. // ==UserScript==
  2. // @namespace         https://github.com/tiansh
  3. // @name              Zhihu Visitor
  4. // @name:en           Zhihu Visitor
  5. // @name:zh           知乎免登录
  6. // @name:zh-CN        知乎免登录
  7. // @description       知乎免登录查看回答全文
  8. // @description:en    View zhihu.com answers without sign in
  9. // @description:zh    知乎免登录查看回答全文并显示更多回答
  10. // @description:zh-CN 知乎免登录查看回答全文并显示更多回答
  11. // @include           *://www.zhihu.com/*
  12. // @homepageURL       https://tiansh.github.io/us-else/zhihu_visitor/
  13. // @supportURL        https://github.com/tiansh/us-else/issues/
  14. // @version           3.3
  15. // @grant             GM_addStyle
  16. // @grant             GM_xmlhttpRequest
  17. // @connect-src       www.zhihu.com
  18. // ==/UserScript==

  19. var mina = function () {

  20.   // 这个脚本不对已经登录的做任何事情
  21.   if (function isLogin() {
  22.     return !document.querySelector('.js-signin-noauth');
  23.   }()) return;

  24.   // 基础工具

  25.   // 判断一个元素是否匹配特定选择器
  26.   var matches = (function () {
  27.     var ep = Element.prototype, matches = ep.matches ||
  28.       ep.mozMatchesSelector || ep.oMatchesSelector ||
  29.       ep.webkitMatchesSelector || ep.msMatchesSelector;
  30.     return function (element, selector) {
  31.       try { return matches.call(element, [selector]); }
  32.       catch (e) { return null; }
  33.     };
  34.   }());

  35.   // 找满足条件的父元素
  36.   var parent = function (element, selector) {
  37.     while (element && !matches(element, selector)) {
  38.       element = element.parentNode;
  39.     }
  40.     return element;
  41.   };

  42.   // 对象转请求参数
  43.   var param = function (data) {
  44.     return Object.keys(data).map(function (k) {
  45.       return encodeURIComponent(k) + '=' + encodeURIComponent(data[k]);
  46.     }).join('&');
  47.   };

  48.   // 样式

  49.   // 隐藏掉会员功能按钮
  50.   GM_addStyle(function () { /*!CSS
  51.     // 投票框的“赞同”“反对”等
  52.     .zm-votebar .label, .zm-votebar .vote-arrow, .zm-votebar .down, .zm-comment-form { display: none; }
  53.     .zm-votebar .count { top: 8px; }
  54.     .zm-votebar .up { height: 40px; }
  55.     .zm-votebar .up, .zm-votebar .down { cursor: auto; }
  56.     html.no-touch .zm-votebar .up:hover, html.no-touch .zm-votebar .down:hover, .zm-votebar .up.pressed, .zm-votebar .down.pressed { color: #698ebf; background: #eff6fa; }
  57.     .feed-item .zm-votebar { display: block; }
  58.     .zm-votebar::after { content: " "; height: 40px; width: 38px; display: block; margin-top: -40px; position: relative; }
  59.     // 回答下的按钮,感谢、没有帮助等
  60.     .meta-item[name="thanks"], .meta-item[name="share"], .meta-item[name="favo"], .meta-item[name="nohelp"], .meta-item[name="report"], .zm-meta-panel > .zg-bull { display: none !important; }
  61.     // 原生的显示全部按钮
  62.     .toggle-expand { display: none !important; }
  63.     // “更多”按钮按下时的样式
  64.     .zu-button-more:active { background: #ddd; box-shadow: none; cursor: auto; }
  65.     // 用户信息的私信与关注按钮,话题的关注按钮,问题的关注按钮
  66.     .zh-profile-card.member .operation,
  67.     .zh-profile-card.topic .operation,
  68.     #zh-question-side-header-wrap .follow-button { display: none; }
  69.     // 长答案
  70.     .zh-summary + .zm-editable-content { display: block !important; }
  71.   */ }.toString().replace(/\r\n|\r/g, '\n').replace(/\n\s*\/\/.*\n/g, '\n').replace(/(^.*\n)|(\n.*$)/g, ''));

  72.   // 自动处理回答
  73.   var fixAnswers = (function () {
  74.     var handlers = [];
  75.     var observe = function () {
  76.       var fixed = [].slice.call(document.querySelectorAll([
  77.         '.zm-item-answer + .zm-item-answer .zm-item-rich-text:not([zvhfs])',
  78.         '.awesome-answer-list .zm-item-rich-text:not([zvhfs])'
  79.       ].join(',')), 0);
  80.       fixed.forEach(function (item) {
  81.         item.setAttribute('zvhfs', '');
  82.         handlers.forEach(function (f) { f(item); });
  83.       });
  84.     };
  85.     var observer = new MutationObserver(observe);
  86.     observer.observe(document.body, { 'childList': true, 'subtree': true });
  87.     return function fixAnswers(callback) { handlers.push(callback); };
  88.   }());

  89.   // 全局处理点击事件
  90.   var handleClick = (function () {
  91.     var handlers = [];
  92.     document.addEventListener('click', function (e) {
  93.       if (e.which !== 1) return;
  94.       var matched = false, target = e.target, callbacks = [];
  95.       handlers.forEach(function (handler) {
  96.         if (!matches(target, handler.selector)) return;
  97.         matched = true; callbacks.push(handler.callback);
  98.       });
  99.       if (matched) { e.preventDefault(); e.stopPropagation(); }
  100.       callbacks.forEach(function (f) { f(e); });
  101.     }, true);
  102.     return function handleClick(selector, callback) {
  103.       handlers.push({ 'selector': selector, 'callback': callback });
  104.     };
  105.   }());

  106.   // 显示回答的评论
  107.   handleClick(['.zh-question-answer-wrapper:not(.autohide-false) .zm-item-answer[data-aid] .toggle-comment',
  108.     '.awesome-answer-list .zm-item-answer[data-aid] .toggle-comment'].join(','),
  109.   function showComment(e) {
  110.     var ans = parent(e.target, '[data-aid]');
  111.     // 避免显示多个评论
  112.     if (ans.hasAttribute('data-cmtshown')) return;
  113.     ans.setAttribute('data-cmtshown', '');
  114.     // 显示评论
  115.     var id = ans.getAttribute('data-aid');
  116.     var metaPanel = ans.querySelector('.zm-meta-panel');
  117.     metaPanel.className = 'zm-meta-panel goog-scrollfloater focusin';
  118.     var commentBox = document.createElement('div');
  119.     commentBox.innerHTML = '<div class="zm-comment-box" style=""><i class="icon icon-spike zm-comment-bubble"></i><div class="zm-comment-spinner">正在加载,请稍等 <i class="spinner-lightgray"></i></div></div>';
  120.     commentBox = metaPanel.parentNode.insertBefore(commentBox.firstChild, metaPanel.nextSibling);
  121.     GM_xmlhttpRequest({
  122.       'method': 'GET',
  123.       'url': location.protocol + '//www.zhihu.com/node/AnswerCommentBoxV2?params={%22answer_id%22%3A%22' + id + '%22%2C%22load_all%22%3Afalse}',
  124.       'onload': function (resp) {
  125.         commentBox.outerHTML = resp.responseText;
  126.         var loadmore = ans.querySelector('.load-more');
  127.         if (loadmore) {
  128.           loadmore.href = ans.querySelector('.answer-date-link').href;
  129.           loadmore.target = '_blank';
  130.         }
  131.       },
  132.     });
  133.   });

  134.   // 显示回答时修复回答中的一些链接什么的
  135.   fixAnswers(function fixImages(ans) {
  136.     // 解决图片延迟加载问题
  137.     var imgs = ans.querySelectorAll('img[data-actualsrc]');
  138.     Array.prototype.forEach.call(imgs, function (img) {
  139.       img.setAttribute('src', img.getAttribute('data-actualsrc'));
  140.     });
  141.   });

  142.   // “添加评论”字样改成“0 条评论”
  143.   fixAnswers(function fixAddComment(content) {
  144.     var comment = parent(content, '.zm-item-answer').querySelector('.meta-item[name="addcomment"]').lastChild;
  145.     var text = comment.textContent, re = text.replace('添加评论', '0 条评论');
  146.     if (re !== text) comment.textContent = re;
  147.   });

  148.   // 显示更多回答
  149.   handleClick('.zu-button-more', (function () {
  150.     // 显示一条回答
  151.     var show = function (ans) {
  152.       var lastAnswer = document.querySelectorAll('.zm-item-answer');
  153.       lastAnswer = lastAnswer[lastAnswer.length - 1];
  154.       var ref = lastAnswer.nextSibling;
  155.       var newAnswerWrap = document.createElement('div');
  156.       newAnswerWrap.innerHTML = ans;
  157.       var newAnswer = newAnswerWrap.firstChild;
  158.       ref.parentNode.insertBefore(newAnswer, ref);
  159.     };

  160.     // 已经没有更多的回答了
  161.     var nomore = function () {
  162.       var button = document.querySelector('.zu-button-more');
  163.       button.parentNode.removeChild(button);
  164.     };

  165.     // 处理显示更多回答的按钮
  166.     return function showMoreButton(e) {
  167.       var button = e.target;
  168.       if (button.classList.contains('loading')) return;
  169.       button.classList.add('loading');

  170.       var offset = document.querySelectorAll('.zm-item-answer').length;
  171.       var pagesize = 20;
  172.       var url_token = Number(location.pathname.match(/\/(\d+)$/)[1]);
  173.       var params = JSON.stringify({
  174.         'url_token': url_token,
  175.         'pagesize': pagesize,
  176.         'offset': offset,
  177.       });

  178.       var _xsrf = document.querySelector('input[name="_xsrf"]').value;

  179.       var data = {
  180.         '_xsrf': _xsrf,
  181.         'method': 'next',
  182.         'params': params
  183.       };

  184.       GM_xmlhttpRequest({
  185.         'method': 'POST',
  186.         'url': location.protocol + '//www.zhihu.com/node/QuestionAnswerListV2',
  187.         'headers': {
  188.           'Referer': location.href,
  189.           'Content-Type': 'application/x-www-form-urlencoded',
  190.         },
  191.         'data': param(data),
  192.         'onload': function (response) {
  193.           var resp = JSON.parse(response.responseText);
  194.           resp.msg.forEach(show);
  195.           if (resp.msg.length < 20) nomore();
  196.           button.classList.remove('loading');
  197.         },
  198.         'onerror': function () {
  199.           button.classList.remove('loading');
  200.         }
  201.       });
  202.     };
  203.   }()));

  204. };

  205. if (['complete', 'loaded', 'interactive'].indexOf(document.readyState) !== -1) mina();
  206. else window.addEventListener('DOMContentLoaded', mina);
复制代码
  1. // ==UserScript==
  2. // @name                知乎免登录
  3. // @description         并且去掉链接跳转。
  4. // @author              Damn
  5. // @namespace           incast.info
  6. // @run-at              document-start
  7. // @include             http://*.zhihu.com/*
  8. // @include             https://*.zhihu.com/*
  9. // @match               http://*.zhihu.com/*
  10. // @match               https://*.zhihu.com/*
  11. // @date                18/12/2016
  12. // @version             2.0.4
  13. // ==/UserScript==

  14. if(location.href=="https://www.zhihu.com/"){location.href="https://www.zhihu.com/explore";}
  15. document.addEventListener('DOMContentLoaded',proceed());
  16. var mo=new MutationObserver(function(){proceed();});
  17. mo.observe(document,{'childList':true,'subtree':true});
  18. function proceed(){
  19. (function(){
  20.         if(document.body){
  21.                 function treat(that){
  22.                         var targets = document.querySelectorAll(that);
  23.                         if(targets.length>0){
  24.                                 [].forEach.call(targets,function(node){
  25.                                         node.style.display="none";
  26.                                         console.log(that);
  27.                                 });
  28.                         }
  29.                 }
  30.                 treat("div.zm-editable-editor-wrap");
  31.                 treat("div.zu-editable-editor-wrap");
  32.                 treat("ul.topnav-noauth");
  33.                 treat("#SidebarSignFlow");
  34.                 treat("#zu-top-add-question");
  35.                 treat("#zh-top-nav-topic");
  36.                 treat("#zh-footer");
  37.                 treat("div.DownloadApp");
  38.                 treat("button[class^='_CommentItem']:not([class^='_CommentItem_openConversations'])");
  39.                 if(document.querySelectorAll('a.zu-button-more').length>0){document.querySelectorAll('a.zu-button-more')[0].outerHTML="<hr>";}
  40.                 [].forEach.call(document.querySelectorAll('a[href="/"]'),function(node){node.href="/explore";});
  41.                 [].forEach.call(document.querySelectorAll('div.conpulsory-login-mask'),function(node){node.parentNode.style.height="";node.style.display='none';});
  42.                 [].forEach.call(document.querySelectorAll('a.external'),function(node){if(node.href.indexOf("target")>0){node.href=decodeURIComponent(node.href.slice(node.href.indexOf("target")+7));}});
  43.                 [].forEach.call(document.querySelectorAll('a.meta-item'),function(node){if(node.innerHTML.indexOf('添加评论')>0){node.outerHTML='<label class="meta-item">暂无评论</label>';} if((node.className.indexOf('toggle-comment')<0)*(node.className.indexOf('answer-date-link')<0)){node.style.display='none';}});
  44.                 [].forEach.call(document.querySelectorAll('a.action-item'),function(node){if(node.className.indexOf('js-toggleCommentBox')<0){node.style.display='none';}});
  45.                 [].forEach.call(document.querySelectorAll('button[class^="FeedbackButton"]'),function(node){node.parentNode.style.display='none';});
  46.                 [].forEach.call(document.querySelectorAll('button[class^="follow-button"]'),function(node){node.parentNode.style.display='none';});
  47.                 [].forEach.call(document.querySelectorAll('#SidebarSignFlow'),function(node){node.parentNode.style.display='none';});
  48.                 [].forEach.call(document.querySelectorAll('div.zm-comment-ft'),function(node){[].forEach.call(node.childNodes,function(cht){if(cht.nodeName=="A"){cht.style.display='none';}});});
  49.         }
  50. })()
  51. }
复制代码


请关注公众号:“北海实用推荐”,期待我们下次更新。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|北海实用推荐 ( 桂ICP备15001999号-2  

GMT+8, 2018-7-23 01:55 , Processed in 1.029682 second(s), 10 queries , Xcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表