扇贝

扇贝单词下载导出

  1. // ==UserScript==
  2. // @name 扇贝
  3. // @name:en shanbay
  4. // @namespace http://261day.com/
  5. // @version 0.2
  6. // @description 扇贝单词下载导出
  7. // @description:en shanbay word download
  8. // @author You
  9. // @match https://web.shanbay.com/*
  10. // @grant none
  11. // ==/UserScript==
  12.  
  13. (function() {
  14. 'use strict';
  15.  
  16. var book_id = "";
  17. var learning_count = 0;
  18. var unlearned_count = 0;
  19. var simple_count = 0;
  20.  
  21. function get_data(url){
  22. return fetch(url, {
  23. "headers": {
  24. "accept": "application/json, text/plain, */*",
  25. "accept-language": "en,zh-CN;q=0.9,zh;q=0.8,ja;q=0.7",
  26. "sec-ch-ua": "\"Chromium\";v=\"88\", \"Google Chrome\";v=\"88\", \";Not A Brand\";v=\"99\"",
  27. "sec-ch-ua-mobile": "?0",
  28. "sec-fetch-dest": "empty",
  29. "sec-fetch-mode": "cors",
  30. "sec-fetch-site": "same-site",
  31. "x-csrftoken": "d57d33018f6b24892cea401df0173f53"
  32. },
  33. "referrer": "https://web.shanbay.com/",
  34. "referrerPolicy": "strict-origin-when-cross-origin",
  35. "body": null,
  36. "method": "GET",
  37. "mode": "cors",
  38. "credentials": "include"
  39. })
  40. .then(response => response.json())
  41. }
  42.  
  43. function get_decoded_data(url){
  44. return get_data(url)
  45. .then(json => json.data)
  46. .then(data => window.bays4.d(data))
  47. .then(data => JSON.parse(data))
  48. }
  49.  
  50. function update_wordinfo(){
  51. get_data("https://apiv3.shanbay.com/wordsapp/user_material_books/current").
  52. then(data => {
  53. document.getElementById("current_book").innerHTML = "单词书:" + data.materialbook.name + "<br/>单词书id:" + data.materialbook.id;
  54.  
  55. book_id = data.materialbook.id;
  56.  
  57.  
  58. get_decoded_data("https://apiv3.shanbay.com/wordsapp/user_material_books/"+book_id+"/learning/words/unlearned_items?ipp=10&page=1")
  59. .then(data => {
  60. document.getElementById("unlearned_word").innerText = data.total
  61. unlearned_count = data.total;
  62. })
  63.  
  64. get_decoded_data("https://apiv3.shanbay.com/wordsapp/user_material_books/"+book_id+"/learning/words/learning_items?ipp=10&page=1")
  65. .then(data => {
  66. document.getElementById("learning_word").innerText = data.total;
  67. learning_count = data.total;
  68. })
  69.  
  70. get_decoded_data("https://apiv3.shanbay.com/wordsapp/user_material_books/"+book_id+"/learning/words/simple_learned_items?ipp=10&page=1")
  71. .then(data => {
  72. document.getElementById("simple_learned_word").innerText = data.total
  73. simple_count = data.total;
  74. })
  75. })
  76. }
  77.  
  78. function sleep(ms) {
  79. return new Promise(resolve => setTimeout(resolve, ms));
  80. }
  81.  
  82. async function download_book(url,pages){
  83. var res = [];
  84.  
  85. for(var i=1;i<=pages;i++){
  86. document.getElementById("download_info").innerText = "休眠中"+i+"/"+pages
  87. await sleep(100)
  88. document.getElementById("download_info").innerText = "下载中"+i+"/"+pages
  89. var data = await get_decoded_data(url+i);
  90.  
  91. for(const id in data.objects){
  92. var word = data.objects[id]
  93. var meanings = " ";
  94. for(const mean of word.vocab_with_senses.senses){
  95. meanings += mean.pos + mean.definition_cn
  96. }
  97.  
  98. res.push({"word":word.vocab_with_senses.word, "trans":meanings})
  99. }
  100. }
  101.  
  102. document.getElementById("download_info").innerText = ""
  103.  
  104. return res;
  105. }
  106.  
  107. function disable_buttons(){
  108. document.getElementById("download_learning").setAttribute("disabled","true");
  109. document.getElementById("download_unlearned").setAttribute("disabled","true");
  110. document.getElementById("download_simple").setAttribute("disabled","true");
  111. }
  112.  
  113. function enable_buttons(){
  114. document.getElementById("download_learning").removeAttribute("disabled");
  115. document.getElementById("download_unlearned").removeAttribute("disabled");
  116. document.getElementById("download_simple").removeAttribute("disabled");
  117. }
  118.  
  119. function popup_result(res){
  120. var win = window.open("", "_blank");
  121. win.document.write(String.raw`<html>
  122. <head><title>请使用Excel导入</title>
  123. <script>
  124. function download(filename, text) {
  125. var element = document.createElement('a');
  126. element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
  127. element.setAttribute('download', filename);
  128.  
  129. element.style.display = 'none';
  130. document.body.appendChild(element);
  131.  
  132. element.click();
  133.  
  134. document.body.removeChild(element);
  135. }
  136.  
  137. function download_code(){
  138. var c = document.getElementById("code").innerText;
  139. download("export.json",c);
  140. }
  141. </script>
  142. </head>
  143. <body>
  144. <h1>请使用Excel导入</h1>
  145. <button onclick="download_code()">download</button>
  146. <hr style="border-top: 3px solid #bbb;">
  147. <pre><code class="json" id="code">`+JSON.stringify(res,null,2)+"</code></pre></body></html>");
  148. }
  149.  
  150. function init(){
  151. var body = document.getElementById("root").parentElement
  152.  
  153. 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">
  154. <h4 style="color:Green">扇贝助手</h4>
  155. <p style="color:Green" id="current_book">单词书</p>
  156. <p style="color:Green">条目 数量</p>
  157. <p style="color:Green">在学单词 <var id="learning_word">NaN</var> <button id="download_learning">download</button></p>
  158. <p style="color:Green">未学单词 <var id="unlearned_word">NaN</var> <button id="download_unlearned">download</button></p>
  159. <p style="color:Green">简单词 <var id="simple_learned_word">NaN</var> <button id="download_simple">download</button></p>
  160. <p style="color:Green" id="download_info"></p>
  161. </div>`;
  162.  
  163. update_wordinfo();
  164.  
  165.  
  166. window.addEventListener('hashchange',()=>{update_wordinfo()})
  167. document.getElementById("download_learning").addEventListener('click',async function(){
  168. disable_buttons();
  169. 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));
  170. popup_result(res)
  171. enable_buttons();
  172. })
  173.  
  174. document.getElementById("download_unlearned").addEventListener('click',async function(){
  175. disable_buttons();
  176. 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));
  177. popup_result(res)
  178. enable_buttons();
  179. })
  180.  
  181. document.getElementById("download_simple").addEventListener('click',async function(){
  182. disable_buttons();
  183. 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));
  184. popup_result(res)
  185. enable_buttons();
  186. })
  187. }
  188.  
  189.  
  190. init();
  191.  
  192.  
  193. // "https://apiv3.shanbay.com/wordscollection/learning/words/unlearned_items?page=0&order=DESC&ipp=10"
  194.  
  195.  
  196. // Your code here...
  197. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址