标签 动漫 下的文章

在 github 等找到网易云自动刷量的都是好久之前的了,还有封号的风险

于是弄了这个方便网易云音乐人完成听歌任务
项目部署在 docker 里,借助浏览器播放网易云播放实现刷量
docker 的浏览器是通过 vnc 实现可用网页打开
脚本是用到油猴插件

推荐用小号收藏要刷的歌曲在一个歌单,浏览器打开这个歌单试一下播放
再设置脚本定时播放

注意:端口请改成自己合适的,还有 config 路径

Docker Compose

services: edge-browser:  linuxserver/msedge:latest # Edge浏览器镜像 container_name: edge-browser # 容器名称 hostname: edge-browser # 容器主机名 environment: - PUID=1000 # 用户ID,请根据你的NAS实际用户ID修改 - PGID=1000 # 用户组ID,请根据你的NAS实际用户组ID修改 - TZ=Asia/Shanghai # 时区设置 - LC_ALL=zh_CN.UTF-8 #- CUSTOM_USER=admin #配置访问用户名 已注释 #- PASSWORD=password  #配置访问密码 已注释 - EDGE_CLI=https://music.163.com/ # Edge启动时打开的默认网页 volumes: - ./config:/config # 核心数据持久化,浏览器配置、书签、历史记录等都存在这里 ports: - 3000:3000 # 内部 HTTP 端口。默认为 3000 - 3001:3001 # 内部 HTTPS 端口。默认为 3001,修改冒号左边的端口号。 shm_size: "1gb" # /dev/shm 大小,建议至少 1GB,避免浏览器崩溃 restart: unless-stopped # 除非手动停止,否则容器异常退出后自动重启 

油猴脚本 js

// ==UserScript==
// @name         网易云音乐定时播放暂停(每日重复+无弹窗自动执行)
// @namespace    https://shuffle.com/
// @version      3.0
// @description  适配.btns容器按钮,每日固定时间自动播放/暂停,无弹窗、任务持久化
// @author       You
// @match        *://music.163.com/*
// @grant        none
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';

    // ========== 核心配置 ==========
    const PLAY_PAUSE_SELECTOR = '.btns [data-action="play"].ply.j-flag';
    const BACKUP_SELECTOR = '.btns .ply.j-flag';
    const STORAGE_KEY = 'neteaseMusicTimedTasks'; // 本地存储键名

    // 全局变量:存储重复任务的定时器ID(key: 任务ID, value: intervalId)
    let intervalTasks = {};

    // ========== 工具函数 ==========
    // 1. 等待播放按钮加载
    function waitForPlayBtn() {
        return new Promise(resolve => {
            const findBtn = () => {
                let btn = document.querySelector(PLAY_PAUSE_SELECTOR);
                if (!btn) btn = document.querySelector(BACKUP_SELECTOR);
                return btn;
            };
            const btn = findBtn();
            if (btn) return resolve(btn);

            const observer = new MutationObserver(() => {
                const btn = findBtn();
                if (btn) {
                    observer.disconnect();
                    resolve(btn);
                }
            });
            observer.observe(document.body, { childList: true, subtree: true });
        });
    }

    // 2. 无弹窗执行播放/暂停(仅控制台输出日志)
    async function togglePlayPause(action) {
        try {
            const playBtn = await waitForPlayBtn();
            if (!playBtn) {
                console.error('[网易云定时] 未找到播放/暂停按钮');
                return;
            }

            // 状态判断:data-action=pause → 播放中;data-action=play → 暂停中
            const currentAction = playBtn.getAttribute('data-action');
            const isPlaying = currentAction === 'pause';
            const actionText = action === 'play' ? '播放' : '暂停';

            // 自动执行点击,无弹窗
            if (action === 'play' && !isPlaying) {
                playBtn.click();
                console.log(`[网易云定时] ${new Date().toLocaleTimeString()} → 自动${actionText}成功`);
            } else if (action === 'pause' && isPlaying) {
                playBtn.click();
                console.log(`[网易云定时] ${new Date().toLocaleTimeString()} → 自动${actionText}成功`);
            } else {
                console.log(`[网易云定时] ${new Date().toLocaleTimeString()} → 无需执行${actionText}(当前:${isPlaying ? '播放中' : '已暂停'})`);
            }
        } catch (e) {
            console.error('[网易云定时] 执行失败:', e);
        }
    }

    // 3. 计算「首次执行延迟」和「每日重复间隔」
    function getDelayAndInterval(targetHour, targetMinute) {
        const now = new Date();
        const target = new Date();
        target.setHours(targetHour);
        target.setMinutes(targetMinute);
        target.setSeconds(0);
        target.setMilliseconds(0);

        // 首次执行延迟:若目标时间已过,延迟为「明天该时间 - 现在」
        let delay = target.getTime() - now.getTime();
        if (delay < 0) delay += 86400000; // 加24小时(86400000毫秒)

        return {
            firstDelay: delay, // 首次执行延迟(毫秒)
            repeatInterval: 86400000 // 每日重复间隔(24小时)
        };
    }

    // ========== 任务持久化(localStorage) ==========
    // 1. 从本地存储加载任务
    function loadTasks() {
        const tasks = localStorage.getItem(STORAGE_KEY);
        return tasks ? JSON.parse(tasks) : [];
    }

    // 2. 保存任务到本地存储
    function saveTasks(tasks) {
        localStorage.setItem(STORAGE_KEY, JSON.stringify(tasks));
    }

    // ========== 重复任务管理 ==========
    // 1. 添加每日重复任务
    function addDailyTask(hour, minute, action) {
        // 验证时间格式
        if (hour < 0 || hour > 23 || minute < 0 || minute > 59) {
            alert('时间格式错误!小时(0-23),分钟(0-59)'); // 仅添加时提示,执行时无弹窗
            return;
        }

        // 生成唯一任务ID
        const taskId = Date.now().toString();
        const { firstDelay, repeatInterval } = getDelayAndInterval(hour, minute);

        // 首次执行 + 每日重复
        const firstTimer = setTimeout(() => {
            // 执行首次操作
            togglePlayPause(action);
            // 设置每日重复
            const intervalId = setInterval(() => {
                togglePlayPause(action);
            }, repeatInterval);
            intervalTasks[taskId] = intervalId;
        }, firstDelay);

        // 存储任务信息
        const task = {
            id: taskId,
            time: `${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}`,
            action: action === 'play' ? '播放' : '暂停',
            firstTimerId: firstTimer // 首次执行的定时器ID
        };
        const tasks = loadTasks();
        tasks.push(task);
        saveTasks(tasks);

        // 更新UI + 提示添加成功(仅一次)
        updateTaskList();
        alert(`✅ 每日重复任务已添加:每天${task.time}自动${task.action}音乐(页面刷新不丢失)`);
    }

    // 2. 取消单个每日任务
    function cancelDailyTask(taskId) {
        const tasks = loadTasks();
        const taskIndex = tasks.findIndex(t => t.id === taskId);
        if (taskIndex === -1) return;

        // 清除定时器(首次执行+重复执行)
        clearTimeout(tasks[taskIndex].firstTimerId);
        if (intervalTasks[taskId]) clearInterval(intervalTasks[taskId]);
        delete intervalTasks[taskId];

        // 移除任务 + 保存
        tasks.splice(taskIndex, 1);
        saveTasks(tasks);
        updateTaskList();
        console.log(`[网易云定时] 已取消每日${tasks[taskIndex]?.time}的${tasks[taskIndex]?.action}任务`);
    }

    // 3. 取消所有每日任务
    function cancelAllDailyTasks() {
        const tasks = loadTasks();
        // 清除所有定时器
        tasks.forEach(task => {
            clearTimeout(task.firstTimerId);
            if (intervalTasks[task.id]) clearInterval(intervalTasks[task.id]);
        });
        intervalTasks = {};
        // 清空存储
        saveTasks([]);
        updateTaskList();
        alert('❌ 已取消所有每日重复任务');
    }

    // ========== UI面板(管理每日重复任务) ==========
    function updateTaskList() {
        const listEl = document.getElementById('taskList');
        if (!listEl) return;

        const tasks = loadTasks();
        listEl.innerHTML = '';

        if (tasks.length === 0) {
            listEl.innerHTML = '<div style="color:#999; padding:5px;">暂无每日重复任务</div>';
            return;
        }

        // 渲染所有重复任务
        tasks.forEach(task => {
            const item = document.createElement('div');
            item.style.cssText = 'padding:4px 0; border-bottom:1px solid #eee; display:flex; justify-content:space-between; align-items:center;';
            item.innerHTML = `
                <span>🔁 每天${task.time}:自动${task.action}音乐</span>
                <button class="cancelTaskBtn" data-id="${task.id}" style="padding:2px 6px; background:#f5222d; color:#fff; border:none; border-radius:3px; cursor:pointer;">取消</button>
            `;
            listEl.appendChild(item);

            // 绑定取消事件
            item.querySelector('.cancelTaskBtn').addEventListener('click', (e) => {
                cancelDailyTask(e.target.dataset.id);
            });
        });
    }

    // 创建UI面板
    function createUIPanel() {
        const panel = document.createElement('div');
        panel.style.cssText = `
            position: fixed; top: 20px; right: 20px; z-index: 99999;
            background: #fff; padding: 15px; border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.2);
            font-size: 14px; color: #333; min-width: 300px;
        `;
        panel.innerHTML = `
            <div style="margin-bottom: 10px; font-weight: bold; font-size:16px;">网易云每日定时</div>
            <!-- 时间设置区域 -->
            <div style="margin-bottom: 10px; padding-bottom:10px; border-bottom:1px solid #eee;">
                <div style="margin-bottom: 8px; display:flex; align-items:center; gap:8px;">
                    <label>每日执行时间:</label>
                    <input type="number" id="taskHour" placeholder="小时(0-23)" min="0" max="23" style="padding:4px; width:60px;">
                    <span>:</span>
                    <input type="number" id="taskMinute" placeholder="分钟(0-59)" min="0" max="59" style="padding:4px; width:60px;">
                </div>
                <div style="margin-bottom: 8px;">
                    <label>执行操作:</label>
                    <select id="taskAction" style="padding:4px; width:120px;">
                        <option value="play">自动播放</option>
                        <option value="pause">自动暂停</option>
                    </select>
                </div>
                <button id="addTaskBtn" style="padding:4px 12px; background:#1890ff; color:#fff; border:none; border-radius:4px; cursor:pointer;">添加每日任务</button>
            </div>
            <!-- 任务列表区域 -->
            <div>
                <div style="margin-bottom:8px; font-weight:bold;">已添加的每日任务:</div>
                <div id="taskList" style="max-height:200px; overflow-y:auto; padding:5px; border:1px solid #eee; border-radius:4px;">
                    <div style="color:#999; padding:5px;">暂无每日重复任务</div>
                </div>
                <button id="cancelAllBtn" style="margin-top:8px; padding:4px 12px; background:#666; color:#fff; border:none; border-radius:4px; cursor:pointer;">取消所有任务</button>
            </div>
        `;
        document.body.appendChild(panel);

        // 绑定添加任务事件
        document.getElementById('addTaskBtn').addEventListener('click', () => {
            const hour = Number(document.getElementById('taskHour').value);
            const minute = Number(document.getElementById('taskMinute').value);
            const action = document.getElementById('taskAction').value;

            if (isNaN(hour) || isNaN(minute)) {
                alert('请输入有效的小时和分钟!');
                return;
            }

            addDailyTask(hour, minute, action);
            // 清空输入框
            document.getElementById('taskHour').value = '';
            document.getElementById('taskMinute').value = '';
        });

        // 绑定取消所有任务事件
        document.getElementById('cancelAllBtn').addEventListener('click', cancelAllDailyTasks);
    }

    // ========== 初始化:加载任务+创建UI ==========
    function init() {
        // 1. 创建UI面板
        createUIPanel();
        // 2. 加载本地存储的任务,重建定时器
        const tasks = loadTasks();
        tasks.forEach(task => {
            const [hour, minute] = task.time.split(':').map(Number);
            const action = task.action === '播放' ? 'play' : 'pause';
            const { firstDelay, repeatInterval } = getDelayAndInterval(hour, minute);

            // 重建首次执行+重复定时器
            const firstTimer = setTimeout(() => {
                togglePlayPause(action);
                const intervalId = setInterval(() => {
                    togglePlayPause(action);
                }, repeatInterval);
                intervalTasks[task.id] = intervalId;
            }, firstDelay);

            // 更新任务的首次定时器ID(防止页面刷新后无法取消)
            task.firstTimerId = firstTimer;
        });
        saveTasks(tasks);
        // 3. 更新任务列表UI
        updateTaskList();
    }

    // 页面加载完成后初始化
    if (document.readyState === 'complete') {
        init();
    } else {
        window.addEventListener('load', init);
    }

})();

效果图:

飞牛也可以用应用市场的浏览器,方便在外面访问,但是谷歌安装油猴插件有点麻烦


可以在电脑保存好脚本,通过 vnc 的控制栏上传文件


📌 转载信息
原作者:
shuffle
转载时间:
2025/12/25 10:39:32

1、找一部安卓机,下载 Apple Music
2、创建 Apple 账户,国家地区选择 “美国”
3、再找一台苹果设置,登录刚注册账户,爽用

全程无需梯子,自带应用商店就能下载 Apple Music


此方法注册苹果账号的优势在于:
你想注册哪个区的,就注册哪个区
一直注册到你满意为止
土区、尼区、日区、阿拉伯区


📌 转载信息
原作者:
xiongjy
转载时间:
2025/12/25 09:59:17

背景

众所周知,目前国内想要看日漫的话,除了B站引进的动漫之外。其他的都是得自己去找途径。而在B站看番还得等过审。相对来说又是一个不足。所以很多人转向了其他网站或者通过磁力链接之类的。而这些没有国内资质的网站很容易倒闭,而且很多时候为了成本考虑他们会尽可能的压缩视频的画质,导致观看体验较差。而BT下载相对来说资源不用愁,但是得自己去下载。对于手机用户或者对BT不熟悉的人可能会有一定的门槛。

目前有一个开源追番系统——AutoBangumi

这个项目是基于 Mikan Project、qBittorrent 的全自动追番整理下载工具。只需要在 Mikan Project 上订阅番剧,就可以全自动追番。并且整理完成的名称和目录可以直接被 Plex、Jellyfin 等媒体库软件识别,无需二次刮削。所以我们可以通过一次搭建彻底解决看番烦恼。

准备

一台服务器/NAS/电脑

一枚蜜柑账号(已被墙)CN站点:Mikan Project CN

服务器我这里选择的是腾讯云的轻量服务器。个人推荐是买海外地区的。比如新加坡、硅谷、东京这几个地区,这几个地区的服务器线路相对较好。当然如果对价格不敏感的话也可以选择香港地区或者买带宽超过7M的境内服务器

服务器推荐

国内服务器带宽小但是胜在稳定。7M的带宽可以覆盖绝大部分的动漫的码率。

蜜柑账号就直接注册一个即可。然后在账号设置中打开高级订阅。

蜜柑账号
蜜柑账号1
注册完成之后我们需要RSS订阅自己想要看的番剧。订阅可以选择订阅该番剧的全部资源/指定字幕组/指定语言。

下图为示例图:①代表订阅全部资源 ②订阅该发布组的资源可选③简中、繁中、全部
RSS订阅番剧
目前出种速度上大部分都是巴哈上播放之后10分钟以内就有内嵌繁中的web源,而简中资源一般会1-7天内出,冷门番剧的话可能没有中文字幕。我个人是喜欢先看繁中资源,剧情要是好看的话就等简中资源出来再看一遍。

订阅之后就会显示如下图标。
番剧资源字母中文繁体
此时点击首页最上方菜单栏的订阅就可以看到订阅的番剧了,RSS订阅则是我们接下来要用到。格式如下

AutoBangumi中需要的token就是token=后面的一串字符

https://mikanani.me/RSS/MyBangumi?token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 或者
https://mikanime.tv/RSS/MyBangumi?token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

全自动追番系统搭建教程

AutoBangumi 部署

部署程序非常简单,我这里以2c2g的硅谷debian服务器作为演示,进入控制台,先登录指定服务器。可以先在服务器防火墙安全组开放后面需要用到的端口号:7892

服务器开放安全组端口

安装Docker

先更新软件源:

sudo apt update -y && sudo apt upgrade -y

使用官方的安装脚本:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

创建数据和配置文件夹

为了保证 AB 在每次更新之后数据和配置不丢失,推荐使用 Docker volume 或者 bind mount 进行数据和配置的持久化。下列操作可以通过sudo su命令切换到 root 用户进行操作

# 使用 Docker volume
docker volume create AutoBangumi_config
docker volume create AutoBangumi_data
​
# 使用 bind mount
mkdir "AutoBangumi"
cd "AutoBangumi"
mkdir -p $PWD/config
mkdir -p $PWD/data

使用 Docker-cli 部署 AutoBangumi

复制以下命令运行即可。

docker run -d \
  --name=AutoBangumi \
  -v AutoBangumi_config:/app/config \
  -v AutoBangumi_data:/app/data \
  -p 7892:7892 \
  --network=bridge \
  --dns=8.8.8.8 \
  --restart unless-stopped \
  estrellaxd/auto_bangumi:latest

如果使用 bind mount,可以自行替换绑定路径。

此时 AB 的 WebUI 会自动运行,但是主程序会处于暂停状态,可以进入 http://abhost:7892 进行配置。

此时 AB 会自动把环境变量写入 config.json 文件中然后自动运行。

推荐使用 Portainer 等带有 UI 的 Docker 管理器进行进阶部署

Qbittorrent安装

我们这里安装的是4.3.9版本

cd /root
wget https://github.com/userdocs/qbittorrent-nox-static/releases/download/release-4.3.9_v1.2.15/x86_64-qbittorrent-nox
chmod +x x86_64-qbittorrent-nox
./x86_64-qbittorrent-nox 

输入y就可以安装了,然后CTRL+C退出

默认登录的用户名和密码为admin adminadmin,登陆地址为公网IP:8080。

把下列代码整体复制粘贴到命令行。让qbittorrent可以作为服务长久运行。

cat << "EOF" > /etc/systemd/system/qbittorrent.service
[Unit]
Description=qBittorrent Daemon Service
After=network.target
​
[Service]
LimitNOFILE=512000
User=root
ExecStart=/root/x86_64-qbittorrent-nox
​
[Install]
WantedBy=multi-user.target
EOF

更新并启动服务

# 更新配置
systemctl daemon-reload
# 启动服务
systemctl start qbittorrent
# 查看状态
systemctl status qbittorrent
# 重启服务
systemctl restart qbittorrent

启动服务

登录qb的webui页面进行配置并且进行重启服务

配置AutoBangumi

输入服务器的 公网IP:7892进入webUI页面默认的用户名为:admin 密码为adminadmin,务必第一时间修改密码!
登陆界面
进入设置页面,首先修改下载设置

qb的地址改为公网地址,密码改成修改后的密码

后台界面

然后修改解析器,填入之前在蜜柑获取的token,把解析器类型改为蜜柑即可。最后再进行应用

蜜柑获取的token
应用

应用之后就可以再qb界面看到下载资源了

资源下载
可以看到我们订阅的番剧了
订阅的番剧

在线播放

如果要实现在线播放有几种方法。

1、优雅的emby、plex、jellyfin媒体管理程序

都是优秀的媒体管理程序,直接适配,不需要再进行搜刮。

2、直接搭建一个服务器的文件浏览器。直接看。没啥美感,但是极致的简单

这里介绍一下建一个Emby的服务器。

直接进入官网下载页面按照教程即可。

https://emby.media/linux-server.html

wget https://github.com/MediaBrowser/Emby.Releases/releases/download/4.7.13.0/emby-server-deb_4.7.13.0_amd64.deb
dpkg -i emby-server-deb_4.7.13.0_amd64.deb

快速搭建一个全自动追番系统在线播放

完成后打开公网IP:8096 ,打不开先看看防火墙规则是否开放了8096端口。

emby服务器
进入配置页面,设置一下管理员账号、语言以及qb的下载文件夹即可

管理配置
完成之后登录就可以看到啦

番剧追剧系统

然后把emby的地址填入AutoBangumi的media player Setting里即可

最后的效果。
快速搭建一个全自动追番系统,从此追番快人一步