Greasy Fork is available in English.

V2EX增强插件

一些增强功能

  1. // ==UserScript==
  2. // @name V2EX增强插件
  3. // @description 一些增强功能
  4. // @namespace yfmx746qpx8vhhmrgzt9s4cijmejj3tn
  5. // @icon http://ww1.sinaimg.cn/large/4ec98f50jw1e85azvlnh9j206y06y3ye.jpg
  6. // @author me
  7. // @match https://*.v2ex.com/*
  8. // @match https://v2ex.com/*
  9. // @version 2024.12.19
  10. // @grant none
  11. // ==/UserScript==
  12.  
  13. // 2024.03.08 新消息界面,回复提醒对比感谢提醒更加醒目
  14. // 2024.02.27 回复框增加快捷回复,建议广告贴发在推广节点
  15. // 2024.01.16 新消息界面,显示消息序号,页码链接显示序号范围
  16. // 2024.01.08 更新管理员列表,标记回帖中漏标记的管理员
  17. // 2023.12.27 避免链接转图片的大小超出布局
  18. // 2021.11.26 账户余额页面增加签到页面链接
  19. // 2020.10.19 首页增加全文搜索链接
  20. // 2020.10.10 解决由于改版导致的定位错误导致无法签到问题
  21. // 2019.10.25 解决Safari不能重加载新浪图片
  22. // 2019.08.01 修正帖子tag区域的链接转图片误判
  23. // 2019.05.12 新浪的图片反防盗链
  24. // 2017.05.16 由于存储数据出错,改变存储数据的方式
  25. // 2016.09.21 修复发帖页面判断用户名出错的情况
  26. // 2016.09.14 修正判断登录状态逻辑
  27. // 2016.05.25 链接自动转图片
  28. // 2016.05.21 新增召唤/呼叫管理员
  29. // 2016.05.09 Webkit内核允许修改回复框高度
  30. // 2016.04.12 在回复时可@所有人
  31. // 2015.10.16 新增在回复中标记楼主
  32. // 2015.03.22 尝试修正未知原因情况下导致的签到失败。
  33. // 2015.02.07 解决JQuery库在某种情况可能会无法载入
  34. // 2014.10.07 某种情况下会产生cookie重复赋值,增加清理补丁。
  35. // 2014.10.06 cookie信息过期时间改为3天
  36.  
  37.  
  38. //签到
  39. setTimeout(function(){
  40. var load, execute, loadAndExecute;
  41. load = function(a, b, c) {
  42. var d;
  43. d = document.createElement("script"), d.setAttribute("src", a), b != null
  44. && d.addEventListener("load", b), c != null && d.addEventListener("error", c), document.body.appendChild(d);
  45. return d;
  46. }, execute = function(a) {
  47. var b, c;
  48. typeof a == "function" ? b = "(" + a + ")();" : b = a, c = document.createElement("script"), c.textContent = b, document.body.appendChild(c);
  49. return c;
  50. }, loadAndExecute = function(a, b) {
  51. return load(a, function() {
  52. return execute(b);
  53. });
  54. };
  55.  
  56. loadAndExecute("https://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.0.min.js", function() {
  57. if ( $("a[class='balance_area']").length > 0 && $("a[href='/settings']").length > 0 ) {
  58. var uid=$.find('a[href^="/member/"]')[0].innerHTML;//用户名
  59. var dateinfo=new Date().getUTCDate();//获得GMT时间今天几号
  60. var SigninInfo=uid + ":" + dateinfo + "";
  61. var daily = $('input[id="search"]');
  62. if (daily.length && localStorage.SigninInfo != SigninInfo ) {
  63. $.ajax({url:"/"});
  64. daily.val("正在检测每日签到状态...");
  65. $.ajax({
  66. url: "/mission/daily",
  67. success: function(data) {
  68. var awards = $(data).find('input[value^="领取"]');
  69. if (awards.length) {
  70. // daily.val("正在" + awards.attr("value") + "...");
  71. daily.val("正在领取今日的登录奖励......");
  72. $.ajax({
  73. url: awards.attr('onclick').match(/(?=\/).+?(?=\')/),
  74. success: function(data) {
  75. daily.val("正在提交...");
  76. var days=data.split("已连续登")[1].split(" ")[1];
  77. if ( $('a[href="/mission/daily"]').length==1 ) {$('a[href="/mission/daily"]').parent().parent().fadeOut(3000);}
  78. $.ajax({
  79. url: "/balance",
  80. success: function(data) {
  81. function p(s) {return s < 10 ? '0' + s: s;} //自动补0
  82. var date2="" + new Date().getUTCFullYear() + p(new Date().getUTCMonth()+1) +p(new Date().getUTCDate());
  83. if (data.indexOf(date2+" 的每日登录奖励")!="-1") {
  84. daily.val( "已连续领取" + days + "天,本次领到" + data.split("每日登录")[2].split(" ")[1] + "铜币" );
  85. localStorage.SigninInfo = SigninInfo;
  86. } else {
  87. daily.val( "自动领取遇到意外,你可以试试手动领。" );
  88. }
  89. }
  90. });
  91. },
  92. error: function() {
  93. daily.val("网络异常 :(");
  94. }
  95. });
  96. }else{
  97. if (data.indexOf("已领取") != -1) {
  98. daily.val("今日奖励领取过了");
  99. localStorage.SigninInfo = SigninInfo;
  100. } else {
  101. daily.val("无法辩识领奖按钮 :(");
  102. }
  103.  
  104. }
  105. },
  106. error: function() {
  107. daily.val("请手动领取今日的登录奖励!");
  108. }
  109. });
  110. } else {
  111. //console.log("");
  112. }
  113. }
  114. });
  115. //
  116.  
  117. //帖子标记个别没有自动标记的管理员,回复所有人
  118. if (location.href.indexOf("/t/") != -1) {
  119. (function (){
  120. var modarr=["Livid","Kai","Olivia","GordianZ","sparanoid","Tink"];
  121. var modlist="@"+modarr.join(" @");//生成@所有管理员的列表
  122. var uname=document.getElementById("Rightbar").getElementsByTagName("a")[0].href.split("/member/")[1];//自己用户名
  123. //标记管理员,预存回复用户名列表
  124. var lzname=document.getElementById("Main").getElementsByClassName("avatar")[0].parentNode.href.split("/member/")[1];
  125. var allname='@'+lzname+' ';
  126. var all_elem = document.querySelectorAll('a[href^="/member"].dark');
  127. for(var i=0; i<all_elem.length; i++) {
  128. if (modlist.indexOf(all_elem[i].innerHTML)!= -1){
  129. if (document.getElementsByClassName("badges")[i].innerHTML.indexOf("mod") == -1){
  130. document.getElementsByClassName("badges")[i].innerHTML+='<div class="badge mod">MOD</div>';
  131. }
  132. }
  133. //为回复所有人做准备
  134. if ( uname != all_elem[i].innerHTML && all_elem[i].href.indexOf("/member/") != -1
  135. && all_elem[i].innerText == all_elem[i].innerHTML && allname.indexOf('@'+all_elem[i].innerHTML+' ') == -1 ) {
  136. allname+='@'+ all_elem[i].innerHTML+' ';
  137. }
  138. }
  139.  
  140.  
  141. if ( document.getElementById("reply_content") ) {
  142. document.getElementById("reply_content").parentNode.innerHTML
  143. +="&nbsp;&nbsp;&nbsp;&nbsp;<a href='javascript:;' onclick='if ( document.getElementById(\"reply_content\").value.indexOf(\""
  144. +allname+"\") == -1 ) {document.getElementById(\"reply_content\").value+=\"\\r\\n"+allname+"\"}'>@所有人</a>";
  145. if ( document.body.style.WebkitBoxShadow !== undefined ) {
  146. //允许调整回复框高度
  147. document.getElementById("reply_content").style.resize="vertical";
  148. }
  149. document.getElementById("reply_content").style.overflow="auto";
  150.  
  151. document.getElementById("reply_content").parentNode.innerHTML
  152. +="&nbsp;&nbsp;&nbsp;&nbsp;<a href='javascript:;' onclick='if ( document.getElementById(\"reply_content\").value.indexOf(\""
  153. +modlist+"\") == -1 ) {document.getElementById(\"reply_content\").value+=\"\\r\\n"+modlist+"\"}'>@管理员</a>";
  154. }
  155. })();
  156. }
  157. //
  158.  
  159. // 帖子回复框增加快捷回复,提示广告贴应发在推广节点
  160. if (location.href.indexOf("/t/") != -1) {
  161. (function(){
  162. document.getElementById("reply_content").parentNode.innerHTML
  163. +="&nbsp;&nbsp;&nbsp;&nbsp;<a href='javascript:;' onclick='document.getElementById(\"reply_content\").value+=\"\\r\\n"+"广告和推广主题应该发在推广节点。"+"\"'>报告广告贴</a>";
  164. })()
  165. }//
  166.  
  167. // 图片链接自动转换成图片 代码来自caoyue@v2ex
  168. (function (){
  169. var links = document.links;
  170. for (var i=0;i<links.length;i++){
  171. var link = links[i];
  172. if (/^http.*\.(?:jpg|jpeg|jpe|bmp|png|gif)/i.test(link.href)
  173. && !/<img\s/i.test(link.innerHTML) && link.href.indexOf("v2ex.com/tag")==-1){
  174. link.innerHTML = "<img title='" + link.href + "' src='" + link.href + "' style='max-width:98%' />";
  175. }
  176. }
  177. })();
  178. //
  179.  
  180. //新浪图床的图片反防盗链
  181. (function (){
  182. var images = document.images;
  183. for (var i=0;i<images.length;i++){
  184. var image = images[i];
  185. if ( image.src && image.src.indexOf(".sinaimg.cn")!=-1 &&image.src.indexOf(".sinaimg.cn")<13 ) {
  186. image.setAttribute("referrerPolicy","no-referrer");
  187. image.src=image.src + "?";
  188. }
  189. }
  190. })();
  191. //
  192.  
  193. // 首页增加全文搜索链接
  194. if ( location.href.split("v2ex.com")[1] == "/" && $('div[id="SecondaryTabs"]').length > 0 ) {
  195. document.getElementById("SecondaryTabs").innerHTML+='&nbsp;&nbsp;&nbsp;&nbsp;<a href="https://www.sov2ex.com/" title="第三方全文搜索">全文搜索</a>'
  196. document.getElementById("SecondaryTabs").innerHTML+='&nbsp;&nbsp;&nbsp;&nbsp;<a href="/changes" title="所有节点最新100帖">最新</a>'
  197. }
  198. //
  199.  
  200. // 在账户余额界面/明细界面的上方增加签到页面链接
  201. if ( location.href.indexOf("/balance") != -1 && document.getElementsByClassName("tab").length > 0) {
  202. document.getElementsByClassName("tab")[0].parentNode.innerHTML+='<a class="tab" href="/mission/daily" >签到</a>'
  203. }
  204. //
  205.  
  206. // 新消息界面,显示消息序号,页码链接显示序号范围
  207. if (location.href.indexOf("/notifications") != -1){
  208. (function(){
  209. var page_index=new URL(window.location.href).searchParams.get('p');
  210. var before_index=0;
  211. if(page_index!=null){
  212. before_index=(page_index-1)*50;
  213. }
  214. document.querySelectorAll("a[onclick^=delete]").forEach((ele,i)=>{
  215. var index_ele=document.createElement("span");
  216. index_ele.innerText=(i+1+before_index)+". ";
  217. ele.parentElement.insertBefore(index_ele,ele.parentElement.firstElementChild)
  218. })
  219. var allmsgcount=document.querySelectorAll(".header .gray")[0].innerText;//消息总数
  220. document.querySelectorAll(".page_current,.page_normal").forEach((ele)=>{
  221. var index_a=(ele.innerText-1)*50+1;
  222. var index_b=(ele.innerText-1)*50+50;
  223. var title_str=index_a+"-"+index_b;
  224. if(allmsgcount-index_a<50){
  225. title_str=index_a+"-"+allmsgcount;
  226. }
  227. ele.setAttribute("title",title_str)
  228. })
  229. })();
  230. }
  231. //
  232.  
  233. // 新消息界面,回复提醒对比感谢提醒更加醒目
  234. if (location.href.indexOf("/notifications") != -1){
  235. (function(){
  236. if(document.querySelectorAll(".payload").length > 0){
  237. document.querySelectorAll(".payload").forEach((ele) => {
  238. if(ele.parentElement.innerText.indexOf("时提到了你") != -1
  239. || ele.parentElement.innerText.indexOf("里回复了你") != -1 ){
  240. //1、被人@提醒。2、回复我的主题提醒。
  241. ele.style.backgroundColor="#F9EA9A";
  242. }
  243. })
  244. }
  245. })();
  246. }
  247. //
  248.  
  249. },0);
  250. // end