哔哩哔哩直播间开播提醒脚本

当你指定的主播开播时,进行及时的系统提醒

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         哔哩哔哩直播间开播提醒脚本
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  当你指定的主播开播时,进行及时的系统提醒
// @author       伊吹dv子
// @match        https://t.bilibili.com/*
// @grant        none
// @license      MIT
// ==/UserScript==


(function() {
    'use strict';
    const targetRoomIds = [33989, 42062, 5085, 17961, 5252, 24371440]; // 需要检测的直播间房间号
    const roomNames = {
        33989: "诶嘿酱",
        42062: "牛子豪",
        5085: "小智",
        17961: "赫萝",
        5252: "天堂",
        24371440: "测试"
    }; // 房间号对应主播名字



    const checkInterval = 10000; // 检测间隔时间为10秒

    // 从 localStorage 读取直播状态
    function loadRoomLiveStatus() {
        let status = localStorage.getItem('roomLiveStatus');
        try {
            return JSON.parse(status) || {};
        } catch (e) {
            console.error('localStorage 读取失败,重置状态:', e);
            return {};
        }
    }

    // 保存直播状态到 localStorage
    function saveRoomLiveStatus(status) {
        try {
            localStorage.setItem('roomLiveStatus', JSON.stringify(status));
        } catch (e) {
            console.error('localStorage 保存失败:', e);
        }
    }

    // 初始化直播状态
    let roomLiveStatus = loadRoomLiveStatus();
    targetRoomIds.forEach(roomId => {
        if (!roomLiveStatus[roomId]) {
            roomLiveStatus[roomId] = { notified: false, status: 'offline' }; // 默认状态为未提醒且离线
        }
    });

    // 检查某个房间的直播状态
    async function checkRoomStatus(roomId) {
        try {
            const apiUrl = `https://api.live.bilibili.com/room/v1/Room/get_info?room_id=${roomId}`;
            const response = await fetch(apiUrl);
            const data = await response.json();

            if (data && data.data) {
                const isLive = data.data.live_status === 1;

                // 如果主播直播且未提醒过,发送提醒
                if (isLive && roomLiveStatus[roomId].status === 'offline' && !roomLiveStatus[roomId].notified) {
                    notifyUser(roomId); // 发送提醒
                    roomLiveStatus[roomId] = { notified: true, status: 'live' }; // 更新状态为直播且已提醒
                    saveRoomLiveStatus(roomLiveStatus); // 保存状态
                }

                // 如果主播下播,重置提醒状态
                if (!isLive && roomLiveStatus[roomId].status === 'live') {
                    roomLiveStatus[roomId] = { notified: false, status: 'offline' }; // 更新状态为离线
                    saveRoomLiveStatus(roomLiveStatus); // 保存状态
                }
            }
        } catch (error) {
            console.error(`获取房间 ${roomId} 的直播状态失败:`, error);
        }
    }

    // 通知用户
    function notifyUser(roomId) {
        const roomUrl = `https://live.bilibili.com/${roomId}`;
        const roomName = roomNames[roomId] || `直播间${roomId}`; // 获取主播名字,找不到时显示房间号

        if (Notification.permission === 'granted') {
            const notification = new Notification('主播已开播!', {
                body: `哔哩哔哩直播间:【${roomName}】正在直播!`,
                icon: 'https://i0.hdslb.com/bfs/live/cb040181b80e61b94473b2e42d39fa06de09ae2a.png'
            });

            // 点击通知跳转到直播间
            notification.onclick = () => {
                window.open(roomUrl, '_blank'); // 打开直播间
            };
        } else if (Notification.permission !== 'denied') {
            Notification.requestPermission().then(permission => {
                if (permission === 'granted') {
                    const notification = new Notification('主播已开播!', {
                        body: `哔哩哔哩直播间:【${roomName}】正在直播!`,
                        icon: 'https://i0.hdslb.com/bfs/live/cb040181b80e61b94473b2e42d39fa06de09ae2a.png'
                    });

                    // 点击通知跳转到直播间
                    notification.onclick = () => {
                        window.open(roomUrl, '_blank'); // 打开直播间
                    };
                }
            });
        }
    }

    // 定时检查所有房间的状态
    function checkLiveStatus() {
        targetRoomIds.forEach(roomId => {
            checkRoomStatus(roomId);
        });
    }

    // 定时循环监控,使用 setTimeout 控制检查间隔
    function startMonitoring() {
        checkLiveStatus();
        setTimeout(startMonitoring, checkInterval); // 每10秒检测一次
    }

    // 请求通知权限并开始监控
    if (Notification.permission !== 'granted') {
        Notification.requestPermission();
    }

    // 延迟3秒后开始监控,避免页面刚加载时增加压力
    setTimeout(() => startMonitoring(), 3000);

})();