您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
自动刷linuxdo文章
- // ==UserScript==
- // @name Auto Read
- // @namespace http://tampermonkey.net/
- // @version 1.4.2
- // @description 自动刷linuxdo文章
- // @author liuweiqing
- // @match https://meta.discourse.org/*
- // @match https://linux.do/*
- // @match https://meta.appinn.net/*
- // @match https://community.openai.com/
- // @grant none
- // @license MIT
- // @icon https://www.google.com/s2/favicons?domain=linux.do
- // ==/UserScript==
- (function () {
- ("use strict");
- // 定义可能的基本URL
- const possibleBaseURLs = [
- "https://linux.do",
- "https://meta.discourse.org",
- "https://meta.appinn.net",
- "https://community.openai.com",
- ];
- const commentLimit = 1000;
- const topicListLimit = 100;
- const likeLimit = 50;
- // 获取当前页面的URL
- const currentURL = window.location.href;
- // 确定当前页面对应的BASE_URL
- let BASE_URL = possibleBaseURLs.find((url) => currentURL.startsWith(url));
- console.log("currentURL:", currentURL);
- // 环境变量:阅读网址,如果没有找到匹配的URL,则默认为第一个
- if (!BASE_URL) {
- BASE_URL = possibleBaseURLs[0];
- console.log("默认BASE_URL设置为: " + BASE_URL);
- } else {
- console.log("当前BASE_URL是: " + BASE_URL);
- }
- console.log("脚本正在运行在: " + BASE_URL);
- //1.进入网页 https://linux.do/t/topic/数字(1,2,3,4)
- //2.使滚轮均衡的往下移动模拟刷文章
- // 检查是否是第一次运行脚本
- function checkFirstRun() {
- if (localStorage.getItem("isFirstRun") === null) {
- console.log("脚本第一次运行,执行初始化操作...");
- updateInitialData();
- localStorage.setItem("isFirstRun", "false");
- } else {
- console.log("脚本非第一次运行");
- }
- }
- // 更新初始数据的函数
- function updateInitialData() {
- localStorage.setItem("read", "false"); // 开始时自动滚动关闭
- localStorage.setItem("autoLikeEnabled", "false"); //默认关闭自动点赞
- console.log("执行了初始数据更新操作");
- }
- const delay = 2000; // 滚动检查的间隔(毫秒)
- let scrollInterval = null;
- let checkScrollTimeout = null;
- let autoLikeInterval = null;
- function scrollToBottomSlowly(distancePerStep = 20, delayPerStep = 50) {
- if (scrollInterval !== null) {
- clearInterval(scrollInterval);
- }
- scrollInterval = setInterval(() => {
- window.scrollBy(0, distancePerStep);
- }, delayPerStep); // 每50毫秒滚动20像素
- }
- function getLatestTopic() {
- let latestPage = Number(localStorage.getItem("latestPage")) || 0;
- let topicList = [];
- let isDataSufficient = false;
- while (!isDataSufficient) {
- latestPage++;
- const url = `${BASE_URL}/latest.json?no_definitions=true&page=${latestPage}`;
- $.ajax({
- url: url,
- async: false,
- success: function (result) {
- if (
- result &&
- result.topic_list &&
- result.topic_list.topics.length > 0
- ) {
- result.topic_list.topics.forEach((topic) => {
- // 未读且评论数小于 commentLimit
- if (commentLimit > topic.posts_count) {
- //其实不需要 !topic.unseen &&
- topicList.push(topic);
- }
- });
- // 检查是否已获得足够的 topics
- if (topicList.length >= topicListLimit) {
- isDataSufficient = true;
- }
- } else {
- isDataSufficient = true; // 没有更多内容时停止请求
- }
- },
- error: function (XMLHttpRequest, textStatus, errorThrown) {
- console.error(XMLHttpRequest, textStatus, errorThrown);
- isDataSufficient = true; // 遇到错误时也停止请求
- },
- });
- }
- if (topicList.length > topicListLimit) {
- topicList = topicList.slice(0, topicListLimit);
- }
- // 其实不需要对latestPage操作
- // localStorage.setItem("latestPage", latestPage);
- localStorage.setItem("topicList", JSON.stringify(topicList));
- }
- function openNewTopic() {
- let topicListStr = localStorage.getItem("topicList");
- let topicList = topicListStr ? JSON.parse(topicListStr) : [];
- // 如果列表为空,则获取最新文章
- if (topicList.length === 0) {
- getLatestTopic();
- topicListStr = localStorage.getItem("topicList");
- topicList = topicListStr ? JSON.parse(topicListStr) : [];
- }
- // 如果获取到新文章,打开第一个
- if (topicList.length > 0) {
- const topic = topicList.shift();
- localStorage.setItem("topicList", JSON.stringify(topicList));
- if (topic.last_read_post_number) {
- window.location.href = `${BASE_URL}/t/topic/${topic.id}/${topic.last_read_post_number}`;
- } else {
- window.location.href = `${BASE_URL}/t/topic/${topic.id}`;
- }
- }
- }
- // 检查是否已滚动到底部(不断重复执行),到底部时跳转到下一个话题
- function checkScroll() {
- if (localStorage.getItem("read")) {
- if (
- window.innerHeight + window.scrollY >=
- document.body.offsetHeight - 100
- ) {
- console.log("已滚动到底部");
- openNewTopic();
- } else {
- scrollToBottomSlowly();
- if (checkScrollTimeout !== null) {
- clearTimeout(checkScrollTimeout);
- }
- checkScrollTimeout = setTimeout(checkScroll, delay);
- }
- }
- }
- // 入口函数
- window.addEventListener("load", () => {
- checkFirstRun();
- console.log(
- "autoRead",
- localStorage.getItem("read"),
- "autoLikeEnabled",
- localStorage.getItem("autoLikeEnabled")
- );
- if (localStorage.getItem("read") === "true") {
- console.log("执行正常的滚动和检查逻辑");
- checkScroll();
- if (isAutoLikeEnabled()) {
- autoLike();
- }
- }
- });
- // 获取当前时间戳
- const currentTime = Date.now();
- // 获取存储的时间戳
- const defaultTimestamp = new Date("1999-01-01T00:00:00Z").getTime(); //默认值为1999年
- const storedTime = parseInt(
- localStorage.getItem("clickCounterTimestamp") ||
- defaultTimestamp.toString(),
- 10
- );
- // 获取当前的点击计数,如果不存在则初始化为0
- let clickCounter = parseInt(localStorage.getItem("clickCounter") || "0", 10);
- // 检查是否超过24小时(24小时 = 24 * 60 * 60 * 1000 毫秒)
- if (currentTime - storedTime > 24 * 60 * 60 * 1000) {
- // 超过24小时,清空点击计数器并更新时间戳
- clickCounter = 0;
- localStorage.setItem("clickCounter", "0");
- localStorage.setItem("clickCounterTimestamp", currentTime.toString());
- }
- console.log(`Initial clickCounter: ${clickCounter}`);
- function triggerClick(button) {
- const event = new MouseEvent("click", {
- bubbles: true,
- cancelable: true,
- view: window,
- });
- button.dispatchEvent(event);
- }
- function autoLike() {
- console.log(`Initial clickCounter: ${clickCounter}`);
- // 寻找所有的discourse-reactions-reaction-button
- const buttons = document.querySelectorAll(
- ".discourse-reactions-reaction-button"
- );
- if (buttons.length === 0) {
- console.error(
- "No buttons found with the selector '.discourse-reactions-reaction-button'"
- );
- return;
- }
- console.log(`Found ${buttons.length} buttons.`); // 调试信息
- // 逐个点击找到的按钮
- buttons.forEach((button, index) => {
- if (
- (button.title !== "点赞此帖子" && button.title !== "Like this post") ||
- clickCounter >= likeLimit
- ) {
- return;
- }
- // 使用setTimeout来错开每次点击的时间,避免同时触发点击
- autoLikeInterval = setTimeout(() => {
- // 模拟点击
- triggerClick(button); // 使用自定义的触发点击方法
- console.log(`Clicked like button ${index + 1}`);
- clickCounter++; // 更新点击计数器
- // 将新的点击计数存储到localStorage
- localStorage.setItem("clickCounter", clickCounter.toString());
- // 如果点击次数达到likeLimit次,则设置点赞变量为false
- if (clickCounter === likeLimit) {
- console.log(
- `Reached ${likeLimit} likes, setting the like variable to false.`
- );
- localStorage.setItem("autoLikeEnabled", "false"); // 使用localStorage存储点赞变量状态
- } else {
- console.log("clickCounter:", clickCounter);
- }
- }, index * 3000); // 这里的1000毫秒是两次点击之间的间隔,可以根据需要调整
- });
- }
- const button = document.createElement("button");
- // 初始化按钮文本基于当前的阅读状态
- button.textContent =
- localStorage.getItem("read") === "true" ? "停止阅读" : "开始阅读";
- button.style.position = "fixed";
- button.style.bottom = "10px"; // 之前是 top
- button.style.left = "10px"; // 之前是 right
- button.style.zIndex = 1000;
- button.style.backgroundColor = "#f0f0f0"; // 浅灰色背景
- button.style.color = "#000"; // 黑色文本
- button.style.border = "1px solid #ddd"; // 浅灰色边框
- button.style.padding = "5px 10px"; // 内边距
- button.style.borderRadius = "5px"; // 圆角
- document.body.appendChild(button);
- button.onclick = function () {
- const currentlyReading = localStorage.getItem("read") === "true";
- const newReadState = !currentlyReading;
- localStorage.setItem("read", newReadState.toString());
- button.textContent = newReadState ? "停止阅读" : "开始阅读";
- if (!newReadState) {
- if (scrollInterval !== null) {
- clearInterval(scrollInterval);
- scrollInterval = null;
- }
- if (checkScrollTimeout !== null) {
- clearTimeout(checkScrollTimeout);
- checkScrollTimeout = null;
- }
- localStorage.removeItem("navigatingToNextTopic");
- } else {
- // 如果是Linuxdo,就导航到我的帖子
- if (BASE_URL == "https://linux.do") {
- window.location.href = "https://linux.do/t/topic/13716/700";
- } else {
- window.location.href = `${BASE_URL}/t/topic/1`;
- }
- checkScroll();
- }
- };
- //自动点赞按钮
- // 在页面上添加一个控制自动点赞的按钮
- const toggleAutoLikeButton = document.createElement("button");
- toggleAutoLikeButton.textContent = isAutoLikeEnabled()
- ? "禁用自动点赞"
- : "启用自动点赞";
- toggleAutoLikeButton.style.position = "fixed";
- toggleAutoLikeButton.style.bottom = "50px"; // 之前是 top,且与另一个按钮错开位置
- toggleAutoLikeButton.style.left = "10px"; // 之前是 right
- toggleAutoLikeButton.style.zIndex = "1000";
- toggleAutoLikeButton.style.backgroundColor = "#f0f0f0"; // 浅灰色背景
- toggleAutoLikeButton.style.color = "#000"; // 黑色文本
- toggleAutoLikeButton.style.border = "1px solid #ddd"; // 浅灰色边框
- toggleAutoLikeButton.style.padding = "5px 10px"; // 内边距
- toggleAutoLikeButton.style.borderRadius = "5px"; // 圆角
- document.body.appendChild(toggleAutoLikeButton);
- // 为按钮添加点击事件处理函数
- toggleAutoLikeButton.addEventListener("click", () => {
- const isEnabled = !isAutoLikeEnabled();
- setAutoLikeEnabled(isEnabled);
- toggleAutoLikeButton.textContent = isEnabled
- ? "禁用自动点赞"
- : "启用自动点赞";
- });
- // 判断是否启用自动点赞
- function isAutoLikeEnabled() {
- // 从localStorage获取autoLikeEnabled的值,如果未设置,默认为"true"
- return localStorage.getItem("autoLikeEnabled") !== "false";
- }
- // 设置自动点赞的启用状态
- function setAutoLikeEnabled(enabled) {
- localStorage.setItem("autoLikeEnabled", enabled ? "true" : "false");
- }
- })();