Greasy Fork

Greasy Fork is available in English.

扇贝

扇贝单词下载导出

目前为 2021-03-05 提交的版本。查看 最新版本

// ==UserScript==
// @name         扇贝
// @name:en      shanbay
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  扇贝单词下载导出
// @description:en shanbay word download
// @author       You
// @match        https://web.shanbay.com/*
// @grant        WTFL
// ==/UserScript==

(function() {
    'use strict';

    var book_id = "";
    var learning_count = 0;
    var unlearned_count = 0;
    var simple_count = 0;

    function get_data(url){
        return fetch(url, {
            "headers": {
                "accept": "application/json, text/plain, */*",
                "accept-language": "en,zh-CN;q=0.9,zh;q=0.8,ja;q=0.7",
                "sec-ch-ua": "\"Chromium\";v=\"88\", \"Google Chrome\";v=\"88\", \";Not A Brand\";v=\"99\"",
                "sec-ch-ua-mobile": "?0",
                "sec-fetch-dest": "empty",
                "sec-fetch-mode": "cors",
                "sec-fetch-site": "same-site",
                "x-csrftoken": "d57d33018f6b24892cea401df0173f53"
            },
            "referrer": "https://web.shanbay.com/",
            "referrerPolicy": "strict-origin-when-cross-origin",
            "body": null,
            "method": "GET",
            "mode": "cors",
            "credentials": "include"
        })
        .then(response => response.json())
    }

    function get_decoded_data(url){
        return get_data(url)
        .then(json => json.data)
        .then(data => window.bays4.d(data))
        .then(data => JSON.parse(data))
    }

    function update_wordinfo(){
        get_data("https://apiv3.shanbay.com/wordsapp/user_material_books/current").
        then(data => {
            document.getElementById("current_book").innerHTML = "单词书:" + data.materialbook.name + "<br/>单词书id:" + data.materialbook.id;

            book_id = data.materialbook.id;


            get_decoded_data("https://apiv3.shanbay.com/wordsapp/user_material_books/"+book_id+"/learning/words/unlearned_items?ipp=10&page=1")
                .then(data => {
                document.getElementById("unlearned_word").innerText = data.total
                unlearned_count = data.total;
            })

            get_decoded_data("https://apiv3.shanbay.com/wordsapp/user_material_books/"+book_id+"/learning/words/learning_items?ipp=10&page=1")
                .then(data => {
                document.getElementById("learning_word").innerText = data.total;
                learning_count = data.total;
            })

            get_decoded_data("https://apiv3.shanbay.com/wordsapp/user_material_books/"+book_id+"/learning/words/simple_learned_items?ipp=10&page=1")
                .then(data => {
                document.getElementById("simple_learned_word").innerText = data.total
                simple_count = data.total;
            })
        })
    }

    function sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

    async function download_book(url,pages){
        var res = [];

        for(var i=1;i<=pages;i++){
            document.getElementById("download_info").innerText = "休眠中"+i+"/"+pages
            await sleep(100)
            document.getElementById("download_info").innerText = "下载中"+i+"/"+pages
            var data = await get_decoded_data(url+i);

            for(const id in data.objects){
                var word = data.objects[id]
                var meanings = " ";
                for(const mean of word.vocab_with_senses.senses){
                    meanings += mean.pos + mean.definition_cn
                }

                res.push({"word":word.vocab_with_senses.word, "trans":meanings})
            }
        }

        document.getElementById("download_info").innerText = ""

        return res;
    }

    function disable_buttons(){
        document.getElementById("download_learning").setAttribute("disabled","true");
        document.getElementById("download_unlearned").setAttribute("disabled","true");
        document.getElementById("download_simple").setAttribute("disabled","true");
    }

    function enable_buttons(){
        document.getElementById("download_learning").removeAttribute("disabled");
        document.getElementById("download_unlearned").removeAttribute("disabled");
        document.getElementById("download_simple").removeAttribute("disabled");
    }

    function popup_result(res){
        var win = window.open("", "Title", "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=780,height=200,top="+(screen.height-400)+",left="+(screen.width-840));
        win.document.body.innerHTML = ("<html><head><title>请使用Excel导入</title></head><body><var>"+JSON.stringify(res)+"</var></body></html>");
    }

    function init(){
        var body = document.getElementById("root").parentElement

        body.appendChild(document.createElement("div")).innerHTML = String.raw`<div style="position: fixed; background-color: LightGreen; border: 2px solid ForestGreen; top: 200px; left: 0; min-width: 200px; min-height: 200px; text-align: center;" id="inject-root">
<h4 style="color:Green">扇贝助手</h4>
<p style="color:Green" id="current_book">单词书</p>
<p style="color:Green">条目 数量</p>
<p style="color:Green">在学单词 <var id="learning_word">NaN</var> <button id="download_learning">download</button></p>
<p style="color:Green">未学单词 <var id="unlearned_word">NaN</var> <button id="download_unlearned">download</button></p>
<p style="color:Green">简单词 <var id="simple_learned_word">NaN</var> <button id="download_simple">download</button></p>
<p style="color:Green" id="download_info"></p>
</div>`;

        update_wordinfo();


        window.addEventListener('hashchange',()=>{update_wordinfo()})
        document.getElementById("download_learning").addEventListener('click',async function(){
            disable_buttons();
            var res = await download_book("https://apiv3.shanbay.com/wordsapp/user_material_books/"+book_id+"/learning/words/learning_items?ipp=10&page=",Math.ceil(learning_count/10));
            popup_result(res)
            enable_buttons();
        })

        document.getElementById("download_unlearned").addEventListener('click',async function(){
            disable_buttons();
            var res = await download_book("https://apiv3.shanbay.com/wordsapp/user_material_books/"+book_id+"/learning/words/unlearned_items?ipp=10&page=",Math.ceil(unlearned_count/10));
            popup_result(res)
            enable_buttons();
        })

        document.getElementById("download_simple").addEventListener('click',async function(){
            disable_buttons();
            var res = await download_book("https://apiv3.shanbay.com/wordsapp/user_material_books/"+book_id+"/learning/words/simple_learned_items?ipp=10&page=",Math.ceil(simple_count/10));
            popup_result(res)
            enable_buttons();
        })
    }


    init();


    // "https://apiv3.shanbay.com/wordscollection/learning/words/unlearned_items?page=0&order=DESC&ipp=10"


    // Your code here...
})();