微博粉丝变化监测

监测微博粉丝变化并发送通知

目前为 2025-02-26 提交的版本。查看 最新版本

// ==UserScript==
// @name         微博粉丝变化监测
// @namespace    Spuddy
// @version      1.0
// @description  监测微博粉丝变化并发送通知
// @author       Spuddy
// @match        https://weibo.com/*
// @grant        GM_xmlhttpRequest
// @grant        GM_notification
// @grant        GM_setValue
// @grant        GM_getValue
// @run-at       document-idle
// @noframes
// @license      MIT
// ==/UserScript==

'use strict';

if (document.querySelector('.loginBtn')) {
    console.log('User is not logged in');
    return;
}

// 配置参数
const config = {
    uid: unsafeWindow.$CONFIG.uid
};

// 获取当前用户的 UID
const uid = config.uid;
console.log(`Current UID: ${uid}`);

// 初始化
let userMap = new Map(JSON.parse(GM_getValue(`userMap_${uid}`, '[]')));
console.log('Loaded userMap from storage:', userMap);

// 获取当前时间戳
const currentTime = Date.now();
const lastRunTime = GM_getValue(`lastRunTime_${uid}`, 0);
const twentyFourHours = 24 * 60 * 60 * 1000;
console.log(`Current time: ${currentTime}, Last run time: ${lastRunTime}`);

// 判断是否超过24小时
if (currentTime - lastRunTime > twentyFourHours) {
    console.log('More than 24 hours since last run, starting main loop');
    // 缓存新的时间戳
    GM_setValue(`lastRunTime_${uid}`, currentTime);
    mainLoop();
} else {
    console.log('Less than 24 hours since last run, skipping main loop');
}
async function mainLoop() {
    try {
        let currentPage = 1;
        let hasNextPage = true;
        const newUserMap = new Map();
        console.log('Starting main loop');

        while (hasNextPage) {
            console.log(`Fetching page ${currentPage}`);
            const response = await fetchFansPage(currentPage);
            hasNextPage = processResponse(response, newUserMap);
            currentPage++;
        }

        const differences = compareUsers(userMap, newUserMap);
        if (differences.length > 0) {
            console.log('Differences found:', differences);
            sendNotification(differences);
            userMap = newUserMap;
            GM_setValue(`userMap_${uid}`, JSON.stringify([...userMap]));
            console.log('Updated userMap in storage');
        } else {
            console.log('No differences found');
        }
    } catch (error) {
        handleError(error);
    }
}

async function fetchFansPage(page) {
    return new Promise((resolve, reject) => {
        GM_xmlhttpRequest({
            method: "GET",
            url: `https://weibo.com/ajax/friendships/friends?uid=${config.uid}&relate=fans&page=${page}`,
            onload: (response) => {
                if (response.status === 200) {
                    console.log(`Page ${page} fetched successfully`);
                    resolve(JSON.parse(response.responseText));
                } else {
                    console.error(`Failed to fetch page ${page}: ${response.status}`);
                    reject(new Error(`请求失败: ${response.status}`));
                }
            },
            onerror: (error) => {
                console.error(`Error fetching page ${page}:`, error);
                reject(error);
            }
        });
    });
}

function processResponse(response, userMap) {
    const users = response.users || [];
    console.log(`Processing response, found ${users.length} users`);
    users.forEach(user => {
        userMap.set(user.id, user.name);
    });
    return !!response.next_page && users.length > 0;
}

function compareUsers(oldMap, newMap) {
    const changes = [];
    // 检测新增
    for (const id of newMap.keys()) {
        if (!oldMap.has(id)) {
            const name = newMap.get(id);
            changes.push(`➕ 新增: ${name} (${id})`);
        }
    }
    // 检测移除
    for (const id of oldMap.keys()) {
        if (!newMap.has(id)) {
            const name = oldMap.get(id);
            changes.push(`➖ 移除: ${name} (${id})`);
        }
    }
    console.log('Comparison complete, changes:', changes);
    return changes;
}

function sendNotification(messages) {
    const content = messages.join('\n');
    console.log('Sending notification:', content);
    // 改为浏览器弹窗提示
    alert(`粉丝变化通知:\n\n${content}`);
}

function handleError(error) {
    console.error('发生错误:', error);
    GM_notification({
        title: '监测异常',
        text: error.message.substring(0, 100),
        timeout: 5000
    });
}

// 修改初始化提示
if (!GM_getValue('init', false)) {
    console.log('First time initialization');
    GM_notification({
        title: '粉丝监测已就绪',
        text: '监测服务已启动',
        timeout: 5000
    });
    GM_setValue('init', true);
}

QingJ © 2025

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