Greasy Fork is available in English.

BiliBili每日任务

自动完成bilibili的每日任务

// ==UserScript==
// @name         BiliBili每日任务
// @namespace    http://tampermonkey.net/
// @version      0.4
// @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
            })
            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(3) > p.re-exp-none').innerHTML === '未完成' || 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) > p.re-exp-none').innerHTML === '已获得0/50') {
                 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)
})();