diff --git a/README.md b/README.md index 04392ce..67deb28 100644 --- a/README.md +++ b/README.md @@ -1,182 +1,11 @@ -## 当前程序版本:2.6.9 -**现在满分为42哦(除了每日和专项答题)** -因为刚刚上线,所以`commit`有点多,更新也比较频繁,经常是想到哪改到哪,所以请多包涵,有问题可以提`issue` - -## 使用说明 -- 因为部分模块有随机性,所以控制台输出的数量和时间不一定准确。 -- 文章和视频:点击“切到 强国”,在强国主界面点击“开始浏览”,即可自动浏览,**并且会记录已阅读的文章到数据库,重复阅读会自动退出**。 -- 挑战答题:进入挑战答题界面,点击“挑战答题”,开始答题,答错会自动重新开始,得到6分停止。 -- 每日答题:进入每日、专项、每周界面,点击"每日答题等"。程序会自行进行答题,得到6分停止。 -- 手动改题:手动查改删增,支持以题目或答案关键字查询,或列出最后十条入库记录 -- 题库页面有清空文章列表的功能,方便两个账号的用户使用 -- 更新网络题库:从网络同步最近题库,过滤后入tikuNet表 -# 懒人学习 +## 双节来临,普天同庆! +把近一个月的更新,重构界面功能;不断更新题库;加入工具模式; -一款基于auto.js,安卓自动学习脚本,支持看文章视频、收藏分享评论、挑战答题、每日答题、每周答题。 -本项目仅供autojs交流学习,请勿用于商业 +#### 自定义学习:按照页面的开关选项和参数进行学习。 +#### 工具模式:不进行学习,只保留答题提示功能。可以在各种答题界面使用,如每日、每周、专项、挑战和竞答。但是在竞答中,只提示,不点击。 +#### 一键学习:按照获得的学分进行学习。为了避免专项答题失分(因为填空题不能保证全对),所以一键学习不会进行专项答题,即最多一键47分。 +[安装包下载](https://github.com/admin0008/LazyStudy/releases/download/2.6.9%EF%BC%88fix%EF%BC%89/_v3.0.apk) -[release下载](https://github.com/lolisaikou/LazyStudy/releases/) -## 关于本脚本 -因原作者将脚本被删除,这里只能依靠本人能力和[ivanwhaf](https://github.com/ivanwhaf/xxqg-helper)的脚本更新 +注:由于我没有升级xxqg的2.17的版本,所以2.17的用户请自己重新安装2.15版本的xxqg享用。 -## 软件界面 -
- - -
- - -## 环境依赖 - -- 手机为安卓7.0以上版本 -- 安装程序后,点击加载悬浮窗,弹出授权界面。请授权 无障碍 和 悬浮窗。 - - -## 版本更新 -- 2020.08.27 - 重构了题库更新的方法,不再使用jsoup来解析[原题库](http://49.235.90.76:5000/),而是使用js自带的方法来解析题库的[json源](http://49.235.90.76:5000/api/questions)。并且使用了[jsDelivr](https://www.jsdelivr.com/)加速了json源,[加速用](https://github.com/lolisaikou/tiku-autoupdate)的项目在这里。 [#40](https://github.com/lolisaikou/LazyStudy/issues/40) - ~~大概~~修复看视频出现的问题 [#42](https://github.com/lolisaikou/LazyStudy/issues/42) -*** -- 2020.08.21 - 修复了上个版本的报错(~~因为太懒直接复制粘贴另一个版本的代码~~) - 题库页面增加了清空文章列表的按钮,方便有两个账号的用户使用 - 为文章阅读增加了一个循环,直到循环次数大于3次或阅读文章满分停止 - 为配合上面的功能,对获取积分和阅读文章的模块做了相应调整 - 调整随机背景的透明度 -*** -- 2020.08.16 - 主页增加随机背景 [#29](https://github.com/lolisaikou/LazyStudy/issues/29) - 为部分函数增加了随机性(提高安全性) - ~~大概~~修复听广播卡住的问题 [#27](https://github.com/lolisaikou/LazyStudy/issues/27) - 现在更新题库会正常显示更新了多少道题(不会再显示更新了undefined道题) [#20](https://github.com/lolisaikou/LazyStudy/issues/20) - 修改学习顺序,减少不必要的流程 -*** -- 2020.08.14 - 跟进了最新版的积分规则 - 修复一些小问题 - 增加一个没用的功能 - 下面总结一下变化 - -|原项目|变化|现项目|现分数| -| :-: | :-: | :-: | :-: | -|登录|不变|×|1| -|阅读文章|与文章学习时长合并|我要选读文章|6| -|文章学习时长|与阅读文章合并(且2分钟1分改为1分钟1分)|我要选读文章|6| -|视听学习|不变|×|6| -|视听学习时长|1分钟1分(原2分钟1分)|×|6| -|每日答题|10道题减为5道|×|6| -|挑战答题|10道题减为5道|×|6| -|订阅|不变|×|2| -|收藏|删除|×|0| -|分享|不变|×|1| -|评论|次数-1|×|1| -|本地频道|不变|×|1| -|**合计**|||42| -*** -- 2020.08.11 - 点击文章的方式从点击页面上的日期换到控件了 - 因为autojspro最新版有bug,需要降级,所以原来的签名丢失,所以**本次更新需要卸载**(记得备份文章列表) - 更新了题库 - 听广播时间增加了1分钟(防止分数不够) - 修改听广播部分的逻辑 - 修复订阅部分的问题 - 增加了运行结束后停止收听广播的功能 - 因为影响阅读文章,所以将看小视频和本地频道到**最后(收听完广播才会运行)** -*** -- 2020.07.26 - 修复因为首页没有当天新闻,出现的控制台被刷屏,无法继续阅读文章的问题 - 解决文章学习时长不够,但剩余文章为0不能阅读的问题 - 增加了判断当前是否在答题界面的功能,防止直接报错停止 - 修复了一些小问题 -*** -- 2020.07.20 - 增加了选择文章学习类别的功能 [#11](https://github.com/lolisaikou/LazyStudy/issues/11) - 修复如果文章标题里有英文单引号会导致数据库写入错误的问题 - 更改了阅读文章部分的逻辑,把视频检测的部分放在了获取文章标题的前面 - 增加了文章标题获取的方法,感谢[#issuecomment-660916041](https://github.com/lolisaikou/LazyStudy/issues/11#issuecomment-660916041) - 修复了一些小问题 -*** -- 2020.07.08 - 现在每日答题功能可以答每周和专项答题了 - 修复上个版本留下来的小bug -*** -- 2020.07.07 - 将已学习的文章存储到**其他数据库**内而不是`题库`(备份题库的功能也换为备份已读文章的数据库) - 修改每日浏览逻辑,解决运行结束,"视听学习"分数不够的问题 - ~~可能~~修复 [#3](https://github.com/lolisaikou/LazyStudy/issues/3) 中提到的问题 - 修改限制每日挑战答题次数的逻辑 - 修复订阅强国号的各种问题 -*** -- 2020.06.26 - 继续修复听广播卡住的问题 - 增加每日运行结束后自动备份题库(备份到/sdcard/Download/下) - 修复一些小问题 -*** -- 2020.06.21 - 修复卡在听广播页面的问题(其实是卡在订阅部分了,因为在非主页的情况下,click方法找不到订阅这这个控件) - 修改每日浏览逻辑,降低了浏览的时间 -*** -- 2020.06.20 - **增加了导入、导出题库的功能,方便更新(更新时一定要到题库页面导出题库)** - 修复了阅读到重复文章会增加计数的问题 - 合入订阅(实验性)功能到主程序中(会在浏览中自动订阅) -*** -- 2020.06.19 - 完全依靠[ivanwhaf](https://github.com/ivanwhaf/xxqg-helper)的脚本,恢复了使用 - 修复了大部分功能无法使用的问题 - ~~每日答题功能不能做每周和专项答题了~~7月8日更新已支持 - 挑战答题答错会自动重新挑战,而且增加了限制,每日最多10题,达到自动停止 - 每日答题答够十题也会自动返回了 - 每日阅读的文章自动添加到数据库,重复阅读会自动返回,感谢[wanghuisenior](https://github.com/wanghuisenior) - 更改包名为com.lazyxue(因为使用auto.js pro打包导致和之前的签名不同) - 增加了订阅功能,感谢[colincai](https://github.com/ivanwhaf/xxqg-helper/issues/75)(20日更新已合入)~~(未测试稳定性,未实装,感兴趣可以下载subscribe.js在学习强国主页运行即可)~~ -*** - -- 2020.04.02 - 再次修复填空题获取不到题目问题 -*** -- 2020.04.01 - 修复填空题获取不到题目问题 -*** -- 2020.03.27 - 修复每日答题填空题获取多个空格时错误;获取正确答案由滑屏改控件滚动 -*** -- 2020.03.21 - 修复获取填空题题目失败,点击评论后增加停顿 -*** -- 2020.02.23 - 重制界面,新增按积分浏览,修复改题中update语句错误 - 支持按题目与答案模糊搜索,增加在线帮助与更新功能 - 挑战答题点击间隔改为随机 -*** -- 2020.01.19 - 新增下载网络题库到本地,取消切换小程序方式(感谢kessil) - 修复每日答题,错误答案入库问题 - 更新浏览文章视频部分,目前为xxqg_v3.1.0 (无 UI).js(感谢ivanwhaf) - 新增手动查改删增题库功能 - 新增本地频道浏览 -*** -- 2019.12.24 - 修复每日答题获取提示内容失败等问题 -*** -- 2019.12.15 - 修复答题部分bug 取消浏览时收藏评论分享功能(避免部分手机报错) -*** -- 2019.12.13 - 重构收藏分享评论模块,修复错误 -*** -- 2019.12.11 - 重构每日答题逻辑,速度更快 -*** -- 2019.12.08 - 新增每日答题功能 -*** -- 2019.11.21 - 发布 - -## **特别感谢** -###### 以下排名不分先后 ->[**lgpersonal**](https://github.com/lgpersonal/) ->[**kessil**](https://github.com/kessil/AutoXue) ->[**ivanwhaf**](https://github.com/ivanwhaf/xxqg-helper) ->[**studyhelperhelper**](https://github.com/studyhelperhelper/studyhelper) +其实功能也就差不多了,不打算继续更新了,可能一下次更新是下个双节(我也不知道还会不会有双节) diff --git a/challengeAnswer.js b/challengeAnswer.js index a9994e6..0e50f05 100644 --- a/challengeAnswer.js +++ b/challengeAnswer.js @@ -11,23 +11,6 @@ function delay(seconds) { sleep(1000 * seconds);//sleep函数参数单位为毫秒所以乘1000 } -/** - * @description: 生成从minNum到maxNum的随机数 - * @param: minNum-较小的数 - * @param: maxNum-较大的数 - * @return: null - */ -function randomNum(minNum, maxNum) { - switch (arguments.length) { - case 1: - return parseInt(Math.random() * minNum + 1, 10); - case 2: - return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10); - default: - return 0; - } -} - /** * @description: 从数据库中搜索答案 * @param: question 问题 @@ -37,7 +20,7 @@ function getAnswer(question, table_name) { var dbName = "tiku.db";//题库文件名 var path = files.path(dbName); var db = SQLiteDatabase.openOrCreateDatabase(path, null); - sql = "SELECT answer FROM " + table_name + " WHERE question LIKE '" + question + "%'" + sql = "SELECT answer FROM " + table_name + " WHERE question LIKE '%" + question + "%'" var cursor = db.rawQuery(sql, null); if (cursor.moveToFirst()) { var answer = cursor.getString(0); @@ -45,7 +28,7 @@ function getAnswer(question, table_name) { return answer; } else { - console.log("题库中未找到答案"); + console.log(table_name + "题库中未找到答案"); cursor.close(); return ''; } @@ -89,7 +72,7 @@ function challengeQuestionLoop(conNum) { question = question.substring(0, chutiIndex - 2); } - question = question.replace(/\s/g, ""); + question = question.replace(/\s/g, "%"); var options = [];//选项列表 if (className("ListView").exists()) { @@ -101,7 +84,8 @@ function challengeQuestionLoop(conNum) { console.error("答案获取失败!"); return; } - + var optionStr = options.join("_"); + question = question + "%" + optionStr; var answer = getAnswer(question, 'tiku'); if (answer.length == 0) {//tiku表中没有则到tikuNet表中搜索答案 answer = getAnswer(question, 'tikuNet'); @@ -121,53 +105,33 @@ function challengeQuestionLoop(conNum) { { let i = random(0, listArray.length - 1); console.error("没有找到答案,随机点击一个"); - delay(randomNum(0.5, 1)); + delay(1); listArray[i].child(0).click();//随意点击一个答案 hasClicked = true; console.log("------------"); } else//如果找到了答案 { - var clickAns = ""; listArray.forEach(item => { var listDescStr = item.child(0).child(1).text(); if (listDescStr == answer) { - clickAns = answer; - //显示 对号 - var b = item.child(0).bounds(); - var tipsWindow = drawfloaty(b.left, b.top); - //随机时长点击 - delay(randomNum(0.5, 1.5)); //点击 item.child(0).click(); hasClicked = true; - sleep(300); - //消失 对号 - tipsWindow.close(); + log("-----------------------------------"); } }); } if (!hasClicked)//如果没有点击成功 { console.error("未能成功点击,随机点击一个"); - delay(randomNum(0.5, 1)); + delay(1); let i = random(0, listArray.length - 1); listArray[i].child(0).click();//随意点击一个答案 console.log("------------"); } } -function drawfloaty(x, y) { - //floaty.closeAll(); - var window = floaty.window( - - - - ); - window.setPosition(x, y - 45); - return window; -} - /** * @description: 挑战答题 @@ -175,50 +139,58 @@ function drawfloaty(x, y) { * @return: null */ function challengeQuestion() { - let conNum = 0;//连续答对的次数 - let lNum = 0;//轮数 + text("我的").click(); + while (!textContains("我要答题").exists()); + delay(1); + click("我要答题"); + while (!text("答题竞赛").exists()); + delay(1); + var ob= text("答题竞赛").findOne().parent(); + var index = ob.childCount() - 1; + ob.child(index).click(); + console.info("开始挑战答题") + delay(4); + let conNum = 0; //连续答对的次数 + let lNum = 1; //轮数 while (true) { - delay(2); - if (!className("RadioButton").exists()) { - toastLog("没有找到题目!请检查是否进入答题界面!"); - console.error("没有找到题目!请检查是否进入答题界面!"); - console.log("停止"); - break; - } + delay(1); challengeQuestionLoop(conNum); delay(1); if (text("v5IOXn6lQWYTJeqX2eHuNcrPesmSud2JdogYyGnRNxujMT8RS7y43zxY4coWepspQkvw" + - "RDTJtCTsZ5JW+8sGvTRDzFnDeO+BcOEpP0Rte6f+HwcGxeN2dglWfgH8P0C7HkCMJOAAAAAElFTkSuQmCC").exists())//遇到❌号,则答错了,不再通过结束本局字样判断 + "RDTJtCTsZ5JW+8sGvTRDzFnDeO+BcOEpP0Rte6f+HwcGxeN2dglWfgH8P0C7HkCMJOAAAAAElFTkSuQmCC").exists()) //遇到❌号,则答错了,不再通过结束本局字样判断 { - if (conNum >= qCount) { - lNum++; - } - if (lNum >= lCount) { - console.log("挑战答题结束!返回积分界面!"); + delay(1); + if (lNum >= lCount && conNum >= qCount) { + console.log("挑战答题结束!返回主页!"); + /* 回退4次返回主页 */ back(); delay(1); back(); - break; - } - else { - console.log("出现错误,等5秒开始下一轮...") - delay(3);//等待5秒才能开始下一轮 + delay(1); + back(); + delay(1); back(); - //desc("结束本局").click();//有可能找不到结束本局字样所在页面控件,所以直接返回到上一层 - delay(2); - text("再来一局").click() - delay(4); - if (conNum < 5) { - conNum = 0; + delay(1); + break; + } else { + console.log("等5秒开始下一轮...") + delay(1); + click("结束本局"); + delay(1); + text("再来一局").waitFor(); + click("再来一局"); + delay(5); + if (conNum >= qCount) { + lNum++; } + conNum = 0; } - } - else//答对了 + console.warn("第" + lNum.toString() + "轮开始...") + } else //答对了 { conNum++; } } - conNum = 0; } function main() { @@ -228,7 +200,7 @@ function main() { challengeQuestion(); console.hide() } - +//main(); module.exports = main; diff --git a/tiku.db b/tiku.db index 8737b49..54966c4 100644 Binary files a/tiku.db and b/tiku.db differ diff --git a/updateTikuNet.js b/updateTikuNet.js index e3ccd55..596786a 100644 --- a/updateTikuNet.js +++ b/updateTikuNet.js @@ -31,6 +31,8 @@ function CreateAndInsert(liArray){ //log("题目:"+li.text()); var tiMu = liArray[li].content; var daAn = liArray[li].answer; + var xuanXiang = liArray[li].options; + tiMu = tiMu + xuanXiang; log(util.format("题目:%s\n答案:%s"),tiMu,daAn); stmt.bindString(1, tiMu); stmt.bindString(2, daAn); diff --git a/xxqg_v3.1.3.js b/xxqg_v3.1.3.js index d3391ab..aa9a32f 100644 --- a/xxqg_v3.1.3.js +++ b/xxqg_v3.1.3.js @@ -1,82 +1,52 @@ importClass(android.database.sqlite.SQLiteDatabase); -/** - * @Description: Auto.js xxqg-helper https://github.com/ivanwhaf/xxqg-helper - * @version: 3.1.3 - * @Author: Ivan - * @Date: 2020-6-10 - */ +auto.waitFor(); //等待获取无障碍辅助权限 -/********************************************数据库控制函数开始***********************************************/ -/** - * @description: 读取文章数据库 - * @param: title,date - * @return: res - */ -function getLearnedArticle(title, date) { - rtitle = title.replace("'", "''"); - var dbName = "list.db"; - //文件路径 - var path = files.path(dbName); - //确保文件存在 - if (!files.exists(path)) { - // files.createWithDirs(path); - console.error("未找到题库!请将题库放置与js同一目录下"); - } - //创建或打开数据库 - var db = SQLiteDatabase.openOrCreateDatabase(path, null); - var createTable = "\ - CREATE TABLE IF NOt EXISTS learnedArticles(\ - title CHAR(500),\ - date CHAR(100)\ - );"; - // var cleanTable = "DELETE FROM tikuNet"; - db.execSQL(createTable); - // db.execSQL(cleanTable); - var sql = "SELECT * FROM learnedArticles WHERE title = '" + rtitle + "' AND date = '" + date + "'"; - var cursor = db.rawQuery(sql, null); - var res = cursor.moveToFirst(); - cursor.close(); - db.close(); - return res; +//检查截图权限 +if (!requestScreenCapture()) { + toast("请求截图失败"); + exit(); } /** - * @description: 获取的文章题目写入数据库 - * @param: title,date - * @return: res + * @Description: Auto.js xxqg-helper (6+6)+(6+6)+(1+1+2)+6+6+1=41分 + * @version: 3.1.3 + * @Author: Ivan + * @Date: 2020-6-10 */ -function insertLearnedArticle(title, date) { - rtitle = title.replace("'", "''"); - var dbName = "list.db"; - var path = files.path(dbName); - var db = SQLiteDatabase.openOrCreateDatabase(path, null); - var createTable = "\ - CREATE TABLE IF NOt EXISTS learnedArticles(\ - title CHAR(253),\ - date CHAR(100)\ - );"; - // var cleanTable = "DELETE FROM tikuNet"; - db.execSQL(createTable); - var sql = "INSERT INTO learnedArticles VALUES ('" + rtitle + "','" + date + "')"; - db.execSQL(sql); - db.close(); -} - -/********************************************数据库控制函数结束***********************************************/ +var customize_flag = false; //自定义运行标志 var asub = 2; //订阅数 -var aCount = 6;//文章默认学习篇数 -var vCount = 6;//小视频默认学习个数 -var cCount = 2;//收藏+分享+评论次数 - -var aTime = 70;//有效阅读一分钟1分*6 -var vTime = 15;//每个小视频学习-15秒 -var rTime = 370;//广播收听6分 * 60 = 360秒 - -var aCatlog = files.read("./article.txt");//文章学习类别,可自定义修改为“要闻”、“新思想”等 - -var myScores = {};//分数 - +var aCount = 6; //文章默认学习篇数 +var vCount = 6; //小视频默认学习个数 +var sCount = 2; //分享次数 +var cCount = 1; //评论次数 + +var aTime = 10; //每篇文章学习10秒 +var pTime = 360; //文章时长 +var vTime = 10 //每个小视频学习10秒 +var rTime = 360; //视频时长 + +var commentText = ["支持党,支持国家!", "为实现中华民族伟大复兴而不懈奋斗!", "紧跟党走,毫不动摇!", + "不忘初心,牢记使命", "努力奋斗,报效祖国!" +]; //评论内容,可自行修改,大于5个字便计分 + +var aCatlog = "推荐" //文章学习类别,可自定义修改为“要闻”、“新思想”等 + +var myScores = []; //分数数组及初始化 + +myScores['登录'] = 0; +myScores['阅读文章'] = 0; +myScores['文章时长'] = 0; +myScores['视听学习'] = 0; +myScores['视听学习时长'] = 0; +myScores['每日答题'] = 0; +myScores['每周答题'] = 0; +myScores['专项答题'] = 0; +myScores['挑战答题'] = 0; +myScores['订阅'] = 0; +myScores['分享'] = 0; +myScores['发表观点'] = 0; +myScores['本地频道'] = 0; /** * @description: 延时函数 @@ -84,25 +54,9 @@ var myScores = {};//分数 * @return: null */ function delay(seconds) { - sleep(1000 * seconds + randomNum(0, 500));//sleep函数参数单位为毫秒所以乘1000 + sleep(1000 * seconds + random(0, 1000)); //sleep函数参数单位为毫秒所以乘1000 } -/** - * @description: 生成从minNum到maxNum的随机数 - * @param: minNum-较小的数 - * @param: maxNum-较大的数 - * @return: null - */ -function randomNum(minNum, maxNum) { - switch (arguments.length) { - case 1: - return parseInt(Math.random() * minNum + 1, 10); - case 2: - return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10); - default: - return 0; - } -} /** * @description: 文章学习计时(弹窗)函数 @@ -110,31 +64,29 @@ function randomNum(minNum, maxNum) { * @return: null */ function article_timing(n, seconds) { - seconds = seconds + randomNum(0, 10) - h = device.height;//屏幕高 - w = device.width;//屏幕宽 + h = device.height; //屏幕高 + w = device.width; //屏幕宽 x = (w / 3) * 2; h1 = (h / 6) * 5; h2 = (h / 6); for (var i = 0; i < seconds; i++) { - while (!textContains("欢迎发表你的观点").exists())//如果离开了文章界面则一直等待 + while (!textContains("欢迎发表你的观点").exists()) //如果离开了文章界面则一直等待 { console.error("当前已离开第" + (n + 1) + "文章界面,请重新返回文章页面..."); delay(2); } - if (i % 5 == 0)//每5秒打印一次学习情况 + if (i % 5 == 0) //每5秒打印一次学习情况 { console.info("第" + (n + 1) + "篇文章已经学习" + (i + 1) + "秒,剩余" + (seconds - i - 1) + "秒!"); } - sleep(1000); - if (i % 10 == 0)//每10秒滑动一次,如果android版本<7.0请将此滑动代码删除 + delay(1); + if (i % 10 == 0) //每10秒滑动一次,如果android版本<7.0请将此滑动代码删除 { toast("这是防息屏toast,请忽视-。-"); if (i <= seconds / 2) { - swipe(x, h1, x, h2, 500);//向下滑动 - } - else { - swipe(x, h2, x, h1, 500);//向上滑动 + swipe(x, h1, x, h2, 500); //向下滑动 + } else { + swipe(x, h2, x, h1, 500); //向上滑动 } } } @@ -147,12 +99,12 @@ function article_timing(n, seconds) { */ function video_timing_bailing(n, seconds) { for (var i = 0; i < seconds; i++) { - while (!textContains("分享").exists())//如果离开了百灵小视频界面则一直等待 + while (!textContains("分享").exists()) //如果离开了百灵小视频界面则一直等待 { console.error("当前已离开第" + (n + 1) + "个百灵小视频界面,请重新返回视频"); delay(2); } - sleep(1000); + delay(1); console.info("第" + (n + 1) + "个小视频已经观看" + (i + 1) + "秒,剩余" + (seconds - i - 1) + "秒!"); } } @@ -163,14 +115,13 @@ function video_timing_bailing(n, seconds) { * @return: null */ function video_timing_news(n, seconds) { - seconds = seconds + randomNum(0, 10) for (var i = 0; i < seconds; i++) { - sleep(1000); - while (!textContains("欢迎发表你的观点").exists())//如果离开了联播小视频界面则一直等待 + while (!textContains("欢迎发表你的观点").exists()) //如果离开了联播小视频界面则一直等待 { console.error("当前已离开第" + (n + 1) + "个新闻小视频界面,请重新返回视频"); delay(2); } + delay(1); console.info("第" + (n + 1) + "个小视频已经观看" + (i + 1) + "秒,剩余" + (seconds - i - 1) + "秒!"); } } @@ -182,12 +133,12 @@ function video_timing_news(n, seconds) { */ function radio_timing(r_time, seconds) { for (var i = 0; i < seconds; i++) { - sleep(1000); - if (i % 5 == 0)//每5秒打印一次信息 + delay(1); + if (i % 5 == 0) //每5秒打印一次信息 { console.info("广播已经收听" + (i + 1 + r_time) + "秒,剩余" + (seconds - i - 1) + "秒!"); } - if (i % 15 == 0)//每15秒弹一次窗防止息屏 + if (i % 15 == 0) //每15秒弹一次窗防止息屏 { toast("这是防息屏弹窗,可忽略-. -"); } @@ -203,17 +154,15 @@ function dateToString(y, m, d) { var year = y.toString(); if ((m + 1) < 10) { var month = "0" + (m + 1).toString(); - } - else { + } else { var month = (m + 1).toString(); } if (d < 10) { var day = "0" + d.toString(); - } - else { + } else { var day = d.toString(); } - var s = year + "-" + month + "-" + day;//年-月-日 + var s = year + "-" + month + "-" + day; //年-月-日 return s; } @@ -228,7 +177,7 @@ function getTodayDateString() { var m = date.getMonth(); var d = date.getDate(); - var s = dateToString(y, m, d);//年-月-日 + var s = dateToString(y, m, d); //年-月-日 return s } @@ -243,7 +192,7 @@ function getYestardayDateString() { var y = date.getFullYear(); var m = date.getMonth(); var d = date.getDate(); - var s = dateToString(y, m, d);//年-月-日 + var s = dateToString(y, m, d); //年-月-日 return s } @@ -252,115 +201,114 @@ function getYestardayDateString() { * @param: null * @return: null */ -function articleStudy(x) { - while (!desc("学习").exists());//等待加载出主页 - var listView = className("ListView");//获取文章ListView控件用于翻页 - if (x == 0) { - desc("学习").click();//点击主页正下方的"学习"按钮 - delay(2); - click(aCatlog); - } +function articleStudy() { + while (!desc("学习").exists()); //等待加载出主页 + desc("学习").click(); //点击主页正下方的"学习"按钮 + delay(2); + var listView = className("ListView"); //获取文章ListView控件用于翻页 + click(aCatlog); delay(2); - var zt_flag = false;//判断进入专题界面标志 - var fail = 0;//点击失败次数 - var date_string = getTodayDateString();//获取当天日期字符串 + var currentNewsTitle = ""; + var fail = 0; //点击失败次数 + var date_string = getTodayDateString(); //获取当天日期字符串 + for (var i = 0, t = 0; i < aCount;) { - try { - if ((id("general_card_title_id").findOnce(t).parent().parent().click() || id("general_card_title_id").findOnce(t).parent().parent().parent().click()) == true) { - delay(5); - // // delay(10); //等待加载出文章页面,后面判断是否进入了视频文章播放要用到 - //获取当前正在阅读的文章标题 - let n = 0; - while (!textContains("欢迎发表你的观点").exists()) {//如果没有找到评论框则认为没有进入文章界面,一直等待 - delay(2); - console.warn("正在等待加载文章界面..."); - if (n > 3) {//等待超过3秒则认为进入了专题界面,退出进下一篇文章 - console.warn("没找到评论框!该界面非文章界面!"); - zt_flag = true; - break; - } - n++; - } - if (text("展开").exists()) {//如果存在“展开”则认为进入了文章栏中的视频界面需退出 - console.warn("进入了视频界面,退出并进入下一篇文章!"); - t++; - back(); - if (rTime != 0) { - while (!desc("学习").exists()); - console.info("因为广播被打断,重新收听广播..."); - delay(0.5); - listenToRadio();//听电台广播 - while (!desc("学习").exists()); - desc("学习").click(); - } - delay(2); - continue; - } - if (zt_flag == true) {//进入专题页标志 - console.warn("进入了专题界面,即将退出并进下一篇文章!"); - t++; - back(); - delay(2); - zt_flag = false; - continue; - } - var currentNewsTitle = "" - if (id("xxqg-article-header").exists()) { - currentNewsTitle = id("xxqg-article-header").findOne().child(0).text(); // 最终解决办法 - } else if (textContains("来源").exists()) { - currentNewsTitle = textContains("来源").findOne().parent().children()[0].text(); - } else if (textContains("作者").exists()) { - currentNewsTitle = textContains("作者").findOne().parent().children()[0].text(); - } else if (descContains("来源").exists()) { - currentNewsTitle = descContains("来源").findOne().parent().children()[0].desc(); - } else if (descContains("作者").exists()) { - currentNewsTitle = descContains("作者").findOne().parent().children()[0].desc(); - } else { - console.log("无法定位文章标题,即将退出并阅读下一篇") - t++; + var art_obj = text(date_string).findOnce(t); + //console.info(art_obj); + if ((art_obj != null) && (art_obj.parent().childCount() == 4)) { + t++; //t为实际查找的文章控件在当前布局中的标号,和i不同,勿改动! + if ((art_obj.parent().child(3).text() == "播报") && (art_obj.parent().child(0).text() != currentNewsTitle)) //如果播报存在就进入文章正文 + { + currentNewsTitle = art_obj.parent().child(0).text(); + log(currentNewsTitle); + art_obj.parent().click(); + delay(1); + + if (checkCol() != null) { + console.info("当前文章已收藏阅读过"); back(); - delay(2); continue; } - if (currentNewsTitle == "") { - console.log("标题为空,即将退出并阅读下一篇") - t++; - back(); - delay(2); - continue; + + console.log("正在学习第" + (i + 1) + "篇文章..."); + fail = 0; //失败次数清0 + article_timing(i, aTime); + pTime = pTime - aTime; + Collect(); //* 以收藏来标记文章已读,避免重复阅读 + //分享文章 + if (sCount != 0) { + Share(sCount); //分享 + sCount = 0; + } - var flag = getLearnedArticle(currentNewsTitle, date_string); - if (flag) { - //已经存在,表明阅读过了 - console.info("该文章已经阅读过,即将退出并阅读下一篇"); - t++; - back(); - delay(2); - continue; - } else { - //没阅读过,添加到数据库 - insertLearnedArticle(currentNewsTitle, date_string); + //评论文章 + if (cCount != 0) { + Comment(cCount); //评论 + cCount = 0; } - console.log("正在学习第" + (i + 1) + "篇文章,标题:", currentNewsTitle); - fail = 0;//失败次数清0 - //开始循环进行文章学习 - article_timing(i, aTime); - delay(2); - back();//返回主界面 - while (!desc("学习").exists());//等待加载出主页 - delay(2); + + back(); //返回主界面 + while (!desc("学习").exists()); //等待加载出主页 + delay(1); i++; - t++;//t为实际点击的文章控件在当前布局中的标号,和i不同,勿改动! - } else { - t++; + + } else { //判断非目标文章 + if (t > 5) { + listView.scrollForward(); //向下滑动(翻页 + log("……翻页……"); + t = 0; + delay(1.5); + } + } + } else { + if (fail > 3) //连续翻几页没有点击成功则认为今天的新闻还没出来,学习昨天的 + { + date_string = getYestardayDateString(); + fail = 0; + console.warn("没有找到当天文章,即将学习昨日新闻!"); + continue; } - } catch (e) { - listView.scrollForward(); + if (!textContains(date_string).exists()) //当前页面当天新闻 + { + fail++; //失败次数加一 + } + listView.scrollForward(); //向下滑动(翻页 + log("……翻页……"); t = 0; delay(1.5); } } +} +/** + * @description: “百灵”小视频学习函数 + * @param: vCount,vTime + * @return: null + */ +function videoStudy_bailing(vCount, vTime) { + h = device.height; //屏幕高 + w = device.width; //屏幕宽 + x = (w / 3) * 2; //横坐标2分之3处 + h1 = (h / 6) * 5; //纵坐标6分之5处 + h2 = (h / 6); //纵坐标6分之1处 + + click("百灵"); + delay(2); + click("竖"); + delay(2); + var a = className("FrameLayout").depth(23).findOnce(0); //根据控件搜索视频框,但部分手机不适配,改用下面坐标点击 + a.click(); + //click((w/2)+random()*10,h/4);//坐标点击第一个视频 + delay(1); + for (var i = 0; i < vCount; i++) { + console.log("正在观看第" + (i + 1) + "个小视频"); + video_timing_bailing(i, vTime); //观看每个小视频 + if (i != vCount - 1) { + swipe(x, h1, x, h2, 500); //往下翻(纵坐标从5/6处滑到1/6处) + } + } + back(); + delay(2); } /** @@ -369,44 +317,128 @@ function articleStudy(x) { * @return: null */ function videoStudy_news() { - delay(1) - desc("学习").click(); - delay(2) + while (!desc("学习").exists()); //等待加载出主页 + console.info("开始进入视频学习…"); click("电视台"); delay(1) click("联播频道"); delay(2); - var listView = className("ListView");//获取listView视频列表控件用于翻页 - for (var i = 0, t = 0; i < vCount;) { - if ((click("中央广播电视总台", t) || click("央视网", t)) == true) { - console.log("即将学习第" + (i + 1) + "个视频!"); - video_timing_news(i, vTime);//学习每个新闻联播小片段 - back();//返回联播频道界面 - while (!desc("学习").exists());//等待加载出主页 - delay(1); - i++; - t++; - if (t >= 2) {//如果是平板等设备,请尝试修改i为合适值! - listView.scrollForward();//翻页 - delay(2); - t = 0; + var currentNewsTitle = ""; + var listView = className("ListView"); //获取listView视频列表控件用于翻页 + let s = "中央广播电视总台"; + if (!textContains("中央广播电视总台")) { + s = "央视网"; + } + for (var i = 0, t = 1; i < vCount;) { + while (!desc("学习").exists()); + delay(0.5); + var news_obj = text(s).findOnce(t); + //console.info(art_obj); + if (news_obj != null) { + t++; //t为实际查找的文章控件在当前布局中的标号,和i不同,勿改动! + if ((news_obj.parent().child(0).text() != currentNewsTitle) && (news_obj.parent().child(0).text() != s)) { //如果播报存在就进入文章正文 + + currentNewsTitle = news_obj.parent().child(0).text(); + log(currentNewsTitle); + news_obj.parent().click(); + delay(1); + + if (text("继续播放").exists()) { + click("继续播放"); + } + + if (!checkAndCollect()) { + back(); + continue; + } + + console.log("即将学习第" + (i + 1) + "个视频!"); + delay(1); + video_timing_news(i, vTime); //学习每个新闻联播小片段 + rTime = rTime - vTime; + i++; + back(); //返回联播频道界面 + while (!desc("学习").exists()); //等待加载出主页 + delay(1); } - } - else { - listView.scrollForward();//翻页 + } else { + listView.scrollForward(); //翻页 + log("……翻页……"); delay(2); t = 0; } + if (text("你已经看到我的底线了").exists()) { + log("主人,你已经看到我的底线了…"); + console.info("退出观看新闻联播视频!"); + vCount = vCount - i; + return false; + } } + console.info("已完成视频学习任务!"); + return true; } +/** + * @description: 阅读文章函数 + * @param: null + * @return: null + */ +function readToPage() { + while (!desc("学习").exists()); //等待加载出主页 + desc("学习").click(); //点击主页正下方的"学习"按钮 + delay(1); + click("推荐"); + delay(1); + var listView = className("ListView"); //获取文章ListView控件用于翻页 + while (!textContains("每日金句").exists()) { + listView.scrollForward(); //翻页 + log("……翻页……"); + delay(2); + } + if (click("每日金句")) { + console.log("开始进行阅读时长..."); + delay(1); + article_timing(-1, pTime); + + back(); //返回主界面 + } + console.log("阅读时长任务已完成..."); + return; +} + /** * @description: 听“电台”新闻广播函数 (视听学习+视听学习时长)---6+6=12分 * @param: null * @return: null */ function listenToRadio() { + click("电台"); + delay(1); + click("听新闻广播"); + delay(2); + if (textContains("最近收听").exists()) { + click("最近收听"); + console.log("正在收听广播..."); + delay(1); + back(); //返回电台界面 + return; + } + if (textContains("推荐收听").exists()) { + click("推荐收听"); + console.log("正在收听广播..."); + delay(1); + back(); //返回电台界面 + } +} + +/** +@description: 停止广播 +@param: null +@return: null +*/ +function stopRadio() { + console.log("停止收听广播!"); click("电台"); delay(1); click("听新闻广播"); @@ -415,57 +447,124 @@ function listenToRadio() { log("等待加载"); delay(1); } - if (click("最近收听") == 0) { - if (click("推荐收听") == 0) { - click("正在收听"); - } + if (id("v_playing").exists()) { + id("v_playing").findOnce(0).click(); + delay(1); } - delay(2); - if (id("btn_back").findOne().click() == 0) { +} + +/** + * @description: 分享函数 (收藏+分享)---1+1=2分 + * @param: 分享次数 + * @return: null + */ +function Share(i) { + while (!textContains("欢迎发表你的观点").exists()) //如果没有找到评论框则认为没有进入文章界面,一直等待 + { + delay(1); + console.log("等待进入文章界面") + } + console.log("正在进行分享..."); + var textOrder = text("欢迎发表你的观点").findOnce().drawingOrder(); + var shareOrder = textOrder + 3; + var shareIcon = className("ImageView").filter(function(iv) { + return iv.drawingOrder() == shareOrder; + }).findOnce(); + + for (; i > 0; i--) { + shareIcon.click(); //点击分享 + while (!textContains("分享到学习强").exists()); //等待弹出分享选项界面 + delay(1); + click("分享到学习强国"); delay(2); - back();//返回电台界面 + console.info("分享成功!"); + back(); //返回文章界面 + delay(1); } - delay(2); } +/** + * @description: 收藏函数 (收藏+分享)---1+1=2分 + * @param: + * @return: null + */ +function Collect() { + while (!textContains("欢迎发表你的观点").exists()) //如果没有找到评论框则认为没有进入文章界面,一直等待 + { + delay(1); + console.log("等待进入文章界面") + } + var textOrder = text("欢迎发表你的观点").findOnce().drawingOrder(); + var collectOrder = textOrder + 2; + var collectIcon = className("ImageView").filter(function(iv) { + return iv.drawingOrder() == collectOrder; + }).findOnce(); + + collectIcon.click(); //点击收藏 + console.info("收藏成功!"); + delay(1); +} /** - * @description: 启动app - * @param: null + * @description: 评论函数---2分 + * @param: i-文章标号 * @return: null */ -function start_app() { - console.setPosition(0, device.height / 2);//部分华为手机console有bug请注释本行 - console.show();//部分华为手机console有bug请注释本行 - console.log("正在启动app..."); - if (!launchApp("学习强国"))//启动学习强国app +function Comment(i) { + while (!textContains("欢迎发表你的观点").exists()) //如果没有找到评论框则认为没有进入文章界面,一直等待 { - console.error("找不到学习强国App!"); - return; + delay(1); + console.log("等待进入文章界面") } - while (!desc("学习").exists()) { - console.log("正在等待加载出主页"); + for (; i > 0; i--) { + click("欢迎发表你的观点"); //单击评论框 + console.log("正在进行评论..."); + delay(1); + var num = random(0, commentText.length - 1) //随机数 + setText(commentText[num]); //输入评论内容 + delay(1); + click("发布"); //点击右上角发布按钮 + console.info("评论(" + commentText[num] + ")成功!"); + delay(1); + click("删除"); //删除该评论 + delay(1); + click("确认"); //确认删除 + console.info("评论删除成功!"); + if (i > 0) { + delay(5); //评论之间有时间间隔要求 + log("等待继续进行评论…"); + } delay(1); } - delay(1); } +/** + * @description: 检测文章是否收藏 + * @param: + * @return: point,坐标值,为null时表示未收藏 + */ +function checkCol() { + let color = "#FFFFC63F"; + let point; + let img = captureScreen(); //截取当前屏幕 + point = findColorInRegion(img, color, device.width / 2, device.height / 8); + return point; +} + /** * @description: 本地频道 * @param: null * @return: null */ function localChannel() { - delay(1) - while (!desc("学习").exists());//等待加载出主页 - desc("学习").click(); - console.log("点击本地频道"); + while (!desc("学习").exists()); //等待加载出主页 + console.info("点击本地频道"); if (text("新思想").exists()) { - text("新思想").findOne().parent().parent().child(3).click(); - delay(3); - className("android.support.v7.widget.RecyclerView").findOne().child(2).click(); + text("新思想").findOne().parent().parent().child(14).click(); + delay(2); + className("android.support.v7.widget.RecyclerView").findOne().child(0).click(); delay(2); console.log("返回主界面"); back(); @@ -480,95 +579,54 @@ function localChannel() { * @param: null * @return: null */ -function getScores(i) { - while (!desc("学习").exists());//等待加载出主页 - console.log("正在获取积分..."); +function getScores() { + while (!desc("学习").exists()); //等待加载出主页 + console.info("正在获取积分..."); while (!text("积分明细").exists()) { if (id("comm_head_xuexi_score").exists()) { id("comm_head_xuexi_score").findOnce().click(); } else if (text("积分").exists()) { text("积分").findOnce().parent().child(1).click(); } - delay(2); - } - - let err = false; - while (!err) { - try { - className("android.widget.ListView").findOnce().children().forEach(item => { - let name = item.child(0).child(0).text(); - let str = item.child(2).text().split("/"); - let score = str[0].match(/[0-9][0-9]*/g); - myScores[name] = score; - }); - err = true; - } catch (e) { - console.log(e); - } - } - console.log(myScores); - - aCount = Math.ceil((12 - myScores["我要选读文章"]) / 2); //文章个数 - if (i == 1) { - console.info("检查阅读文章是否满分!") - aCount = 12 - myScores["我要选读文章"]; - if (aCount != 0) { - console.log("还需要阅读:" + aCount.toString() + "篇!"); - } else { - console.info("已满分!"); - } - delay(1); - back(); delay(1); - return; + text("积分明细").findOne().parent().click(); } - if (aCount != 0) { - aCount = aCount + randomNum(0, 1) - } - vCount = 6 - myScores["视听学习"]; - rTime = (6 - myScores["视听学习时长"]) * 60; - asub = 2 - myScores["订阅"]; - sCount = 2 - myScores["分享"] * 2 - cCount = 1 - myScores["发表观点"] - - console.log('评论:' + cCount.toString() + '个') - console.log('分享:' + sCount.toString() + '个') - console.log('订阅:' + asub.toString() + '个') - console.log('剩余文章:' + aCount.toString() + '篇') - console.log('剩余每篇文章学习时长:' + aTime.toString() + '秒') - console.log('剩余视频:' + vCount.toString() + '个') - console.log('剩视听学习时长:' + rTime.toString() + '秒') - delay(1); + let item = textContains("当日积分").findOne().parent().child(4).child(0); + + for (var i = 1; i < item.childCount(); i++) { + let name = item.child(i).child(2).text(); + let str = item.child(i).child(3).text(); + let score = parseInt(str.match(/[0-9][0-9]*/g)); + if (name.search("订阅") != -1) { + name = "订阅"; + } + myScores[name] += score; + } + + //console.log(myScores); + + if (customize_flag == false) { + aCount = 6 - myScores["阅读文章"]; //文章个数 + pTime = (6 - myScores["文章时长"]) * 60; + vCount = 6 - myScores["视听学习"]; + rTime = (6 - myScores["视听学习时长"]) * 60; + asub = 2 - myScores["订阅"]; + sCount = 2 - myScores["分享"] * 2; + cCount = 1 - myScores["发表观点"]; + } + console.log('评论:' + cCount.toString() + '个'); + console.log('分享:' + sCount.toString() + '个'); + console.log('订阅:' + asub.toString() + '个'); + console.log('剩余文章:' + aCount.toString() + '篇'); + console.log('剩余文章学习时长:' + pTime.toString() + '秒'); + console.log('剩余视频:' + vCount.toString() + '个'); + console.log('剩视听学习时长:' + rTime.toString() + '秒'); + console.info("当日已获得积分:" + textContains("当日积分").findOne().parent().child(2).text()); back(); delay(1); -} - -/** -@description: 停止广播 -@param: null -@return: null -*/ -function stopRadio() { - console.log("停止收听广播!"); - click("电台"); + back(); delay(1); - click("听新闻广播"); - delay(2); - while (!(textContains("正在收听").exists() || textContains("最近收听").exists() || textContains("推荐收听").exists())) { - log("等待加载"); - delay(2) - } - if (click("正在收听") == 0) { - click("最近收听"); - } - delay(3); - id("v_play").findOnce(0).click(); - delay(2) - if (id("btn_back").findOne().click() == 0) { - delay(2); - back(); - } } /** @@ -591,7 +649,7 @@ function sub() { while (i < asub) { let object = desc("订阅").find(); if (!object.empty()) { - object.forEach(function (currentValue) { + object.forEach(function(currentValue) { if (currentValue && i < asub) { let like = currentValue.parent() if (like.click()) { @@ -615,7 +673,7 @@ function sub() { while (i < asub) { let object = desc("订阅").find(); if (!object.empty()) { - object.forEach(function (currentValue) { + object.forEach(function(currentValue) { if (currentValue && i < asub) { let like = currentValue.parent() if (like.click()) { @@ -646,47 +704,77 @@ function sub() { delay(2); } -function main() { - start_app();//启动app - var path = files.path("list.db"); - var start = new Date().getTime();//程序开始时间 - getScores(0);//获取积分 +/** + * @description: 启动app + * @param: null + * @return: null + */ +function start_app() { + console.setPosition(0, device.height / 2); //部分华为手机console有bug请注释本行 + console.show(); //部分华为手机console有bug请注释本行 + console.log("正在启动app..."); + if (!launchApp("学习强国")) //启动学习强国app + { + console.error("找不到学习强国App!"); + return; + } + while (!desc("学习").exists()) { + console.log("正在等待加载出主页"); + delay(1); + } + delay(1); +} + +/** + * @description: 检测分数并学习 + * @param: null + * @return: null + */ + +function checkedToStudy() { + getScores(); //获取积分 + + if (myScores['本地频道'] != 1) { + localChannel(); //本地频道 + } + if (rTime != 0) { - listenToRadio();//听电台广播 + listenToRadio(); //听电台广播 } - var r_start = new Date().getTime();//广播开始时间 + var r_start = new Date().getTime(); //广播开始时间 + if (myScores['订阅'] != 2) { - sub();//订阅 - } - while (aCount != 0) { - var x = 0; - articleStudy(x);//学习文章,包含点赞、分享和评论 - console.info("等待十秒,然后确认文章是否已满分。"); - delay(10); - getScores(1); - x++; - if (x > 2) {//尝试三次 - console.info("尝试3次未满分,暂时跳过。"); - break; - } + sub(); //订阅 } - var end = new Date().getTime();//广播结束时间 - var radio_time = (parseInt((end - r_start) / 1000));//广播已经收听的时间 - radio_timing(parseInt((end - r_start) / 1000), rTime - radio_time);//广播剩余需收听时间 - if (rTime != 0) { - stopRadio(); + + if (aCount != 0) { + articleStudy(); //学习文章,包含点赞、分享和评论 } - if (myScores['本地频道'] != 1) { - localChannel();//本地频道 + + if (pTime > 0) { + readToPage(); //文章挂时长 } + if (vCount != 0) { - videoStudy_news();//看视频 + videoStudy_news(); //看视频 } + var end = new Date().getTime(); //广播结束时间 + var radio_time = (parseInt((end - r_start) / 1000)); //广播已经收听的时间 + radio_timing(parseInt((end - r_start) / 1000), rTime - radio_time); //广播剩余需收听时间 + if (rTime != 0) { + stopRadio(); + } +} + +//主函数 +function main() { + start_app(); //启动app + var start = new Date().getTime(); //程序开始时间 + checkedToStudy(); end = new Date().getTime(); console.log("运行结束,共耗时" + (parseInt(end - start)) / 1000 + "秒"); - files.copy(path, "/sdcard/Download/list.db"); - console.warn("自动备份已学文章列表到/sdcard/Download!!!"); } -module.exports = main; +//main(); +module.exports = main;