// ==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...
})();