BiliBili每日任务

自动完成bilibili的每日任务

当前为 2019-06-10 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         BiliBili每日任务
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  自动完成bilibili的每日任务
// @author       maxinimize
// @match        https://account.bilibili.com/account/home
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    const getRandomInt = (min, max) => {
        min = Math.ceil(min);
        max = Math.floor(max);
        return Math.floor(Math.random() * (max - min)) + min;
    }

    const fetchAttentions = async () => {
        try {
            let attentionList = [];
            const uid = document.cookie.split('; ').find(x => x.substr(0,11) === 'DedeUserID=').substr(11);
            const response = await fetch(`https://api.bilibili.com/x/relation/followings?vmid=${uid}&ps=50&order=desc`)
            const data = await response.json();
            if (data.code === 0) {
                let attentionList = data.data.list.map(a => a.mid)
                return attentionList
            } else {
                console.log(data.message);
            }
        } catch (error) {
            console.log('错误', error);
        }
    }

    const fetchVideos = async () => {
        try {
            let attentionList = await fetchAttentions();
            let videoList = [];
            for (let a of attentionList) {
                let response = await fetch(`https://space.bilibili.com/ajax/member/getSubmitVideos?mid=${a}&pagesize=100&tid=0`)
                let data = await response.json();
                videoList = videoList.concat(data.data.vlist.map(v => v.aid))
            }
            return videoList

        } catch (error) {
            console.log('错误', error);
        }
    }

/*
    const fetchFiveMinsVideos = async () => {
        try {
            let attentionList = await fetchAttentions();
            let videoList = [];
            for (let a of attentionList) {
                let response = await fetch(`https://space.bilibili.com/ajax/member/getSubmitVideos?mid=${a}&pagesize=100&tid=0`)
                let data = await response.json(); // parseInt(data.data.vlist[0].length.split(':'))
                let result = data.data.vlist.filter(v => v.length.split(':').length > 2 || v.length.split(':') = 2 && parseInt(v.length.split(':')[0], 10))
                videoList = videoList.concat(data.data.vlist.map(v => v.aid))
            }
            return videoList

        } catch (error) {
            console.log('错误', error);
        }
    }
*/


    const fetchWatch = async (aid) => {
        try {
            let response = await fetch('https://api.bilibili.com/x/web-interface/view?aid='+aid)
            let data = await response.json();
            if (data.code === 0) {
                const cid = data.data.cid;
                const duration = data.data.duration;
                const sid = document.cookie.split('; ').find(x => x.substr(0,4) === 'sid=').substr(4);
                const uid = document.cookie.split('; ').find(x => x.substr(0,11) === 'DedeUserID=').substr(11);
                const csrf = document.cookie.split('; ').find(x => x.substr(0,9) === 'bili_jct=').substr(9);
                response = await fetch('https://api.bilibili.com/x/report/click/h5', {
                    credentials: 'include',
                    method: 'post',
                    headers: {'Content-type': 'application/x-www-form-urlencoded'},
                    body: `aid=${aid}&cid=${cid}&part=1&did=${sid}&ftime=${new Date().getTime()}&jsonp=jsonp&lv=None&mid=${uid}&csrf=${csrf}&stime=${new Date().getTime()}`
                })
                data = await response.json();
                if (data.code === 0) {
                    response = await fetch('https://api.bilibili.com/x/report/web/heartbeat', {
                        credentials: 'include',
                        method: 'post',
                        headers: {'Content-type': 'application/x-www-form-urlencoded'},
                        body: `aid=${aid}&cid=${cid}&jsonp=jsonp&mid=${uid}&csrf=${csrf}&played_time=0&pause=false&realtime=${duration}&dt=7&play_type=1&start_ts=${new Date().getTime()}`
                    })
                    data = await response.json();
                    if (data.code === 0) {
                        const controller = new AbortController();
                        const signal = controller.signal;
                        const fetchPromise = fetch('https://api.bilibili.com/x/report/web/heartbeat', {
                            credentials: 'include',
                            method: 'post',
                            headers: {'Content-type': 'application/x-www-form-urlencoded'},
                            body: `aid=${aid}&cid=${cid}&jsonp=jsonp&mid=${uid}&csrf=${csrf}&played_time=${duration-1}&pause=false&realtime=${duration}&dt=7&play_type=0&start_ts=${new Date().getTime()}`
                        })
                        const timeoutId = setTimeout(() => controller.abort(), 5000);
                        data = await fetchPromise.then(response => response.json());
                        if (data.code === 0) {
                            console.log('观看成功');
                            return true
                        } else {
                            console.log('观看失败@4: ', data.message);
                            return false
                        }
                    } else {
                        console.log('观看失败@3: ', data.message);
                        return false
                    }

                } else {
                    console.log('观看失败@2: ', data.message);
                    return false
                }
            } else {
                console.log('获取视频信息失败: ', data.message);
                return false
            }
        } catch (error) {
            console.log('错误', error);
            return false
        }
    }

    const fetchShare = async (body) => {
        try {
            const response = await fetch('https://api.bilibili.com/x/web-interface/share/add', {
                credentials: 'include',
                method: 'post',
                headers: {'Content-type': 'application/x-www-form-urlencoded'},
                body: body
            })
            const data = await response.json();
            if (data.code === 0) {
                console.log("分享成功");
                return true
            } else {
                console.log(data.message);
                return false
            }
        } catch (error) {
            console.log('错误', error);
            return false
        }
    }

    const fetchCoin = async (body) => {
        try {
            const response = await fetch('https://api.bilibili.com/x/web-interface/coin/add', {
                credentials: 'include',
                method: 'post',
                headers: {'Content-type': 'application/x-www-form-urlencoded'},
                body: body //'aid=36711746&multiply=1&csrf=49095dd563aaef3187cf9594c39a2085'
            })
            const data = await response.json()
            if (data.code === 0) {
                console.log("投币成功");
                return true
            } else {
                console.log(data.message);
                return false
            }
        } catch (error) {
            console.log('错误', error);
            return false
        }
    }

    const watch = async () => {
        let videoList = await fetchVideos();
        let aid = videoList[getRandomInt(0, videoList.length)];
        return fetchWatch(aid);
    }

    const share = async () => {
        let videoList = await fetchVideos();
        let aid = videoList[getRandomInt(0, videoList.length)];
        let csrf = document.cookie.split('; ').find(x => x.substr(0,9) === 'bili_jct=').substr(9);
        let payload = `aid=${aid}&csrf=${csrf}`;
        return fetchShare(payload);
    }

    const coin = async () => {
        let videoList = await fetchVideos();
        let aid = videoList[getRandomInt(0, videoList.length)];
        let csrf = document.cookie.split('; ').find(x => x.substr(0,9) === 'bili_jct=').substr(9);
        let payload = `aid=${aid}&multiply=1&csrf=${csrf}`;
        return fetchCoin(payload);
    }

     window.setTimeout(() => {
         if (document.querySelector('#app > div > div.security_content > div.security-right > div > div:nth-child(2) > div.home-daily-task-warp > div > div:nth-child(2) > div.home-dialy-exp-icon.position-rest')) {
             watch()
         }

         if (document.querySelector('#app > div > div.security_content > div.security-right > div > div:nth-child(2) > div.home-daily-task-warp > div > div:nth-child(3) > div.home-dialy-exp-icon.position-rest')) {
             if (document.querySelector('#app > div > div.security_content > div.security-right > div > div:nth-child(2) > div.home-daily-task-warp > div > div:nth-child(2) > p.re-exp-none').innerHTML === '未完成') {
                 if (parseInt(document.querySelector('#app > div > div.security_content > div.security-right > div > div:nth-child(1) > div.index-info > div.home-right > div.home-top-bp > span:nth-child(4)').innerHTML, 10) >= 5) {
                     let i = 0;
                     let timer = setInterval(() => {
                         coin();
                         i = i + 1;
                         if (i >= 5) {
                             clearInterval(timer);
                         }
                     },2000);
                 }
             }
         }

         if (document.querySelector('#app > div > div.security_content > div.security-right > div > div:nth-child(2) > div.home-daily-task-warp > div > div:nth-child(4) > div.home-dialy-exp-icon.position-rest')) {
             share()
         }
     }, 5000)
})();