84864694 发表于 2022-7-11 12:23:25

关于脚本获取数据写入本地json文件的实现问题请教

我是小白,最近在学着写一个法宣在线网站自动学习的脚本,法宣的规则是每天学习够5分钟得5分,每天最多得50分,每做一个练习题得10分,每天最多50分,一个练习题可以重复做重复得分,目前自动学习的功能已经完美实现,关于做练习题我想实现的功能是我先找答案做题,当点击了答案就自动把题目和答案写入本地的json文件,后面再遇到和这个一样的题目,就会从本地的json文件中匹配,然后自动点击正确答案,现在点击答案获取数据已经实现,但是在把数据写入本地json文件上遇到了问题,在网上找了好多方法都没有解决,刚开始用了FileSaver.js,但这个只是保存文件,后又在网上看到nodejs的fs.writeFile可以解决,就安装了nodejs,但我在脚本里写const fs = require("fs")就报错了,说require未定义,也就是脚本没有nodejs环境,在网上查了好多都不知道怎么办,也没有关于油猴和nodejs相关的话题,试了在本地写一个js文件,然后用@require引入js文件也不行,实在没招了,所以请教大佬,这个怎么来实现,能实现吗,数据上传服务器暂时没考虑,之前买过一年的服务器做过影视站,但服务器已经到期了,写脚本期间还遇到一个问题,到现在也没解决,也是在做练习这个页面,我用了document.onreadystatechange = function() { if (document.readyState == "complete") {} }还有window.onload,里面的代码无论怎么都不会执行,网上说是网页一样造成了多个绑定,但是我试了addEventListener("load",function(){})也没用,下面是所有的脚本代码,麻烦大佬给看看
`// ==UserScript==
// @name         法宣在线自动学习
// @namespace    http://tampermonkey.net/
// @version      1.3
// @descriptiontry to take over the world!
// @author       Amen
// @match      http://www.faxuanyun.com/bps/frame/t/frame.html?*
// @match      http://www.faxuanyun.com/sps/courseware/t/courseware_1_t.html?*
// @match      http://www.faxuanyun.com/sps/exercises/t/exercies_3_t.html?*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=faxuanyun.com
// @grant      none
// ==/UserScript==

(function() {
    'use strict';

    // Your code here...
    document.onreadystatechange = function(){
      if (document.readyState == "complete") {
            //第一个页面进入课程
            if (document.location.href.indexOf("http://www.faxuanyun.com/bps/frame/t/frame.html") > -1 ) {
                var courses = document.querySelectorAll("#page .kc_img");
                var courses_sum = courses.length;
                var course_num = Math.ceil(Math.random()*courses_sum) - 1; //在所有课程中随机点击一个进入
                var course_study = courses;
                var point = Number(document.querySelector("#todypoint").innerHTML);
                if (point < 50) {
                  course_study.click();
                  setTimeout(function() {
                        location.reload();
                  }, 1000*60*5+1000*10);
                }
            }
            //第二个页面开始学习
            if (document.location.href.indexOf("http://www.faxuanyun.com/sps/courseware/t/courseware_1_t.html") > -1 ) {
                var courses_sub = document.querySelectorAll("#kejmc-box-id a");
                var courses_sub_sum = courses_sub.length;
                var course_sub_num = Math.ceil(Math.random()*courses_sub_sum) - 1; //在课程列表中随机点击一个学习
                var course_sub_study = courses_sub;
                course_sub_study.click();
                setTimeout(function() {
                  var start_study = document.querySelector("#inBtnDiv > a");
                  start_study.click();
                }, 3000);
                setInterval(function() {
                  var study_time = document.querySelector("#ware_time_num").innerHTML;
                  if (study_time == "00:05:01") {
                        var exit_btn = document.querySelector("#exitCourse");
                        exit_btn.click();
                        setTimeout(function() {
                            var exit_study = document.querySelectorAll("#exitBtnDiv > a");
                            exit_study.click();
                        }, 2000);
                  }
                }, 1000);
            }
      }
    }
    //第三个页面做练习题,目前只能做《中华人民共和国反有组织犯罪法》这一个课程
    if (document.location.href.indexOf("http://www.faxuanyun.com/sps/exercises/t/exercies_3_t.html") > -1 ) {
      setTimeout(function() {
            var title = document.querySelector("#ti_title").innerText.replace(/\d、/,""); //题目
            console.log(title);
            var options = document.querySelectorAll("#ti_item input"); //选项
            const fs = require("fs");
            //从选项中获得选择的答案
            for (var i=0; i<options.length; i++) {
                (function(i) {
                  var select = options;
                  select.addEventListener("click", function() {
                        var ans = document.querySelectorAll("#ti_item > li").innerText;
                        console.log(ans);
                        //将题目和答案写入本地json文件
                        var tiku = {"题目":title, "答案":ans};
                        tiku = JSON.stringify(tiku, 4);
                        console.log(tiku);
                        //fs.writeFile("E:\study\exam\题库.json", tiku, err=> {
                            //if(err) {
                              //console.log("写入出错了");
                            //}
                        //}
                  })
                })(i);
            }
            //var next_btn = document.querySelector("#ulPage > a:last-child");
      }, 2000);
    }
})();`

steven026 发表于 2022-7-11 12:37:25

浏览器好像因为安全原因是禁止写入本地文件的,只能生成一个文件让你手动下载
然后读取的话可以通过油猴的@resource file://+@grant GM_getResourceText读(不清楚能不能反向写,印象中是不行的)
// @resource FILE file://......
// @grant      GM_getResourceText
// ==/UserScript==
let abc=GM_getResourceText(FILE)

另外我建议你把数据存储在油猴内,用油猴内置的函数读存,这样比较方便,如果要下载到本地的话需要手动复制出来
// @grant      GM_setValue
// @grant      GM_getValue

Ne-21 发表于 2022-7-11 12:54:53

我建议本地起一个http服务器,用python或php写一个接口,将题目数据存入数据库来实现

Ne-21 发表于 2022-7-11 13:03:39

分享一个写着玩的题库API
https://bbs.tampermonkey.net.cn/thread-1643-1-1.html
(出处: 油猴中文网)

这个您可能需要,只需要配置一下go环境和mysql就可以用了

84864694 发表于 2022-7-11 14:11:03

steven026 发表于 2022-7-11 12:37
浏览器好像因为安全原因是禁止写入本地文件的,只能生成一个文件让你手动下载
然后读取的话可以通过油猴的@ ...

谢谢大佬

84864694 发表于 2022-7-11 14:12:52

Ne-21 发表于 2022-7-11 13:03
分享一个写着玩的题库API
https://bbs.tampermonkey.net.cn/thread-1643-1-1.html
(出处: 油猴中文网)


谢谢大佬,就是说油猴脚本想用nodejs是用不了的对吧

84864694 发表于 2022-7-11 14:17:03

Ne-21 发表于 2022-7-11 12:54
我建议本地起一个http服务器,用python或php写一个接口,将题目数据存入数据库来实现 ...

谢谢,python和php我也懂一点,我下一步的学习目标就是想建一个搜题的公众号,服务器要重新整起来了

Ne-21 发表于 2022-7-11 14:46:31

84864694 发表于 2022-7-11 14:12
谢谢大佬,就是说油猴脚本想用nodejs是用不了的对吧

nodejs我并不是很了解,我只是提供给你一个可行的方法

李恒道 发表于 2022-7-11 15:23:00

油猴是浏览器环境
不能执行nodejs环境代码的
你还是要写一个服务器端
有兴趣可以学一下nodejs或者php

84864694 发表于 2022-7-11 18:26:28

李恒道 发表于 2022-7-11 15:23
油猴是浏览器环境
不能执行nodejs环境代码的
你还是要写一个服务器端


好的,谢谢大佬
页: [1]
查看完整版本: 关于脚本获取数据写入本地json文件的实现问题请教