Microsoft Rewards reminder

This userscript automatically checks if you have visited a specified webpage each day (default is [Bing Rewards](https://rewards.bing.com/)).

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name          Microsoft Rewards reminder
// @name:zh-CN Microsoft Rewards reminder
// @namespace  http://tampermonkey.net/
// @version       1.5
// @description  This userscript automatically checks if you have visited a specified webpage each day (default is [Bing Rewards](https://rewards.bing.com/)).  
// @author        FZXG.dev & OpenAI
// @description:zh-CN        每天弹窗提示用户访问指定网页,点击跳转(在新窗口中)后记录,不跳转则明天继续提醒;使用 GM 存储 API;带关闭按钮。
// @match        *://*/*
// @match        https://rewards.bing.com/*
// @grant         GM.getValue
// @grant         GM.setValue
// @license       MIT
// ==/UserScript==

(async function () {
    'use strict';

    const targetURL = 'https://rewards.bing.com/'; // 👉 替换为你希望跳转的网址
    const storageKey = 'dailyVisitConfirmed';

    const today = new Date();
    const localDate = today.toISOString().split('T')[0]; // 注意:还是 UTC 日期!

    // 正确方式(本地时区):
    const localDateString = today.getFullYear() + '-' +
          String(today.getMonth() + 1).padStart(2, '0') + '-' +
          String(today.getDate()).padStart(2, '0');

    // 先读GM存储中的访问日期,访问过当天就不弹窗
    const visitedDate = await GM.getValue(storageKey, null);
    if (visitedDate === localDateString) return; // 今天已访问过,直接退出

    // 读OsType判断风格,默认win
    const osType = await GM.getValue('OsType', 'win');

    if (osType === 'mac') {
        showMacModal();
    } else {
        showWinModal();
    }

    // ==========================
    // Win11风格弹窗
    function showWinModal() {
        injectWinStyle();

        const modal = document.createElement('div');
        modal.innerHTML = `
        <div id="popup-overlay">
            <div id="win11-modal">
                <p>今天你还没有访问:<br><strong>${targetURL}</strong></p>
                <button id="goto-btn">点击前往</button>
                <button id="close-btn">关闭</button>
            </div>
        </div>`;
        document.body.appendChild(modal);

        document.getElementById('goto-btn').addEventListener('click', async () => {
            await GM.setValue(storageKey, localDateString);
            window.open(targetURL, '_blank');
            closeModalWin();
        });

        document.getElementById('close-btn').addEventListener('click', () => {
            closeModalWin();
        });

        function closeModalWin() {
            const modalEl = document.getElementById('win11-modal');
            const overlay = document.getElementById('popup-overlay');
            modalEl.classList.add('hide');
            setTimeout(() => overlay.remove(), 200);
        }
    }

    function injectWinStyle() {
        const style = document.createElement('style');
        style.textContent = `
        @keyframes fadeIn {
            from { opacity: 0; transform: scale(0.95); }
            to { opacity: 1; transform: scale(1); }
        }
        @keyframes fadeOut {
            from { opacity: 1; transform: scale(1); }
            to { opacity: 0; transform: scale(0.95); }
        }
        #popup-overlay {
            position: fixed;
            top: 0; left: 0;
            width: 100vw; height: 100vh;
            display: flex;
            justify-content: center;
            align-items: start;
            padding-top: 20vh;
            background-color: rgba(0, 0, 0, 0);
            z-index: 9999;
        }
        #win11-modal {
            animation: fadeIn 0.3s ease-out forwards;
            background: #fefefe;
            border: 1px solid #d0d0d0;
            padding: 24px;
            box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
            border-radius: 12px;
            font-family: 'Segoe UI', sans-serif;
            text-align: center;
            width: 320px;
            max-width: 90vw;
            box-sizing: border-box;
            color: #1f1f1f;
        }
        #win11-modal.hide {
            animation: fadeOut 0.2s ease-in forwards;
        }
        #win11-modal p {
            font-size: 15px;
            margin-bottom: 20px;
        }
        #win11-modal button {
            font-size: 14px;
            padding: 10px 18px;
            margin: 0 5px;
            border: none;
            border-radius: 6px;
            cursor: pointer;
            transition: all 0.2s ease;
        }
        #goto-btn {
            background-color: #0078d4;
            color: white;
        }
        #goto-btn:hover {
            background-color: #005a9e;
        }
        #close-btn {
            background-color: #e5e5e5;
            color: #333;
        }
        #close-btn:hover {
            background-color: #d0d0d0;
        }
        `;
        document.head.appendChild(style);
    }

    // ==========================
    // macOS风格弹窗
    function showMacModal() {
        injectMacStyle();

        const modal = document.createElement('div');
        modal.innerHTML = `
        <div id="popup-overlay">
            <div id="macos-modal">
                <p>今天你还没有访问:<br><strong>${targetURL}</strong></p>
                <button id="goto-btn">点击前往</button>
                <button id="close-btn">关闭</button>
            </div>
        </div>`;
        document.body.appendChild(modal);

        document.getElementById('goto-btn').addEventListener('click', async () => {
            await GM.setValue(storageKey, localDateString);
            window.open(targetURL, '_blank');
            closeModalMac();
        });

        document.getElementById('close-btn').addEventListener('click', () => {
            closeModalMac();
        });

        function closeModalMac() {
            const modalEl = document.getElementById('macos-modal');
            const overlay = document.getElementById('popup-overlay');
            modalEl.classList.add('hide');
            setTimeout(() => overlay.remove(), 200);
        }
    }

    function injectMacStyle() {
        const style = document.createElement('style');
        style.textContent = `
        @keyframes fadeIn {
            from { opacity: 0; transform: scale(0.95); }
            to { opacity: 1; transform: scale(1); }
        }
        @keyframes fadeOut {
            from { opacity: 1; transform: scale(1); }
            to { opacity: 0; transform: scale(0.95); }
        }
        #popup-overlay {
            position: fixed;
            top: 0; left: 0;
            width: 100vw; height: 100vh;
            display: flex;
            justify-content: center;
            align-items: start;
            padding-top: 20vh;
            background-color: rgba(0, 0, 0, 0.12);
            backdrop-filter: blur(12px);
            z-index: 9999;
        }
        #macos-modal {
            animation: fadeIn 0.3s ease-out forwards;
            background: rgba(255 255 255 / 0.85);
            border-radius: 20px;
            box-shadow: 0 24px 48px rgba(0, 0, 0, 0.15);
            padding: 28px 32px;
            width: 320px;
            max-width: 90vw;
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen,
              Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
            color: #1c1c1e;
            text-align: center;
            user-select: none;
            box-sizing: border-box;
            backdrop-filter: saturate(180%) blur(20px);
            border: 1px solid rgba(255 255 255 / 0.5);
        }
        #macos-modal.hide {
            animation: fadeOut 0.2s ease-in forwards;
        }
        #macos-modal p {
            font-size: 16px;
            margin-bottom: 24px;
            font-weight: 500;
        }
        #macos-modal button {
            font-size: 15px;
            font-weight: 600;
            padding: 11px 24px;
            border-radius: 14px;
            border: none;
            cursor: pointer;
            transition: background-color 0.25s ease, box-shadow 0.25s ease;
            user-select: none;
            min-width: 100px;
            margin: 0 8px;
            box-shadow: 0 0 0 1px rgba(0,0,0,0.08) inset;
            background-color: rgba(0,0,0,0.05);
            color: #1c1c1e;
        }
        #macos-modal button#goto-btn {
            background: linear-gradient(180deg, #007aff 0%, #0051a8 100%);
            color: white;
            box-shadow:
                0 0 8px #007aff88,
                inset 0 1px 0 rgba(255 255 255 0.3);
        }
        #macos-modal button#goto-btn:hover {
            background: linear-gradient(180deg, #1a8cff 0%, #0062cc 100%);
            box-shadow:
                0 0 12px #1a8cffcc,
                inset 0 1px 0 rgba(255 255 255 0.4);
        }
        #macos-modal button#close-btn {
            background-color: transparent;
            color: #6e6e73;
            box-shadow: none;
        }
        #macos-modal button#close-btn:hover {
            background-color: rgba(0,0,0,0.07);
            color: #1c1c1e;
        }
        `;
        document.head.appendChild(style);
    }

})();