您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
获取并解析微信文章数据
// ==UserScript== // @name 微信文章获取脚本 // @namespace http://tampermonkey.net/ // @version 1.0 // @license MIT // @description 获取并解析微信文章数据 // @match https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit* // @grant GM_xmlhttpRequest // @grant GM_setClipboard // ==/UserScript== (function() { 'use strict'; // 创建按钮 let button = document.createElement("button"); button.innerText = "获取往期文章代码"; button.style.position = "fixed"; button.style.bottom = "20px"; button.style.right = "20px"; button.style.zIndex = 9999; button.style.padding = "10px"; button.style.backgroundColor = "#4CAF50"; button.style.color = "white"; button.style.border = "none"; button.style.borderRadius = "5px"; button.style.cursor = "pointer"; document.body.appendChild(button); // 按钮点击事件 button.addEventListener("click", function() { // 获取 body 内容,使用 textContent 以获取纯文本,避免 HTML 标签干扰 let bodyText = document.body.textContent; // 使用正则表达式匹配 &token= 后的数字 let match = bodyText.match(/&token=(\d+)/); // 如果匹配到 token 参数 let tokenValue=""; if (match) { tokenValue = match[1]; // 提取到的 token 值 console.log('Token found in body text:', tokenValue); // 输出匹配到的 token 值 } else { console.log('No token found in the body text.'); } GM_xmlhttpRequest({ method: "GET", url: `https://mp.weixin.qq.com/cgi-bin/appmsgpublish?sub=list&search_field=null&begin=0&count=5&query=&fakeid=&type=101_1&free_publish_type=1&sub_action=list_ex&token=${tokenValue}&lang=zh_CN&f=json&ajax=1`, headers: { "Content-Type": "application/json" }, onload: function(response) { if (response.status === 200) { try { let data = JSON.parse(response.responseText); // 获取 publish_page 并反转义解析 let publishPage = JSON.parse(data.publish_page.replace(/"/g, '"')); // 获取前三个 publish_info 实体,过滤 is_deleted 为 true 的项 let publishList = publishPage.publish_list .map(info => JSON.parse(info.publish_info.replace(/"/g, '"'))) .filter(info => info.appmsgex[0] && !info.appmsgex[0].is_deleted) .slice(0, 3); // 构建 HTML 片段 let htmlParts = publishList.map(info => { let article = info.appmsgex[0]; let link = article.link.replace(/&/g, '&'); let picUrl = article.pic_cdn_url_235_1.replace(/&/g, '&'); let title = article.title; return ` <section> <a href="${link}" data-linktype="1" _href="${link}"> <section style="width: 100%;display: flex;justify-content: center;align-items: center;"> <section style="width: 100%;background: #ffffff;display: flex;justify-content: flex-start;align-items: center;flex-direction: column;"> <section style="width: 100%;display: flex;justify-content: center;align-items: center;" data-mid=""> <span class="js_jump_icon h5_image_link" data-positionback="static" style="inset: auto;width: 100%;"> <img data-ratio="0.425" src="${picUrl}" data-w="1080" style="width: 100%; max-height: 160px; object-fit: cover; border-radius: 6px;" class="rich_pages wxw-img" data-imgqrcoded="1"> </span> </section> <section style="width: 100%;background: rgba(0, 0, 0, 0.65);font-size: 13px;color: rgb(255, 255, 255);line-height: 18px;margin-top: -35px;z-index: 20;" data-mid=""> <p style="padding: 9px 7px 8px;">${title} <mpchecktext contenteditable="false"></mpchecktext> </p> </section> </section> </section> </a> </section> <p> <br> </p> `; }).join("\n"); // 复制到剪贴板 GM_setClipboard(htmlParts); alert("文章内容已复制到剪贴板!"); } catch (e) { console.error("解析出错:", e); alert("解析出错,请检查控制台日志。"); } } else { alert("请求失败,状态码:" + response.status); } } }); }); })();