新浪微博PC版手机版相互跳转

点击右上角按钮,跳转至当前微博电脑版/手机版

  1. // ==UserScript==
  2. // @name 新浪微博PC版手机版相互跳转
  3. // @namespace https://blog.bgme.me
  4. // @match https://m.weibo.cn/status/*
  5. // @match https://m.weibo.cn/detail/*
  6. // @match https://weibo.com/*/*
  7. // @exclude https://weibo.com/u/*
  8. // @exclude https://weibo.com/p/*
  9. // @exclude https://weibo.com/*/p/*
  10. // @exclude https://weibo.com/tv/*
  11. // @exclude https://weibo.com/signup/*
  12. // @grant none
  13. // @run-at document-end
  14. // @version 1.1.3
  15. // @author bgme
  16. // @description 点击右上角按钮,跳转至当前微博电脑版/手机版
  17. // @supportURL https://github.com/yingziwu/Greasemonkey/issues
  18. // @icon https://weibo.com/favicon.ico
  19. // @license AGPL-3.0-or-later
  20. // ==/UserScript==
  21.  
  22. window.addEventListener('load', function () {
  23. addButton();
  24. setTimeout(testPage, 500);
  25. })
  26.  
  27.  
  28. function addButton() {
  29. let img = document.createElement('img');
  30. img.src = 'data:image/png;base64,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'
  31. img.style.cssText = 'height: 35px; width: 25px;';
  32.  
  33. let button = document.createElement('button');
  34. button.id = 'weibo-pc-mobile-switch';
  35. button.className = 'icon';
  36. button.style.cssText = `position: fixed;
  37. top: 15%;
  38. right: 5%;
  39. z-index: 99;
  40. border-style: none;
  41. text-align:center;
  42. vertical-align:baseline;
  43. background-color: #fafafa;
  44. border-radius: 50%;`
  45. button.onclick = function () {
  46. jump();
  47. };
  48. button.appendChild(img);
  49. document.body.appendChild(button);
  50. }
  51.  
  52. function getWebUri() {
  53. let script;
  54. for (let s of document.querySelectorAll('body script')) {
  55. if (s.innerText.length && !s.hasAttribute('src')) {
  56. script = s;
  57. break;
  58. }
  59. }
  60. eval(script.innerText);
  61. const juid = $render_data.status.user.id;
  62. const jmid = $render_data.status.mid;
  63.  
  64. let uid = juid;
  65. let mid = jmid;
  66. if (document.querySelector('a.m-img-box')) {
  67. const duid = document.querySelector('a.m-img-box').href.match(/\/(\d+)$/)[1];
  68. if (duid != juid) { uid = duid; }
  69. }
  70. if (document.URL.match(/^.*m\.weibo\.cn\/(status|detail)\/(\d+)\??.*$/i)) {
  71. const dmid = document.URL.match(/^.*m\.weibo\.cn\/(status|detail)\/(\d+)\??.*$/i)[2];
  72. if (dmid != jmid) { mid = dmid; }
  73. }
  74.  
  75. let id = "";
  76. if (document.URL.match(/^.*m\.weibo\.cn\/(status|detail)\/(\w+)\??.*$/i) && !/^\d+$/.test(RegExp.$2)) {
  77. id = RegExp.$2;
  78. } else {
  79. id = WeiboUtil.mid2url(mid);
  80. }
  81.  
  82. const href = `https://weibo.com/${uid}/${id}`;
  83. return href;
  84. }
  85.  
  86. function getMobileUri() {
  87. const id = document.URL.split('?')[0].split('/')[4];
  88.  
  89. let mid = "";
  90. if (document.querySelector('div.WB_cardwrap.WB_feed_type')) {
  91. mid = document.querySelector('div.WB_cardwrap.WB_feed_type').getAttribute('mid');
  92. } else {
  93. mid = WeiboUtil.url2mid(id);
  94. }
  95.  
  96. const href = `https://m.weibo.cn/status/${mid}`;
  97. return href;
  98. }
  99.  
  100. function getUrl() {
  101. let host = (new URL(document.URL)).host;
  102. switch (host) {
  103. case 'm.weibo.cn': {
  104. let webUri = getWebUri();
  105. return webUri;
  106. }
  107. case 'weibo.com': {
  108. let mobileUri = getMobileUri();
  109. return mobileUri;
  110. }
  111. }
  112. }
  113.  
  114. function testPage() {
  115. try {
  116. getUrl();
  117. } catch (error) {
  118. console.error(error);
  119. document.querySelector('#weibo-pc-mobile-switch').style.setProperty('display', 'none');
  120. }
  121. }
  122.  
  123. function jump() {
  124. let url = getUrl();
  125. console.log(url);
  126. window.open(url);
  127. }
  128.  
  129. /**
  130. * 新浪微博mid与url互转实用工具
  131. * 作者: XiNGRZ (http://weibo.com/xingrz)
  132. * gist: https://gist.github.com/fengmk2/1844413
  133. */
  134.  
  135. var WeiboUtil = {
  136. // 62进制字典
  137. str62keys: [
  138. "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
  139. "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
  140. "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"
  141. ],
  142. };
  143.  
  144. /**
  145. * 62进制值转换为10进制
  146. * @param {String} str62 62进制值
  147. * @return {String} 10进制值
  148. */
  149. WeiboUtil.str62to10 = function (str62) {
  150. var i10 = 0;
  151. for (var i = 0; i < str62.length; i++) {
  152. var n = str62.length - i - 1;
  153. var s = str62[i];
  154. i10 += this.str62keys.indexOf(s) * Math.pow(62, n);
  155. }
  156. return String(i10);
  157. };
  158.  
  159. /**
  160. * 10进制值转换为62进制
  161. * @param {String} int10 10进制值
  162. * @return {String} 62进制值
  163. */
  164. WeiboUtil.int10to62 = function (int10) {
  165. var s62 = '';
  166. var r = 0;
  167. while (int10 != 0 && s62.length < 100) {
  168. r = int10 % 62;
  169. s62 = this.str62keys[r] + s62;
  170. int10 = Math.floor(int10 / 62);
  171. }
  172. return s62;
  173. };
  174.  
  175. /**
  176. * URL字符转换为mid
  177. * @param {String} url 微博URL字符,如 "wr4mOFqpbO"
  178. * @return {String} 微博mid,如 "201110410216293360"
  179. */
  180. WeiboUtil.url2mid = function (url) {
  181. var mid = '';
  182.  
  183. for (var i = url.length - 4; i > -4; i = i - 4) //从最后往前以4字节为一组读取URL字符
  184. {
  185. var offset1 = i < 0 ? 0 : i;
  186. var offset2 = i + 4;
  187. var str = url.substring(offset1, offset2);
  188.  
  189. str = this.str62to10(str);
  190. if (offset1 > 0) //若不是第一组,则不足7位补0
  191. {
  192. while (str.length < 7) {
  193. str = '0' + str;
  194. }
  195. }
  196.  
  197. mid = str + mid;
  198. }
  199.  
  200. return mid;
  201. };
  202.  
  203. /**
  204. * mid转换为URL字符
  205. * @param {String} mid 微博mid,如 "201110410216293360"
  206. * @return {String} 微博URL字符,如 "wr4mOFqpbO"
  207. */
  208. WeiboUtil.mid2url = function (mid) {
  209. if (!mid) {
  210. return mid;
  211. }
  212. mid = String(mid); //mid数值较大,必须为字符串!
  213. if (!/^\d+$/.test(mid)) { return mid; }
  214. var url = '';
  215.  
  216. for (var i = mid.length - 7; i > -7; i = i - 7) //从最后往前以7字节为一组读取mid
  217. {
  218. var offset1 = i < 0 ? 0 : i;
  219. var offset2 = i + 7;
  220. var num = mid.substring(offset1, offset2);
  221.  
  222. num = this.int10to62(num);
  223. if (offset1 > 0) //若不是第一组,则不足4位补0
  224. {
  225. while (num.length < 4) {
  226. num = '0' + num;
  227. }
  228. }
  229. url = num + url;
  230. }
  231.  
  232. return url;
  233. };

QingJ © 2025

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