头条搜索跳过app下载(自动展开)

2025/4/02 19:41:00

  1. // ==UserScript==
  2. // @name 头条搜索跳过app下载(自动展开)
  3. // @namespace Violentmonkey Scripts
  4. // @match *://m.toutiao.com/*
  5. // @match *://www.toutiao.com/article/*
  6. // @match *://z.toutiao.com/*
  7. // @match *://article.zlink.toutiao.com/*
  8. // @grant none
  9. // @version 2.2
  10. // @author Ling
  11. // @description 2025/4/02 19:41:00
  12. // @license MIT
  13. // ==/UserScript==
  14. (async function() {
  15.  
  16. const config = {
  17. maxRetry: 50,
  18. baseDelay: 300,
  19. logPrefix: '[头条优化]'
  20. };
  21. var constantVar1='JUTHx';
  22. var constantVar2='J4dQM';
  23. var count=0;
  24. var url = window.location.href;
  25. var seachUrl=window.location.pathname;
  26. var domain = window.location.hostname;
  27.  
  28. console.log('seachUrl:'+url);
  29.  
  30. // 智能点击器(带延时重试)
  31. const smartClick = async (selector, type) => {
  32. for (let i = 0; i < config.maxRetry; i++) {
  33. const target = document.querySelector(selector);
  34. if (target) {
  35. target.click();
  36. console.log(`${config.logPrefix} ${type}按钮点击成功`);
  37. return true;
  38. }
  39. await new Promise(r => setTimeout(r, config.baseDelay));
  40. }
  41. console.warn(`${config.logPrefix} ${type}按钮未找到`);
  42. return false;
  43. };
  44.  
  45. //获取路径名
  46. var urlpath=seachUrl.substring(1,seachUrl.length);
  47. console.log('urlpath:'+urlpath);
  48. if(constantVar1===urlpath||constantVar2===urlpath){//判断是否属于链接跳转
  49. // let turnUrl=getQueryVariable("h5_url");//取H5链接;
  50. let turnUrl=getH5Url();
  51. var decUrl =decodeURIComponent(turnUrl);
  52. //alert('解析结束!!!')
  53. location.href=decUrl;
  54. return; // 跳转后不再执行后续代码
  55. }else{
  56.  
  57.  
  58. // 第二阶段:设备自适应点击
  59. const isMobile = /Mobi|Android/i.test(navigator.userAgent);
  60. const expandBtn = isMobile ? '.toggle-button' : '.expand-button';
  61.  
  62. await smartClick(expandBtn, '展开');
  63. await smartClick('.button.cancel, .dialog-close', '取消弹窗');
  64.  
  65. }
  66.  
  67.  
  68. function getH5Url() {
  69. let h5_url=window.location.search.substring(1);
  70. let turnUrl2=getQueryVariable(h5_url,"h5_url");
  71. console.log("取h5_url:"+turnUrl2);
  72. if(turnUrl2===false){//解析scheme H5链接;
  73. turnUrl2=getQueryVariable(h5_url,"scheme");
  74. console.log("取scheme:"+turnUrl2);
  75. turnUrl2=decodeURIComponent(turnUrl2);
  76. console.log("scheme解码后:"+turnUrl2);
  77. let turnArray=turnUrl2.split("?");
  78. console.log("scheme分割为数组:"+turnArray);
  79. let paramUrl=turnArray[turnArray.length-1];
  80. console.log("scheme参数链接:"+paramUrl);
  81. turnUrl2=getQueryVariable(paramUrl,"launch_log_extra");
  82. console.log("解析scheme的H5链接:"+turnUrl2);
  83. turnUrl2=decodeURIComponent(turnUrl2);
  84. //取h5链接
  85.  
  86. let paramArray=turnUrl2.split(",");
  87. let h5Url=paramArray[0].substring(15,paramArray[0].length-1);
  88. let h5UrlArray=h5Url.split("?");
  89. h5Url=getQueryVariable(h5UrlArray[1],"h5_url")
  90. console.log("取文章链接:"+h5Url);
  91. turnUrl2=h5Url;
  92.  
  93. }
  94.  
  95. console.log("解析的H5链接:"+turnUrl2);
  96.  
  97. return turnUrl2;
  98.  
  99. }
  100. function getQueryVariable(v1,variable) {
  101. var query = v1; var vars = query.split("&"); for (var i=0;i<vars.length;i++) { var pair = vars[i].split("="); if(pair[0] == variable){return pair[1];}
  102. } return(false);
  103. }
  104. })();