微博增强-添加悄悄关注

在m.weibo.cn和weibo.com域名下运行的自定义脚本

  1. // ==UserScript==
  2. // @name 微博增强-添加悄悄关注
  3. // @namespace https://github.com/ozingi
  4. // @version 2.0.02
  5. // @description 在m.weibo.cn和weibo.com域名下运行的自定义脚本
  6. // @author ozingi
  7. // @match https://m.weibo.cn/*
  8. // @match https://weibo.com/*
  9. // @match https://weibo.com/set/*
  10. // @match https://m.weibo.cn/u/*
  11. // @match https://m.weibo.cn/setting*
  12. // @grant GM_xmlhttpRequest
  13. // @connect weibo.cn
  14. // @license 版权所有 (C) 2024 ozingi@163.com。允许修改和再分发,但必须保留此版权声明。商业使用需联系作者获得授权。
  15.  
  16. // ==/UserScript==
  17. (function() {
  18. 'use strict';
  19.  
  20. // 获取当前页面的cookie
  21. var cookies = document.cookie;
  22. // 记录当前页面的URL
  23. let lastUrl = window.location.href;
  24. // 添加自定义样式
  25. var style = document.createElement('style');
  26. style.type = 'text/css';
  27. style.innerHTML = `
  28. .custom-setting-span:active {
  29. background-color: orange;
  30. }
  31. .custom-setting-div {
  32. display: none; /* 默认不显示 */
  33. width: 200px;
  34. height: 300px;
  35. border: 1px solid black;
  36. position: absolute;
  37. top:10%;
  38. right: 5%;
  39. z-index:1;
  40. background:white;
  41. padding: 10px;
  42. box-sizing: border-box;
  43. }
  44. .custom-setting-div input,
  45. .custom-setting-div button {
  46. margin-top: 10px;
  47. width: 100%;
  48. }
  49. `;
  50. document.head.appendChild(style);
  51. function setQuietfollow(uid) {
  52. // 执行后台访问
  53. GM_xmlhttpRequest({
  54. method: 'GET',
  55. url: 'https://weibo.cn/'+uid+'/operation?rl=0',
  56. headers:{
  57. "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/jxl,image/webp,*/*;q=0.8",
  58. "Accept-Encoding": "gzip, deflate, br, zstd",
  59. "Accept-Language": "zh-CN,zh-HK;q=0.5",
  60. "Connection":"keep-alive",
  61. "Cookie": cookies,
  62. "Host": "weibo.cn",
  63. "Priority": "u=1",
  64. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.0.0"
  65. },
  66. onload: function(response) {
  67. // 这里可以根据返回的内容进行相应的处理
  68. //console.log('请求成功,返回的数据:', response.responseText);
  69. //console.log(typeof(response.responseText));
  70. // 使用正则表达式匹配St内容
  71. var regexSt = /rl=0&st=(.*?)">/;
  72. var matchResult = response.responseText.match(regexSt);
  73. var matchesSt = matchResult ? matchResult[1] : false;
  74. //console.log("查找st",matchesSt);
  75. if(matchesSt!=false){
  76. GM_xmlhttpRequest({
  77. method: 'GET',
  78. url: 'https://weibo.cn/attention/addPrivate?uid='+uid+'&rl=0&st='+matchesSt+'',
  79. headers:{
  80. "Host": "weibo.cn",
  81. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.0.0",
  82. "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/jxl,image/webp,*/*;q=0.8",
  83. "Accept-Language": "zh-CN,zh-HK;q=0.5",
  84. "Accept-Encoding": "gzip, deflate, br, zstd",
  85. "Connection": "keep-alive",
  86. "Referer": 'https://weibo.cn/'+uid+'/operation?rl=0&rand=6608&p=r',
  87. "Cookie": cookies,
  88. "Upgrade-Insecure-Requests": "1",
  89. "Sec-Fetch-Dest": "document",
  90. "Sec-Fetch-Mode": "navigate",
  91. "Sec-Fetch-Site": "same-origin",
  92. "Sec-Fetch-User": "?1",
  93. "sec-ch-ua-platform": "Windows",
  94. "sec-ch-ua": '"Edge";v="118", "Chromium";v="118", "Not=A?Brand";v="24"',
  95. 'sec-ch-ua-mobile': '?0',
  96. 'Priority': 'u=1',
  97. 'TE': 'trailers'
  98. },
  99. onload: function(response) {
  100. // 这里可以根据返回的内容进行相应的处理
  101. //console.log('请求成功,返回的数据:', response.responseText);
  102. //console.log(typeof(response.responseText));
  103. // 使用正则表达式匹配<div class="me">标签及其内容
  104. var regexMe = /<div class="me">(.*?)<\/div>/;
  105. var matchesMe = response.responseText.match(regexMe);
  106. var regexPs = /<div class="ps">(.*?)<\/div>/;
  107. var matchesPs = response.responseText.match(regexPs);
  108. var matches;
  109. matches=matchesMe?matchesMe:matchesPs;
  110. //console.log(matchesMe);
  111. if(matches){
  112. matches = matches[1];
  113. // 使用Toast函数
  114. console.log(matches);
  115. showToast(matches, 3000); // 显示3秒钟
  116. }
  117.  
  118. },
  119. onerror: function(error) {
  120. // 请求失败时的处理
  121. console.error('请求失败:', error);
  122. }});}else{
  123. showToast("请求用户信息失败", 3000); // 显示3秒钟
  124. }}
  125. });
  126. }
  127. // 使用MutationObserver监听DOM变化
  128. var observer = new MutationObserver(function() {
  129. const url = window.location.href;
  130. // 使用正则表达式匹配执行url内容
  131. var regexUrl = /^https:\/\/m\.weibo\.cn\/(u\/\w+|setting|profile)/;
  132. var regexUrl2 = /^https:\/\/weibo\.com\/(set\/\w+|u)/;
  133. var matchUrl2 = url.match(regexUrl2);
  134. var matchUrl = url.match(regexUrl);
  135.  
  136. //console.log('浏览器地址变化:', matchUrl2);
  137. if (matchUrl||matchUrl2) {
  138. if(typeof elements() === 'undefined'){
  139.  
  140. }
  141.  
  142. }
  143.  
  144. });
  145. // 获取所有class为m-diy-btn m-box-col m-box-center m-box-center-a和div.bar-btn:nth-child(2)的元素
  146. var elements = ()=>{
  147. var element = document.querySelector('.m-diy-btn.m-box-col.m-box-center.m-box-center-a');
  148. var element2 = document.querySelector('.m-diy-btn.m-box-col.m-box-center.m-box-center-a.quiet-follow');
  149. //资料页
  150. var element3 = document.querySelector('div.bar-btn:nth-child(2)');
  151. var element4 = document.querySelector('.bar-btn.m-box-col.quiet-follow');
  152. //pc
  153. var element5 = document.querySelector('a.ALink_default_2ibt1:nth-child(6)');
  154. var element6 = document.querySelector('.router-link-exact-active.router-link-active.ALink_default_2ibt1.quiet-follow');
  155.  
  156. var element7 = document.querySelector('div.woo-pop-wrap:nth-child(3)');
  157. var element8 = document.querySelector('.woo-pop-wrap.quiet-follow');
  158. //console.log("搜索个人页",element4)
  159. if (element&& (element2==null)) {
  160. // 创建新的div元素
  161. var newDiv = document.createElement('div');
  162. newDiv.className = 'm-diy-btn m-box-col m-box-center m-box-center-a quiet-follow'; // 添加自定义类名
  163. newDiv.innerHTML = '<div data-v-5552d90b="" callback="follow()" class="m-add-box m-followBtn"><span class="m-add-box"><h5>悄悄关注</h5></span></div>';
  164. // 将新的div标签添加到找到的div标签后面
  165. element.parentNode.insertBefore(newDiv, element.nextSibling);
  166. // 执行完毕后断开观察者
  167. //observer.disconnect();
  168. // 添加点击事件监听器
  169. newDiv.addEventListener('click', function() {
  170. var currentUrl = window.location.href;
  171. // 使用正则表达式匹配St内容
  172. var regexUid = /cn\/u\/(.*?)(?=\?|$)/;
  173. var matchUid = currentUrl.match(regexUid);
  174. if(matchUid){
  175. setQuietfollow(matchUid[1])
  176. }
  177. });
  178. };
  179. if (element3&& (element4==null)) {
  180. // 创建新的div元素
  181. var newDiv2 = document.createElement('div');
  182. newDiv2.className = 'bar-btn m-box-col quiet-follow'; // 添加自定义类名
  183. newDiv2.innerHTML = '<div callback="follow()" class="m-add-box m-followBtn m-btn m-btn-block m-btn-blue"><span class="m-add-box"><sapn>悄悄关注</span></span></div>';
  184. // 将新的div标签添加到找到的div标签后面
  185. element3.parentNode.insertBefore(newDiv2, element3.nextSibling);
  186. // 执行完毕后断开观察者
  187. //observer.disconnect();
  188. // 添加点击事件监听器
  189. newDiv2.addEventListener('click', function() {
  190. var currentUrl = window.location.href;
  191. // 使用正则表达式匹配St内容
  192. var regexUid = /profile\/(.*?)(?=\?|$)/;
  193. var matchUid = currentUrl.match(regexUid);
  194. if(matchUid){
  195. setQuietfollow(matchUid[1])
  196. }
  197. });
  198. };
  199. if (element5&& (element6==null)) {
  200. // 创建新的div元素
  201. var newDiv3 = document.createElement('a');
  202. newDiv3.className = 'router-link-exact-active router-link-active ALink_default_2ibt1 quiet-follow'; // 添加自定义类名
  203. newDiv3.href = 'https://m.weibo.cn/setting?tab=whisper'; // 设置跳转链接
  204. newDiv3.innerHTML = '<div class="woo-box-flex woo-box-alignCenter NavItem_main_2hs9r NavItem_cur_2ercx" role="link" title="使用偏好" tabindex="0" data-focus-visible="true"><span class="NavItem_text_3Z0D7">悄悄关注</span></div>';
  205. // 将新的div标签添加到找到的div标签后面
  206. element5.parentNode.insertBefore(newDiv3, element5.nextSibling);
  207. };
  208. if (element7&& (element8==null)) {
  209. // 创建新的div元素
  210. var newDiv4 = document.createElement('div');
  211. newDiv4.className = 'woo-pop-wrap quiet-follow'; // 添加自定义类名
  212. newDiv4.innerHTML = '<span class="woo-pop-ctrl"><button class="woo-button-main woo-button-flat woo-button-primary woo-button-m woo-button-round FollowBtn_m_1UJhp ProfileHeader_btn3_2VD_Y" user="[object Object]"><span class="woo-button-wrap"><span class="woo-button-content"> 悄悄关注 </span></span></button></span>';
  213. // 将新的div标签添加到找到的div标签后面
  214. element7.parentNode.insertBefore(newDiv4, element7.nextSibling);
  215. // 执行完毕后断开观察者
  216. //observer.disconnect();
  217. // 添加点击事件监听器
  218. newDiv4.addEventListener('click', function() {
  219. var currentUrl = window.location.href;
  220. // 使用正则表达式匹配St内容
  221. var regexUid = /\/u\/(\d+)(?=\?|$)/;
  222. var matchUid = currentUrl.match(regexUid);
  223. //console.log(matchUid)
  224. if(matchUid){
  225. setQuietfollow(matchUid[1])
  226. }
  227. });
  228. };
  229. return element;
  230. }
  231. // 配置和启动观察者
  232. observer.observe(document.body, { childList: true, subtree: true });
  233.  
  234. // 等待页面加载完成
  235. window.addEventListener('load', function() {
  236. // 查找.sub-header下的第一个span标签
  237. var subHeaderSpan = document.querySelector('.sub-header span');
  238. //console.log("搜索列表",subHeaderSpan)
  239. if (subHeaderSpan) {
  240. // 创建新的span标签
  241. var newSpan = document.createElement('span');
  242. newSpan.textContent = '设置'; // 设置新span的内容
  243. newSpan.style.float = 'right'; // 设置新span的样式
  244. newSpan.className = 'custom-setting-span'; // 添加自定义类名
  245.  
  246. // 创建设置面板div
  247. var settingDiv = document.createElement('div');
  248. settingDiv.className = 'custom-setting-div';
  249. // 添加文本
  250. settingDiv.innerHTML = '<p>添加用户</p>';
  251. // 创建UID输入框
  252. var uidInput = document.createElement('input');
  253. uidInput.type = 'text';
  254. uidInput.placeholder = '请输入UID';
  255. // 创建确认添加按钮
  256. var addButton = document.createElement('button');
  257. addButton.textContent = '确认添加';
  258. // 将输入框和按钮添加到设置面板
  259. settingDiv.appendChild(uidInput);
  260. settingDiv.appendChild(addButton);
  261.  
  262. // 添加点击事件监听器
  263. newSpan.addEventListener('click', function() {
  264. //关闭时刷新悄悄关注列表
  265. if(settingDiv.style.display=='block'){
  266. location.reload();
  267. }
  268. // 显示或隐藏设置面板
  269. settingDiv.style.display = settingDiv.style.display === 'none' ? 'block' : 'none';
  270. //console.log(settingDiv.style.display);
  271.  
  272. });
  273. // 添加点击事件监听器
  274. addButton.addEventListener('click', function() {
  275. // 执行后台访问
  276. setQuietfollow(uidInput.value)
  277. });
  278.  
  279.  
  280. // 将新的span标签添加到找到的span标签后面
  281. subHeaderSpan.parentNode.insertBefore(newSpan, subHeaderSpan.nextSibling);
  282. // 将设置面板div添加到body中
  283. document.body.appendChild(settingDiv);
  284. }
  285. });
  286. /* // 保存原始的send函数
  287. var originalSend = XMLHttpRequest.prototype.send;
  288.  
  289. // 修改send函数
  290. XMLHttpRequest.prototype.send = function() {
  291. // 在这里添加你的代码,它会在每个请求发送时执行
  292.  
  293. // 监听请求的load事件,它会在请求完成时触发
  294. this.addEventListener('load', function() {
  295. if (this.readyState === 4 && this.status === 200) {
  296. // 在这里添加你的代码,它会在请求成功完成时执行
  297. var subHeaderSpan1 = document.querySelector('.box-right.m-box-center-a.m-box-center.m-btn-box');
  298. console.log("搜索列表",subHeaderSpan1)
  299. if (subHeaderSpan1) {
  300. // 创建新的div元素
  301. var newDiv = document.createElement('div');
  302. newDiv.className = 'box-right m-box-center-a m-box-center m-btn-box'; // 添加自定义类名
  303. newDiv.innerHTML = '<div data-v-124dcff2=""><div data-v-124dcff2="" class="m-add-box"><i data-v-124dcff2="" class="m-font m-font-follow"></i><h4 data-v-124dcff2="">加关注</h4></div></div>';
  304.  
  305. // 将新的div添加到当前元素的后面
  306. subHeaderSpan1.appendChild(newDiv);
  307. }
  308. console.log('请求完成:', this);
  309. }
  310. }, false);
  311.  
  312. // 调用原始的send方法
  313. originalSend.apply(this, arguments);
  314. }; */
  315. // 创建Toast函数
  316. function showToast(message, duration) {
  317. // 创建一个div元素作为Toast容器
  318. var toast = document.createElement('div');
  319.  
  320. // 设置Toast的样式
  321. toast.style.position = 'fixed';
  322. toast.style.top = '50%';
  323. toast.style.left = '50%';
  324. toast.style.transform = 'translateX(-50%)';
  325. toast.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
  326. toast.style.color = 'white';
  327. toast.style.padding = '10px 20px';
  328. toast.style.borderRadius = '5px';
  329. toast.style.zIndex = '555';
  330. toast.style.fontSize = '16px';
  331.  
  332. // 将消息文本添加到Toast容器中
  333. toast.textContent = message;
  334.  
  335. // 将Toast添加到文档中
  336. document.body.appendChild(toast);
  337.  
  338. // 设置Toast显示的时间
  339. setTimeout(function() {
  340. // 移除Toast
  341. document.body.removeChild(toast);
  342. }, duration || 2000); // 如果没有指定时间,默认为2000毫秒
  343. }
  344.  
  345. })();

QingJ © 2025

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