├── 20221010 ├── 20221111 ├── LICENSE ├── README.md ├── question ├── question2021 ├── question_tiku.txt ├── question_tiku.txt 原始版 ├── replace.js ├── studytogether.js ├── study异常最终版.js ├── 接听电话.js └── 配置.json /20221010: -------------------------------------------------------------------------------- 1 | 阮玲玉=二十世纪三十年代,中国的默片发展到了巅峰。由吴永刚编导, 和黎铿主演的《神女》,可以称为中国默片艺术日臻完美时期的代表性作品。 2 | 正确=92式手枪是我国自主研发的适合近距离作战的手枪。 来源:参见《中国大百科全书》 3 | 禹=《礼记·礼运篇》记载, 以前是没有阶级,没有剥削,财产公有的大同社会。来源: 4 | 秦国=从东周时期开始的大小宗族兼并战争,战国时期发展到了剧烈阶段。在这个阶段里, 首先建立起代表新兴地主阶级利益的政权 5 | 刘禅=公元223年,蜀汉开国皇帝刘备死后,后主 继位。来源:参见《中国通史》 6 | 长安=公元前202年,汉高帝刘邦战胜项羽,建立汉朝,定都 ,称为前汉或西汉。 7 | 莆仙戏=2006年5月20日,有“宋元南戏活化石”之称的 ,经国务院批准,被列入第一批国家级非物质文化遗产名录。 8 | 白花石刻=2008年6月,四川广元特有的民间工艺产品“ ”被评为国家级非物质文化遗产。 9 | 福建莆田=“海上和平女神”妈祖的故乡和妈祖文化的发祥地是中国 10 | 黑龙江省伊春市=中国最大的森林城市是 ,森林覆盖率在全国地级城市中最高,素有“中国林都”之誉。 11 | 唐家河国家级自然保护区=以大熊猫、扭角羚、川金丝猴、珙桐、红豆杉等珍稀濒危野生动、植物及其自然生态环境为主要保护对象 12 | 开平碉楼=位于广东江门的 ,是一座集防卫、居住和中西建筑艺术于一体的多层塔楼式建筑,其特色是融合了中国、古希腊、古罗马等多种建筑风格。 13 | -------------------------------------------------------------------------------- /20221111: -------------------------------------------------------------------------------- 1 | 具有自我更新能力,并且可以分化为其它类型细胞的“种子”细胞=干细胞是指 2 | 《中华民国临时约法》=中国历史上第一部具有资产阶级共和国宪法性质的法典是 3 | 孙中山=辛亥革命是资产阶级领导的以反对封建君主专制制度、建立资产阶级共和国为目的的革命,是一次比较完全意义上的资产阶级民主革命。 4 | 辛亥革命=中国两千多年的封建社会君主专制制度结束的标志是( ) 5 | 上海江南制造总局=1865年,曾国藩支持、李鸿章筹办的( ),是当时国内最大的兵工厂。 6 | 洋务派=19世纪60年代,为了挽救清政府的统治危机,封建统治阶级中的部分成员主张引进、仿造西方的武器装备和学习西方的科学技术,创设近代企业。这些官员被称为“ 7 | 黄兴=1911年4月27日,( )率敢死队120余人在广州举行起义,大部在激战中牺牲。其中72位烈士的遗骸被葬于黄花岗,故称“黄花岗起义”。 8 | 《马关条约》=1895年,日本强迫清政府签订( ),割去中国台湾全岛及所有附属各岛屿和澎湖列岛。 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 alikankan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # study 2 | 修改来源于:LazyStudy 3 | https://github.com/Twelve-blog/Study_hamibot 4 | 品尝 5 | https://hamibot.com/marketplace/yHlGK?invite=GWPMY3faSW5R3cHo9ZguEs1Y 6 | 题库更新来源 7 | https://github.com/Pandaver/XXQG_TiKu_Transform 8 | APP2.43 9 | https://github.com/dundunnp/auto_xuexiqiangguo/issues/571#issue-1454911348 10 | 免责声明 11 | 此仓库为交流的开源非营利项目,本脚本为免费使用,本脚本只供个人学习使用,不得盈利传播,不得用于违法用途,否则造成的一切后果自负! 12 | 13 | 异常滑块处理消息推送更新 14 | 15 | 更新匹配规则更换 16 | 17 | 更新本地频道更新 ,下滑限制次数 18 | 更新异常滑块出现告警 19 | 更新百灵视频学习逻辑 20 | 21 | 文章阅读不小心粘贴代码导致错误 22 | 23 | 更新日志推送 24 | 25 | 20220528更新为本地题库 ,异常验证提醒 26 | 27 | 20220529更新百灵视频随机点击栏目 ,判断视频是否看过,看过的直接跳过 28 | 29 | 20220530 更新百灵视频视频学习次数,可学习时长2分钟内视频,更改logs.push的题库无的题目。 30 | 31 | 修复循环答题只答一次退出问题 32 | 33 | 异常刷新重启进程 34 | 挑战答题5分验证, 专项答题分数 正则表达式 更改 35 | 36 | 20220607 增减点击选项延迟时间配置 ,增加可选比赛第一轮不作答 37 | -------------------------------------------------------------------------------- /replace.js: -------------------------------------------------------------------------------- 1 | const PI = Math.PI; 2 | 3 | var r = {}; 4 | 5 | r.replace = function(answers) { 6 | if(answers.indexOf('氨')!=-1&&answers.indexOf('氮')!=-1) answers = answers.replace(/氨/g, "氦"); 7 | if(answers.indexOf('戈')!=-1&&answers.indexOf('矛')!=-1) answers = answers.replace(/载/g, "戟"); 8 | if(answers.indexOf('泰')!=-1&&answers.indexOf('樱')!=-1) answers = answers.replace(/泰/g, "菽"); 9 | if(answers.indexOf('缘')!=-1&&answers.indexOf('舜')!=-1) answers = answers.replace(/缘/g, "鲧"); 10 | if(answers.indexOf('放松活动')!=-1&&answers.indexOf('基本活动')!=-1) answers = answers.replace(/一/g, ""); 11 | if(answers.indexOf('辑拿')!=-1&&answers.indexOf('绳拿')!=-1) answers = answers.replace(/绳拿/g, "缉拿"); 12 | if(answers.indexOf('黄海')!=-1&&answers.indexOf('潮海')!=-1) answers = answers.replace(/潮海/g, "渤海"); 13 | answers = answers.replace(/嘎岭/g, "嘌呤"); 14 | answers = answers.replace(/此呢风云/g, "叱咤风云"); 15 | answers = answers.replace(/溶炼/g, "淬炼"); 16 | answers = answers.replace(/声名韵起/g, "声名鹊起"); 17 | answers = answers.replace(/貂鲜/g, "貂蝉"); 18 | answers = answers.replace(/cuotud/g, "cuōtuó"); 19 | answers = answers.replace(/悠气/g, "憋气"); 20 | answers = answers.replace(/0型/g, "O型"); 21 | answers = answers.replace(/o型/g, "O型"); 22 | answers = answers.replace(/既往不智/g, "既往不咎"); 23 | answers = answers.replace(/继脚石/g, "绊脚石"); 24 | answers = answers.replace(/演合/g, "凑合"); 25 | answers = answers.replace(/刘翻/g, "刘勰"); 26 | answers = answers.replace(/情懒/g, "慵懒"); 27 | answers = answers.replace(/河汉/g, "河汊"); 28 | answers = answers.replace(/谢肌/g, "谢朓"); 29 | answers = answers.replace(/绎脚石/g, "绊脚石"); 30 | answers = answers.replace(/修营/g, "修葺"); 31 | answers = answers.replace(/斐秀/g, "裴秀"); 32 | answers = answers.replace(/翡秀/g, "裴秀"); 33 | answers = answers.replace(/奴婢bi/g, "奴婢bì"); 34 | answers = answers.replace(/奴bi/g, "奴婢bì"); 35 | answers = answers.replace(/杯盘狼精/g, "杯盘狼藉"); 36 | answers = answers.replace(/有特无恐/g, "有恃无恐"); 37 | answers = answers.replace(/荷子/g, "荀子"); 38 | answers = answers.replace(/蒸馅水/g, "蒸馏水"); 39 | answers = answers.replace(/粗扩/g, "粗犷"); 40 | answers = answers.replace(/哆峻/g, "啰唆"); 41 | answers = answers.replace(/點然失色/g, "黯然失色"); 42 | answers = answers.replace(/chaigian/g, "chaiqian"); 43 | answers = answers.replace(/差造/g, "差遣"); 44 | answers = answers.replace(/青营素/g, "青蒿素"); 45 | answers = answers.replace(/奴购/g, "奴婢"); 46 | answers = answers.replace(/嘴之以鼻/g, "嗤之以鼻"); 47 | answers = answers.replace(/款收/g, "歉收"); 48 | answers = answers.replace(/链而走险/g, "铤而走险"); 49 | answers = answers.replace(/母康置疑/g, "毋庸置疑"); 50 | answers = answers.replace(/JI/g, "川"); 51 | answers = answers.replace(/叫苦不送/g, "叫苦不迭"); 52 | answers = answers.replace(/虫胡/g, "蝴"); 53 | answers = answers.replace(/鱼鲤/g, "鱼鳔"); 54 | answers = answers.replace(/沉缅/g, "沉湎"); 55 | answers = answers.replace(/表秀/g, "裴秀"); 56 | answers = answers.replace(/泽炼/g, "淬炼"); 57 | answers = answers.replace(/bu/g, "bù"); 58 | answers = answers.replace(/夏然而止/g, "戛然而止"); 59 | answers = answers.replace(/垫伏/g, "蛰伏"); 60 | answers = answers.replace(/从我/g, "从戎"); 61 | answers = answers.replace(/跨踏/g, "踌躇"); 62 | answers = answers.replace(/漂岭/g, "嘌呤"); 63 | answers = answers.replace(/快密/g, "诀窍"); 64 | answers = answers.replace(/决密/g, "诀窍"); 65 | answers = answers.replace(/令媛/g, "令嫒"); 66 | answers = answers.replace(/朱捷/g, "朱棣"); 67 | answers = answers.replace(/雾淞/g, "雾凇"); 68 | answers = answers.replace(/.阳湖/g, "潘阳湖"); 69 | answers = answers.replace(/赔然失色/g, "黯然失色"); 70 | answers = answers.replace(/相形见细/g, "相形见绌"); 71 | answers = answers.replace(/饮鸽止渴/g, "饮鸩止渴"); 72 | answers = answers.replace(/何族/g, "侗族"); 73 | answers = answers.replace(/切碳/g, "切磋"); 74 | answers = answers.replace(/不胜而走/g, "不胫而走"); 75 | answers = answers.replace(/\+/g, "十"); 76 | answers = answers.replace(/李诚/g, "李诫"); 77 | answers = answers.replace(/晖红/g, "蹿红"); 78 | answers = answers.replace(/蹄红/g, "蹿红"); 79 | return answers 80 | }; 81 | 82 | module.exports = r; 83 | -------------------------------------------------------------------------------- /studytogether.js: -------------------------------------------------------------------------------- 1 | auto.waitFor(); 2 | 3 | //题库更换=A1&"="&LEFT(B1,40) 4 | /** 5 | * @description: 视频学习秒数 6 | */ 7 | var video_s = hamibot.env.video_s * 1; 8 | if (!video_s) video_s = 6; 9 | /** 10 | * @description: 文章学习秒数 11 | */ 12 | var article_s = hamibot.env.article_s * 1; 13 | if (!article_s) article_s = 45; 14 | /** 15 | * @description: 文章学习篇数 16 | */ 17 | var article_num = 1; 18 | 19 | /** 20 | * @description: 视频学习篇数 21 | */ 22 | var video_num = 1; 23 | 24 | /** 25 | * @description: 每日答题次数 26 | */ 27 | var daily_num = 1; 28 | 29 | /** 30 | * @description: 每周答题次数 31 | */ 32 | var week_num = 1; 33 | 34 | /** 35 | * @description: 专项答题次数 36 | */ 37 | var special_num = 1; 38 | 39 | /** 40 | * @description: 挑战答题次数 41 | */ 42 | var challenge_num = 1; 43 | const logs = []; 44 | const { TELEMETRY } = hamibot.env; 45 | var challenge_loop_num = hamibot.env.challenge_loop_num; 46 | var uptiku = hamibot.env.appendtiku; 47 | if (!challenge_loop_num || challenge_loop_num <= 0) challenge_loop_num = 5; 48 | /** 49 | * @description: 四人赛答题次数 50 | */ 51 | var four_num = 1; 52 | 53 | /** 54 | * @description: 双人人赛答题次数 55 | */ 56 | var double_num = 1; 57 | 58 | /** 59 | * @description: 订阅次数 60 | */ 61 | var sub_num = 2; 62 | 63 | /** 64 | * @description: 分享次数 65 | */ 66 | var share_num = 0; 67 | 68 | /** 69 | * @description: 评论观点次数 70 | */ 71 | var standpoint_num = 1; 72 | 73 | /** 74 | * @description: 本地频道 75 | */ 76 | var local_num = 1; 77 | 78 | /** 79 | * @description: 四人双人单题答题延迟时间 80 | */ 81 | var { init_true } = hamibot.env; 82 | var delay_time = hamibot.env.delay_time; 83 | if (!delay_time) delay_time = 0; 84 | 85 | /** 86 | * @description: 本地题库存储->[num,[question,answer]] 87 | */ 88 | var storage1 = storages.create('Twelve:question'); 89 | 90 | /** 91 | * @description: 本地文字识别内容对应题库->[question,answer] 92 | */ 93 | var storage2 = storages.create('Twelve:local'); 94 | /** 95 | * @description: 题库列表 96 | */ 97 | var question_list = []; 98 | 99 | /** 100 | * @description: 题是否为读音字形 101 | */ 102 | var yinzi = false; 103 | 104 | /** 105 | * @description: 是否第一题 106 | */ 107 | var first = true; 108 | 109 | /** 110 | * @description: 四人/双人 记录当前题目 111 | */ 112 | var old_q = ''; 113 | 114 | /** 115 | * @description: 四人/双人 记录当前题目答案 116 | */ 117 | var old_ans = ''; 118 | 119 | /** 120 | * @description: OCR模式选择 121 | */ 122 | var choose = hamibot.env.choose; 123 | if (!choose) { choose = 'c'; } 124 | 125 | /** 126 | * @description: 选项错字替换 127 | */ 128 | var replace = null; 129 | replace = function (answers) { 130 | if (answers.indexOf('氨') != -1 && answers.indexOf('氮') != -1) answers = answers.replace(/氨/g, "氦"); 131 | if (answers.indexOf('戈') != -1 && answers.indexOf('矛') != -1) answers = answers.replace(/载/g, "戟"); 132 | if (answers.indexOf('泰') != -1 && answers.indexOf('樱') != -1) answers = answers.replace(/泰/g, "菽"); 133 | if (answers.indexOf('缘') != -1 && answers.indexOf('舜') != -1) answers = answers.replace(/缘/g, "鲧"); 134 | if (answers.indexOf('放松活动') != -1 && answers.indexOf('基本活动') != -1) answers = answers.replace(/一/g, ""); 135 | if (answers.indexOf('辑拿') != -1 && answers.indexOf('绳拿') != -1) answers = answers.replace(/绳拿/g, "缉拿"); 136 | if (answers.indexOf('黄海') != -1 && answers.indexOf('潮海') != -1) answers = answers.replace(/潮海/g, "渤海"); 137 | answers = answers.replace(/祖击手/g, "狙击手"); 138 | answers = answers.replace(/姓款/g, "账款"); 139 | answers = answers.replace(/对筹公堂/g, "对簿公堂"); 140 | answers = answers.replace(/嘎岭/g, "嘌呤"); 141 | answers = answers.replace(/此呢风云/g, "叱咤风云"); 142 | answers = answers.replace(/溶炼/g, "淬炼"); 143 | answers = answers.replace(/声名鸽起/g, "声名鹊起"); 144 | answers = answers.replace(/声名韵起/g, "声名鹊起"); 145 | answers = answers.replace(/貂鲜/g, "貂蝉"); 146 | answers = answers.replace(/cuotud/g, "cuōtuó"); 147 | answers = answers.replace(/悠气/g, "憋气"); 148 | answers = answers.replace(/0型/g, "O型"); 149 | answers = answers.replace(/o型/g, "O型"); 150 | answers = answers.replace(/既往不智/g, "既往不咎"); 151 | answers = answers.replace(/继脚石/g, "绊脚石"); 152 | answers = answers.replace(/演合/g, "凑合"); 153 | answers = answers.replace(/刘翻/g, "刘勰"); 154 | answers = answers.replace(/情懒/g, "慵懒"); 155 | answers = answers.replace(/河汉/g, "河汊"); 156 | answers = answers.replace(/谢肌/g, "谢朓"); 157 | answers = answers.replace(/绎脚石/g, "绊脚石"); 158 | answers = answers.replace(/修营/g, "修葺"); 159 | answers = answers.replace(/斐秀/g, "裴秀"); 160 | answers = answers.replace(/翡秀/g, "裴秀"); 161 | answers = answers.replace(/奴婢bi/g, "奴婢bì"); 162 | answers = answers.replace(/奴bi/g, "奴婢bì"); 163 | answers = answers.replace(/杯盘狼精/g, "杯盘狼藉"); 164 | answers = answers.replace(/有特无恐/g, "有恃无恐"); 165 | answers = answers.replace(/荷子/g, "荀子"); 166 | answers = answers.replace(/蒸馅水/g, "蒸馏水"); 167 | answers = answers.replace(/粗扩/g, "粗犷"); 168 | answers = answers.replace(/哆峻/g, "啰唆"); 169 | answers = answers.replace(/點然失色/g, "黯然失色"); 170 | answers = answers.replace(/chaigian/g, "chaiqian"); 171 | answers = answers.replace(/差造/g, "差遣"); 172 | answers = answers.replace(/青营素/g, "青蒿素"); 173 | answers = answers.replace(/奴购/g, "奴婢"); 174 | answers = answers.replace(/嘴之以鼻/g, "嗤之以鼻"); 175 | answers = answers.replace(/款收/g, "歉收"); 176 | answers = answers.replace(/链而走险/g, "铤而走险"); 177 | answers = answers.replace(/母康置疑/g, "毋庸置疑"); 178 | answers = answers.replace(/JI/g, "川"); 179 | answers = answers.replace(/叫苦不送/g, "叫苦不迭"); 180 | answers = answers.replace(/虫胡/g, "蝴"); 181 | answers = answers.replace(/鱼鲤/g, "鱼鳔"); 182 | answers = answers.replace(/沉缅/g, "沉湎"); 183 | answers = answers.replace(/表秀/g, "裴秀"); 184 | answers = answers.replace(/泽炼/g, "淬炼"); 185 | answers = answers.replace(/bu/g, "bù"); 186 | answers = answers.replace(/夏然而止/g, "戛然而止"); 187 | answers = answers.replace(/垫伏/g, "蛰伏"); 188 | answers = answers.replace(/从我/g, "从戎"); 189 | answers = answers.replace(/跨踏/g, "踌躇"); 190 | answers = answers.replace(/漂岭/g, "嘌呤"); 191 | answers = answers.replace(/快密/g, "诀窍"); 192 | answers = answers.replace(/决密/g, "诀窍"); 193 | answers = answers.replace(/令媛/g, "令嫒"); 194 | answers = answers.replace(/朱捷/g, "朱棣"); 195 | answers = answers.replace(/雾淞/g, "雾凇"); 196 | answers = answers.replace(/.阳湖/g, "潘阳湖"); 197 | answers = answers.replace(/赔然失色/g, "黯然失色"); 198 | answers = answers.replace(/相形见细/g, "相形见绌"); 199 | answers = answers.replace(/饮鸽止渴/g, "饮鸩止渴"); 200 | answers = answers.replace(/何族/g, "侗族"); 201 | answers = answers.replace(/切碳/g, "切磋"); 202 | answers = answers.replace(/不胜而走/g, "不胫而走"); 203 | answers = answers.replace(/\+/g, "十"); 204 | answers = answers.replace(/李诚/g, "李诫"); 205 | answers = answers.replace(/晖红/g, "蹿红"); 206 | answers = answers.replace(/蹄红/g, "蹿红"); 207 | return answers; 208 | } 209 | /** 210 | * @description: 看门狗时长 211 | */ 212 | var watchdog_time = hamibot.env.watchdog_time * 1 * 1000; 213 | if (!watchdog_time) watchdog_time = 2000 * 1000; 214 | /** 215 | * @description: 百度ocr access_token 216 | */ 217 | var token = ""; 218 | 219 | /** 220 | * @description: 判断是否过验证了 221 | */ 222 | var captcha = false; 223 | 224 | /** 225 | * @description: 随机延迟 226 | * @param: seconds-延迟秒数[a,a+1] 227 | */ 228 | function delay(a) { 229 | sleep(a * 1000 + Math.random() * 1000); 230 | } 231 | function my_click_non_clickable(target) { 232 | if (typeof (target) == "string") { 233 | text(target).waitFor(); 234 | var tmp = text(target).findOne().bounds(); 235 | } else { 236 | var tmp = target.bounds(); 237 | } 238 | var randomX = random(tmp.left, tmp.right); 239 | var randomY = random(tmp.top, tmp.bottom); 240 | click(randomX, randomY); 241 | } 242 | /** 243 | * @description: 得到各项次数 244 | */ 245 | function get_all_num() { 246 | console.info('正在获取分数情况'); 247 | delay(1); 248 | if (id("comm_head_xuexi_score").exists()) { 249 | id("comm_head_xuexi_score").findOnce().click(); 250 | } else if (text("积分").exists()) { 251 | text("积分").findOnce().parent().child(1).click(); 252 | } 253 | delay(1); 254 | if (text('知道了').exists()) { 255 | text('知道了').click(); 256 | } 257 | // var score_id = id('comm_head_xuexi_score').findOne(5000); 258 | // score_id.click(); 259 | text('登录').waitFor(); 260 | delay(4); 261 | var score = {}; 262 | 263 | 264 | // var list_view = className("android.widget.ListView").findOne(5000); 265 | var texts = ""; 266 | if (arguments.length >= 2) { // 返回分数情况->PushDeer 267 | try { 268 | texts += "%0A成长总积分:" + textContains("成长总积分").findOne().parent().child(3).text() + "分%0A"; 269 | } catch (e) { } 270 | texts += textContains("今日已累积").findOne().text(); 271 | } 272 | // for (var i = 0; i < list_view.childCount(); i++) { 273 | // var son = list_view.child(i); 274 | // try { 275 | // var names = son.child(0).child(0).text(); 276 | // } catch (e) { 277 | // var names = son.child(0).text(); 278 | // } 279 | // var sx = son.child(2).text().split("/")[0].match(/[0-9][0-9]*/g); 280 | // score[names] = Number(sx); 281 | // if (arguments.length >= 2) { // 返回分数情况->PushDeer 282 | // texts += '%0A - ' + names + ':' + son.child(2).text().split("/")[0].match(/[0-9][0-9]*/g) + '/' + son.child(2).text().split("/")[1].match(/[0-9][0-9]*/g); 283 | // if (i == list_view.childCount() - 1) { 284 | // back_table(); 285 | // return texts; 286 | // } 287 | // } 288 | // } 289 | for (var i = 4; i < 17; i++) { 290 | // 由于模拟器有model无法读取因此用try catch 291 | try { 292 | var model = className("android.view.View").depth(24).findOnce(i); 293 | if (i == 4) { 294 | score['我要选读文章'] = parseInt(model.child(3).child(0).text()); 295 | texts += '%0A - ' + '我要选读文章' + score['我要选读文章'] 296 | } else if (i == 5) { 297 | score['视听学习'] = parseInt(model.child(3).child(0).text()); 298 | texts += '%0A - ' + '视听学习' + score['视听学习'] 299 | 300 | } else if (i == 16) { 301 | score['每周答题'] = parseInt(model.child(3).child(0).text()); 302 | texts += '%0A - ' + '每周答题' + score['每周答题'] 303 | } else if (i == 7) { 304 | score['每日答题'] = parseInt(model.child(3).child(0).text()); 305 | texts += '%0A - ' + '每日答题' + score['每日答题'] 306 | } else if (i == 8) { 307 | score['专项答题'] = parseInt(model.child(3).child(0).text()); 308 | texts += '专项答题' + score['专项答题'] 309 | } else if (i == 9) { 310 | score['挑战答题'] = parseInt(model.child(3).child(0).text()); 311 | texts += '%0A - ' + '挑战答题' + score['挑战答题'] 312 | } else if (i == 10) { 313 | score['四人赛'] = parseInt(model.child(3).child(0).text()); 314 | texts += '%0A - ' + '四人赛' + score['四人赛'] 315 | } else if (i == 11) { 316 | score['双人对战'] = parseInt(model.child(3).child(0).text()); 317 | texts += '%0A - ' + '双人对战' + score['双人对战'] 318 | } 319 | else if (i == 13) { 320 | score['发表观点'] = parseInt(model.child(3).child(0).text()); 321 | } else if (i == 14) { 322 | score['本地频道'] = parseInt(model.child(3).child(0).text()); 323 | texts += '%0A - ' + '本地频道' + score['本地频道'] 324 | } else { 325 | log("i=" + i + "分数" + parseInt(model.child(3).child(0).text())) 326 | } 327 | // finish_list.push(model.child(4).text() == "已完成"); 328 | } catch (error) { 329 | 330 | } 331 | } 332 | video_num = 6 - score['视听学习']; 333 | if (arguments.length >= 1) { 334 | article_num = Math.ceil((12 - score['我要选读文章'])); 335 | } 336 | else { 337 | article_num = Math.ceil((12 - score['我要选读文章']) / 2); 338 | } 339 | daily_num = (5 - score['每日答题']) ? 1 : 0; 340 | week_num = score['每周答题'] ? 0 : 1; 341 | special_num = score['专项答题'] ? 0 : 1; 342 | challenge_num = (5 - score['挑战答题']) ? 1 : 0; 343 | four_num = score['四人赛'] ? 0 : 1; 344 | double_num = score['双人对战'] ? 0 : 1; 345 | sub_num = 2 - score['订阅']; 346 | standpoint_num = 1 - score['发表观点']; 347 | local_num = 1 - score['本地频道']; 348 | // share_num = score['分享']?0:2; 349 | console.log('文章学习:' + article_num + '次'); 350 | console.log('视频学习:' + video_num + '次'); 351 | console.log('每日答题:' + daily_num + '次'); 352 | // console.log('每周答题:'+week_num+'次'); 353 | console.log('专项答题:' + special_num + '次'); 354 | console.log('挑战答题:' + challenge_num + '次'); 355 | console.log('四人赛 :' + four_num + '次'); 356 | console.log('双人对战:' + double_num + '次'); 357 | back(); 358 | return texts; 359 | console.info('获取完成'); 360 | delay(2); 361 | } 362 | var article_list = []; 363 | /** 364 | * @description: 已读文章判断 365 | * @param: 文章名字 X 366 | */ 367 | function article_check(x) { 368 | for (var i = 0; i < article_list.length; i++) { 369 | if (article_list[i] == x) return true; 370 | } 371 | article_list.push(x); 372 | return false; 373 | } 374 | var commits = ["中国特色社会主义不是从天上掉下来的", 375 | "时代是出卷人,我们是答卷人,人民是阅卷人", 376 | "这个新时代是中国特色社会主义新时代,而不是别的什么新时代", 377 | "决不能因为胜利而骄傲,决不能因为成就而懈怠,决不能因为困难而退缩", 378 | "要打好防范和抵御风险的有准备之战,也要打好化险为夷、转危为机的战略主动战"]; 379 | /** 380 | * @description: 文章学习 381 | * @param: 第xxx次学习 382 | */ 383 | function study_article() { 384 | if (article_num == 0 || !hamibot.env.article) return; 385 | console.info('正在文章学习'); 386 | back_table(); 387 | delay(2); 388 | start_close_radio(true); 389 | delay(2); 390 | desc('工作').click(); 391 | delay(2); 392 | click('推荐'); 393 | console.warn('还需要学习' + article_num + '篇文章'); 394 | var x = 0; 395 | while (article_num > 0) { 396 | while (article_num > 0) { 397 | var b = text('播报').findOnce(x); 398 | if (b) { 399 | var names = b.parent().parent().parent().child(0).text(); 400 | if (!article_check(names)) { 401 | delay(1); 402 | var tmp = b.parent().parent().parent().child(0).parent().parent().click(); 403 | if (!tmp) { 404 | x++; 405 | continue; 406 | } 407 | delay(3); 408 | var show = textContains('2022 年').findOne(10); 409 | if (!show) { console.warn('没有加载出文章,返回'); } 410 | else { 411 | var t = article_s + Math.floor(Math.random() * 5 + 1); 412 | console.info('当前第' + (7 - article_num) + '篇文章,本篇文章学习' + t + 's'); 413 | for (var i = 0; i < t;) { 414 | sleep(1000); 415 | while (!textContains("欢迎发表你的观点").exists()) { 416 | console.error('已离开文章界面'); 417 | delay(5); 418 | } 419 | var tmp = Math.random(); 420 | try { 421 | if (tmp > 0.9) { 422 | swipe(3 * device.width / 4, 3 * device.height / 4 + Math.random() * 100, 3 * device.width / 4, device.height / 4 - Math.random() * 100, Math.random() * 1000); 423 | } else if (tmp < 0.1) { 424 | swipe(3 * device.width / 4, device.height / 4 + Math.random() * 100, 3 * device.width / 4, 3 * device.height / 4 - Math.random() * 100, Math.random() * 1000); 425 | } 426 | } catch (e) { } 427 | i++; 428 | if (i % 5 == 0) { 429 | console.log('已经学习文章' + i + 's,' + '还剩' + (t - i) + 's'); 430 | } 431 | } 432 | article_num--; 433 | if (standpoint_num > 0) { 434 | console.info('开始发表观点'); 435 | try { 436 | var commit = text('观点').findOne(3000).parent().parent().child(2).child(1).child(0).text(); 437 | } catch (e) { 438 | var commit = commits[random(0, commits.length - 1)]; 439 | } 440 | standpoint_num--; 441 | text('欢迎发表你的观点').click(); 442 | delay(2); 443 | setText(commit); 444 | delay(1); 445 | click("发布"); 446 | delay(2); 447 | click("删除"); 448 | delay(2); 449 | click("确认"); 450 | console.info('发表观点完成'); 451 | } 452 | if (share_num > 0) { 453 | console.info('开始分享'); 454 | delay(2); 455 | share_num--; 456 | className('ImageView').depth(10).drawingOrder(4).click(); 457 | delay(1); 458 | click("分享到学习强国"); 459 | delay(1); 460 | back(); 461 | console.info('分享完成'); 462 | } 463 | } 464 | delay(2); 465 | back(); 466 | delay(2); 467 | } 468 | x++; 469 | } 470 | else { 471 | x = 0; 472 | className("ListView").scrollForward(); 473 | delay(2); 474 | } 475 | } 476 | console.info('正在检查是否完成'); 477 | delay(5); 478 | article_s = 6 + random(0, 6); // 文章未完成 479 | get_all_num(1); 480 | } 481 | console.info('文章学习完成'); 482 | start_close_radio(false); 483 | delay(2); 484 | } 485 | /** 486 | * @description: 本地频道 487 | */ 488 | function local_() { 489 | if (local_num == 0 || !hamibot.env.local) return; 490 | console.info('开始本地频道'); 491 | back_table(); 492 | desc('工作').click(); 493 | delay(2); 494 | my_click_non_clickable('四川') 495 | delay(2); 496 | 497 | if (text("四川").exists()) { 498 | 499 | className("android.widget.LinearLayout").clickable(true).depth(26).waitFor(); 500 | 501 | className("android.widget.LinearLayout").clickable(true).depth(26).drawingOrder(1).findOne().click(); 502 | toastLog('点击四川学习平台') 503 | back(); 504 | } else { 505 | my_click_non_clickable('四川') 506 | my_click_non_clickable('四川学习平台') 507 | back(); 508 | } 509 | 510 | back_table(); 511 | console.info('本地频道完成'); 512 | delay(2); 513 | } 514 | /** 515 | * @description: 视频学习 516 | */ 517 | function study_video() { 518 | if (video_num == 0 || !hamibot.env.video) return; 519 | console.info('开始视频学习'); 520 | back_table(); 521 | console.warn('还需学习' + (video_num) + '篇视频'); 522 | delay(2); 523 | click('百灵'); 524 | delay(2); 525 | var contentsText = ["推荐", "党史", "竖", "炫", "窗", "藏", "靓", "秀"]; 526 | var contentsNum = random(0, contentsText.length - 1); //随机数 527 | console.info("视频看的" + contentsText[contentsNum]); 528 | click(contentsText[contentsNum]); 529 | delay(2); 530 | while (video_num > 0) { 531 | while (video_num > 0) { 532 | console.info('当前第' + (7 - video_num) + '篇'); 533 | delay(2); 534 | try { 535 | className('android.widget.FrameLayout').clickable(true).depth(22).findOnce(0).click(); 536 | } 537 | catch (e) { 538 | className('android.widget.FrameLayout').clickable(true).depth(22).findOnce(1).click(); 539 | } 540 | delay(2); 541 | var t = video_s + random(0, 5); 542 | for (var i = 0; i < t;) { 543 | sleep(1000); 544 | while (!text('播放').exists()) { 545 | console.error('已离开视频界面'); 546 | delay(5); 547 | } 548 | i++; 549 | console.log('已经学习视频' + i + 's,' + '还需' + (t - i) + 's'); 550 | } 551 | back(); 552 | video_num--; 553 | delay(1); 554 | className("ListView").depth(21).findOne().scrollForward(); 555 | delay(1); 556 | className("ListView").depth(21).findOne().scrollForward(); 557 | delay(1); 558 | } 559 | delay(5); 560 | console.info("正在获取是否完成"); 561 | get_all_num(); 562 | } 563 | console.info('视频学习完成'); 564 | delay(2); 565 | } 566 | 567 | /** 568 | * @description: 每周专项获取提示答案列表 569 | * @author:Lejw 570 | * @return:答案列表 571 | */ 572 | function getAnsList() { 573 | 574 | ansField = className("android.view.View").clickable(true).depth(23).indexInParent(0).findOne() 575 | var ans = ansField.bounds() 576 | var x = ans.left 577 | var y = ans.top 578 | var h = ans.bottom - ans.top 579 | var w = ans.right - ans.left 580 | var img = images.clip(captureScreen(), x, y, w, h);//裁切提示 581 | img = images.interval(img, "#FD1111", 60)//图片二值化 582 | // images.save(img,'/sdcard/1.png') 583 | var ansLis = [] 584 | if (choose == 'a') { 585 | //TODO:HUAWEI_OCR 586 | } else if (choose == 'b') { 587 | //TODO: THIRD_PARTY_OCR 588 | } else if (choose == 'c') { 589 | ansList = hamibot_ocr_api_return_list(img); 590 | } else { 591 | var token = get_baidu_token(hamibot.env.client_id, hamibot.env.client_secret); 592 | ansList = baidu_ocr_api_return_list(img, token); 593 | } 594 | retList = []; 595 | if (ansList.length != 0) {//处理连续字符串换行合并 596 | rawAns = ansField.text(); 597 | retList.push(ansList[0]); 598 | for (let i = 1; i < ansList.length; i++) { 599 | str = ansList[i - 1] + ansList[i] 600 | if (rawAns.indexOf(str) != -1) { 601 | retList.push(retList.pop() + (ansList[i])); 602 | } else { 603 | retList.push(ansList[i]); 604 | } 605 | // console.log(rawAns.lastIndexOf(str.substr(str.length-1,1)),rawAns.indexOf(ansList[i][0])) 606 | // if(rawAns.lastIndexOf(str.substr(str.length-1,1))==rawAns.indexOf(ansList[i][0])-1) { 607 | // retList.push(retList.pop()+(ansList[i])); 608 | // }else { 609 | // retList.push(ansList[i]); 610 | // } 611 | } 612 | } 613 | return retList 614 | } 615 | 616 | 617 | /** 618 | * @description: 获取专项提示答案列表 619 | * @author:Lejw 620 | * @return:答案列表 621 | */ 622 | function getSpecialAnsList() { 623 | auto.waitFor(); 624 | ansField = className("android.view.View").clickable(true).depth(22).indexInParent(0).findOne() 625 | rawAns = ansField.text() 626 | console.log(rawAns) 627 | var ans = ansField.bounds() 628 | var x = ans.left 629 | var y = ans.top 630 | var h = ans.bottom - ans.top 631 | var w = ans.right - ans.left 632 | console.log(x, y, h, w) 633 | var img = images.clip(captureScreen(), x, y, w, h);//裁切提示 634 | img = images.interval(img, "#FD1111", 60)//图片二值化 635 | images.save(img, '/sdcard/1.png') 636 | var ansLis = [] 637 | if (choose == 'a') { 638 | //TODO:HUAWEI_OCR 639 | } else if (choose == 'b') { 640 | //TODO: THIRD_PARTY_OCR 641 | } else if (choose == 'c') { 642 | ansList = hamibot_ocr_api_return_list(img); 643 | } else { 644 | var token = get_baidu_token(hamibot.env.client_id, hamibot.env.client_secret); 645 | ansList = baidu_ocr_api_return_list(img, token) 646 | } 647 | retList = []; 648 | if (ansList.length != 0) {//处理连续字符串换行合并 649 | retList.push(ansList[0]); 650 | for (let i = 1; i < ansList.length; i++) { 651 | str = ansList[i - 1] + ansList[i] 652 | if (rawAns.indexOf(str) != -1) { 653 | retList.push(retList.pop() + (ansList[i])); 654 | } else { 655 | retList.push(ansList[i]); 656 | } 657 | // console.log(rawAns.lastIndexOf(str.substr(str.length-1,1)),rawAns.indexOf(ansList[i][0])) 658 | // if(rawAns.lastIndexOf(str.substr(str.length-1,1))==rawAns.indexOf(ansList[i][0])-1) { 659 | // retList.push(retList.pop()+(ansList[i])); 660 | // }else { 661 | // retList.push(ansList[i]); 662 | // } 663 | } 664 | } 665 | return retList 666 | } 667 | 668 | /** 669 | * @description: 每日答题 - 单题 670 | */ 671 | function click_daily() { 672 | var xxxxxxxxxx = ''; 673 | var click_true = false; 674 | text("查看提示").findOne().click(); 675 | var tips = text("提示").findOne().parent().parent().child(1).child(0).text(); 676 | delay(1); 677 | back(); 678 | delay(1); 679 | if (textContains('选题').exists()) { 680 | className("ListView").findOne().children().forEach(option => { 681 | if (tips.indexOf(option.child(0).child(2).text()) != -1) { 682 | xxxxxxxxxx += option.child(0).child(2).text(); 683 | option.child(0).click(); 684 | click_true = true; 685 | } 686 | }) 687 | if (click_true == false) { 688 | className("ListView").findOne().child(0).child(0).click(); 689 | } 690 | console.log('答案:' + xxxxxxxxxx); 691 | } 692 | else { 693 | var q_list = []; 694 | var space_num = []; 695 | className("EditText").findOnce().parent().parent().children().forEach(item => { 696 | if (item.childCount() == 0) { 697 | q_list.push(item.text()); 698 | } 699 | else { 700 | q_list.push('@' + (item.childCount() - 1)); 701 | space_num.push((item.childCount() - 1)); 702 | } 703 | }) 704 | var ans = ''; 705 | for (var i = 1; i < q_list.length - 1; i++) { 706 | if (q_list[i][0] == '@') { 707 | var ss = q_list[i - 1].substr(Math.max(0, q_list[i - 1].length - 5), 5); 708 | var aaa = tips.indexOf(ss) + ss.length; 709 | var aaaa = tips.substr(aaa, Number(q_list[i][1])); 710 | ans += aaaa; 711 | } 712 | } 713 | if (ans == '') { ans = "没有找到答案!!!" } 714 | console.log('答案:' + ans); 715 | setText(0, ans.substr(0, space_num[0])); 716 | if (space_num.length > 1) { 717 | for (var i = 1; i < space_num.length; i++) { 718 | setText(i, ans.substr(space_num[i - 1], space_num[i])); 719 | } 720 | } 721 | } 722 | delay(1); 723 | text('确定').findOne().click(); 724 | delay(0.5); 725 | if (text('下一题').exists()) { 726 | click('下一题'); 727 | } 728 | if (text('完成').exists()) { 729 | click('完成'); 730 | } 731 | delay(1); 732 | } 733 | /** 734 | * @description: 每日答题 735 | */ 736 | function daily_Answer() { 737 | if (daily_num == 0 || !hamibot.env.day) return; 738 | console.info('开始每日答题'); 739 | questionShow(); 740 | delay(1); 741 | text('每日答题').findOne().parent().click(); 742 | delay(3); 743 | var x = 0; 744 | while (true) { 745 | click_daily(); 746 | x++; 747 | if (x >= 5) { 748 | text("再来一组").waitFor() 749 | delay(3); 750 | if (!text("领取奖励已达今日上限").exists()) { 751 | console.warn('积分未满,再答一次'); 752 | x = 0; 753 | text("再来一组").click(); 754 | delay(2); 755 | } else { 756 | text("返回").click(); 757 | delay(2); 758 | break; 759 | } 760 | } 761 | } 762 | console.info('每日答题结束'); 763 | delay(2); 764 | } 765 | /** 766 | * @description: 挑战 单题答题 767 | */ 768 | function challenge_loop(x) { 769 | yinzi = false; 770 | if (x > 5) { 771 | 772 | try { 773 | console.info('答题次数已满,随机点击'); 774 | var tmp = className("ListView").findOne().childCount(); 775 | className("ListView").findOne().child(random(0, tmp - 1)).child(0).child(0).click(); 776 | } catch (error) { 777 | console.info('随机点击错误') 778 | back(); 779 | 780 | } 781 | 782 | } 783 | else { 784 | reg = /下列..正确的是.*/g; 785 | reb = /选择词语的正确.*/g; 786 | rea = /选择正确的读音.*/g; 787 | rec = /下列不属于二十四史的是.*/g; 788 | var question = className("ListView").findOnce().parent().child(0).text(); 789 | if (rec.test(question) || reg.test(question) || rea.test(question) || reb.test(question)) { 790 | yinzi = true; 791 | question = ''; 792 | className("ListView").findOne().children().forEach(option => { 793 | question += option.child(0).child(1).text(); 794 | }) 795 | } 796 | var similars = 0; 797 | var answer = ''; 798 | for (var i = 0; i < question_list.length; i++) { 799 | var tmp = similarity(question_list[i][1], question_list[i][0], question, yinzi); 800 | if (tmp > similars) { 801 | similars = tmp; 802 | answer = question_list[i][0]; 803 | } 804 | } 805 | console.log('答案:' + answer); 806 | var option = className("ListView").findOne(); 807 | var click_option = 0; 808 | var similars = 0; 809 | for (var i = 0; i < option.childCount(); i++) { 810 | var tmp = similarity_answer(option.child(i).child(0).child(1).text(), answer); 811 | if (tmp > similars) { 812 | similars = tmp; 813 | click_option = i; 814 | } 815 | } 816 | try { 817 | option.child(click_option).child(0).child(0).click(); 818 | } catch (error) { 819 | console.log('挑战答题点击答案异常'); 820 | } 821 | 822 | } 823 | delay(1); 824 | 825 | } 826 | 827 | 828 | /** 829 | * @description: 专项答题 - 单题 830 | * @author:Lejw 831 | */ 832 | function click_special() { 833 | var xxxxxxxxxx = ''; 834 | var click_true = false; 835 | text("查看提示").findOne().click(); 836 | delay(1); 837 | var ansList = getSpecialAnsList(); 838 | back(); 839 | delay(1); 840 | if (textContains('选题').exists()) { 841 | var tips = ''; 842 | ansList.forEach(x => { 843 | tips += x; 844 | }) 845 | className("ListView").findOne().children().forEach(option => { 846 | if (tips.indexOf(option.child(0).child(2).text()) != -1) { 847 | xxxxxxxxxx += option.child(0).child(2).text(); 848 | option.child(0).click(); 849 | click_true = true; 850 | } 851 | }) 852 | if (click_true == false) { 853 | className("ListView").findOne().child(0).child(0).click(); 854 | } 855 | console.log('答案:' + xxxxxxxxxx); 856 | } 857 | else { 858 | for (let i = 0; i < ansList.length; i++) { 859 | setText(i, ansList[i]); 860 | } 861 | } 862 | delay(0.5); 863 | if (text('下一题').exists()) { 864 | click('下一题'); 865 | } 866 | if (text('完成').exists()) { 867 | click('完成'); 868 | } 869 | delay(1); 870 | } 871 | 872 | 873 | /** 874 | * @description: 查找每周答题入口 875 | * @Author: Lejw 876 | */ 877 | function checkWeekEntry() { 878 | let tryTime = 10; 879 | while (tryTime) { 880 | tryTime--; 881 | delay(1); 882 | if (text("未作答").exists()) { 883 | console.log("进入答题"); 884 | text('未作答').findOne().parent().click(); 885 | return true; 886 | } 887 | gesture(500, [100, 1300], [100, 200]); 888 | } 889 | console.log("没有未完成题目"); 890 | return false; 891 | } 892 | 893 | /** 894 | * @description: 查找专项答题入口 895 | * @Author: Lejw 896 | */ 897 | function checkSpecialEntry() { 898 | let tryTime = 10 899 | while (tryTime) { 900 | tryTime--; 901 | delay(1); 902 | if (text("开始答题").exists()) { 903 | console.log("进入答题"); 904 | text('开始答题').findOne().click(); 905 | return true; 906 | } 907 | if (text("继续答题").exists()) { 908 | console.log("继续答题"); 909 | text('继续答题').findOne().click(); 910 | return true; 911 | } 912 | gesture(500, [100, 1300], [100, 200]); 913 | } 914 | console.log("没有未完成题目") 915 | return false; 916 | } 917 | 918 | 919 | 920 | /** 921 | * @description: 每周答题 - 单题 922 | * @author:Lejw 923 | */ 924 | function click_week() { 925 | var xxxxxxxxxx = ''; 926 | var click_true = false; 927 | text("查看提示").findOne().click(); 928 | delay(1); 929 | var ansList = getAnsList(); 930 | back(); 931 | delay(1); 932 | if (textContains('选题').exists()) { 933 | var tips = ''; 934 | ansList.forEach(x => { 935 | tips += x; 936 | }) 937 | className("ListView").findOne().children().forEach(option => { 938 | if (tips.indexOf(option.child(0).child(2).text()) != -1) { 939 | xxxxxxxxxx += option.child(0).child(2).text(); 940 | option.child(0).click(); 941 | click_true = true; 942 | } 943 | }) 944 | if (click_true == false) { 945 | className("ListView").findOne().child(0).child(0).click(); 946 | } 947 | console.log('答案:' + xxxxxxxxxx); 948 | } 949 | else { 950 | for (let i = 0; i < ansList.length; i++) { 951 | setText(i, ansList[i]); 952 | } 953 | } 954 | delay(1); 955 | text('确定').findOne().click(); 956 | delay(0.5); 957 | if (text('下一题').exists()) { 958 | click('下一题'); 959 | } 960 | if (text('完成').exists()) { 961 | click('完成'); 962 | } 963 | delay(1); 964 | } 965 | 966 | 967 | /** 968 | * @description: 每周答题 969 | * @author:Lejw 970 | */ 971 | function week_Answer() { 972 | if (week_num == 0 || !hamibot.env.week || token == "") return; 973 | console.info('开始每周答题'); 974 | questionShow(); 975 | delay(1); 976 | text('每周答题').findOne().parent().click(); 977 | delay(1); 978 | if (!checkWeekEntry()) {//找不到能进去的题 979 | console.log("每周答题结束"); 980 | back(); 981 | delay(1); 982 | return; 983 | } 984 | delay(3); 985 | while (true) { 986 | click_week(); 987 | if (text("返回").exists()) { 988 | delay(1); 989 | text("返回").click(); 990 | delay(2); 991 | break; 992 | } 993 | } 994 | back(); 995 | console.info('每周答题结束'); 996 | delay(2); 997 | } 998 | 999 | /** 1000 | * @description: 专项答题 1001 | * @author:Lejw 1002 | */ 1003 | function special_Answer() { 1004 | if (special_num == 0 || !hamibot.env.special) return; 1005 | console.info('开始专项答题'); 1006 | questionShow(); 1007 | delay(1); 1008 | text('专项答题').findOne().parent().click(); 1009 | delay(1); 1010 | if (!checkSpecialEntry()) {//找不到能进去的题 1011 | console.log("专项答题结束"); 1012 | back(); 1013 | delay(1); 1014 | return; 1015 | } 1016 | delay(3); 1017 | while (true) { 1018 | click_special(); 1019 | if (text("查看解析").exists()) { 1020 | delay(1); 1021 | back(); 1022 | delay(1); 1023 | back(); 1024 | break; 1025 | } 1026 | } 1027 | back(); 1028 | console.info('每项答题结束'); 1029 | delay(2); 1030 | } 1031 | 1032 | 1033 | /** 1034 | * @description: 题目相似的查询 1035 | * @param: question-题库题目,answer-题库答案,q文字识别内容,flag-字音 1036 | */ 1037 | function similarity(question, answer, q, flag) { 1038 | var num = 0; 1039 | if (flag) { 1040 | if (question.indexOf('正确') == -1 && question.indexOf('下列不属于二十四史的') == -1) { 1041 | return 0; 1042 | } 1043 | for (var i = 0; i < q.length; i++) { 1044 | if (answer.indexOf(q[i]) != -1) { 1045 | num++; 1046 | } 1047 | } 1048 | return num / (answer.length + q.length); 1049 | } 1050 | else { 1051 | var tmp = 1; 1052 | if (q.length > 20) tmp = 2; 1053 | if (q.length > 40) tmp = 3; 1054 | if (q.length > 50) tmp = 4; 1055 | for (var i = 0; i < q.length - tmp; i += tmp) { 1056 | if (question.indexOf(q[i] + q[i + 1]) != -1) { 1057 | num++; 1058 | } 1059 | } 1060 | return num / (question.length + q.length); 1061 | } 1062 | } 1063 | /** 1064 | * @description: 挑战答题 1065 | */ 1066 | function challenge() { 1067 | if (challenge_num == 0 || !hamibot.env.challenge) return; 1068 | console.info('开始挑战答题'); 1069 | questionShow(); 1070 | delay(3); 1071 | text("排行榜").findOnce().parent().child(10).click(); 1072 | delay(5); 1073 | var xxxxx = 1; 1074 | while (true) { 1075 | delay(3); 1076 | challenge_loop(xxxxx); 1077 | delay(0.5); 1078 | if (text('wrong@3x.9ccb997c').exists() || text('2kNFBadJuqbAAAAAElFTkSuQmCC').exists() || text("v5IOXn6lQWYTJeqX2eHuNcrPesmSud2JdogYyGnRNxujMT8RS7y43zxY4coWepspQkvw" + "RDTJtCTsZ5JW+8sGvTRDzFnDeO+BcOEpP0Rte6f+HwcGxeN2dglWfgH8P0C7HkCMJOAAAAAElFTkSuQmCC").exists()) { 1079 | delay(1); 1080 | if (xxxxx < challenge_loop_num && text("立即复活").exists()) { 1081 | click("立即复活"); 1082 | delay(1); 1083 | 1084 | } else if (text('结束本局').exists()) { 1085 | text('结束本局').findOne().click(); 1086 | delay(2); 1087 | } 1088 | if (xxxxx > challenge_loop_num) { 1089 | if (text('再来一局').exists()) { 1090 | text('再来一局').waitFor(); 1091 | } 1092 | delay(1); 1093 | back(); 1094 | break; 1095 | } 1096 | else { 1097 | 1098 | click('再来一局'); 1099 | delay(5); 1100 | 1101 | } 1102 | xxxxx = 0; 1103 | 1104 | } 1105 | else { xxxxx++; } 1106 | } 1107 | console.info('挑战答题结束'); 1108 | delay(2); 1109 | } 1110 | /** 1111 | * @description: 题库提取到questi_list 1112 | */ 1113 | function init_question_list() { 1114 | 1115 | var path = "/sdcard/question_tiku.txt"; 1116 | if (init_true == true) { 1117 | 1118 | files.remove(path); 1119 | delay(2); 1120 | } 1121 | var Dates = new Date(); 1122 | var Y = Dates.getFullYear(); 1123 | var M = Dates.getMonth() + 1; 1124 | var D = Dates.getDate(); 1125 | 1126 | var uptimes = Y + (M < 10 ? "0" : "") + M + (D < 10 ? "0" : "") + D; 1127 | if (uptiku >= uptimes) { 1128 | console.info('比当天月份大或等于 正在执行题库更新'); 1129 | try { 1130 | var upx = http.get("https://gh-proxy.com/https://raw.githubusercontent.com/alikankan/study/main/" + uptiku).body.string(); 1131 | console.error("更新upx长度为" + upx.length) 1132 | 1133 | } catch (e) { e.error } 1134 | if (upx.length > 100) { 1135 | files.append("/sdcard/question_tiku.txt", upx); 1136 | console.error('题库更新' + upx); 1137 | toastLog("题库添加完成"); 1138 | } else { 1139 | console.error("更新出错,upx长度为" + upx.length) 1140 | } 1141 | delay(3); 1142 | } else { 1143 | console.info('老题库 不更新'); 1144 | } 1145 | //题库更新 1146 | if (!files.exists(path)) { 1147 | console.error('题库文件不存在,仔细查看脚本介绍\n3s重新下载'); 1148 | 1149 | try { 1150 | var x = http.get("https://gh-proxy.com/https://raw.githubusercontent.com/alikankan/study/main/question_tiku.txt").body.string(); 1151 | files.write("/sdcard/question_tiku.txt", x); 1152 | } catch (e) { } 1153 | delay(3); 1154 | // console.close(); 1155 | // exit(); 1156 | } 1157 | delay(3); 1158 | var tiku = files.read(path); 1159 | tiku = tiku.split('\n'); 1160 | for (var i = 0; i <= tiku.length; i++) { 1161 | if (tiku[i]) { 1162 | question_list.push(tiku[i].split('=')); 1163 | } 1164 | } 1165 | } 1166 | /** 1167 | * @description: 四人/双人对战 1168 | */ 1169 | function zsyAnswer() { 1170 | console.info('开始对战'); 1171 | var img = captureScreen(); 1172 | try { 1173 | var point = findColor(img, '#1B1F25', { 1174 | region: [0, 0, 100, 100], 1175 | threshold: 10, 1176 | }); 1177 | } catch (e) { 1178 | console.info('你可能使用了模拟器并且hamibot的版本是1.3.0及以上,请使用hamibot1.1.0版本'); 1179 | delay(3); 1180 | exit(); 1181 | } 1182 | if (choose == 'a') { 1183 | huawei_ocr_api(img); 1184 | } else if (choose == 'b') { 1185 | ocr_api(img); 1186 | } else if (choose == 'c') { 1187 | hamibot_ocr_api(img); 1188 | } 1189 | else baidu_ocr_api(img); 1190 | var count = 2; 1191 | for (var i = 0; i < count; i++) { 1192 | delay(2); 1193 | if (text("随机匹配").exists()) { 1194 | text("随机匹配").findOne(3000).parent().child(0).click(); 1195 | console.log("点击随机匹配"); 1196 | count = 1; 1197 | } else { 1198 | console.log("点击开始比赛"); 1199 | var sx = text("开始比赛").findOne(5000); 1200 | if (sx) { 1201 | sx.click(); 1202 | } 1203 | else { 1204 | console.log('没有找到开始比赛,点击随机匹配'); 1205 | text("随机匹配").findOne(3000).parent().child(0).click(); 1206 | count = 1; 1207 | } 1208 | } 1209 | first = true; 1210 | yinzi = false; 1211 | delay(1); 1212 | if (text('知道了').exists()) { 1213 | console.warn('答题已满'); 1214 | text('知道了').findOnce().click(); 1215 | delay(2); 1216 | if (text("随机匹配").exists() || text("开始比赛").exists()) { 1217 | break; 1218 | } else return 0; 1219 | } 1220 | className("ListView").waitFor(); 1221 | var range = className("ListView").findOnce().parent().bounds(); 1222 | var x = range.left + 20, 1223 | dx = range.right - x - 20; 1224 | var y = range.top, 1225 | dy = device.height - 300 - y; 1226 | log('坐标获取完成'); 1227 | while (!text('继续挑战').exists()) { 1228 | do { 1229 | img = captureScreen(); 1230 | var point = findColor(img, '#1B1F25', { 1231 | region: [x, y, dx, dy], 1232 | threshold: 10, 1233 | }); 1234 | } while (!point); 1235 | if (!yinzi) console.time('答题'); 1236 | try { 1237 | range = className("ListView").findOnce().parent().bounds(); 1238 | // if (choose == 'a') img = images.inRange(img, '#000000', '#444444'); 1239 | if (!first && !yinzi) 1240 | img = images.clip(img, x, y, dx, (range.bottom - y) / 3); 1241 | else 1242 | img = images.clip(img, x, y, dx, range.bottom - y); 1243 | } 1244 | catch (e) { 1245 | img = images.clip(img, x, y, dx, dy); 1246 | } 1247 | var question; 1248 | if (choose == 'a') { // 文字识别 1249 | if (!first && !yinzi) 1250 | img = images.inRange(img, '#000000', '#444444'); 1251 | question = huawei_ocr_api(img); 1252 | } else if (choose == 'b') { 1253 | question = ocr_api(img); 1254 | } else if (choose == 'c') { 1255 | if (!first && !yinzi) // 第一题不变色 1256 | img = images.inRange(img, '#000000', '#444444'); 1257 | question = hamibot_ocr_api(img); 1258 | } 1259 | else { 1260 | if (!first && !yinzi) 1261 | img = images.inRange(img, '#000000', '#444444'); 1262 | question = baidu_ocr_api(img); 1263 | } 1264 | question = question.slice(question.indexOf('.') + 1); 1265 | question = question.replace(/,/g, ","); 1266 | console.log(question); 1267 | logs.push(question); 1268 | if (question) { 1269 | var c = do_contest_answer(32, question); 1270 | if (c == -1) { 1271 | break; 1272 | } else if (c == -2) { 1273 | className('android.widget.RadioButton').waitFor(); 1274 | continue; 1275 | } 1276 | } else { 1277 | images.save(img, "/sdcard/截图.jpg", "jpg", 50); 1278 | console.error("没有识别出任何内容,为了查错已经将截图保存在根目录./截图.jpg"); 1279 | console.log('截图坐标为(' + x + ',' + y + '),(' + dx + ',' + dy + ')'); 1280 | break; 1281 | } 1282 | console.timeEnd('答题'); 1283 | img.recycle(); 1284 | var q_right = true; 1285 | do { 1286 | img = captureScreen(); 1287 | var point = findColor(img, '#fff64e75', { 1288 | region: [x, y, dx, dy], 1289 | threshold: 10, 1290 | }); 1291 | if (point && q_right) { 1292 | q_right = false; 1293 | } 1294 | point = findColor(img, '#555AB6', { 1295 | region: [x, y, dx, dy], 1296 | threshold: 10, 1297 | }); 1298 | } while (!point); 1299 | if (q_right == true) { // 如果当前题目正确 1300 | storage2.put(old_q, old_ans); // 存入本地存储,减小下一次搜该题的时间 1301 | } else { // 当出错时 1302 | if (storage2.contains(old_q)) 1303 | storage2.remove(old_q); // 可能由于上次搜题因错误答案而点击正确,则此时删除本地存储 1304 | } 1305 | console.log('----------'); 1306 | logs.push('----------'); 1307 | yinzi = false; 1308 | } 1309 | if (i == 0 && count == 2) { 1310 | delay(1) 1311 | console.log('第二轮答题开始'); 1312 | logs.push('第二轮答题开始'); 1313 | while (!click('继续挑战')); 1314 | delay(1); 1315 | } 1316 | } 1317 | if (hamibot.env.another) { 1318 | // var x = hamibot.env.another * 1; 1319 | var x = 0; 1320 | 1321 | } 1322 | else { 1323 | var x = 0; 1324 | } 1325 | while (x > 0) { 1326 | console.info('额外的 ' + x + ' 轮即将开始!'); 1327 | x--; 1328 | delay(2); 1329 | click('继续挑战'); 1330 | delay(3); 1331 | if (text("随机匹配").exists()) { 1332 | text("随机匹配").findOne().parent().child(0).click(); 1333 | console.log("点击随机匹配"); 1334 | } else { 1335 | console.log("点击开始比赛"); 1336 | // my_click_clickable('开始比赛'); 1337 | var sx = text("开始比赛").findOne(5000); 1338 | if (sx) { 1339 | sx.click(); 1340 | } 1341 | else { 1342 | console.log('没有找到开始比赛,点击随机匹配'); 1343 | text("随机匹配").findOne(3000).parent().child(0).click(); 1344 | } 1345 | } 1346 | delay(1); 1347 | if (text('知道了').exists()) { 1348 | console.warn('答题已满'); 1349 | text('知道了').findOnce().click(); 1350 | delay(1); 1351 | return 0; 1352 | } 1353 | while (true) { 1354 | if (text('继续挑战').exists()) break; 1355 | while (!className('android.widget.RadioButton').depth(32).exists()) { 1356 | delay(random(3, 5)); 1357 | if (text('继续挑战').exists()) break; 1358 | } 1359 | delay(2); 1360 | console.warn('随机点击'); 1361 | try { 1362 | var t = className("ListView").findOne(5000).childCount(); 1363 | t = random(0, t - 1); 1364 | className('android.widget.RadioButton').depth(32).findOnce(t).click(); 1365 | } 1366 | catch (e) { } 1367 | if (text('继续挑战').exists()) break; 1368 | sleep(200); 1369 | } 1370 | // console.warn('额外一轮结束!'); 1371 | } 1372 | console.info('答题结束,返回答题界面'); 1373 | delay(2); 1374 | back(); 1375 | delay(2); 1376 | back(); 1377 | if (count == 1) { 1378 | delay(2); 1379 | if (text('退出').exists()) { 1380 | textContains('退出').click(); 1381 | delay(1); 1382 | } else { 1383 | console.warn('没有找到退出,按坐标点击(可能失败)\n如果没返回,手动退出双人赛即可继续运行'); 1384 | // console.setPosition(device.width * 0.2, device.height * 0.5); 1385 | click(device.width * 0.2, device.height * 0.6); 1386 | } 1387 | delay(2); 1388 | } 1389 | } 1390 | /** 1391 | * @description: 四人/双人单题答题 1392 | */ 1393 | function do_contest_answer(depth_option, question1) { 1394 | // console.time('搜题'); 1395 | question1 = question1.replace(/'/g, ""); 1396 | question1 = question1.replace(/"/g, ""); 1397 | old_question = JSON.parse(JSON.stringify(question1)); 1398 | question1 = question1.split('来源:')[0]; //去除来源 1399 | question1 = question1.split('来源:')[0]; //去除来源 1400 | question = question1.split('A.')[0]; 1401 | // question = question.split('(.*)')[0]; 1402 | reg = /下列..正确的是.*/g; 1403 | reb = /选择词语的正确.*/g; 1404 | rea = /选择正确的读音.*/g; 1405 | rec = /下列不属于二十四史的是.*/g; 1406 | var option = 'A'; 1407 | var answer = 'N'; 1408 | var similars = 0; 1409 | var pos = -1; 1410 | var answers_list = ''; 1411 | if (rec.test(question) || reg.test(question) || rea.test(question) || reb.test(question)) { 1412 | yinzi = true; 1413 | first = false; 1414 | try { 1415 | old_question = old_question.replace(/4\./g, 'A.'); 1416 | var old_answers = old_question.split('A.')[1].split('C')[0]; 1417 | for (var k = 0; k < 2; k++) { 1418 | answers = old_answers.split('B.')[k]; 1419 | // answers = answers.match(/[\u4e00-\u9fa5]/g).join(""); //剩余汉字 1420 | answers = answers.replace(/哆峻/g, "啰唆"); 1421 | answers = answers.replace(/罗峻/g, "罗唆"); 1422 | answers = answers.replace(/暖陀/g, "蹉跎"); 1423 | answers = answers.replace(/暖跑/g, "蹉跎"); 1424 | answers = answers.replace(/跨踏/g, "踌躇"); 1425 | answers = answers.replace(/chuo/g, "chuò"); 1426 | answers = answers.replace(/cuotuo/g, "cuōtuó"); 1427 | answers = answers.replace(/duo/g, "duō"); 1428 | answers = answers.replace(/蹈/g, "踌躇"); 1429 | answers = answers.replace(/调帐/g, "惆怅"); 1430 | answers = answers.replace(/任悔/g, "忏悔"); 1431 | answers = answers.replace(/仟悔/g, "忏悔"); 1432 | answers = answers.replace(/忧心../g, "忧心忡忡"); 1433 | answers = answers.replace(/美轮美./g, "美轮美奂"); 1434 | answers = answers.replace(/决穿/g, "诀窍"); 1435 | answers = answers.replace(/浙临/g, "濒临"); 1436 | answers = answers.replace(/不落../g, "不落窠臼"); 1437 | answers = answers.replace(/.目结舌/g, "膛目结舌"); 1438 | answers = answers.replace(/泉水../g, "泉水淙淙"); 1439 | answers = answers.replace(/饮.止渴/g, "饮鸠止渴"); 1440 | answers = answers.replace(/趋之若./g, "趋之若鹜"); 1441 | answers = answers.replace(/一.而就/g, "一蹴而就"); 1442 | answers = answers.replace(/刚.自用/g, "刚愎自用"); 1443 | answers = answers.replace(/风驰电./g, "风驰电掣"); 1444 | answers = answers.replace(/不.而走/g, "不胫而走"); 1445 | answers = answers.replace(/.声叹气/g, "唉声叹气"); 1446 | answers = answers.replace(/.而走险/g, "铤而走险"); 1447 | answers = answers.replace(/底护/g, "庇护"); 1448 | answers = answers.replace(/蓓./g, "蓓蕾"); 1449 | answers = answers.replace(/抵悟/g, "抵牾"); 1450 | answers = answers.replace(/情懒/g, "慵懒"); 1451 | answers = answers.replace(/差道/g, "差遣"); 1452 | answers = answers.replace(/泽炼/g, "淬炼"); 1453 | answers = answers.replace(/博奔/g, "博弈"); 1454 | answers = answers.replace(/相形见./g, "相形见绌"); 1455 | answers = answers.replace(/对.公堂/g, "对簿公堂"); 1456 | answers = answers.replace(/疼李/g, "痉挛"); 1457 | answers = answers.replace(/痉李/g, "痉挛"); 1458 | answers = answers.replace(/..人口/g, "脍炙人口"); 1459 | answers = answers.replace(/.意安为/g, "恣意妄为"); 1460 | answers = answers.replace(/凌合/g, "凑合"); 1461 | answers = answers.replace(/神抵/g, "神祗"); 1462 | answers = answers.replace(/叫苦不./g, "叫苦不迭"); 1463 | answers = answers.replace(/草.人命/g, "草菅人命"); 1464 | answers = answers.replace(/鞭./g, "鞭笞"); 1465 | answers = answers.replace(/发物/g, "发轫"); 1466 | answers = answers.replace(/..充数/g, "滥芋充数"); 1467 | answers = answers.replace(/水蒸气/g, "水蒸气 水蒸汽"); 1468 | answers = answers.replace(/..置疑/g, "毋庸置疑"); 1469 | answers = answers.replace(/..不振/g, "萎靡不振"); 1470 | answers = answers.replace(/瓜熟.落/g, "瓜熟蒂落"); 1471 | answers = answers.replace(/虎视../g, "虎视眈眈"); 1472 | answers = answers.replace(/进裂/g, "崩裂"); 1473 | answers_list += answers; 1474 | } 1475 | } catch (e) { 1476 | while (!className('android.widget.RadioButton').depth(32).exists()) { 1477 | if (text('继续挑战').exists()) return -1; 1478 | } 1479 | return -2; 1480 | }; 1481 | } 1482 | if (yinzi) question = answers_list; 1483 | answer = storage2.get(question); 1484 | if (!answer) { 1485 | for (var i = 0; i < question_list.length; i++) { // 搜题 1486 | var sx = similarity(question_list[i][1], question_list[i][0], question, yinzi); 1487 | if (sx > similars) { 1488 | similars = sx; 1489 | pos = i; 1490 | } 1491 | if (sx == 999) break; 1492 | } 1493 | if (pos != -1) { 1494 | answer = question_list[pos][0]; 1495 | } 1496 | else { 1497 | console.error('没搜到答案,题目异常:\n“' + old_question + '”'); 1498 | logs.push('没搜到答案,题目异常:\n“' + old_question + '”'); 1499 | console.error('此题异常'); 1500 | } 1501 | } 1502 | if (answer) { 1503 | old_q = question; 1504 | old_ans = answer; 1505 | console.info('答案:' + answer); 1506 | logs.push('答案:' + answer); 1507 | if (!first && !yinzi) { 1508 | while (true) { 1509 | if (className('android.widget.RadioButton').depth(32).exists()) { 1510 | break; 1511 | } 1512 | if (text('继续挑战').exists()) return -1; 1513 | } 1514 | try { 1515 | var img = captureScreen(); 1516 | var b = className('ListView').depth(29).findOne(3000).bounds(); 1517 | img = images.clip(img, b.left, b.top, b.right - b.left, b.bottom - b.top); 1518 | if (choose == 'a') { 1519 | old_question = huawei_ocr_api(img); 1520 | } else if (choose == 'b') { 1521 | old_question = ocr_api(img); 1522 | } else if (choose == 'c') { 1523 | old_question = hamibot_ocr_api(img, 30, false); 1524 | } 1525 | else old_question = baidu_ocr_api(img); 1526 | console.log(old_question); 1527 | logs.push(old_question); 1528 | } 1529 | catch (e) { 1530 | console.error(e); 1531 | console.info('选项获取失败'); 1532 | } 1533 | } 1534 | try { 1535 | option = click_by_answer(answer, old_question); 1536 | if (!option) option = 'A'; 1537 | } 1538 | catch (e) { console.error("此题选项异常!!!"); console.error(e); } 1539 | console.info('点击选项:' + option); 1540 | if (text('继续挑战').exists()) return -1; 1541 | while (!className("ListView").exists()) { 1542 | if (text('继续挑战').exists()) return -1; 1543 | } 1544 | if (text('继续挑战').exists()) return -1; 1545 | if (!first && !yinzi) { 1546 | sleep(delay_time); 1547 | } 1548 | first = false; 1549 | try { 1550 | while (!className("ListView").findOne(5000).child(option[0].charCodeAt(0) - 65).child(0).click()) { 1551 | if (text('继续挑战').exists()) return -1; 1552 | } 1553 | } catch (e) { 1554 | while (!className('android.widget.RadioButton').depth(depth_option).exists()) { 1555 | if (text('继续挑战').exists()) return -1; 1556 | } 1557 | try { 1558 | className('android.widget.RadioButton').depth(depth_option).findOnce(option[0].charCodeAt(0) - 65).click(); 1559 | } catch (e) { 1560 | console.error('没找到选项,选A跳过'); 1561 | className('android.widget.RadioButton').depth(depth_option).findOnce(0).click(); 1562 | } 1563 | } 1564 | return 0; 1565 | } 1566 | try { 1567 | className('android.widget.RadioButton').depth(depth_option).findOnce(0).click(); 1568 | } 1569 | catch (e) { 1570 | while (!className("ListView").findOne(5000).child(0).child(0).click()) { 1571 | if (text('继续挑战').exists()) return -1; 1572 | } 1573 | } 1574 | return 0; 1575 | } 1576 | var o = ['A.', 'B.', 'C.', 'D.', 'AAAA']; 1577 | var o1 = ['A', 'B', 'C', 'D', 'AAAA']; 1578 | /** 1579 | * @description: 根据答案选择选项 1580 | */ 1581 | function click_by_answer(ans, question) { 1582 | ans = ans.match(/[\u4e00-\u9fa5a-zA-Z0-9āáǎàōóǒòēéěèīíǐìūúǔùǖǘǚǜü]/g).join("") 1583 | question = question.replace(/ /g, ''); 1584 | question = question.replace(/4\./g, 'A.'); 1585 | question = question.replace(/:/g, ':'); 1586 | try { 1587 | question = replace(question); 1588 | } catch (e) { } 1589 | question = question.replace(/c\./g, "C."); 1590 | question = question.replace(/,/g, "."); 1591 | 1592 | var sum = 0; 1593 | for (var i = 0; i < question.length; i++) { 1594 | if (question[i] >= 'A' && question[i] <= 'D') { 1595 | sum++; 1596 | } 1597 | } 1598 | var op = []; 1599 | if (sum <= 4) { 1600 | question = question.replace(/\./g, ""); 1601 | for (var i = 0; i < 4; i++) { 1602 | try { 1603 | var tmp = question.split(o1[i])[1].split(o1[i + 1])[0].split('推荐:')[0].split('出题')[0]; 1604 | op.push(tmp.match(/[\u4e00-\u9fa5a-zA-Z0-9āáǎàōóǒòēéěèīíǐìūúǔùǖǘǚǜü]/g).join("")); 1605 | } 1606 | catch (e) { 1607 | op.push('&'); 1608 | } 1609 | } 1610 | } 1611 | else { 1612 | for (var i = 0; i < 4; i++) { 1613 | try { 1614 | var tmp = question.split(o[i])[1].split(o[i + 1])[0].split('推荐:')[0].split('出题')[0]; 1615 | op.push(tmp.match(/[\u4e00-\u9fa5a-zA-Z0-9āáǎàōóǒòēéěèīíǐìūúǔùǖǘǚǜü]/g).join("")); 1616 | } 1617 | catch (e) { 1618 | op.push('&'); 1619 | } 1620 | } 1621 | } 1622 | var s = 0; 1623 | var pos = -1; 1624 | for (var i = 0; i < op.length; i++) { 1625 | if (op[i] == '&') continue; 1626 | if (op[i] == ans) { 1627 | return o1[i]; 1628 | } 1629 | var tmp = similarity_answer(op[i], ans); 1630 | if (tmp > s) { 1631 | s = tmp; 1632 | pos = i; 1633 | } 1634 | } 1635 | return o1[pos]; 1636 | } 1637 | /** 1638 | * @description: 选项相似度查询 1639 | * @param: 选择 1640 | * @param: 正确选项 1641 | */ 1642 | function similarity_answer(op, ans) { 1643 | var num = 0; 1644 | for (var i = 0; i < ans.length; i++) { 1645 | if (op.indexOf(ans[i]) != -1) num++; 1646 | } 1647 | for (var i = 0; i < ans.length - 1; i++) { 1648 | if (op.indexOf(ans[i] + ans[i + 1]) != -1) num++; 1649 | } 1650 | for (var i = 0; i < ans.length - 2; i++) { 1651 | if (op.indexOf(ans[i] + ans[i + 1] + ans[i + 2]) != -1) num++; 1652 | } 1653 | return num / (2 * op.length + 2 * ans.length); 1654 | } 1655 | /** 1656 | * @description: 四人赛 1657 | */ 1658 | function four() { 1659 | if (hamibot.env.another) { 1660 | // var x = hamibot.env.another * 1; 1661 | four_num = 1; 1662 | 1663 | } 1664 | if (four_num == 0 || !hamibot.env.four) return; 1665 | // if (!hamibot.env.four) return; 1666 | console.info('开始四人赛'); 1667 | logs.push('开始四人赛'); 1668 | questionShow(); 1669 | text("排行榜").findOne().parent().child(8).click(); 1670 | delay(1); 1671 | zsyAnswer(); 1672 | delay(2); 1673 | } 1674 | /** 1675 | * @description: 双人对战 1676 | */ 1677 | function double() { 1678 | if (hamibot.env.another) { 1679 | // var x = hamibot.env.another * 1; 1680 | double_num = 1; 1681 | 1682 | } 1683 | if (double_num == 0 || !hamibot.env.double) return; 1684 | // if (!hamibot.env.double) return; 1685 | console.info('开始双人对战'); 1686 | logs.push('开始双人对战'); 1687 | questionShow(); 1688 | text("排行榜").findOne().parent().child(9).click(); 1689 | delay(1); 1690 | zsyAnswer(); 1691 | delay(2); 1692 | } 1693 | /** 1694 | * @description: 进入答题界面 1695 | */ 1696 | function questionShow() { 1697 | while (!desc("工作").exists()) { 1698 | delay(1); 1699 | if (text("排行榜").exists()) { 1700 | return; 1701 | } 1702 | } 1703 | console.log("进入答题界面"); 1704 | text("我的").click(); 1705 | delay(1); 1706 | while (!desc("我的信息").exists()) { 1707 | delay(1); 1708 | } 1709 | text("我要答题").findOne().parent().click(); 1710 | delay(1); 1711 | while (!text("排行榜").exists()) { 1712 | delay(1); 1713 | } 1714 | delay(1); 1715 | } 1716 | 1717 | /** 1718 | * @description: 百度文字识别 1719 | * @return: 文字识别内容 1720 | */ 1721 | function baidu_ocr_api(img) { 1722 | console.log('百度ocr文字识别中baidu_ocr_api'); 1723 | var answer = ""; 1724 | var res = http.post( 1725 | 'https://aip.baidubce.com/rest/2.0/ocr/v1/accurate', 1726 | { 1727 | headers: { 1728 | 'Content-Type': 'application/x-www-form-urlencoded' 1729 | }, 1730 | access_token: token, 1731 | image: images.toBase64(img), 1732 | } 1733 | ); 1734 | 1735 | var res = res.body.json(); 1736 | try { 1737 | var words_list = res.words_result; 1738 | } catch (error) { 1739 | console.error('百度ocr文字识别请求错误:可能有以下情况\n1.百度ocr欠费\n2.其他的错误'); 1740 | exit(); 1741 | } 1742 | for (var i in words_list) { 1743 | answer += words_list[i].words; 1744 | } 1745 | return answer.replace(/\s*/g, ""); 1746 | } 1747 | 1748 | /** 1749 | * @description: 返回结果列表的百度文字识别 1750 | * @author:Lejw 1751 | * @return: 文字识别内容 1752 | */ 1753 | function baidu_ocr_api_return_list(img, token) { 1754 | console.log('百度ocr文字识别中baidu_ocr_api_return_list'); 1755 | var res = http.post( 1756 | 'https://aip.baidubce.com/rest/2.0/ocr/v1/general', 1757 | { 1758 | headers: { 1759 | 'Content-Type': 'application/x-www-form-urlencoded' 1760 | }, 1761 | access_token: token, 1762 | image: images.toBase64(img), 1763 | } 1764 | ); 1765 | 1766 | var res = res.body.json(); 1767 | try { 1768 | var words_list = res.words_result; 1769 | } catch (error) { 1770 | console.error('百度ocr文字识别失败:检查\n1.百度ocr欠费\n2.其他的错误'); 1771 | exit(); 1772 | } 1773 | var ret = []; 1774 | for (let i = 0; i < words_list.length; i++) { 1775 | ret[i] = words_list[i].words.replace(/\s*/g, ""); 1776 | } 1777 | return ret; 1778 | } 1779 | 1780 | /** 1781 | * @description: 获取百度OCR_token 1782 | * @return: access_token 1783 | */ 1784 | function get_baidu_token(client_id, client_secret) { // 百度ocr 1785 | var res = http.post( 1786 | 'https://aip.baidubce.com/oauth/2.0/token', 1787 | { 1788 | grant_type: 'client_credentials', 1789 | client_id: client_id, 1790 | client_secret: client_secret 1791 | } 1792 | ); 1793 | var xad = res.body.json()['access_token']; 1794 | if (xad == null) { 1795 | console.error('百度文字识别(OCR)载入失败'); 1796 | delay(3); 1797 | exit(); 1798 | } else { 1799 | console.info('百度文字识别(OCR)载入成功'); 1800 | } 1801 | return xad; 1802 | } 1803 | var ocr; 1804 | /** 1805 | * @description: 第三方浩然文字识别 1806 | * @return: 文字识别内容 1807 | */ 1808 | function ocr_api(img) { 1809 | console.log('第三方本地ocr文字识别中'); 1810 | try { 1811 | var answer = ""; 1812 | var results = ocr.detect(img.getBitmap(), 1); 1813 | for (var i = 0; i < results.size(); i++) { 1814 | var s = results.get(i).text; 1815 | answer += s; 1816 | } 1817 | return answer.replace(/\s*/g, ""); 1818 | } catch (e) { 1819 | console.error(e); 1820 | console.info("第三方OCR插件安装错了位数,分为64位和32位\n卸载之前的插件,换一个位数安装"); 1821 | delay(3); 1822 | exit(); 1823 | } 1824 | } 1825 | /** 1826 | * @description: hamibot内置paddle文字识别 1827 | * @return: 文字识别内容 1828 | */ 1829 | function hamibot_ocr_api() { 1830 | console.log('hamibot文字识别中'); 1831 | let list = ocr.recognize(arguments[0])['results']; // 识别文字,并得到results 1832 | let eps = 30; // 坐标误差 1833 | if (arguments.length >= 2) eps = arguments[1]; 1834 | for ( 1835 | var i = 0; 1836 | i < list.length; 1837 | i++ // 选择排序对上下排序,复杂度O(N²)但一般list的长度较短只需几十次运算 1838 | ) { 1839 | for (var j = i + 1; j < list.length; j++) { 1840 | if (list[i]['bounds']['bottom'] > list[j]['bounds']['bottom']) { 1841 | var tmp = list[i]; 1842 | list[i] = list[j]; 1843 | list[j] = tmp; 1844 | } 1845 | } 1846 | } 1847 | 1848 | for ( 1849 | var i = 0; 1850 | i < list.length; 1851 | i++ // 在上下排序完成后,进行左右排序 1852 | ) { 1853 | for (var j = i + 1; j < list.length; j++) { 1854 | // 由于上下坐标并不绝对,采用误差eps 1855 | if ( 1856 | Math.abs(list[i]['bounds']['bottom'] - list[j]['bounds']['bottom']) < 1857 | eps && 1858 | list[i]['bounds']['left'] > list[j]['bounds']['left'] 1859 | ) { 1860 | var tmp = list[i]; 1861 | list[i] = list[j]; 1862 | list[j] = tmp; 1863 | } 1864 | } 1865 | } 1866 | let res = ''; 1867 | for (var i = 0; i < list.length; i++) { 1868 | res += list[i]['text']; 1869 | } 1870 | list = null; 1871 | return res; 1872 | } 1873 | 1874 | /** 1875 | * @description: 返回结果列表的Hamibot文字识别 1876 | * @author:Lejw 1877 | * @return: 文字识别内容 1878 | */ 1879 | function hamibot_ocr_api_return_list() { 1880 | console.log('hamibot文字识别中'); 1881 | let list = ocr.recognize(arguments[0])['results']; // 识别文字,并得到results 1882 | let eps = 5; // 坐标误差 1883 | if (arguments.length >= 2) eps = arguments[1]; 1884 | for ( 1885 | var i = 0; 1886 | i < list.length; 1887 | i++ // 选择排序对上下排序,复杂度O(N²)但一般list的长度较短只需几十次运算 1888 | ) { 1889 | for (var j = i + 1; j < list.length; j++) { 1890 | if (list[i]['bounds']['bottom'] > list[j]['bounds']['bottom']) { 1891 | var tmp = list[i]; 1892 | list[i] = list[j]; 1893 | list[j] = tmp; 1894 | } 1895 | } 1896 | } 1897 | 1898 | for ( 1899 | var i = 0; 1900 | i < list.length; 1901 | i++ // 在上下排序完成后,进行左右排序 1902 | ) { 1903 | for (var j = i + 1; j < list.length; j++) { 1904 | // 由于上下坐标并不绝对,采用误差eps 1905 | if ( 1906 | Math.abs(list[i]['bounds']['bottom'] - list[j]['bounds']['bottom']) < 1907 | eps && 1908 | list[i]['bounds']['left'] > list[j]['bounds']['left'] 1909 | ) { 1910 | var tmp = list[i]; 1911 | list[i] = list[j]; 1912 | list[j] = tmp; 1913 | } 1914 | } 1915 | } 1916 | let res = []; 1917 | for (var i = 0; i < list.length; i++) { 1918 | res[i] = list[i]['text']; 1919 | } 1920 | list = null; 1921 | return res; 1922 | } 1923 | 1924 | /** 1925 | * @description: 华为文字识别 1926 | * @return: 文字识别内容 1927 | */ 1928 | function huawei_ocr_api(img) { 1929 | console.log('华为ocr文字识别中'); 1930 | var answer = ""; 1931 | var res = http.postJson( 1932 | 'https://' + endpoint + '/v2/' + projectId + '/ocr/web-image', { 1933 | "image": images.toBase64(img) 1934 | }, { 1935 | headers: { 1936 | "User-Agent": "API Explorer", 1937 | "X-Auth-Token": token, 1938 | "Content-Type": "application/json;charset=UTF-8" 1939 | } 1940 | } 1941 | ); 1942 | var res = res.body.json(); 1943 | try { 1944 | var words_list = res.result.words_block_list; 1945 | } catch (error) { 1946 | toastLog(error); 1947 | exit(); 1948 | } 1949 | for (var i in words_list) { 1950 | answer += words_list[i].words; 1951 | } 1952 | return answer.replace(/\s*/g, ""); 1953 | } 1954 | /** 1955 | * @description: 返回主界面 1956 | */ 1957 | function back_table() { 1958 | delay(1); 1959 | var back_num = 0; 1960 | while (!desc("工作").exists()) { //等待加载出主页 1961 | console.log("正在返回主页"); 1962 | back(); 1963 | delay(1); 1964 | back_num++; 1965 | if (className('Button').textContains('退出').exists()) { 1966 | var c = className('Button').textContains('退出').findOne(3000); 1967 | if (c) c.click(); 1968 | delay(1); 1969 | c = null; 1970 | } 1971 | if (back_num > 10) { 1972 | console.error('返回超过10次,可能当前不在xxqg,正在启动app...'); 1973 | launchApp("学习强国") || launch('cn.xuexi.android'); //启动学习强国app 1974 | console.info('等待10s继续进行'); 1975 | delay(10); 1976 | back_num = 0; 1977 | } 1978 | } 1979 | back_num = null; 1980 | } 1981 | /** 1982 | * @description: 开关广播 1983 | * @param:开true -> 关false 1984 | */ 1985 | function start_close_radio(flag) { 1986 | back_table(); 1987 | if (flag) { 1988 | console.info("正在打开广播"); 1989 | click('电台'); 1990 | delay(2); 1991 | click('听广播'); 1992 | delay(2); 1993 | if (id("lay_state_icon").exists()) { 1994 | log("等待:" + "lay_state_icon"); 1995 | id("lay_state_icon").waitFor(); 1996 | var lay_state_icon_pos = id("lay_state_icon").findOne().bounds(); 1997 | click(lay_state_icon_pos.centerX(), lay_state_icon_pos.centerY()); 1998 | delay(2); 1999 | var home_bottom = id("home_bottom_tab_icon_large").findOne().bounds(); 2000 | click(home_bottom.centerX(), home_bottom.centerY()); 2001 | } else { 2002 | console.info("广播点击失败换个方式"); 2003 | while (!(textContains("正在收听").exists() || textContains("最近收听").exists() || textContains("推荐收听").exists())) { 2004 | log("等待加载"); 2005 | delay(1); 2006 | } 2007 | if (click("最近收听") == 0) { 2008 | if (click("推荐收听") == 0) { 2009 | click("正在收听"); 2010 | } 2011 | } 2012 | delay(2); 2013 | if (id("btn_back").findOne().click() == 0) { 2014 | delay(2); 2015 | back(); //返回电台界面 2016 | } 2017 | back(); 2018 | } 2019 | 2020 | } 2021 | else { 2022 | console.info("正在关闭广播"); 2023 | click('电台'); 2024 | delay(2); 2025 | click('听广播'); 2026 | delay(2); 2027 | var tmp = id('v_playing').findOne(5000); 2028 | if (tmp) { 2029 | tmp.click(); 2030 | } 2031 | } 2032 | back_table(); // 防止部分机型未在主页 2033 | } 2034 | 2035 | /** 2036 | * @description: 订阅 2037 | */ 2038 | function sub() { 2039 | if (sub_num == 0 || !hamibot.env.sub) return; 2040 | if (!files.exists('/sdcard/sub_position.txt')) { 2041 | console.error('没有订阅坐标,跳过订阅'); 2042 | return; 2043 | } 2044 | console.info('开始订阅,还需要订阅' + (sub_num) + "个"); 2045 | back_table(); 2046 | desc('工作').click(); 2047 | delay(2); 2048 | click('订阅'); 2049 | delay(2); 2050 | text('添加').depth(25).findOne().parent().click(); 2051 | delay(2); 2052 | try { 2053 | if (hamibot.env.sub == 'b') { // 只查看上新 2054 | sub_click(); 2055 | } 2056 | } 2057 | catch (e) { 2058 | log(e); 2059 | console.error('坐标错误?重新生成坐标试试'); 2060 | back_table(); 2061 | } 2062 | } 2063 | /** 2064 | * @description: 订阅平台切换 2065 | */ 2066 | function sub_click() { 2067 | eval(files.read('/sdcard/sub_position.txt')); 2068 | for (var i = 0; i < position.length && sub_num; i += 2) { 2069 | press(position[i], position[i + 1], 100); 2070 | if (i == 0 || i == 23) { delay(0.5); continue }; 2071 | 2072 | } 2073 | } 2074 | /** 2075 | * @description: 点击订阅 2076 | */ 2077 | function pic_click() { 2078 | while (sub_num > 0) { 2079 | let result = findColor(captureScreen(), '#E42417', { 2080 | max: 5, 2081 | region: [s1, 100, device.width - s1, device.height - 200], //区域 2082 | threshold: 10, 2083 | }); 2084 | if (result) { 2085 | console.log("已经订阅了" + (3 - sub_num) + "个"); 2086 | press(result.x + 10, result.y + 10, 100); 2087 | sub_num--; 2088 | } else { 2089 | break; 2090 | } 2091 | delay(1); 2092 | } 2093 | } 2094 | /** 2095 | * @description: 获取截图权限 2096 | */ 2097 | function get2_requestScreenCapture() { 2098 | threads.start(function () { 2099 | // 请求截图 2100 | if (!requestScreenCapture(false)) { 2101 | toastLog("请求截图失败"); 2102 | exit(); 2103 | } 2104 | }) 2105 | delay(1); 2106 | threads.start(function () { 2107 | try { 2108 | textContains("立即开始").className("Button").findOne(3000).click(); 2109 | } catch (e) { } 2110 | }) 2111 | threads.start(function () { 2112 | try { 2113 | textContains("允许").className("Button").findOne(3000).click(); 2114 | } catch (e) { } 2115 | }) 2116 | } 2117 | function getVersion(package_name) { // 得到包名的版本 2118 | let pkgs = context.getPackageManager().getInstalledPackages(0).toArray(); 2119 | for (let i in pkgs) { 2120 | if (pkgs[i].packageName.toString() === package_name) { 2121 | return pkgs[i].versionName; 2122 | } 2123 | } 2124 | } 2125 | /** 2126 | * @description: 进入hamibot界面获取截图权限(更稳定) 2127 | */ 2128 | function get_requestScreenCapture() { 2129 | console.info('正在获取截图权限'); 2130 | launchApp("Hamibot"); // 若无必要,可以删除该行 2131 | delay(2); 2132 | get2_requestScreenCapture(); 2133 | var wait_num = 0; 2134 | while (true) { 2135 | sleep(3000); 2136 | try { 2137 | captureScreen(); 2138 | break; 2139 | } catch (e) { } 2140 | if (wait_num > 10) { // 等待超过30s,重新申请截图权限 2141 | wait_num = 0; 2142 | get2_requestScreenCapture(); 2143 | } 2144 | wait_num++; 2145 | } 2146 | wait_num = null; 2147 | console.info('截图权限获取完成'); 2148 | if (choose == 'd') { // 获取百度OCR的token,在hamibot内获取 2149 | if (hamibot.env.client_id && hamibot.env.client_secret) { 2150 | token = get_baidu_token(hamibot.env.client_id, hamibot.env.client_secret); 2151 | } 2152 | else { 2153 | console.error('未填写百度OCR配置!!!'); 2154 | delay(3); 2155 | exit(); 2156 | } 2157 | } 2158 | else if (choose == 'b') { 2159 | try { 2160 | ocr = plugins.load("com.hraps.ocr"); 2161 | } 2162 | catch (e) { 2163 | console.error('第三方OCR插件未安装'); 2164 | delay(3); 2165 | 2166 | exit(); 2167 | } 2168 | } 2169 | else if (choose == 'c') { 2170 | var version = getVersion('com.hamibot.hamibot'); 2171 | if (version < '1.3.0') { 2172 | console.error('Hamibot版本过低'); 2173 | delay(3); 2174 | 2175 | exit(); 2176 | } 2177 | } 2178 | } 2179 | /** 2180 | * @description: 数组随机排序 2181 | */ 2182 | function disorder(arr) { 2183 | let length = arr.length; 2184 | let current = arr.length - 1; 2185 | let random; 2186 | while (current >= 0) { 2187 | random = Math.floor(length * Math.random()); 2188 | [arr[current], arr[random]] = [arr[random], arr[current]]; 2189 | current--; 2190 | } 2191 | return arr; 2192 | } 2193 | /** 2194 | * @description: 积分推送到PushDeer 2195 | */ 2196 | function PushDeer() { 2197 | if (!hamibot.env.key || hamibot.env.key == '') return; 2198 | console.info('开始获取当天积分情况'); 2199 | back_table(); 2200 | var texts = get_all_num(1, 1); 2201 | try { 2202 | console.info('开始发送推送信息,请等待...'); 2203 | log(http.get(hamibot.env.key.replace(/这是推送内容不要删除/g, texts)).body.string()); 2204 | } 2205 | catch (e) { 2206 | console.error('推送请求失败,自己琢磨原因'); 2207 | } 2208 | console.info('推送完成'); 2209 | texts = null; 2210 | } 2211 | /** 2212 | * @description: 主函数 2213 | */ 2214 | function 等待主页(waitNum) { 2215 | console.warn("等待加载主页"); 2216 | if (text("排行榜").exists()) { 2217 | delay(0.5); 2218 | back(); 2219 | delay(0.5); 2220 | back(); 2221 | delay(0.5); 2222 | } else { 2223 | waitNum++; 2224 | 2225 | if (waitNum > 1) { 2226 | back_table(); 2227 | } 2228 | } 2229 | } 2230 | function main() { 2231 | device.keepScreenOn(30 * 60 * 1000);// 设置亮屏 2232 | console.info('启动工作'); 2233 | launchApp("学习强国") || launch('cn.xuexi.android'); 2234 | while (!desc('工作').exists()) { 2235 | delay(10); 2236 | console.info('等待主页出现'); 2237 | 等待主页(1); 2238 | if (textContains("取消").exists() && textContains("立即升级").exists()) { 2239 | text("取消").findOne().click(); 2240 | } 2241 | } 2242 | if (textContains("取消").exists() && textContains("立即升级").exists()) { 2243 | text("取消").findOne().click(); 2244 | } 2245 | delay(1); 2246 | get_all_num(); 2247 | // double_num=1; 2248 | // daily_num=1; 2249 | delay(1); 2250 | var list = disorder([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); 2251 | list.forEach(i => { 2252 | switch (i) { 2253 | case 1: 2254 | local_(); 2255 | study_article(); 2256 | break; 2257 | case 2: 2258 | study_video(); 2259 | break; 2260 | case 3: 2261 | // daily_Answer(); 2262 | break; 2263 | case 4: 2264 | local_(); 2265 | break; 2266 | case 5: 2267 | 2268 | break; 2269 | case 6: 2270 | daily_Answer(); 2271 | four(); 2272 | double(); 2273 | challenge(); 2274 | break; 2275 | case 7: 2276 | //sub(); 2277 | break; 2278 | case 8: 2279 | 2280 | break; 2281 | case 9: 2282 | week_Answer(); 2283 | break; 2284 | case 10: 2285 | daily_Answer(); 2286 | special_Answer(); 2287 | break; 2288 | } 2289 | }) 2290 | device.cancelKeepingAwake(); // 取消屏幕常亮 2291 | PushDeer(); 2292 | // back_table(); 2293 | delay(1); 2294 | if (hamibot.env.end) { 2295 | console.info('正在执行自定义结束代码'); 2296 | try { 2297 | eval(hamibot.env.end); 2298 | console.info('自定义代码执行完成'); 2299 | } 2300 | catch (e) { 2301 | console.error('自定义代码有错误,跳过!!!'); 2302 | } 2303 | } 2304 | //================ 2305 | hamibot.postMessage(Date.now().toString(), { 2306 | telemetry: true, // 由用户决定是否发送报告 2307 | data: { 2308 | title: "更新题库", 2309 | attachments: [ 2310 | { 2311 | type: "json", 2312 | data: JSON.stringify({ 2313 | // 要收集的信息,根据脚本需要自行收集,这里仅作演示 2314 | app: app.versionName, // Hamibot 版本 2315 | currentActivity: currentActivity(), // 当前运行的 Activity 2316 | // 自定义日志,仅作参考 2317 | logs: logs, 2318 | }), 2319 | }, 2320 | ], 2321 | }, 2322 | }); 2323 | 2324 | //============================= 2325 | console.info('脚本运行结束,3s后自动退出'); 2326 | delay(3); 2327 | 2328 | question_list = null; 2329 | 2330 | hamibot.exit(); 2331 | exit(); 2332 | } 2333 | /** 2334 | * @description: 看门狗运行主函数main() 2335 | */ 2336 | function watchdog() { 2337 | device.wakeUpIfNeeded(); 2338 | console.info('Study togther开始运行!!!'); 2339 | console.error('脚本为免费脚本!!!'); 2340 | if (hamibot.env.head) { 2341 | console.info('正在执行自定义开始代码'); 2342 | try { 2343 | eval(hamibot.env.head); 2344 | console.info('自定义代码执行完成'); 2345 | } 2346 | catch (e) { 2347 | console.error('自定义代码有错误,跳过!!!'); 2348 | } 2349 | } 2350 | if (hamibot.env.double || hamibot.env.four || hamibot.env.week || hamibot.env.special) { 2351 | get_requestScreenCapture(); 2352 | delay(1); 2353 | } 2354 | if (hamibot.env.double || hamibot.env.four || hamibot.env.challenge) { 2355 | init_question_list(); 2356 | } 2357 | var thread = null; 2358 | var main_num = 3; 2359 | while (main_num--) { 2360 | thread = threads.start(function () { 2361 | main(); 2362 | }) 2363 | thread.join(watchdog_time); 2364 | thread.interrupt(); 2365 | console.error('脚本超时/出错,正在重新启动'); 2366 | delay(2); 2367 | back_table(); 2368 | delay(2); 2369 | } 2370 | toastLog("已经重新运行了多次,脚本结束"); 2371 | question_list = null; 2372 | thread = null; 2373 | 2374 | exit(); 2375 | } 2376 | threads.start(function () { 2377 | while (true) { 2378 | try { 2379 | if (text('访问异常').exists()) { 2380 | var b = textContains("向右滑动验证").findOne(2000).parent().child(2).bounds();; 2381 | delay(1); 2382 | console.error('当前需要验证,正在过验证'); 2383 | gestures([0, random(600, 1300), [b.centerX(), b.centerY()], [device.width, b.centerY()]]); 2384 | delay(2); 2385 | if (text('刷新').exists()) { 2386 | text('刷新').findOne(1000).parent().click(); 2387 | } 2388 | else break; 2389 | } 2390 | delay(2); 2391 | if (text('重试').exists()) { 2392 | console.info('点击重试'); 2393 | text('重试').findOne(1000).click(); 2394 | } 2395 | if (textContains("网络开小差").exists()) { 2396 | click("确定"); 2397 | } 2398 | } 2399 | catch (e) { } 2400 | } 2401 | console.error('验证通过'); 2402 | captcha = true; 2403 | }) 2404 | 2405 | watchdog(); 2406 | -------------------------------------------------------------------------------- /study异常最终版.js: -------------------------------------------------------------------------------- 1 | auto.waitFor(); 2 | importClass(android.database.sqlite.SQLiteDatabase); 3 | importClass(java.net.HttpURLConnection); 4 | importClass(java.net.URL); 5 | importClass(java.io.File); 6 | importClass(java.io.FileOutputStream); 7 | var url = "https://gh.fakev.cn/Pandaver/XXQG_TiKu_Transform/raw/main/QuestionBank.db"; 8 | var path = "/sdcard/QuestionBank.db"; 9 | var path_replace = "/sdcard/replace.js"; 10 | var path_question = "/sdcard/question"; 11 | device.wakeUpIfNeeded(); //点亮屏幕 12 | var first = true; //记录答题的第一次 13 | var r; // 替换用; 14 | var meizhou_txt = hamibot.env.checkbox_02; 15 | var zhuanxiang_txt = hamibot.env.checkbox_01; 16 | var siren = hamibot.env.checkbox_03; 17 | var shuangren = hamibot.env.shuangren; 18 | 19 | var articles = hamibot.env.article; 20 | var video = hamibot.env.video; 21 | var meiri = hamibot.env.meiri; 22 | var tiaozhan = hamibot.env.tiaozhan; 23 | 24 | var choose = hamibot.env.select_01; 25 | 26 | var 专项答题下滑 = hamibot.env.select; 27 | var 每周答题下滑 = hamibot.env.selectm; 28 | 29 | var 订阅 = hamibot.env.ssub; 30 | var 乱序 = "a"; 31 | // var 随机 = hamibot.env.suiji; 32 | 33 | var 延迟时间 = hamibot.env.delay_s * 1; 34 | if (!延迟时间 || 延迟时间 < 0) 延迟时间 = 0; 35 | var stronger = hamibot.env.stronger; //每日答题增强模式 36 | var { username } = hamibot.env; 37 | var { password } = hamibot.env; 38 | var { domainname } = hamibot.env; 39 | var { projectname } = hamibot.env; 40 | var { endpoint } = hamibot.env; 41 | var { projectId } = hamibot.env; 42 | var { sct_token } = hamibot.env; 43 | var pushplus_token = hamibot.env.Token; 44 | let ocr; 45 | var token; 46 | var ttt; 47 | var { consoleshow } = hamibot.env; 48 | var question_list = []; 49 | //var init_true = false; 50 | var { init_true } = hamibot.env; 51 | var { 首轮不答 } = hamibot.env; 52 | var { 点击延迟时间 } = hamibot.env.delay_click * 50; 53 | if (!点击延迟时间 || 点击延迟时间 < 0) 点击延迟时间 = 0; 54 | var downloadDialog = null; 55 | // var init_url = "https://git.yumenaka.net/https://raw.githubusercontent.com/Twelve-blog/picture/master/question"; 56 | var init_url = "https://gh-proxy.com/https://raw.githubusercontent.com/alikankan/study/main/question"; 57 | var file_tmp = false; 58 | //var { file_tmp } = hamibot.env; 59 | var tikus = ""; 60 | const { TELEMETRY } = hamibot.env; 61 | var logs = []; 62 | var myScores = {}; 63 | 64 | /** 65 | * 获取用户token 66 | */ 67 | function get_baidu_token() { 68 | // 百度ocr 69 | if (!hamibot.env.AK || !hamibot.env.SK) { 70 | console.error("百度ocr配置未填写!!!"); 71 | exit(); 72 | } 73 | var res = http.post("https://aip.baidubce.com/oauth/2.0/token", { 74 | grant_type: "client_credentials", 75 | client_id: hamibot.env.AK.replace(/ /g, ""), 76 | client_secret: hamibot.env.SK.replace(/ /g, ""), 77 | }); 78 | var xad = res.body.json()["access_token"]; 79 | if (xad == null) { 80 | console.error("百度文字识别(OCR)配置出错了!!!,脚本结束"); 81 | exit(); 82 | } else { 83 | console.info("百度文字识别(OCR)配置正确"); 84 | } 85 | return xad; 86 | } 87 | function get_token() { 88 | // 华为ocr 89 | var res = http.postJson( 90 | "https://iam.cn-south-1.myhuaweicloud.com/v3/auth/tokens", 91 | { 92 | auth: { 93 | identity: { 94 | methods: ["password"], 95 | password: { 96 | user: { 97 | name: username, //替换为实际用户名 98 | password: password, //替换为实际的用户密码 99 | domain: { 100 | name: domainname, //替换为实际账号名 101 | }, 102 | }, 103 | }, 104 | }, 105 | scope: { 106 | project: { 107 | name: projectname, //替换为实际的project name,如cn-south-1 108 | }, 109 | }, 110 | }, 111 | }, 112 | { 113 | headers: { 114 | "Content-Type": "application/json;charset=utf8", 115 | }, 116 | } 117 | ); 118 | if (res.headers["X-Subject-Token"] == null) { 119 | console.error("华为文字识别(OCR)配置出错了!!!,脚本结束"); 120 | exit(); 121 | } else { 122 | console.info("华为文字识别(OCR)配置正确"); 123 | } 124 | return res.headers["X-Subject-Token"]; 125 | } 126 | 127 | function getVersion(package_name) { 128 | // 得到包名的版本 129 | let pkgs = context.getPackageManager().getInstalledPackages(0).toArray(); 130 | for (let i in pkgs) { 131 | if (pkgs[i].packageName.toString() === package_name) { 132 | return pkgs[i].versionName; 133 | } 134 | } 135 | } 136 | function get_ocr() { 137 | console.info("你选择了第三方文字识别(OCR)"); 138 | try { 139 | ocr = plugins.load("com.hraps.ocr"); 140 | } catch (e) { 141 | console.error("未安装OCR插件,正在跳转浏览器下载\n密码:7faj"); 142 | app.openUrl("https://twelve123.lanzouq.com/b017az0kj"); 143 | exit(); 144 | } 145 | } 146 | 147 | function get_hamibot_ocr() { 148 | console.info("你选择了hamibot内置文字识别(OCR)"); 149 | if (app.versionName < "1.3.0-beta.1") { 150 | console.error("请去hamibot官网下载版本1.3.0以上的hamibot!!!,脚本结束"); 151 | exit(); 152 | } 153 | } 154 | 155 | var showlog = false; 156 | if (shuangren == true || siren == true || stronger != "a" || tiaozhan) { 157 | if (consoleshow == true) console.show(); 158 | 159 | if (siren == true || shuangren == true) { 160 | console.error("正在获取截图权限,并检查ocr配置是否正确"); 161 | if (choose == "b") get_ocr(); 162 | else if (choose == "a") { 163 | token = get_token(); 164 | } else if (choose == "c") { 165 | get_hamibot_ocr(); 166 | } else if (choose == "d") token = get_baidu_token(); 167 | } 168 | if (stronger != "a") { 169 | console.info("正在检测增强模式配置"); 170 | if (stronger == "c") { 171 | // 百度ocr 172 | if (siren == true && choose == "d") { 173 | ttt = token; 174 | } else { 175 | ttt = get_baidu_token(); 176 | } 177 | } else if (stronger == "b") { 178 | // 华为ocr 179 | if (siren == true && choose == "a") { 180 | ttt = token; 181 | } else { 182 | ttt = get_token(); 183 | } 184 | } 185 | } 186 | console.info("正在打开Hamibot"); 187 | if (!files.exists(path)) { 188 | //toastLog('没有题库,正在下载题库,请等待!!!'); 189 | threads.start(function () { 190 | var tiku = http.get(url).body.bytes(); 191 | //console.log(tiku) 192 | files.writeBytes(path, tiku); 193 | }); 194 | } 195 | launchApp("Hamibot"); 196 | delay(1); 197 | // show_log(); 198 | // while(!showlog){sleep(1000);}; 199 | 200 | if (tiaozhan || siren || shuangren) init(); 201 | if (tiaozhan && !(siren == true || shuangren == true || stronger != "a")) { 202 | } //只开了挑战答题的话 203 | else { 204 | //请求横屏截图权限 205 | threads.start(function () { 206 | if (!requestScreenCapture(false)) { 207 | toastLog("请求截图失败,脚本结束"); 208 | exit(); 209 | } 210 | }); 211 | delay(1.5); 212 | if (textContains("立即开始").exists() || textContains("允许").exists()) { 213 | if (textContains("立即开始").exists()) { 214 | textContains("立即开始").className("Button").findOne().click(); 215 | } else { 216 | textContains("允许").className("Button").findOne().click(); 217 | } 218 | console.info("自动点击获取权限按键!!!"); 219 | } 220 | while (true) { 221 | try { 222 | captureScreen(); 223 | break; 224 | } catch (e) { 225 | console.log("等待截图权限中"); 226 | } 227 | sleep(1500); 228 | } 229 | console.info("立即开始,允许截图权限已获取!!!"); 230 | 231 | if (choose == "b") { 232 | console.time("文字识别"); 233 | console.log("\n测试第三方OCR识别中"); 234 | console.info("\n如果脚本结束,出现红字,则安装错误的OCR位数,卸载安装的OCR插件"); 235 | ocr_api(images.clip(captureScreen(), 0, Math.floor(device.height / 2), device.width, Math.floor(device.height / 2))); 236 | console.timeEnd("文字识别"); 237 | console.log(""); 238 | } else if (choose == "c") { 239 | console.time("文字识别"); 240 | console.log("\n测试Hamibot内置OCR识别中"); 241 | hamibot_ocr_api(images.clip(captureScreen(), 0, Math.floor(device.height / 2), device.width, Math.floor(device.height / 2))); 242 | console.timeEnd("文字识别"); 243 | console.log(""); 244 | } 245 | } 246 | } 247 | 248 | var lCount = 1; //挑战答题轮数 249 | var qCount = 5; //挑战答题每轮答题数 250 | 251 | //var asub = 2; //订阅数 252 | var aCount = 6; //文章默认学习篇数 253 | var vCount = 6; //小视频默认学习个数 254 | var cCount = 2; //收藏+分享+评论次数 255 | var dayCount = 1; // 每日答题 256 | var tzCount = 1; // 挑战答题 257 | var zsyCount = 1; //争上游答题 258 | var doubleCount = 1; // 双人对战 259 | var meizhou = 1; //每周答题 260 | var zhuanxiang = 1; //专项答题 261 | 262 | var aTime = hamibot.env.time1; //有效阅读一分钟1分*6 263 | var vTime = hamibot.env.time2; //每个小视频学习-5秒 264 | var rTime = 370; //广播收听6分 * 60 = 360秒 265 | 266 | var myScores = {}; //分数 267 | var article_list = []; 268 | var delay_time = 1000; 269 | /** 270 | * @description: 延时函数 271 | * @param: seconds-延迟秒数s 272 | * @return: null 273 | */ 274 | function delay(seconds) { 275 | sleep(1000 * seconds + randomNum(0, 500)); //sleep函数参数单位为毫秒所以乘1000 276 | } 277 | /** 278 | * @description: 随机秒数 279 | * @param: seconds-秒数s 280 | * @return: [seconds+100,seconds+1000] 281 | */ 282 | function random_time(time) { 283 | return time + random(100, 1000); 284 | } 285 | /** 286 | * @description: 点击文本控件 287 | * @param: 文本 288 | * @return: null 289 | */ 290 | function my_click_clickable(target) { 291 | text(target).waitFor(); 292 | click(target); 293 | } 294 | /** 295 | * @description: 生成从minNum到maxNum的随机数 296 | * @param: minNum-较小的数 297 | * @param: maxNum-较大的数 298 | * @return: null 299 | */ 300 | function randomNum(minNum, maxNum) { 301 | switch (arguments.length) { 302 | case 1: 303 | return parseInt(Math.random() * minNum + 1, 10); 304 | case 2: 305 | return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10); 306 | default: 307 | return 0; 308 | } 309 | } 310 | 311 | /** 312 | * @description: 文章学习计时(弹窗)函数 313 | * @param: n-文章标号 seconds-学习秒数 314 | * @return: null 315 | */ 316 | function article_timing(n, seconds) { 317 | var seconds = seconds * 1; 318 | seconds = seconds + randomNum(1, 5); 319 | h = device.height; //屏幕高 320 | w = device.width; //屏幕宽 321 | x = (w / 3) * 2; 322 | h1 = (h / 6) * 5; 323 | h2 = h / 6; 324 | for (var i = 0; i < seconds; i++) { 325 | while (!textContains("欢迎发表你的观点").exists()) { 326 | //如果离开了文章界面则一直等待 327 | console.error("当前已离开第" + (n + 1) + "文章界面,请重新返回文章页面..."); 328 | delay(2); 329 | } 330 | if (i % 5 == 0) { 331 | //每5秒打印一次学习情况 332 | console.info("第" + (n + 1) + "篇文章已经学习" + (i + 1) + "秒,剩余" + (seconds - i - 1) + "秒!"); 333 | } 334 | sleep(1000); 335 | if (i % 10 == 0) { 336 | //每10秒滑动一次,如果android版本<7.0请将此滑动代码删除 337 | toast("."); 338 | if (i <= seconds / 2) { 339 | swipe(x, h1, x, h2, 500); //向下滑动 340 | } else { 341 | swipe(x, h2, x, h1, 500); //向上滑动 342 | } 343 | } 344 | } 345 | } 346 | 347 | /** 348 | * @description: 视频学习计时(弹窗)函数 349 | * @param: n-视频标号 seconds-学习秒数 350 | * @return: null 351 | */ 352 | function video_timing_bailing(n, seconds) { 353 | var seconds = seconds * 1; 354 | seconds = seconds + randomNum(1, 5); 355 | delay(1); 356 | for (var i = 0; i < seconds; i++) { 357 | sleep(1000); 358 | while (!textContains("播放").exists() || desc("工作").exists()) { 359 | //如果离开了百灵小视频界面则一直等待 360 | console.error("当前已离开第" + (n + 1) + "个视频界面,请重新返回视频"); 361 | delay(2); 362 | } 363 | console.info("第" + (n + 1) + "个视频已经观看" + (i + 1) + "秒,剩余" + (seconds - i - 1) + "秒!"); 364 | } 365 | } 366 | 367 | /** 368 | * @description: 广播学习计时(弹窗)函数 369 | * @param: r_time-已经收听的时间 seconds-学习秒数 370 | * @return: null 371 | */ 372 | function radio_timing(r_time, seconds) { 373 | var seconds = seconds * 1; 374 | for (var i = 0; i < seconds; i++) { 375 | sleep(1000); 376 | if (i % 5 == 0) { 377 | //每5秒打印一次信息 378 | console.info("广播已经收听" + (i + 1 + r_time) + "秒,剩余" + (seconds - i - 1) + "秒!"); 379 | } 380 | if (i % 15 == 0) { 381 | //每15秒弹一次窗防止息屏 382 | toast("这是防息屏弹窗,可忽略-. -"); 383 | } 384 | } 385 | logs.push("广播已经收听"); 386 | } 387 | 388 | /** 389 | * @description: 已读文章判断 390 | * @param: null 391 | * @return: null 392 | */ 393 | function insertLearnedArticle(article) { 394 | article_list.push(article); 395 | } 396 | 397 | function getLearnedArticle(article) { 398 | for (var i = 0; i < article_list.length; i++) { 399 | if (article_list[i] == article) { 400 | return true; 401 | } 402 | } 403 | return false; 404 | } 405 | 406 | var commentText = [ 407 | "中国特色社会主义不是从天上掉下来的", 408 | "时代是出卷人,我们是答卷人,人民是阅卷人", 409 | "这个新时代是中国特色社会主义新时代,而不是别的什么新时代", 410 | "决不能因为胜利而骄傲,决不能因为成就而懈怠,决不能因为困难而退缩", 411 | "要打好防范和抵御风险的有准备之战,也要打好化险为夷、转危为机的战略主动战", 412 | ]; //评论内容,可自行修改,大于5个字便计分 413 | /** 414 | * @description: 分享评论 415 | * @param: null 416 | * @return: null 417 | */ 418 | function collectCommentShare() { 419 | while (!text("欢迎发表你的观点").exists()) { 420 | toastLog("需要在文章界面"); 421 | delay(1); 422 | } 423 | var textOrder = text("欢迎发表你的观点").findOnce().drawingOrder(); 424 | 425 | var zhuanOrder = textOrder + 3; 426 | 427 | var shareIcon = className("ImageView") 428 | .filter(function (iv) { 429 | return iv.drawingOrder() == zhuanOrder; 430 | }) 431 | .findOnce(); 432 | 433 | var num = random(0, commentText.length - 1); //随机数 434 | click("欢迎发表你的观点"); 435 | delay(1); 436 | setText(commentText[num]); //输入评论内容 437 | delay(1); 438 | click("发布"); //点击右上角发布按钮 439 | //toastLog("评论成功!"); 440 | delay(2); 441 | click("删除"); //删除该评论 442 | delay(2); 443 | click("确认"); //确认删除 444 | //toastLog("评论删除成功!"); 445 | delay(2); 446 | // collectIcon.click(); //取消收藏 447 | // delay(1); 448 | toastLog("分享,评论结束"); 449 | logs.push("评论删除确认"); 450 | //toastLog("收藏成功!"); 451 | //分享 452 | } 453 | 454 | /** 455 | * @description: 文章学习函数 (阅读文章+文章学习时长)---6+6=12分 456 | * @param: null 457 | * @return: null 458 | */ 459 | function articleStudy(x) { 460 | var aCatlog = "推荐"; 461 | while (!desc("工作").exists()); //等待加载出主页 462 | var listView = className("ListView"); //获取文章ListView控件用于翻页 463 | if (x == 0) { 464 | desc("工作").click(); //点击主页正下方的"学习"按钮 465 | delay(2); 466 | click(aCatlog); 467 | } 468 | delay(2); 469 | var zt_flag = false; //判断进入专题界面标志 470 | var fail = 0; //点击失败次数 471 | var x = aCount; 472 | 473 | console.log("需要学习" + x + "篇"); 474 | for (var i = 0, t = 0; i < x;) { 475 | if (aCount <= 0) aTime = 6; 476 | try { 477 | if (text("播报").findOnce(t).parent().parent().parent().child(0).parent().parent().click() == true) { 478 | delay(3); 479 | // // delay(10); //等待加载出文章页面,后面判断是否进入了视频文章播放要用到 480 | //获取当前正在阅读的文章标题 481 | let n = 0; 482 | while (!textContains("欢迎发表你的观点").exists()) { 483 | //如果没有找到评论框则认为没有进入文章界面,一直等待 484 | delay(1); 485 | console.warn("正在等待加载文章界面..."); 486 | if (n > 2) { 487 | //等待超过3秒则认为进入了专题界面,退出进下一篇文章 488 | console.warn("没找到评论框!该界面非文章界面!"); 489 | zt_flag = true; 490 | break; 491 | } 492 | n++; 493 | } 494 | if (text("展开").exists()) { 495 | //如果存在“展开”则认为进入了文章栏中的视频界面需退出 496 | console.warn("进入了视频界面,退出并进入下一篇文章!"); 497 | t++; 498 | back(); 499 | listView.scrollForward(); 500 | delay(1.5); 501 | if (rTime != 0) { 502 | while (!desc("工作").exists()); 503 | console.info("因为广播被打断,重新收听广播..."); 504 | delay(0.5); 505 | listenToRadio(); //听电台广播 506 | while (!desc("工作").exists()); 507 | desc("工作").click(); 508 | } 509 | delay(2); 510 | continue; 511 | } 512 | if (zt_flag == true) { 513 | //进入专题页标志 514 | console.warn("进入了专题界面,即将退出并进下一篇文章!"); 515 | t++; 516 | back(); 517 | delay(2); 518 | zt_flag = false; 519 | continue; 520 | } 521 | var currentNewsTitle = ""; 522 | if (id("xxqg-article-header").exists()) { 523 | currentNewsTitle = id("xxqg-article-header").findOne().child(0).text(); // 最终解决办法 524 | } else if (textContains("来源").exists()) { 525 | currentNewsTitle = textContains("来源").findOne().parent().children()[0].text(); 526 | } else if (textContains("作者").exists()) { 527 | currentNewsTitle = textContains("作者").findOne().parent().children()[0].text(); 528 | } else if (descContains("来源").exists()) { 529 | currentNewsTitle = descContains("来源").findOne().parent().children()[0].desc(); 530 | } else if (descContains("作者").exists()) { 531 | currentNewsTitle = descContains("作者").findOne().parent().children()[0].desc(); 532 | } else { 533 | console.log("无法定位文章标题,即将退出并阅读下一篇"); 534 | t++; 535 | back(); 536 | delay(2); 537 | continue; 538 | } 539 | if (currentNewsTitle == "") { 540 | console.log("标题为空,即将退出并阅读下一篇"); 541 | t++; 542 | back(); 543 | delay(2); 544 | continue; 545 | } 546 | var flag = getLearnedArticle(currentNewsTitle); 547 | if (flag) { 548 | //已经存在,表明阅读过了 549 | console.info("该文章已经阅读过,即将退出并阅读下一篇"); 550 | t++; 551 | back(); 552 | delay(2); 553 | continue; 554 | } else { 555 | //没阅读过,添加到数据库 556 | insertLearnedArticle(currentNewsTitle); 557 | } 558 | console.log("正在学习第" + (i + 1) + "篇文章,标题:", currentNewsTitle); 559 | fail = 0; //失败次数清0 560 | //开始循环进行文章学习 561 | article_timing(i, aTime); 562 | aCount--; 563 | delay(2); 564 | if (sCount != 0) { 565 | console.info("第" + (3 - sCount) + "次评论开始"); 566 | sCount--; 567 | collectCommentShare(); //评论和分享 568 | } 569 | back(); //返回主界面 570 | console.info("返回主界面"); 571 | delay(0.3); 572 | var 加载主页次数 = 1; 573 | while (!desc("工作").exists()) { 574 | //等待加载出主页 575 | console.info("等待加载主页"); 576 | delay(2); 577 | back(); 578 | 加载主页次数++; 579 | if (加载主页次数 > 5) { 580 | back_table(); 581 | } 582 | } 583 | delay(2); 584 | //console.info('i++,t++') 585 | listView.scrollForward(); 586 | delay(1); 587 | i++; 588 | t++; //t为实际点击的文章控件在当前布局中的标号,和i不同,勿改动! 589 | } else { 590 | t++; 591 | } 592 | } catch (e) { 593 | listView.scrollForward(); 594 | //console.info('异常') 595 | t = 0; 596 | delay(1.5); 597 | } 598 | } 599 | logs.push("文章阅读完成"); 600 | aTime = hamibot.env.time1; 601 | } 602 | 603 | /** 604 | * @description:百灵小视频学习函数 605 | * @param: null 606 | * @return: null 607 | */ 608 | function videoStudy_news(tmp) { 609 | h = device.height; //屏幕高 610 | w = device.width; //屏幕宽 611 | x = (w / 3) * 2; 612 | h1 = (h / 6) * 5; 613 | h2 = h / 6; 614 | //delay(1) 615 | if (tmp == 1) { 616 | desc("工作").click(); 617 | delay(2); 618 | click("百灵"); 619 | delay(1); 620 | } 621 | var contentsText = ["推荐", "党史", "竖", "炫", "窗", "藏", "靓", "秀"]; 622 | var contentsNum = random(0, contentsText.length - 1); //随机数 623 | console.info("视频看的" + contentsText[contentsNum]); 624 | click(contentsText[contentsNum]); 625 | delay(2); 626 | //获取listView视频列表控件用于翻页 627 | // var v = className("android.widget.FrameLayout").clickable(true).depth(24).findOne().bounds(); 628 | // press(v.centerX(), v.centerY(), 150); 629 | log("点击:" + "android.widget.FrameLayout"); 630 | className("android.widget.FrameLayout").clickable(true).depth(24).findOne().click(); 631 | 632 | if (text("继续播放").exists()) click("继续播放"); 633 | if (text("刷新重试").exists()) click("刷新重试"); 634 | // if (text('').exists()) 635 | // text('').findOnce(0).parent().parent().parent().parent().child(0).click(); 636 | delay(1); 637 | //var listView = className("ListView"); 638 | var completed_watch_count = 1; 639 | while (completed_watch_count <= vCount) { 640 | log("视听学习:" + completed_watch_count + "总次数" + vCount); 641 | sleep(random_time(delay_time / 2)); 642 | 643 | className("android.widget.LinearLayout").clickable(true).depth(16).waitFor(); 644 | // 当前视频的时间长度 645 | try { 646 | var video_name = className("android.widget.TextView").clickable(true).depth(15).findOne().text(); 647 | console.info("视频标题" + video_name); 648 | var video_flag = getLearnedArticle(video_name); 649 | if (video_flag) { 650 | //已经存在,表明阅读过了 651 | console.info("该视频已经看过,即将滑动看下一个"); 652 | swipe(x, h1, x, h2, 500); // 下滑动 653 | continue; 654 | } else { 655 | //没阅读过,添加到数据库 656 | insertLearnedArticle(video_name); 657 | } 658 | var current_video_time = className("android.widget.TextView").clickable(false).depth(16).findOne().text().match(/\/.*/).toString().slice(1); 659 | // 如果视频超过一分钟就跳过 660 | if (Number(current_video_time.slice(0, 3)) >= 2) { 661 | swipe(x, h1, x, h2, 500); // 下滑动 662 | delay(1); 663 | continue; 664 | } else { 665 | delay(1); 666 | console.error("百灵视频小于2分钟 可以看"); 667 | } 668 | sleep(Number(current_video_time.slice(4)) * 1000 + 500); 669 | } catch (error) { 670 | // 如果被"即将播放"将读取不到视频的时间长度,此时就sleep 3秒 671 | sleep(3000); 672 | } 673 | completed_watch_count++; 674 | } 675 | 676 | delay(2); 677 | back(); 678 | logs.push("修改版百灵视频学习完成"); 679 | } 680 | 681 | /** 682 | * @description: 听“电台”新闻广播函数 (视听学习+视听学习时长)---6+6=12分 683 | * @param: null 684 | * @return: null 685 | */ 686 | function listenToRadio() { 687 | click("电台"); 688 | delay(1); 689 | click("听广播"); 690 | delay(2); 691 | while (!(textContains("正在收听").exists() || textContains("最近收听").exists() || textContains("推荐收听").exists())) { 692 | log("等待加载"); 693 | delay(1); 694 | } 695 | if (click("最近收听") == 0) { 696 | if (click("推荐收听") == 0) { 697 | click("正在收听"); 698 | } 699 | } 700 | delay(2); 701 | if (id("btn_back").findOne().click() == 0) { 702 | delay(2); 703 | back(); //返回电台界面 704 | } 705 | delay(2); 706 | } 707 | /** 708 | * 处理访问异常 709 | */ 710 | function swipeThread(stime, ptime) { 711 | try { 712 | textContains("访问异常").waitFor(); 713 | 714 | var bound = idContains("nc_1_n1t").findOne().bounds(); 715 | var slider_bound = text("向右滑动验证").findOne().bounds(); 716 | var x_start = bound.centerX(); 717 | var dx = x_start - slider_bound.left; 718 | var x_end = slider_bound.right - dx; 719 | var x_mid = (x_end - x_start) * random(5, 8) / 10 + x_start; 720 | var back_x = (x_end - x_start) * random(2, 3) / 10; 721 | var y_start = random(bound.top, bound.bottom); 722 | var y_end = random(bound.top, bound.bottom); 723 | x_start = random(x_start - 7, x_start); 724 | x_end = random(x_end, x_end + 10); 725 | gesture(random(stime, ptime), [x_start, y_start], [x_mid, y_end], [x_mid - back_x, y_start], [x_end, y_end]); 726 | sleep(500); 727 | } catch (error) { 728 | log(error + "使用另一版本滑动验证"); 729 | logs.push(error + "使用另一版本滑动验证"); 730 | var b = textContains("向右滑动验证").findOne(2000).parent().child(2).bounds(); 731 | delay(1); 732 | console.error("当前需要验证,正在过验证"); 733 | gestures([0, random(400, 1000), [b.centerX(), b.centerY()], [device.width, b.centerY()]]); 734 | delay(2); 735 | 736 | } 737 | if (text("刷新").exists()) { 738 | text("刷新").findOne(1000).parent().click(); 739 | } 740 | 741 | } 742 | function handling_access_exceptions() { 743 | toast(""); 744 | if (text("访问异常").exists()) { 745 | logs.push("-----幸运的碰上了异常验证--------------"); 746 | swipeThread(600, 1500); 747 | push_weixin_message("异常验证出现咯", Date.now().toString()); 748 | while (text("访问异常").exists() || text("刷新").exists()) { 749 | if (text("刷新").exists()) { 750 | var thread_refreshexceptions = threads.start(function () { 751 | try { 752 | click("刷新"); 753 | text("刷新").click(); 754 | delay(5); 755 | logs.push("-----异常验证第二次刷新咯--------------"); 756 | push_weixin_message("异常验证第二次刷新咯", Date.now().toString()); 757 | // className("android.view.View").text("刷新").findOne().click(); 758 | sleep(random_time(delay_time * 3)); 759 | swipeThread(700, 2000); 760 | } catch (error) { 761 | logs.push("-----异常验证刷新异常catch--------------:" + error); 762 | push_weixin_message("异常验证刷新点击异常:" + error); 763 | console.error("异常验证刷新点击异常:" + error); 764 | swipeThread(800, 2500); 765 | } 766 | }); 767 | if (thread_refreshexceptions) clearInterval(thread_refreshexceptions); 768 | } 769 | 770 | // 需要开启新线程获取控件 771 | 772 | // 执行脚本只需通过一次验证即可,通过后将定时器关闭 773 | // threads.shutDownAll(); 774 | } 775 | } 776 | if (textContains("网络开小差").exists()) { 777 | click("确定"); 778 | } 779 | } 780 | 781 | /** 782 | * @description: 启动app 783 | * @param: null 784 | * @return: null 785 | */ 786 | function start_app() { 787 | if (consoleshow == true) { 788 | console.setPosition(0, device.height / 2); //部分华为手机console有bug请注释本行 789 | console.show(); //部分华为手机console有bug请注释本行 790 | } 791 | console.log("正在启动app..."); 792 | if (!(launchApp("学习强国") || launch("cn.xuexi.android"))) { 793 | //启动学习强国app 794 | console.error("找不到学习强国App!,请自己尝试打开"); 795 | // return; 796 | } 797 | delay(5); 798 | while (!desc("工作").exists()) { 799 | console.log("正在等待加载出主页,如果一直加载此信息,请检测是否在主界面,或者无障碍服务可能出现BUG,请停止运行hamibot重新给无障碍服务"); 800 | if (textContains("取消").exists() && textContains("立即升级").exists()) { 801 | //toast('1'); 802 | text("取消").click(); 803 | } 804 | delay(1); 805 | back_table(); 806 | logs.push("未找到主页,重新启动APP"); 807 | } 808 | if (textContains("取消").exists() && textContains("立即升级").exists()) { 809 | text("取消").findOne().click(); 810 | } 811 | delay(4); 812 | } 813 | 814 | /** 815 | * @description: 本地频道 816 | * @param: null 817 | * @return: null 818 | */ 819 | function localChannel() { 820 | delay(1); 821 | while (!desc("工作").exists()); //等待加载出主页 822 | desc("工作").click(); 823 | console.log("点击本地频道"); 824 | if (text("四川").exists()) { 825 | text("要闻").findOne().parent().parent().child(3).click(); 826 | delay(2); 827 | className("android.support.v7.widget.RecyclerView").findOne().child(0).click(); 828 | delay(2); 829 | back(); 830 | } else { 831 | className("android.widget.LinearLayout").clickable(true).depth(26).waitFor(); 832 | sleep(1000); 833 | log("点击:" + "android.widget.LinearLayout"); 834 | className("android.widget.LinearLayout").clickable(true).depth(26).drawingOrder(1).findOne().click(); 835 | sleep(1000); 836 | back(); 837 | } 838 | } 839 | 840 | /** 841 | * @description: 获取积分 842 | * @param: null 843 | * @return: null 844 | */ 845 | function getScores(l) { 846 | while (!desc("工作").exists()); //等待加载出主页 847 | console.log("正在获取积分..."); 848 | delay(2); 849 | if (id("comm_head_xuexi_score").exists()) { 850 | id("comm_head_xuexi_score").findOnce().click(); 851 | } else if (text("积分").exists()) { 852 | text("积分").findOnce().parent().child(1).click(); 853 | } 854 | var texts = ""; 855 | 856 | delay(5); 857 | for (var i = 4; i < 17; i++) { 858 | 859 | // 由于模拟器有model无法读取因此用try catch 860 | try { 861 | var model = className("android.view.View").depth(24).findOnce(i); 862 | if (i == 4) { 863 | myScores['我要选读文章'] = parseInt(model.child(3).child(0).text()); 864 | texts += '我要选读文章' + myScores['我要选读文章'] 865 | } else if (i == 5) { 866 | myScores['视听学习'] = parseInt(model.child(3).child(0).text()); 867 | texts += '视听学习' + myScores['视听学习'] 868 | 869 | } else if (i == 16) { 870 | myScores['每周答题'] = parseInt(model.child(3).child(0).text()); 871 | texts += '每周答题' + myScores['每周答题'] 872 | } else if (i == 7) { 873 | myScores['每日答题'] = parseInt(model.child(3).child(0).text()); 874 | texts += '每日答题' + myScores['每日答题'] 875 | } else if (i == 8) { 876 | myScores['专项答题'] = parseInt(model.child(3).child(0).text()); 877 | texts += '专项答题' + myScores['专项答题'] 878 | } else if (i == 9) { 879 | myScores['挑战答题'] = parseInt(model.child(3).child(0).text()); 880 | texts += '挑战答题' + myScores['挑战答题'] 881 | } else if (i == 10) { 882 | myScores['四人赛'] = parseInt(model.child(3).child(0).text()); 883 | texts += '四人赛' + myScores['四人赛'] 884 | } else if (i == 11) { 885 | myScores['双人对战'] = parseInt(model.child(3).child(0).text()); 886 | texts += '双人对战' + myScores['双人对战'] 887 | } 888 | else if (i == 13) { 889 | myScores['发表观点'] = parseInt(model.child(3).child(0).text()); 890 | } else if (i == 14) { 891 | myScores['本地频道'] = parseInt(model.child(3).child(0).text()); 892 | texts += '本地频道' + myScores['本地频道'] 893 | } else { 894 | log("i=" + i + "分数" + parseInt(model.child(3).child(0).text())) 895 | } 896 | 897 | } catch (error) { 898 | 899 | } 900 | console.log("积分循环 ..." + texts); 901 | } 902 | if (l == 3) { 903 | var score = textContains("今日已累积").findOne().text(); 904 | score += "%0A四人赛:" + myScores["四人赛"] + "分"; 905 | score += "%0A双人赛:" + myScores["双人对战"] + "分"; 906 | score += "%0A成长总积分:" + textContains("成长总积分").findOne().parent().child(3).text() + "分%0A"; 907 | log(score); 908 | back(); 909 | return score; 910 | } 911 | //console.log(myScores); 912 | 913 | aCount = Math.ceil((12 - myScores["我要选读文章"]) / 2); //文章个数 914 | if (l == 1) { 915 | console.info("检查阅读文章是否满分!"); 916 | aCount = 12 - myScores["我要选读文章"]; 917 | if (aCount != 0) { 918 | console.log("还需要阅读:" + aCount.toString() + "篇!"); 919 | } else { 920 | console.info("已满分!"); 921 | } 922 | delay(1); 923 | back(); 924 | delay(1); 925 | return; 926 | } 927 | if (l == 2) { 928 | console.info("检查视频是否满分!"); 929 | vCount = 6 - myScores["视听学习"]; 930 | if (vCount != 0) { 931 | console.log("还需要观看:" + vCount.toString() + "篇!"); 932 | } else { 933 | console.info("已满分!"); 934 | } 935 | delay(1); 936 | back(); 937 | delay(1); 938 | return; 939 | } 940 | if (aCount != 0) { 941 | aCount = aCount; 942 | } 943 | vCount = 6 - myScores["视听学习"]; 944 | rTime = (6 - myScores["视听学习时长"]) * 60; 945 | //asub = 2 - myScores["订阅"]; 946 | sCount = 2; 947 | cCount = 1 - myScores["发表观点"]; 948 | if (myScores["每日答题"] < 5) dayCount = 1; 949 | else dayCount = 0; 950 | if (myScores["挑战答题"] < 5) tzCount = 1; 951 | else tzCount = 0; 952 | if (myScores["四人赛"] == 0) zsyCount = 1; 953 | else zsyCount = 0; 954 | if (myScores["双人对战"] == 0) doubleCount = 1; 955 | else doubleCount = 0; 956 | if (myScores["每周答题"] == 0) meizhou = 1; 957 | else meizhou = 0; 958 | if (myScores["专项答题"] == 0) zhuanxiang = 1; 959 | else zhuanxiang = 0; 960 | 961 | console.log("评论:" + cCount.toString() + "个"); 962 | //console.log("分享:" + sCount.toString() + "个"); 963 | //console.log("订阅:" + asub.toString() + "个"); 964 | console.log("剩余文章:" + aCount.toString() + "篇"); 965 | // console.log('剩余每篇文章学习时长:' + aTime.toString() + '秒') 966 | console.log("剩余视频:" + vCount.toString() + "个"); 967 | console.log("剩视听学习时长:" + rTime.toString() + "秒"); 968 | console.log("每日答题:\t" + dayCount.toString()); 969 | console.log("挑战答题:\t" + tzCount.toString()); 970 | console.log("四人赛:\t" + zsyCount.toString()); 971 | console.log("双人对战:\t" + doubleCount.toString()); 972 | if (meizhou_txt == "开启") console.log("每周答题:\t" + meizhou.toString()); 973 | if (zhuanxiang_txt == "开启") console.log("专项答题:\t" + zhuanxiang.toString()); 974 | 975 | delay(1); 976 | back(); 977 | delay(1); 978 | } 979 | 980 | /** 981 | @description: 停止广播 982 | @param: null 983 | @return: null 984 | */ 985 | function stopRadio() { 986 | console.log("停止收听广播!"); 987 | click("电台"); 988 | delay(1); 989 | click("听广播"); 990 | delay(2); 991 | while (!(textContains("正在收听").exists() || textContains("最近收听").exists() || textContains("推荐收听").exists())) { 992 | log("等待加载"); 993 | delay(2); 994 | } 995 | if (click("正在收听") == 0) { 996 | click("最近收听"); 997 | } 998 | delay(3); 999 | id("v_play").findOnce(0).click(); 1000 | delay(2); 1001 | if (id("btn_back").findOne().click() == 0) { 1002 | delay(2); 1003 | back(); 1004 | } 1005 | delay(2); 1006 | try { 1007 | if (id("v_playing").exists()) id("v_playing").findOnce(0).click(); 1008 | } catch (e) { } 1009 | } 1010 | 1011 | function questionShow() { 1012 | while (!desc("工作").exists()) { 1013 | console.log("等待加载出主页"); 1014 | delay(1); 1015 | if (text("排行榜").exists()) { 1016 | return; 1017 | } else { 1018 | delay(1); 1019 | 等待主页(1); 1020 | } 1021 | } 1022 | console.log("当前在主界面"); 1023 | if (text("我的").exists()) { 1024 | text("我的").click(); 1025 | console.log("点击我的"); 1026 | } 1027 | delay(1); 1028 | while (!desc("我的信息").exists()) { 1029 | console.log("等待 我的 界面"); 1030 | delay(1); 1031 | } 1032 | console.log("点击我要答题"); 1033 | text("我要答题").findOne().parent().click(); 1034 | delay(1); 1035 | } 1036 | 1037 | function meizhouAnswer() { 1038 | h = device.height; //屏幕高 1039 | w = device.width; //屏幕宽 1040 | x = (w / 3) * 2; 1041 | h1 = (h / 6) * 5; 1042 | h2 = h / 6; 1043 | while (!text("排行榜").exists()) { 1044 | console.info("等待我要答题界面"); 1045 | delay(1); 1046 | questionShow(); // 进入我要答题 1047 | } 1048 | var textOrder = text("排行榜").findOnce().parent(); 1049 | while (text("排行榜").exists()) { 1050 | console.info("点击每周答题"); 1051 | textOrder.child(3).click(); 1052 | delay(1); 1053 | handling_access_exceptions(); 1054 | } 1055 | delay(3); 1056 | var t = 0; 1057 | while (true) { 1058 | if (text("未作答").exists()) { 1059 | text("未作答").findOne().parent().click(); 1060 | dailyAnswer(); 1061 | break; 1062 | } else { 1063 | if (每周答题下滑 == "a") { 1064 | console.info("没有可答题的题目,返回"); 1065 | back(); 1066 | delay(1); 1067 | if (text("已作答").exists() || t > 5) { 1068 | // 防止出现网络卡顿 1069 | back(); 1070 | delay(1); 1071 | } 1072 | break; 1073 | } else { 1074 | if (textContains("您已经看到了我的底线").exists()) { 1075 | console.log("已经没有可答题的题目了,返回"); 1076 | back(); 1077 | delay(1); 1078 | break; 1079 | } 1080 | swipe(x, h1, x, h2, 100); // 下滑动 1081 | try { 1082 | textContains("月").findOnce(0).parent().parent().parent().scrollForward(); 1083 | } catch (e) { } 1084 | delay(1); 1085 | if (t % 10 == 0) console.log("向下滑动中!!!"); 1086 | t++; 1087 | } 1088 | } 1089 | } 1090 | logs.push("每周答题完成"); 1091 | } 1092 | 1093 | function zhuanxiangAnswer() { 1094 | h = device.height; //屏幕高 1095 | w = device.width; //屏幕宽 1096 | x = (w / 3) * 2; 1097 | h1 = (h / 6) * 5; 1098 | h2 = h / 6; 1099 | while (!text("排行榜").exists()) { 1100 | console.info("等待我要答题界面"); 1101 | 1102 | questionShow(); // 进入我要答题 1103 | delay(1); 1104 | } 1105 | var textOrder = text("排行榜").findOnce().parent(); 1106 | while (text("排行榜").exists()) { 1107 | console.info("点击专项答题"); 1108 | textOrder.child(4).click(); 1109 | delay(1); 1110 | handling_access_exceptions(); 1111 | } 1112 | delay(3); 1113 | var t = 0; 1114 | 1115 | while (true) { 1116 | if (text("继续答题").exists() || text("开始答题").exists()) { 1117 | if (text("继续答题").exists()) text("继续答题").findOne().click(); 1118 | else if (text("开始答题").exists()) text("开始答题").findOne().click(); 1119 | delay(1); 1120 | dailyAnswer(); 1121 | break; 1122 | } else { 1123 | if (专项答题下滑 == "a") { 1124 | console.log("没有可答题的题目,返回"); 1125 | back(); 1126 | delay(1); 1127 | if (text("已满分").exists() || text("继续答题").exists() || text("开始答题").exists() || t > 5) { 1128 | // 防止出现网络卡顿 1129 | back(); 1130 | delay(1); 1131 | } 1132 | break; 1133 | } else { 1134 | if (textContains("您已经看到了我的底线").exists() || t > 5) { 1135 | console.log("已经没有可答题的题目了,返回"); 1136 | back(); 1137 | delay(1); 1138 | break; 1139 | } 1140 | swipe(x, h1, x, h2, 300); // 下滑动 1141 | try { 1142 | textContains("专项").findOnce(0).parent().scrollForward(); 1143 | } catch (e) { } 1144 | 1145 | //delay(1); 1146 | if (t % 10 == 0) console.log("向下滑动中!!!"); 1147 | t++; 1148 | } 1149 | } 1150 | } 1151 | } 1152 | 1153 | /** 1154 | * @description: 获取填空题题目数组 1155 | * @param: null 1156 | * @return: questionArray 1157 | */ 1158 | function getFitbQuestion() { 1159 | var questionCollections = className("EditText").findOnce().parent().parent(); 1160 | var questionArray = []; 1161 | var findBlank = false; 1162 | var blankCount = 0; 1163 | var blankNumStr = ""; 1164 | var i = 0; 1165 | questionCollections.children().forEach((item) => { 1166 | if (item.className() != "android.widget.EditText") { 1167 | if (item.text() != "") { 1168 | //题目段 1169 | if (findBlank) { 1170 | blankNumStr = "|" + blankCount.toString(); 1171 | questionArray.push(blankNumStr); 1172 | findBlank = false; 1173 | } 1174 | questionArray.push(item.text()); 1175 | } else { 1176 | findBlank = true; 1177 | blankCount = className("EditText").findOnce(i).parent().childCount() - 1; 1178 | i++; 1179 | } 1180 | } 1181 | }); 1182 | return questionArray; 1183 | } 1184 | 1185 | /** 1186 | * @description: 获取选择题题目数组 1187 | * @param: null 1188 | * @return: questionArray 1189 | */ 1190 | function getChoiceQuestion() { 1191 | var questionCollections = className("ListView").findOnce().parent().child(1); 1192 | var questionArray = []; 1193 | questionArray.push(questionCollections.text()); 1194 | return questionArray; 1195 | } 1196 | 1197 | /** 1198 | * @description: 获取提示字符串 1199 | * @param: null 1200 | * @return: tipsStr 1201 | */ 1202 | function getTipsStr() { 1203 | var tipsStr = ""; 1204 | while (tipsStr == "") { 1205 | if (text("查看提示").exists()) { 1206 | var seeTips = text("查看提示").findOnce(); 1207 | seeTips.click(); 1208 | delay(1); 1209 | click(device.width * 0.5, device.height * 0.41); 1210 | delay(1); 1211 | click(device.width * 0.5, device.height * 0.35); 1212 | } else { 1213 | console.error("未找到查看提示"); 1214 | } 1215 | if (text("提示").exists()) { 1216 | var tipsLine = text("提示").findOnce().parent(); 1217 | //获取提示内容 1218 | var tipsView = tipsLine.parent().child(1).child(0); 1219 | tipsStr = tipsView.text(); 1220 | //关闭提示 1221 | tipsLine.child(1).click(); 1222 | break; 1223 | } 1224 | delay(1); 1225 | } 1226 | return tipsStr; 1227 | } 1228 | 1229 | /** 1230 | * @description: 从提示中获取填空题答案 1231 | * @param: timu, tipsStr 1232 | * @return: ansTips 1233 | */ 1234 | function getAnswerFromTips(timu, tipsStr) { 1235 | var ansTips = ""; 1236 | for (var i = 1; i < timu.length - 1; i++) { 1237 | if (timu[i].charAt(0) == "|") { 1238 | if (timu[i].charAt(0) == "|") { 1239 | var blankLen = timu[i].substring(1); 1240 | // var indexKey = tipsStr.indexOf(timu[i + 1].substr(0,Math.min(8,timu[i + 1].length))); 1241 | // if(timu[i + 1]=='。') indexKey = tipsStr.length - 1; 1242 | // var ansFind = tipsStr.substr(indexKey - blankLen, blankLen); 1243 | // ansTips += ansFind; 1244 | var s = timu[i - 1].substr(Math.max(0, timu[i - 1].length - 12), 12); 1245 | var indexKey = tipsStr.indexOf(s) + s.length; 1246 | var ansFind = tipsStr.substr(indexKey, blankLen); 1247 | ansTips += ansFind; 1248 | } 1249 | } 1250 | } 1251 | return ansTips; 1252 | } 1253 | 1254 | /** 1255 | * @description: 根据提示点击选择题选项 1256 | * @param: tipsStr 1257 | * @return: clickStr 1258 | */ 1259 | function clickByTips(tipsStr) { 1260 | var clickStr = ""; 1261 | var isFind = false; 1262 | if (className("ListView").exists()) { 1263 | var listArray = className("ListView").findOne().children(); 1264 | listArray.forEach((item) => { 1265 | var ansStr = item.child(0).child(2).text(); 1266 | if (tipsStr.indexOf(ansStr) >= 0) { 1267 | item.child(0).click(); 1268 | clickStr += item.child(0).child(1).text().charAt(0); 1269 | isFind = true; 1270 | } 1271 | }); 1272 | if (!isFind) { 1273 | //没有找到 点击第一个 1274 | listArray[0].child(0).click(); 1275 | clickStr += listArray[0].child(0).child(1).text().charAt(0); 1276 | } 1277 | } 1278 | return clickStr; 1279 | } 1280 | 1281 | /** 1282 | * @description: 根据答案点击选择题选项 1283 | * @param: answer 1284 | * @return: null 1285 | */ 1286 | function clickByAnswer(answer) { 1287 | var click_true = false; 1288 | if (className("ListView").exists()) { 1289 | var listArray = className("ListView").findOnce().children(); 1290 | listArray.forEach((item) => { 1291 | var listIndexStr = item.child(0).child(1).text().charAt(0); 1292 | //单选答案为非ABCD 1293 | var listDescStr = item.child(0).child(2).text(); 1294 | if (answer.indexOf(listIndexStr) >= 0 || answer == listDescStr) { 1295 | // sleep(点击延迟时间); 1296 | item.child(0).click(); 1297 | click_true = true; 1298 | } 1299 | }); 1300 | } 1301 | if (!click_true) { 1302 | console.error("没有找到选项,选A跳过"); 1303 | className("ListView").findOnce().child(0).child(0).click(); 1304 | } 1305 | } 1306 | 1307 | /** 1308 | * @description: 检查答案是否正确 1309 | * @param: question, ansTiku, answer 1310 | * @return: null 1311 | */ 1312 | function checkAndUpdate(question, ansTiku, answer) { 1313 | sleep(500); 1314 | if (textContains("答案解析").exists()) { 1315 | //答错了 1316 | swipe(device.width / 2, device.height - 200, 100, 100, 500); 1317 | if (text("确定").exists()) { 1318 | text("确定").click(); 1319 | } else if (textContains("下一题").exists()) { 1320 | textContains("下一题").click(); 1321 | } else if (className("Button").exists()) { 1322 | className("Button").findOnce().click(); 1323 | } else { 1324 | click(device.width * 0.85, device.height * 0.06); 1325 | } 1326 | } 1327 | } 1328 | 1329 | function daily_Answer(question, table_name) { 1330 | try { 1331 | var db = SQLiteDatabase.openOrCreateDatabase(path, null); 1332 | sql = "SELECT answer FROM " + table_name + " WHERE question LIKE '" + question + "%'"; 1333 | var cursor = db.rawQuery(sql, null); 1334 | if (cursor.moveToFirst()) { 1335 | var answer = cursor.getString(0); 1336 | cursor.close(); 1337 | return answer; 1338 | } else { 1339 | cursor.close(); 1340 | return ""; 1341 | } 1342 | } catch (e) { 1343 | return ""; 1344 | } 1345 | } 1346 | /** 1347 | * @description: 每日答题循环 1348 | * @param: null 1349 | * @return: null 1350 | */ 1351 | function dailyQuestionLoop() { 1352 | var vdlNum = 1; 1353 | while (true) { 1354 | if (textStartsWith("填空题").exists()) { 1355 | var questionArray = getFitbQuestion(); 1356 | break; 1357 | } else if (textStartsWith("多选题").exists() || textStartsWith("单选题").exists()) { 1358 | var questionArray = getChoiceQuestion(); 1359 | break; 1360 | } 1361 | log("等待题目出现"); 1362 | vdlNum++; 1363 | if (vdlNum > 8) { 1364 | back_table(); 1365 | 1366 | break; 1367 | } 1368 | delay(1); 1369 | } 1370 | 1371 | var blankArray = []; 1372 | var question = ""; 1373 | questionArray.forEach((item) => { 1374 | if (item != null && item.charAt(0) == "|") { 1375 | //是空格数 1376 | blankArray.push(item.substring(1)); 1377 | } else { 1378 | //是题目段 1379 | question += item; 1380 | } 1381 | }); 1382 | question = question.replace(/\s/g, ""); 1383 | console.log("题目:" + question); 1384 | logs.push("题目:" + question); 1385 | var ansTiku = daily_Answer(question, "tiku"); 1386 | 1387 | if (ansTiku.length == 0) { 1388 | //tiku表中没有则到tikuNet表中搜索答案 1389 | ansTiku = daily_Answer(question, "tikuNet"); 1390 | } 1391 | var answer = ansTiku.replace(/(^\s*)|(\s*$)/g, ""); 1392 | // getAnswer(question); 1393 | 1394 | if (textStartsWith("填空题").exists()) { 1395 | if (answer == "") { 1396 | if (stronger == "a") { 1397 | var tipsStr = getTipsStr(); 1398 | answer = getAnswerFromTips(questionArray, tipsStr); 1399 | console.info("提示中的答案:" + answer); 1400 | logs.push("提示中的答案:" + answer); 1401 | } else if (stronger == "b") { 1402 | var seeTips = text("查看提示").findOnce(); 1403 | seeTips.click(); 1404 | delay(1); 1405 | var img = captureScreen(); 1406 | try { 1407 | var t = text("提示").findOne(3000); 1408 | t = t.parent().parent().child(1).child(0).bounds(); 1409 | img = images.clip(img, t.left, t.top, t.right - t.left, t.bottom - t.top); 1410 | } catch (e) { } 1411 | answer = huawei_ocr_api(images.inRange(img, "#FFFF0000", "#FFFF0000"), ttt); 1412 | console.info("华为OCR识别的答案:" + answer); 1413 | logs.push("华为OCR识别的答案:" + answer); 1414 | back(); 1415 | } else if (stronger == "c") { 1416 | var seeTips = text("查看提示").findOnce(); 1417 | seeTips.click(); 1418 | delay(1); 1419 | var img = captureScreen(); 1420 | try { 1421 | var t = text("提示").findOne(3000); 1422 | t = t.parent().parent().child(1).child(0).bounds(); 1423 | img = images.clip(img, t.left, t.top, t.right - t.left, t.bottom - t.top); 1424 | } catch (e) { } 1425 | answer = baidu_ocr_api(images.inRange(img, "#FFFF0000", "#FFFF0000"), ttt); 1426 | console.info("百度OCR识别的答案:" + answer); 1427 | logs.push("百度OCR识别的答案:" + answer); 1428 | back(); 1429 | } 1430 | 1431 | if (answer == "") answer = "没有找到提示"; 1432 | setText(0, answer.substr(0, blankArray[0])); 1433 | if (blankArray.length > 1) { 1434 | for (var i = 1; i < blankArray.length; i++) { 1435 | setText(i, answer.substr(blankArray[i - 1], blankArray[i])); 1436 | } 1437 | } 1438 | } else { 1439 | console.info("答案:" + answer); 1440 | logs.push("答案:" + answer); 1441 | setText(0, answer.substr(0, blankArray[0])); 1442 | if (blankArray.length > 1) { 1443 | for (var i = 1; i < blankArray.length; i++) { 1444 | setText(i, answer.substr(blankArray[i - 1], blankArray[i])); 1445 | } 1446 | } 1447 | } 1448 | } else if (textStartsWith("多选题").exists() || textStartsWith("单选题").exists()) { 1449 | if (answer == "") { 1450 | if (stronger == "a") { 1451 | var tipsStr = getTipsStr(); 1452 | answer = clickByTips(tipsStr); 1453 | console.info("提示中的答案:" + answer); 1454 | logs.push("提示中的答案:" + answer); 1455 | } else if (stronger == "b") { 1456 | var seeTips = text("查看提示").findOnce(); 1457 | seeTips.click(); 1458 | delay(1); 1459 | var img = captureScreen(); 1460 | try { 1461 | var t = text("提示").findOne(3000); 1462 | t = t.parent().parent().child(1).child(0).bounds(); 1463 | img = images.clip(img, t.left, t.top, t.right - t.left, t.bottom - t.top); 1464 | } catch (e) { } 1465 | answer = huawei_ocr_api(images.inRange(img, "#FFFF0000", "#FFFF0000"), ttt); 1466 | console.info("华为OCR识别的答案:" + answer); 1467 | logs.push("华为OCR识别的答案:" + answer); 1468 | back(); 1469 | delay(1); 1470 | click_answer(answer); 1471 | } else if (stronger == "c") { 1472 | var seeTips = text("查看提示").findOnce(); 1473 | seeTips.click(); 1474 | delay(1); 1475 | var img = captureScreen(); 1476 | try { 1477 | var t = text("提示").findOne(3000); 1478 | t = t.parent().parent().child(1).child(0).bounds(); 1479 | img = images.clip(img, t.left, t.top, t.right - t.left, t.bottom - t.top); 1480 | } catch (e) { } 1481 | answer = baidu_ocr_api(images.inRange(img, "#FFFF0000", "#FFFF0000"), ttt); 1482 | console.info("百度OCR识别的答案:" + answer); 1483 | logs.push("百度OCR识别的答案:" + answer); 1484 | back(); 1485 | delay(1); 1486 | click_answer(answer); 1487 | } 1488 | } else { 1489 | console.info("答案:" + answer); 1490 | logs.push("答案:" + answer); 1491 | clickByAnswer(answer); 1492 | } 1493 | } 1494 | 1495 | delay(3); 1496 | 1497 | if (text("确定").exists()) { 1498 | delay(3); 1499 | text("确定").click(); 1500 | handling_access_exceptions(); 1501 | delay(5); 1502 | } else if (text("下一题").exists()) { 1503 | click("下一题"); 1504 | delay(0.5); 1505 | } else if (text("完成").exists()) { 1506 | text("完成").click(); 1507 | delay(2); 1508 | handling_access_exceptions(); 1509 | delay(3); 1510 | } else { 1511 | console.warn("未找到右上角确定按钮控件,根据坐标点击(可能是模拟器)"); 1512 | click(device.width * 0.85, device.height * 0.06); //右上角确定按钮,根据自己手机实际修改 1513 | } 1514 | 1515 | checkAndUpdate(question, ansTiku, answer); 1516 | console.log("------------"); 1517 | logs.push("------------"); 1518 | delay(2); 1519 | } 1520 | function click_answer(answer) { 1521 | var f = true; 1522 | if (className("ListView").exists()) { 1523 | if (textStartsWith("多选题").exists()) { 1524 | var listArray = className("ListView").findOnce().children(); 1525 | listArray.forEach((item) => { 1526 | var listIndexStr = item.child(0).child(2).text(); 1527 | var num = 0; 1528 | for (var i = 0; i < listIndexStr.length; i++) { 1529 | if (answer.indexOf(listIndexStr[i]) != -1) { 1530 | num++; 1531 | } 1532 | } 1533 | if (num / listIndexStr.length > 1 / 2) { 1534 | item.child(0).click(); 1535 | f = false; 1536 | } 1537 | }); 1538 | } else { 1539 | var listArray = className("ListView").findOnce().children(); 1540 | listArray.forEach((item) => { 1541 | var listIndexStr = item.child(0).child(2).text(); 1542 | if (answer.indexOf(listIndexStr) != -1) { 1543 | item.child(0).click(); 1544 | f = false; 1545 | return; 1546 | } 1547 | }); 1548 | if (f) { 1549 | var a = 0; 1550 | var num = 0; 1551 | var ch = 0; 1552 | listArray.forEach((item) => { 1553 | var maxx = 0; 1554 | var listIndexStr = item.child(0).child(2).text(); 1555 | for (var i = 0; i < listIndexStr.length; i++) { 1556 | if (answer.indexOf(listIndexStr[i]) != -1) { 1557 | maxx++; 1558 | } 1559 | } 1560 | if (maxx > num) { 1561 | num = maxx; 1562 | ch = a; 1563 | } 1564 | a++; 1565 | }); 1566 | className("ListView").findOnce().child(ch).child(0).click(); 1567 | f = false; 1568 | } 1569 | } 1570 | if (f) { 1571 | if (textContains("A").exists()) { 1572 | textContains("A").click(); 1573 | } 1574 | console.error("没有找到,选A跳过"); 1575 | logs.push("没有找到,选A跳过"); 1576 | } 1577 | } 1578 | } 1579 | /** 1580 | * @description: 每日答题 1581 | * @param: null 1582 | * @return: null 1583 | */ 1584 | function dailyAnswer() { 1585 | console.info("开始答题"); 1586 | console.setPosition(0, 0); 1587 | delay(1); 1588 | let dlNum = 0; //每日答题轮数 1589 | var flag = true; 1590 | if (textStartsWith("填空题").exists() || textStartsWith("多选题").exists() || textStartsWith("单选题").exists()) { 1591 | flag = false; 1592 | } 1593 | if (flag) { 1594 | var s = 1; 1595 | while (!text("排行榜").exists()) { 1596 | console.log("等待我要答题界面"); 1597 | delay(1); 1598 | if (textStartsWith("填空题").exists() || textStartsWith("多选题").exists() || textStartsWith("单选题").exists()) { 1599 | s = 0; 1600 | break; 1601 | } 1602 | } 1603 | if (s == 1) { 1604 | var textOrder = text("排行榜").findOnce().parent(); 1605 | while (!className(textOrder.child(2).className()).exists()) { 1606 | toastLog("等待界面出现"); 1607 | } 1608 | textOrder.child(2).click(); 1609 | } 1610 | } 1611 | // var widget = text("太阳每天都是新的").findOne(); 1612 | // click(widget.bounds().centerX(), widget.bounds().centerY()); 1613 | delay(0.5); 1614 | while (true) { 1615 | delay(2); 1616 | // if (!(textStartsWith("填空题").exists() || textStartsWith("多选题").exists() || textStartsWith("单选题").exists())) { 1617 | // // toastLog("没有找到题目!请检查是否进入答题界面!"); 1618 | // console.error("没有找到题目!请检查是否进入答题界面!"); 1619 | // console.log("停止"); 1620 | // 故意报错重启脚本; 1621 | // break; 1622 | // } //冗余 1623 | dailyQuestionLoop(); 1624 | if (text("再练一次").exists()) { 1625 | console.log("每周答题结束!"); 1626 | text("返回").click(); 1627 | delay(2); 1628 | back(); 1629 | break; 1630 | } else if (text("查看解析").exists()) { 1631 | console.log("专项答题结束!"); 1632 | back(); 1633 | delay(0.5); 1634 | back(); 1635 | delay(0.5); 1636 | break; 1637 | } else if (text("再来一组").exists()) { 1638 | delay(2); 1639 | dlNum++; 1640 | if (!text("领取奖励已达今日上限").exists()) { 1641 | text("再来一组").click(); 1642 | console.warn("第" + (dlNum + 1).toString() + "轮答题:"); 1643 | delay(1); 1644 | } else { 1645 | console.log("每日答题结束!"); 1646 | text("返回").click(); 1647 | delay(2); 1648 | break; 1649 | } 1650 | } 1651 | } 1652 | console.setPosition(0, device.height / 2); 1653 | } 1654 | 1655 | ////////////////////////////挑战答题模块功能//////////////////////// 1656 | /** 1657 | * @description: 从数据库中搜索答案 1658 | * @param: question 问题 1659 | * @return: answer 答案 1660 | */ 1661 | function getAnswer(question) { 1662 | var question1 = question.split("来源:")[0]; //去除来源 1663 | question1 = question1.replace(/ /g, ""); //再删除多余空格 1664 | question1 = question1.replace(/  /g, ""); 1665 | try { 1666 | var option = ""; 1667 | var similars = 0; 1668 | var pos = -1; 1669 | for (var i = 0; i < question_list.length; i++) { 1670 | var s = similarity(question_list[i][0], "", question1, 0); 1671 | if (s > similars) { 1672 | similars = s; 1673 | pos = i; 1674 | } 1675 | } 1676 | option = question_list[pos][1]; 1677 | var ans = question_list[pos][2].split(" ")[option[0].charCodeAt(0) - 65]; 1678 | if (!ans) return "A"; 1679 | return ans; 1680 | // return option; 1681 | } catch (e) { 1682 | return "A"; 1683 | } 1684 | } 1685 | 1686 | function indexFromChar(str) { 1687 | return str.charCodeAt(0) - "A".charCodeAt(0); 1688 | } 1689 | 1690 | /** 1691 | * @description: 每次答题循环 1692 | * @param: conNum 连续答对的次数 1693 | * @return: null 1694 | */ 1695 | function challengeQuestionLoop(conNum) { 1696 | let ClickAnswer; //定义已点击答案 1697 | if (conNum >= qCount) { 1698 | //答题次数足够退出,每轮qCount=5+随机1-3次 1699 | let listArray = className("ListView").findOnce().children(); //题目选项列表 1700 | let i = random(0, listArray.length - 1); 1701 | console.log("本轮答题数足够,随机点击答案"); 1702 | var question = className("ListView").findOnce().parent().child(0).text(); 1703 | question = question.replace(/\s/g, ""); 1704 | var options = []; //选项列表 1705 | if (className("ListView").exists()) { 1706 | className("ListView") 1707 | .findOne() 1708 | .children() 1709 | .forEach((child) => { 1710 | var answer_q = child.child(0).child(1).text(); 1711 | options.push(answer_q); 1712 | }); 1713 | } else { 1714 | console.error("答案获取失败!"); 1715 | return; 1716 | } //20201217添加 极低概率下,答题数足够,下一题随机点击,碰到字形题 1717 | if (question == "选择正确的读音" || question == "选择词语的正确词形" || question == "下列词形正确的是") { 1718 | // 选择第一个 1719 | console.log((conNum + 1).toString() + ".直接选第一个!!!"); 1720 | className("android.widget.RadioButton").depth(28).findOne().click(); 1721 | return; 1722 | } 1723 | console.log((conNum + 1).toString() + ".随机点击题目:" + question); 1724 | delay(random(0.5, 1)); //随机延时0.5-1秒 1725 | listArray[i].child(0).click(); //随意点击一个答案 1726 | ClickAnswer = listArray[i].child(0).child(1).text(); //记录已点击答案 1727 | console.log("随机点击:" + ClickAnswer); 1728 | //如果随机点击答案正确,则更新到本地题库tiku表 1729 | delay(0.5); //等待0.5秒,是否出现X 1730 | console.log("---------------------------"); 1731 | return; 1732 | } 1733 | if (className("ListView").exists()) { 1734 | var question = className("ListView").findOnce().parent().child(0).text(); 1735 | } else { 1736 | console.error("提取题目失败!"); 1737 | let listArray = className("ListView").findOnce().children(); //题目选项列表 1738 | let i = random(0, listArray.length - 1); 1739 | console.log("随机点击"); 1740 | delay(random(0.5, 1)); //随机延时0.5-1秒 1741 | listArray[i].child(0).click(); //随意点击一个答案 1742 | return; 1743 | } 1744 | var chutiIndex = question.lastIndexOf("出题单位"); 1745 | if (chutiIndex != -1) { 1746 | question = question.substring(0, chutiIndex - 2); 1747 | } 1748 | //question = question.replace(/\s/g, ""); 1749 | var options = []; //选项列表 1750 | if (className("ListView").exists()) { 1751 | className("ListView") 1752 | .findOne() 1753 | .children() 1754 | .forEach((child) => { 1755 | var answer_q = child.child(0).child(1).text(); 1756 | options.push(answer_q); 1757 | }); 1758 | } else { 1759 | console.error("答案获取失败!"); 1760 | return; 1761 | } 1762 | var reg = /.*择词语的正确.*/g; 1763 | var rea = /.*择正确的读音.*/g; 1764 | var reb = /.*不属于二十四史的是.*/g; 1765 | if (reg.test(question) || rea.test(question) || reb.test(question)) { 1766 | // 选择第一个 1767 | console.log((conNum + 1).toString() + ".直接选第一个!!!"); 1768 | className("android.widget.RadioButton").depth(28).findOne().click(); 1769 | return; 1770 | } 1771 | console.log((conNum + 1).toString() + ".题目:" + question); 1772 | logs.push((conNum + 1).toString() + ".题目:" + question); 1773 | var answer = getAnswer(question); 1774 | console.info("答案:" + answer); 1775 | logs.push("答案:" + answer); 1776 | if (/^[a-zA-Z]{1}$/.test(answer)) { 1777 | //如果为ABCD形式 1778 | var indexAnsTiku = indexFromChar(answer.toUpperCase()); 1779 | answer = options[indexAnsTiku]; 1780 | toastLog(answer); 1781 | } 1782 | let hasClicked = false; 1783 | let listArray = className("ListView").findOnce().children(); //题目选项列表 1784 | if (answer == "") { 1785 | //如果没找到答案 1786 | let i = random(0, listArray.length - 1); 1787 | console.error("没有找到答案,随机点击"); 1788 | delay(random(0.5, 1)); //随机延时0.5-1秒 1789 | listArray[i].child(0).click(); //随意点击一个答案 1790 | ClickAnswer = listArray[i].child(0).child(1).text(); //记录已点击答案 1791 | hasClicked = true; 1792 | console.log("随机点击:" + ClickAnswer); //如果随机点击答案正确,则更新到本地题库tiku表 1793 | delay(0.5); //等待0.5秒,是否出现X 1794 | console.log("---------------------------"); 1795 | } //如果找到了答案 1796 | else { 1797 | listArray.forEach((item) => { 1798 | var listDescStr = item.child(0).child(1).text(); 1799 | if (listDescStr == answer) { 1800 | delay(random(0.5, 1)); //随机延时0.5-1秒 1801 | try { 1802 | item.child(0).click(); //点击答案 1803 | hasClicked = true; 1804 | } catch (e) { } 1805 | delay(0.5); //等待0.5秒,是否出现X 1806 | if (!text("v5IOXn6lQWYTJeqX2eHuNcrPesmSud2JdogYyGnRNxujMT8RS7y43zxY4coWepspQkvw" + "RDTJtCTsZ5JW+8sGvTRDzFnDeO+BcOEpP0Rte6f+HwcGxeN2dglWfgH8P0C7HkCMJOAAAAAElFTkSuQmCC").exists() || text("再来一局").exists()) { 1807 | //遇到❌号,则答错了,不再通过结束本局字样判断 1808 | // console.log("题库答案正确……"); 1809 | } 1810 | if (text("v5IOXn6lQWYTJeqX2eHuNcrPesmSud2JdogYyGnRNxujMT8RS7y43zxY4coWepspQkvw" + "RDTJtCTsZ5JW+8sGvTRDzFnDeO+BcOEpP0Rte6f+HwcGxeN2dglWfgH8P0C7HkCMJOAAAAAElFTkSuQmCC").exists() || text("再来一局").exists()) { 1811 | //遇到❌号,则答错了,不再通过结束本局字样判断 1812 | console.error("答案错误!!!"); 1813 | /*checkAndUpdate(question, answer, ClickAnswer);*/ 1814 | } 1815 | console.log("---------------------------"); 1816 | } 1817 | }); 1818 | } 1819 | if (!hasClicked) { 1820 | //如果没有点击成功 1821 | //因导致不能成功点击问题较多,故该部分不更新题库,大部分问题是题库题目适配为填空题或多选题或错误选项 1822 | console.error("未能成功点击,随机点击"); 1823 | let i = random(0, listArray.length - 1); 1824 | delay(random(0.5, 1)); //随机延时0.5-1秒 1825 | listArray[i].child(0).click(); //随意点击一个答案 1826 | console.log("随机点击:" + ClickAnswer); 1827 | delay(0.5); //等待0.5秒,是否出现X 1828 | if (!text("v5IOXn6lQWYTJeqX2eHuNcrPesmSud2JdogYyGnRNxujMT8RS7y43zxY4coWepspQkvw" + "RDTJtCTsZ5JW+8sGvTRDzFnDeO+BcOEpP0Rte6f+HwcGxeN2dglWfgH8P0C7HkCMJOAAAAAElFTkSuQmCC").exists() || text("再来一局").exists()) { 1829 | //遇到❌号,则答错了,不再通过结束本局字样判断 1830 | console.log("随机点击正确……"); 1831 | } 1832 | if (text("v5IOXn6lQWYTJeqX2eHuNcrPesmSud2JdogYyGnRNxujMT8RS7y43zxY4coWepspQkvw" + "RDTJtCTsZ5JW+8sGvTRDzFnDeO+BcOEpP0Rte6f+HwcGxeN2dglWfgH8P0C7HkCMJOAAAAAElFTkSuQmCC").exists() || text("再来一局").exists()) { 1833 | //遇到❌号,则答错了,不再通过结束本局字样判断 1834 | console.error("随机点击错误!!!"); 1835 | /*checkAndUpdate(question, answer, ClickAnswer);*/ 1836 | } 1837 | console.log("---------------------------"); 1838 | logs.push("---------------------------"); 1839 | } 1840 | } 1841 | 1842 | /** 1843 | * @description: 挑战答题 1844 | * @param: null 1845 | * @return: null 1846 | */ 1847 | function challengeQuestion() { 1848 | // init(); 1849 | if (!className("RadioButton").exists()) { 1850 | while (!text("排行榜").exists()) { 1851 | console.info("等待我要答题界面"); 1852 | 1853 | questionShow(); // 进入我要答题 1854 | delay(3); 1855 | } 1856 | var textOrder = text("排行榜").findOnce().parent(); 1857 | while (text("排行榜").exists()) { 1858 | console.info("点击挑战答题"); 1859 | textOrder.child(10).click(); 1860 | delay(2); 1861 | } 1862 | } 1863 | let conNum = 0; //连续答对的次数 1864 | let lNum = 0; //轮数 1865 | var 复活 = true; 1866 | while (true) { 1867 | delay(2); 1868 | if (!className("RadioButton").exists()) { 1869 | if (复活 == false) { 1870 | console.log("出现错误,等5秒开始下一轮..."); 1871 | delay(3); //等待3秒才能开始下一轮 1872 | text("再来一局").click(); 1873 | delay(4); 1874 | conNum = 0; 1875 | 复活 = true; 1876 | } else { 1877 | // toastLog("没有找到题目!请检查是否进入答题界面!"); 1878 | console.error("没有找到题目!请检查是否进入答题界面!"); 1879 | console.log("停止"); 1880 | break; 1881 | } 1882 | } 1883 | challengeQuestionLoop(conNum); 1884 | delay(1); 1885 | if (text("wrong@3x.9ccb997c").exists() || text("2kNFBadJuqbAAAAAElFTkSuQmCC").exists() || textStartsWith("v5IOXn6lQWYTJeqX2eHuNcrPesmSud2Jdog").exists()) { 1886 | //遇到❌号,则答错了,不再通过结束本局字样判断 1887 | if (conNum >= qCount) { 1888 | lNum++; 1889 | qCount = randomNum(3, 6); 1890 | } 1891 | if (lNum >= lCount) { 1892 | console.log("挑战答题结束!返回我要答题界面!"); 1893 | if (复活) { 1894 | textContains("每局仅可复活一次").waitFor(); 1895 | delay(1); 1896 | back(); 1897 | } 1898 | textContains("再来一局").waitFor(); 1899 | delay(1); 1900 | back(); 1901 | delay(2); 1902 | break; 1903 | } else { 1904 | if (复活 && conNum < qCount) { 1905 | 复活 = false; 1906 | // textContains("分享就能复活").findOne().click(); 1907 | if (text("立即复活").exists()) { 1908 | click("立即复活"); 1909 | } 1910 | delay(0.5); 1911 | back(); 1912 | delay(1); 1913 | } else { 1914 | if (复活) { 1915 | textContains("每局仅可复活一次").waitFor(); 1916 | delay(1); 1917 | back(); 1918 | } 1919 | console.log("等5秒开始下一轮..."); 1920 | delay(3); //等待3秒才能开始下一轮 1921 | text("再来一局").click(); 1922 | delay(4); 1923 | conNum = 0; 1924 | 复活 = true; 1925 | } 1926 | } 1927 | } //答对了 1928 | else { 1929 | conNum++; 1930 | } 1931 | } 1932 | delay(1); 1933 | if (desc("我的信息").exists()) { 1934 | text("我要答题").findOne().parent().click(); 1935 | delay(2); 1936 | } 1937 | } 1938 | //挑战答题 1939 | ////////////////////////////////////////////////////////////////// 1940 | 1941 | // var xn = 0; 1942 | var 音字 = false; 1943 | function do_contest_answer(depth_option, question1) { 1944 | // console.time('搜题'); 1945 | question1 = question1.replace(/'/g, ""); 1946 | question1 = question1.replace(/"/g, ""); 1947 | old_question = JSON.parse(JSON.stringify(question1)); 1948 | question1 = question1.split("来源:")[0]; //去除来源 1949 | question1 = question1.split("来源:")[0]; //去除来源 1950 | question = question1.split("A.")[0]; 1951 | // question = question.split('(.*)')[0]; 1952 | reg = /下列..正确的是.*/g; 1953 | reb = /选择词语的正确.*/g; 1954 | rea = /选择正确的读音.*/g; 1955 | rec = /下列不属于二十四史的是.*/g; 1956 | rex = /劳动行政部门自收到集体合同文本之日起.*/g; 1957 | var option = "N"; 1958 | var answer = "N"; 1959 | var similars = 0; 1960 | var pos = -1; 1961 | var answers_list = ""; 1962 | if (rex.test(question) || rec.test(question) || reg.test(question) || rea.test(question) || reb.test(question)) { 1963 | 音字 = true; 1964 | first = false; 1965 | try { 1966 | old_question = old_question.replace(/4\./g, "A."); 1967 | var old_answers = old_question.split("A.")[1].split("C")[0]; 1968 | for (var k = 0; k < 2; k++) { 1969 | answers = old_answers.split("B.")[k]; 1970 | // answers = answers.match(/[\u4e00-\u9fa5]/g).join(""); //剩余汉字 1971 | answers = answers.replace(/哆峻/g, "啰唆"); 1972 | answers = answers.replace(/罗峻/g, "罗唆"); 1973 | answers = answers.replace(/暖陀/g, "蹉跎"); 1974 | answers = answers.replace(/暖跑/g, "蹉跎"); 1975 | answers = answers.replace(/跨踏/g, "踌躇"); 1976 | answers = answers.replace(/chuo/g, "chuò"); 1977 | answers = answers.replace(/cuotuo/g, "cuōtuó"); 1978 | answers = answers.replace(/duo/g, "duō"); 1979 | answers = answers.replace(/蹈/g, "踌躇"); 1980 | answers = answers.replace(/调帐/g, "惆怅"); 1981 | answers = answers.replace(/任悔/g, "忏悔"); 1982 | answers = answers.replace(/仟悔/g, "忏悔"); 1983 | answers = answers.replace(/忧心../g, "忧心忡忡"); 1984 | answers = answers.replace(/美轮美./g, "美轮美奂"); 1985 | answers = answers.replace(/决穿/g, "诀窍"); 1986 | answers = answers.replace(/浙临/g, "濒临"); 1987 | answers = answers.replace(/不落../g, "不落窠臼"); 1988 | answers = answers.replace(/.目结舌/g, "膛目结舌"); 1989 | answers = answers.replace(/泉水../g, "泉水淙淙"); 1990 | answers = answers.replace(/饮.止渴/g, "饮鸠止渴"); 1991 | answers = answers.replace(/趋之若./g, "趋之若鹜"); 1992 | answers = answers.replace(/一.而就/g, "一蹴而就"); 1993 | answers = answers.replace(/刚.自用/g, "刚愎自用"); 1994 | answers = answers.replace(/风驰电./g, "风驰电掣"); 1995 | answers = answers.replace(/不.而走/g, "不胫而走"); 1996 | answers = answers.replace(/.声叹气/g, "唉声叹气"); 1997 | answers = answers.replace(/.而走险/g, "铤而走险"); 1998 | answers = answers.replace(/底护/g, "庇护"); 1999 | answers = answers.replace(/蓓./g, "蓓蕾"); 2000 | answers = answers.replace(/抵悟/g, "抵牾"); 2001 | answers = answers.replace(/情懒/g, "慵懒"); 2002 | answers = answers.replace(/差道/g, "差遣"); 2003 | answers = answers.replace(/泽炼/g, "淬炼"); 2004 | answers = answers.replace(/博奔/g, "博弈"); 2005 | answers = answers.replace(/相形见./g, "相形见绌"); 2006 | answers = answers.replace(/对.公堂/g, "对簿公堂"); 2007 | answers = answers.replace(/疼李/g, "痉挛"); 2008 | answers = answers.replace(/痉李/g, "痉挛"); 2009 | answers = answers.replace(/..人口/g, "脍炙人口"); 2010 | answers = answers.replace(/.意安为/g, "恣意妄为"); 2011 | answers = answers.replace(/凌合/g, "凑合"); 2012 | answers = answers.replace(/神抵/g, "神祗"); 2013 | answers = answers.replace(/叫苦不./g, "叫苦不迭"); 2014 | answers = answers.replace(/草.人命/g, "草菅人命"); 2015 | answers = answers.replace(/鞭./g, "鞭笞"); 2016 | answers = answers.replace(/发物/g, "发轫"); 2017 | answers = answers.replace(/..充数/g, "滥芋充数"); 2018 | answers = answers.replace(/水蒸气/g, "水蒸气 水蒸汽"); 2019 | answers = answers.replace(/..置疑/g, "毋庸置疑"); 2020 | answers = answers.replace(/..不振/g, "萎靡不振"); 2021 | answers = answers.replace(/瓜熟.落/g, "瓜熟蒂落"); 2022 | answers = answers.replace(/虎视../g, "虎视眈眈"); 2023 | answers = answers.replace(/进裂/g, "崩裂"); 2024 | // try{ 2025 | // answers = r.replace(answers); 2026 | // }catch(e){} 2027 | answers_list += answers; 2028 | } 2029 | } catch (e) { 2030 | while (!className("android.widget.RadioButton").depth(32).exists()) { 2031 | if (text("继续挑战").exists()) return -1; 2032 | } 2033 | return -2; 2034 | } 2035 | } 2036 | if (音字) question = answers_list; 2037 | for (var i = 0; i < question_list.length; i++) { 2038 | // 搜题 2039 | // question answer q flag 2040 | var s = similarity(question_list[i][0], question_list[i][2], question, 音字); 2041 | if (s > similars) { 2042 | similars = s; 2043 | pos = i; 2044 | } 2045 | if (s == 999) break; 2046 | } 2047 | if (pos != -1) { 2048 | option = question_list[pos][1]; 2049 | answer = question_list[pos][2]; 2050 | } else { 2051 | console.error("没搜到答案,题目异常:\n“" + old_question + "”"); 2052 | logs.push("手动添加题库----- --------- "); 2053 | logs.push(" 没搜到答案,题目异常:“" + question + "-----选项为: " + old_question + "”"); 2054 | logs.push("----- --------- 手动添加题库"); 2055 | console.info("此题pos = " + pos + ",s=" + s); 2056 | } 2057 | if (option[0] >= "A" && option[0] <= "D") { 2058 | var ans = answer.split(" ")[option[0].charCodeAt(0) - 65]; 2059 | logs.push("答案:" + ans); 2060 | console.info("答案:" + ans); 2061 | var last = option; 2062 | if (乱序 == "a" && !first && !音字) { 2063 | while (true) { 2064 | if (className("android.widget.RadioButton").depth(32).exists()) { 2065 | break; 2066 | } 2067 | if (text("继续挑战").exists()) return -1; 2068 | } 2069 | try { 2070 | var img = captureScreen(); 2071 | var b = className("ListView").depth(29).findOne(3000).bounds(); 2072 | img = images.clip(img, b.left, b.top, b.right - b.left, b.bottom - b.top); 2073 | if (choose == "a") { 2074 | // 文字识别 2075 | old_question = huawei_ocr_api(img, token); 2076 | } else if (choose == "b") { 2077 | old_question = ocr_api(img); 2078 | } else if (choose == "c") { 2079 | old_question = hamibot_ocr_api(img); 2080 | } else old_question = baidu_ocr_api(img, token); 2081 | // images.save(img, "/sdcard/选项"+xn+".png", "png", 50); 2082 | // xn++; 2083 | log(old_question); 2084 | logs.push("选项:" + old_question); 2085 | logs.push("=================================== "); 2086 | } catch (e) { 2087 | console.error(e); 2088 | console.info("选项获取失败"); 2089 | } 2090 | } 2091 | if (乱序 == "a") { 2092 | try { 2093 | option = click_by_answer(ans, old_question); 2094 | if (!option) option = last; 2095 | } catch (e) { 2096 | console.error("此题选项异常!!!"); 2097 | } 2098 | // logs.push("点击选项:" + option + " 原选项:" + last); 2099 | console.info("点击选项:" + option + " 原选项:" + last); 2100 | } else { 2101 | logs.push("点击选项:" + option); 2102 | console.info("点击选项:" + option); 2103 | } 2104 | if (text("继续挑战").exists()) return -1; 2105 | while (!className("ListView").exists()) { 2106 | // className('android.widget.RadioButton').findOnce(answer[0].charCodeAt(0) - 65).click(); 2107 | if (text("继续挑战").exists()) return -1; 2108 | } 2109 | if (text("继续挑战").exists()) return -1; 2110 | if (!first && !音字) { 2111 | sleep(延迟时间); 2112 | } 2113 | first = false; 2114 | try { 2115 | while ( 2116 | !className("ListView") 2117 | .findOne(5000) 2118 | .child(option[0].charCodeAt(0) - 65) 2119 | .child(0) 2120 | .click() 2121 | ) { 2122 | if (text("继续挑战").exists()) return -1; 2123 | } 2124 | } catch (e) { 2125 | while (!className("android.widget.RadioButton").depth(depth_option).exists()) { 2126 | if (text("继续挑战").exists()) return -1; 2127 | } 2128 | try { 2129 | className("android.widget.RadioButton") 2130 | .depth(depth_option) 2131 | .findOnce(option[0].charCodeAt(0) - 65) 2132 | .click(); 2133 | } catch (e) { 2134 | console.error("没找到选项,选A跳过"); 2135 | className("android.widget.RadioButton").depth(depth_option).findOnce(0).click(); 2136 | } 2137 | } 2138 | return 0; 2139 | } 2140 | try { 2141 | className("android.widget.RadioButton").depth(depth_option).findOnce(0).click(); 2142 | } catch (e) { 2143 | while (!className("ListView").findOne(5000).child(0).child(0).click()) { 2144 | if (text("继续挑战").exists()) return -1; 2145 | } 2146 | } 2147 | return 0; 2148 | } 2149 | var o = ["A.", "B.", "C.", "D.", "AAAA"]; 2150 | var o1 = ["A", "B", "C", "D", "AAAA"]; 2151 | function click_by_answer(ans, question) { 2152 | ans = ans.match(/[\u4e00-\u9fa5a-zA-Z0-9āáǎàōóǒòēéěèīíǐìūúǔùǖǘǚǜü]/g).join(""); 2153 | question = question.replace(/ /g, ""); 2154 | question = question.replace(/4\./g, "A."); 2155 | question = question.replace(/:/g, ":"); 2156 | try { 2157 | question = r.replace(question); 2158 | } catch (e) { } 2159 | // question = question.split('A.'); 2160 | question = question.replace(/c\./g, "C."); 2161 | question = question.replace(/,/g, "."); 2162 | 2163 | var sum = 0; 2164 | for (var i = 0; i < question.length; i++) { 2165 | if (question[i] >= "A" && question[i] <= "D") { 2166 | sum++; 2167 | } 2168 | } 2169 | var op = []; 2170 | if (sum <= 4) { 2171 | question = question.replace(/\./g, ""); 2172 | for (var i = 0; i < 4; i++) { 2173 | try { 2174 | var tmp = question 2175 | .split(o1[i])[1] 2176 | .split(o1[i + 1])[0] 2177 | .split("推荐:")[0] 2178 | .split("出题")[0]; 2179 | op.push(tmp.match(/[\u4e00-\u9fa5a-zA-Z0-9āáǎàōóǒòēéěèīíǐìūúǔùǖǘǚǜü]/g).join("")); 2180 | } catch (e) { 2181 | op.push("&"); 2182 | } 2183 | } 2184 | } else { 2185 | for (var i = 0; i < 4; i++) { 2186 | try { 2187 | var tmp = question 2188 | .split(o[i])[1] 2189 | .split(o[i + 1])[0] 2190 | .split("推荐:")[0] 2191 | .split("出题")[0]; 2192 | op.push(tmp.match(/[\u4e00-\u9fa5a-zA-Z0-9āáǎàōóǒòēéěèīíǐìūúǔùǖǘǚǜü]/g).join("")); 2193 | } catch (e) { 2194 | op.push("&"); 2195 | } 2196 | } 2197 | } 2198 | // op[op.length-1] = op[op.length-1].split('推荐')[0].split('出题')[0]; 2199 | var s = 0; 2200 | var pos = -1; 2201 | for (var i = 0; i < op.length; i++) { 2202 | if (op[i] == "&") continue; 2203 | if (op[i] == ans) { 2204 | return o1[i]; 2205 | } 2206 | var tmp = similarity_answer(op[i], ans); 2207 | if (tmp > s) { 2208 | s = tmp; 2209 | pos = i; 2210 | } 2211 | } 2212 | // sleep(点击延迟时间); 2213 | return o1[pos]; 2214 | } 2215 | function similarity_answer(op, ans) { 2216 | var num = 0; 2217 | for (var i = 0; i < ans.length; i++) { 2218 | if (op.indexOf(ans[i]) != -1) num++; 2219 | } 2220 | for (var i = 0; i < ans.length - 1; i++) { 2221 | if (op.indexOf(ans[i] + ans[i + 1]) != -1) num++; 2222 | } 2223 | for (var i = 0; i < ans.length - 2; i++) { 2224 | if (op.indexOf(ans[i] + ans[i + 1] + ans[i + 2]) != -1) num++; 2225 | } 2226 | return num / (2 * op.length + 2 * ans.length); 2227 | } 2228 | function similarity(question, answer, q, flag) { 2229 | var num = 0; 2230 | if (flag) { 2231 | if (q.indexOf("十五日") != -1 && question.indexOf("劳动行政部门自收到集体合同文本之日起") != -1 && answer.split("\t")[0].indexOf("十日") != -1) { 2232 | return 999; 2233 | } 2234 | if (q.indexOf("十五日") == -1 && q.indexOf("十日") != -1 && question.indexOf("劳动行政部门自收到集体合同文本之日起") != -1 && answer.split("\t")[0].indexOf("五日") != -1) { 2235 | return 999; 2236 | } 2237 | if (question.indexOf("正确") == -1 && question.indexOf("下列不属于二十四史的") == -1) { 2238 | return 0; 2239 | } 2240 | for (var i = 0; i < q.length; i++) { 2241 | if (answer.indexOf(q[i]) != -1) { 2242 | num++; 2243 | } 2244 | } 2245 | return num / (answer.length + q.length); 2246 | } else { 2247 | var tmp = 1; 2248 | if (q.length > 20) tmp = 2; 2249 | if (q.length > 40) tmp = 3; 2250 | if (q.length > 50) tmp = 4; 2251 | for (var i = 0; i < q.length - tmp; i += tmp) { 2252 | if (question.indexOf(q[i] + q[i + 1]) != -1) { 2253 | num++; 2254 | } 2255 | } 2256 | return num / (question.length + q.length); 2257 | } 2258 | } 2259 | /** 2260 | * 点击对应的去答题或去看看 2261 | * @param {image} img 传入图片 2262 | */ 2263 | function baidu_ocr_api(img, tokens) { 2264 | console.log("百度ocr文字识别中"); 2265 | var answer = ""; 2266 | var res = http.post("https://aip.baidubce.com/rest/2.0/ocr/v1/general", { 2267 | headers: { 2268 | "Content-Type": "application/x-www-form-urlencoded", 2269 | }, 2270 | access_token: tokens, 2271 | image: images.toBase64(img), 2272 | }); 2273 | 2274 | var res = res.body.json(); 2275 | try { 2276 | var words_list = res.words_result; 2277 | } catch (error) { 2278 | console.error("百度ocr文字识别请求错误,可能有以下情况\n1.百度ocr欠费\n2.其他的错误"); 2279 | exit(); 2280 | } 2281 | for (var i in words_list) { 2282 | answer += words_list[i].words; 2283 | } 2284 | return answer.replace(/\s*/g, ""); 2285 | } 2286 | /** 2287 | * 点击对应的去答题或去看看 2288 | * @param {image} img 传入图片,,本地。 2289 | */ 2290 | function ocr_api(img) { 2291 | console.log("第三方本地ocr文字识别中"); 2292 | try { 2293 | var answer = ""; 2294 | var results = ocr.detect(img.getBitmap(), 1); 2295 | for (var i = 0; i < results.size(); i++) { 2296 | var s = results.get(i).text; 2297 | answer += s; 2298 | } 2299 | // console.info(answer.replace(/\s*/g, "")); 2300 | return answer.replace(/\s*/g, ""); 2301 | } catch (e) { 2302 | console.error(e); 2303 | console.info("第三方OCR插件安装错了位数,分为64位和32位\n卸载之前的插件,换一个位数安装"); 2304 | exit(); 2305 | } 2306 | } 2307 | 2308 | function hamibot_ocr_api() { 2309 | console.log("hamibot文字识别中"); 2310 | let list = ocr.recognize(arguments[0])["results"]; // 识别文字,并得到results 2311 | let eps = 30; // 坐标误差 2312 | if (arguments.length >= 2) eps = arguments[1]; 2313 | for ( 2314 | var i = 0; 2315 | i < list.length; 2316 | i++ // 选择排序对上下排序,复杂度O(N²)但一般list的长度较短只需几十次运算 2317 | ) { 2318 | for (var j = i + 1; j < list.length; j++) { 2319 | if (list[i]["bounds"]["bottom"] > list[j]["bounds"]["bottom"]) { 2320 | var tmp = list[i]; 2321 | list[i] = list[j]; 2322 | list[j] = tmp; 2323 | } 2324 | } 2325 | } 2326 | 2327 | for ( 2328 | var i = 0; 2329 | i < list.length; 2330 | i++ // 在上下排序完成后,进行左右排序 2331 | ) { 2332 | for (var j = i + 1; j < list.length; j++) { 2333 | // 由于上下坐标并不绝对,采用误差eps 2334 | if (Math.abs(list[i]["bounds"]["bottom"] - list[j]["bounds"]["bottom"]) < eps && list[i]["bounds"]["left"] > list[j]["bounds"]["left"]) { 2335 | var tmp = list[i]; 2336 | list[i] = list[j]; 2337 | list[j] = tmp; 2338 | } 2339 | } 2340 | } 2341 | let res = ""; 2342 | for (var i = 0; i < list.length; i++) { 2343 | res += list[i]["text"]; 2344 | } 2345 | list = null; 2346 | return res; 2347 | } 2348 | function huawei_ocr_api(img, tokens) { 2349 | console.log("华为ocr文字识别中"); 2350 | var answer = ""; 2351 | var res = http.postJson( 2352 | "https://" + endpoint + "/v2/" + projectId + "/ocr/web-image", 2353 | { 2354 | image: images.toBase64(img), 2355 | }, 2356 | { 2357 | headers: { 2358 | "User-Agent": "API Explorer", 2359 | "X-Auth-Token": tokens, 2360 | "Content-Type": "application/json;charset=UTF-8", 2361 | }, 2362 | } 2363 | ); 2364 | var res = res.body.json(); 2365 | try { 2366 | var words_list = res.result.words_block_list; 2367 | } catch (error) { 2368 | // console.info('华为ocr文字识别请求错误,可能有两种情况\n1.华为ocr欠费\n2.配置时除账号密码外,其他的出错') 2369 | toastLog(error); 2370 | exit(); 2371 | } 2372 | for (var i in words_list) { 2373 | answer += words_list[i].words; 2374 | } 2375 | // console.info(answer.replace(/\s*/g, "")); 2376 | return answer.replace(/\s*/g, ""); 2377 | } 2378 | 2379 | var download = null; 2380 | /** 2381 | * @description: 加载题库和加载替换 2382 | * @param: null 2383 | * @return: null 2384 | */ 2385 | 2386 | function init() { 2387 | if (init_true == true) { 2388 | threads.start(function () { 2389 | if (!files.exists(path_replace)) { 2390 | try { 2391 | var x = http.get("https://gh-proxy.com//https://raw.githubusercontent.com/Twelve-blog/picture/master/replace.js").body.string(); 2392 | files.write("/sdcard/replace.js", x); 2393 | 2394 | r = require("/sdcard/replace.js"); 2395 | } catch (e) { } 2396 | x = null; 2397 | } else { 2398 | r = require("/sdcard/replace.js"); 2399 | } 2400 | }); 2401 | //是否更新题库 2402 | 2403 | files.remove(path_question); 2404 | delay(2); 2405 | 2406 | } 2407 | 2408 | try { 2409 | 2410 | if (!files.exists(path_question)) { 2411 | toastLog("下载question读取题库"); 2412 | console.info("正在加载题库中....."); 2413 | downloadDialog = dialogs 2414 | .build({ 2415 | title: "正在加载题库...", 2416 | progress: { 2417 | max: 100, 2418 | showMinMax: true, 2419 | }, 2420 | autoDismiss: false, 2421 | cancelable: true, 2422 | }) 2423 | .show(); 2424 | startDownload(); 2425 | // delay(2); 2426 | download.join(1000 * 60); 2427 | if (!file_tmp) { 2428 | download.interrupt(); 2429 | console.error("题库加载超时!,再次加载一次"); 2430 | startDownload(); 2431 | } 2432 | while (!file_tmp) { 2433 | toastLog("等待加载题库!!!"); 2434 | delay(2); 2435 | } 2436 | } else { 2437 | tikus = files.read(path_question); 2438 | toastLog("本地读取题库"); 2439 | } 2440 | 2441 | file_tmp = null; 2442 | 2443 | tikus = tikus.split("\n"); 2444 | for (var i = 0; i < tikus.length; i++) { 2445 | var t = tikus[i].split(" "); 2446 | if (t[1] && t[0]) { 2447 | var answer = ""; 2448 | for (var j = 2; j < t.length; j++) { 2449 | // 可能tiku答案有空格,但是被切割了 2450 | answer += t[j]; 2451 | } 2452 | question_list.push([t[1], t[0], answer]); 2453 | } 2454 | } 2455 | answer = null; 2456 | tikus = null; 2457 | init_true = true; 2458 | if (question_list.length < 1000) { 2459 | console.info("题库崩了!!!,等!!!"); 2460 | exit(); 2461 | } 2462 | } catch (e) { 2463 | console.error("题库获取失败,检查网络连接!!!" + e); 2464 | exit(); 2465 | } 2466 | 2467 | 2468 | function startDownload() { 2469 | download = threads.start(function () { 2470 | toastLog("等待加载题库!!!"); 2471 | try { 2472 | var conn = new URL(init_url).openConnection(); 2473 | conn.connect(); 2474 | let is = conn.getInputStream(); 2475 | let count = 0; 2476 | length = 973328; 2477 | let buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 1024); 2478 | while (true) { 2479 | var p = Math.abs(Math.min((count / length) * 100, 100)); 2480 | let numread = is.read(buffer); 2481 | count += numread; 2482 | if (numread < 0) { 2483 | toast("加载完成"); 2484 | console.info("加载完成"); 2485 | downloadDialog.dismiss(); 2486 | downloadDialog = null; 2487 | break; 2488 | } 2489 | downloadDialog.setProgress(p); 2490 | tikus += java.lang.String(buffer, "UTF-8").slice(0, numread); 2491 | console.error("将题库写入到本地" + tikus.length); 2492 | files.write(path_question, tikus); 2493 | } 2494 | is.close(); 2495 | file_tmp = true; 2496 | } catch (e) { 2497 | console.error(e); 2498 | console.warn("题库加载失败"); 2499 | question_list = null; 2500 | is.close(); 2501 | tikus = null; 2502 | hamibot.exit(); 2503 | exit(); 2504 | } 2505 | }); 2506 | } 2507 | } 2508 | 2509 | /** 2510 | * @description: 四人赛 2511 | * @param: null 2512 | * @return: null 2513 | */ 2514 | var xxx = 1; 2515 | function zsyAnswer() { 2516 | //首轮不答 2517 | if (首轮不答) { 2518 | delay(2); 2519 | if (text("随机匹配").exists()) { 2520 | text("随机匹配").findOne(3000).parent().child(0).click(); 2521 | console.log("点击随机匹配"); 2522 | } else { 2523 | console.log("点击开始比赛"); 2524 | var s = text("开始比赛").findOne(2000); 2525 | if (s) { 2526 | s.click(); 2527 | } else { 2528 | console.log("没有找到开始比赛,点击随机匹配"); 2529 | text("随机匹配").findOne(3000).parent().child(0).click(); 2530 | } 2531 | } 2532 | delay(1); 2533 | if (text("知道了").exists()) { 2534 | console.warn("答题已满"); 2535 | text("知道了").findOnce().click(); 2536 | delay(2); 2537 | if (text("随机匹配").exists() || text("开始比赛").exists()) { 2538 | console.info("停止脚本"); 2539 | exit(); 2540 | } else return 0; 2541 | } 2542 | className("ListView").waitFor(); 2543 | console.info("等待比赛结束"); 2544 | while (!text("继续挑战").exists()) { 2545 | sleep(5000); 2546 | } 2547 | console.info("比赛结束"); 2548 | delay(1); 2549 | text("继续挑战").click(); 2550 | delay(3); 2551 | var j = text("开始比赛").findOne(5000); 2552 | if ((j = null)) { 2553 | console.error("不在竞赛页面,停止脚本"); 2554 | exit(); 2555 | } 2556 | console.info("开始正式比赛"); 2557 | } 2558 | 2559 | var img = captureScreen(); 2560 | try { 2561 | var point = findColor(img, "#1B1F25", { 2562 | region: [0, 0, 100, 100], 2563 | threshold: 10, 2564 | }); 2565 | } catch (e) { 2566 | console.error(e); 2567 | console.info("你可能使用了模拟器并且hamibot的版本是1.3.0及以上,请使用hamibot1.1.0版本"); 2568 | exit(); 2569 | } 2570 | // init(); 2571 | if (choose == "a") { 2572 | huawei_ocr_api(img, token); 2573 | } else if (choose == "b") { 2574 | ocr_api(img); 2575 | } else if (choose == "c") { 2576 | hamibot_ocr_api(img); 2577 | } else baidu_ocr_api(img, token); 2578 | var count = 2; 2579 | console.info("改变提示框位置"); 2580 | console.setPosition(device.width / 4, -device.height / 4); 2581 | for (var i = 0; i < count; i++) { 2582 | sleep(random_time(delay_time)); 2583 | if (text("随机匹配").exists()) { 2584 | text("随机匹配").findOne(3000).parent().child(0).click(); 2585 | console.log("点击随机匹配"); 2586 | count = 1; 2587 | } else { 2588 | console.log("点击开始比赛"); 2589 | // my_click_clickable('开始比赛'); 2590 | var s = text("开始比赛").findOne(5000); 2591 | if (s) { 2592 | s.click(); 2593 | } else { 2594 | console.log("没有找到开始比赛,点击随机匹配"); 2595 | text("随机匹配").findOne(3000).parent().child(0).click(); 2596 | count = 1; 2597 | } 2598 | } 2599 | first = true; 2600 | 音字 = false; 2601 | delay(1); 2602 | if (text("知道了").exists()) { 2603 | console.warn("答题已满"); 2604 | text("知道了").findOnce().click(); 2605 | delay(2); 2606 | if (text("随机匹配").exists() || text("开始比赛").exists()) { 2607 | break; 2608 | } else return 0; 2609 | } 2610 | className("ListView").waitFor(); 2611 | var range = className("ListView").findOnce().parent().bounds(); 2612 | var x = range.left + 20, 2613 | dx = range.right - x - 20; 2614 | var y = range.top, 2615 | dy = device.height - 300 - y; 2616 | console.log("坐标获取完成"); 2617 | 2618 | while (!text("继续挑战").exists()) { 2619 | do { 2620 | img = captureScreen(); 2621 | var point = findColor(img, "#1B1F25", { 2622 | region: [x, y, dx, dy], 2623 | threshold: 10, 2624 | }); 2625 | // console.log("等待题目显示"); 2626 | } while (!point); 2627 | console.time("答题"); 2628 | try { 2629 | range = className("ListView").findOnce().parent().bounds(); 2630 | // if (choose == 'a') img = images.inRange(img, '#000000', '#444444'); 2631 | if (!first && !音字) img = images.clip(img, x, y, dx, (range.bottom - y) / 3); 2632 | else img = images.clip(img, x, y, dx, range.bottom - y); 2633 | } catch (e) { 2634 | img = images.clip(img, x, y, dx, dy); 2635 | } 2636 | // images.save(img, "/sdcard/题目"+xxx+".jpg", "jpg", 50); 2637 | // xxx++; 2638 | var question; 2639 | if (choose == "a") { 2640 | // 文字识别 2641 | if (!first && !音字) img = images.inRange(img, "#000000", "#444444"); 2642 | question = huawei_ocr_api(img, token); 2643 | } else if (choose == "b") { 2644 | question = ocr_api(img); 2645 | } else if (choose == "c") { 2646 | if (!first && !音字) 2647 | // 第一题不变色的原因的: 2648 | img = images.inRange(img, "#000000", "#444444"); 2649 | question = hamibot_ocr_api(img); 2650 | } else { 2651 | if (!first && !音字) img = images.inRange(img, "#000000", "#444444"); 2652 | question = baidu_ocr_api(img, token); 2653 | } 2654 | question = question.slice(question.indexOf(".") + 1); 2655 | question = question.replace(/,/g, ","); 2656 | log(question); 2657 | logs.push("题目:" + question); 2658 | if (question) { 2659 | var c = do_contest_answer(32, question); 2660 | if (c == -1) { 2661 | break; 2662 | } else if (c == -2) { 2663 | className("android.widget.RadioButton").waitFor(); 2664 | continue; 2665 | } 2666 | } else { 2667 | images.save(img, "/sdcard/截图.jpg", "jpg", 50); 2668 | console.error("没有识别出任何内容,为了查错已经将截图保存在根目录./截图.jpg,如果截图正常并使用的是本地ocr,那么当前你的手机可能并不适配该ocr,百度/华为ocr则检查扣费次数情况"); 2669 | console.log("截图坐标为(" + x + "," + y + "),(" + dx + "," + dy + ")"); 2670 | break; 2671 | } 2672 | console.timeEnd("答题"); 2673 | img.recycle(); 2674 | do { 2675 | var point = findColor(captureScreen(), "#555AB6", { 2676 | region: [x, y, dx, dy], 2677 | threshold: 10, 2678 | }); 2679 | } while (!point); 2680 | console.log("等待下一题\n----------"); 2681 | // logs.push("等待下一题------------------------"); 2682 | 音字 = false; 2683 | } 2684 | if (i == 0 && count == 2) { 2685 | sleep(random_time(delay_time)); 2686 | console.log("第二轮答题开始"); 2687 | while (!click("继续挑战")); 2688 | sleep(random_time(delay_time)); 2689 | } 2690 | } 2691 | if (hamibot.env.another) var x = hamibot.env.another * 1; 2692 | else var x = 0; 2693 | while (x > 0) { 2694 | console.info("额外的 " + x + " 轮即将开始!"); 2695 | x--; 2696 | delay(2); 2697 | click("继续挑战"); 2698 | delay(3); 2699 | if (text("随机匹配").exists()) { 2700 | text("随机匹配").findOne().parent().child(0).click(); 2701 | console.log("点击随机匹配"); 2702 | } else { 2703 | console.log("点击开始比赛"); 2704 | // my_click_clickable('开始比赛'); 2705 | var s = text("开始比赛").findOne(5000); 2706 | if (s) { 2707 | s.click(); 2708 | } else { 2709 | console.log("没有找到开始比赛,点击随机匹配"); 2710 | text("随机匹配").findOne(3000).parent().child(0).click(); 2711 | } 2712 | } 2713 | delay(1); 2714 | if (text("知道了").exists()) { 2715 | console.warn("答题已满"); 2716 | text("知道了").findOnce().click(); 2717 | delay(1); 2718 | return 0; 2719 | } 2720 | while (true) { 2721 | if (text("继续挑战").exists()) break; 2722 | while (!className("android.widget.RadioButton").depth(32).exists()) { 2723 | delay(randomNum(3, 5)); 2724 | if (text("继续挑战").exists()) break; 2725 | } 2726 | delay(2); 2727 | console.warn("随机点击"); 2728 | try { 2729 | var t = className("ListView").findOne(5000).childCount(); 2730 | t = randomNum(0, t - 1); 2731 | className("android.widget.RadioButton").depth(32).findOnce(t).click(); 2732 | } catch (e) { } 2733 | if (text("继续挑战").exists()) break; 2734 | sleep(200); 2735 | } 2736 | // console.warn('额外一轮结束!'); 2737 | } 2738 | console.info("答题结束"); 2739 | logs.push("答题结束"); 2740 | delay(2); 2741 | back(); 2742 | delay(2); 2743 | back(); 2744 | if (count == 1) { 2745 | delay(2); 2746 | if (text("退出").exists()) { 2747 | textContains("退出").click(); 2748 | delay(1); 2749 | } else { 2750 | console.warn("没有找到退出,按坐标点击(可能失败)\n如果没返回,手动退出双人赛即可继续运行"); 2751 | // console.setPosition(device.width * 0.2, device.height * 0.5); 2752 | click(device.width * 0.2, device.height * 0.6); 2753 | } 2754 | sleep(random_time(delay_time)); 2755 | } 2756 | } 2757 | 2758 | //运行主函数 2759 | // if (随机) { 2760 | 2761 | // } else { 2762 | // main(); 2763 | // } 2764 | 2765 | var ta = hamibot.env.alltime * 1; 2766 | if (!ta || ta <= 0) ta = 1500; 2767 | var thread = null; 2768 | function rt() { 2769 | var num = 0; 2770 | while (true) { 2771 | num++; 2772 | console.log("设置脚本运行最长时间为:" + ta + "s"); 2773 | device.keepScreenOn(ta * 1000 + 60000); 2774 | thread = threads.start(function () { 2775 | rand_mode(); 2776 | }); 2777 | thread.join(ta * 1000); 2778 | thread.interrupt(); 2779 | console.error("脚本超时或者出错!!!,重启脚本"); 2780 | if (!(launchApp("学习强国") || launch("cn.xuexi.android"))) { 2781 | //启动学习强国app 2782 | delay(10); 2783 | } 2784 | console.info("等待10s后继续开始"); 2785 | toast("等待10s后继续开始"); 2786 | delay(5); 2787 | back_table(); 2788 | toast(" "); 2789 | delay(1); 2790 | if (num > 3) break; 2791 | } 2792 | console.error("已经重新运行了3轮,停止脚本"); 2793 | question_list = null; 2794 | console.error("无障碍服务可能出了问题"); 2795 | exit(); 2796 | } 2797 | rt(); 2798 | //var brand = device.brand + device.model; //品牌厂商 2799 | function push_weixin_message(message) { 2800 | if (sct_token != "") { 2801 | URL = "https://sctapi.ftqq.com/" + sct_token + ".send"; 2802 | http.post(URL, { 2803 | title: device.brand + device.model + "异常验证通知", 2804 | desp: message, 2805 | }); 2806 | } 2807 | } 2808 | function push_score() { 2809 | console.warn("正在获取今日积分"); 2810 | var score = getScores(3); 2811 | 2812 | score += "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; 2813 | try { 2814 | http.postJson("http://www.pushplus.plus/send", { 2815 | token: pushplus_token, 2816 | title: device.brand + device.model + "学习通知", 2817 | content: "已得分" + score, 2818 | }); 2819 | } catch (e) { } 2820 | } 2821 | 2822 | function re_store() { 2823 | try { 2824 | if (hamibot.env.xianzhi == true) { 2825 | console.warn("四人双人答题无限制开启"); 2826 | zsyCount = 1; 2827 | doubleCount = 1; 2828 | } 2829 | } catch (e) { } 2830 | } 2831 | 2832 | function back_table() { 2833 | delay(1); 2834 | var num = 0; 2835 | while (!desc("工作").exists()) { 2836 | //等待加载出主页 2837 | console.info("当前没有在主页,正在返回主页"); 2838 | back(); 2839 | delay(1); 2840 | num++; 2841 | if (className("Button").textContains("退出").exists()) { 2842 | var c = className("Button").textContains("退出").findOne(3000); 2843 | if (c) c.click(); 2844 | delay(1); 2845 | } 2846 | if (num > 5) { 2847 | console.error("返回超过10次,可能当前不在xxqg,正在启动app..."); 2848 | if (!(launchApp("学习强国") || launch("cn.xuexi.android"))) { 2849 | //启动学习强国app 2850 | } 2851 | console.info("等待10s继续进行"); 2852 | delay(10); 2853 | num = 0; 2854 | } 2855 | } 2856 | // console.info('当前在主页,回到桌面!'); 2857 | // home(); //回到桌面 2858 | } 2859 | 2860 | function rand_mode() { 2861 | start_app(); //启动app 2862 | /* 2863 | 处理访问异常,滑动验证 2864 | */ 2865 | var id_handling_access_exceptions; 2866 | // 在子线程执行的定时器,如果不用子线程,则无法获取弹出页面的控件 2867 | var thread_handling_access_exceptions = threads.start(function () { 2868 | // 每2秒就处理访问异常 2869 | id_handling_access_exceptions = setInterval(handling_access_exceptions, 5000); 2870 | }); 2871 | 2872 | var start = new Date().getTime(); //程序开始时间 2873 | // console.info('随机模式开始'); 2874 | getScores(0); //获取积分 2875 | re_store(); 2876 | 2877 | var arr = [0, 1, 2, 3, 4, 5, 6, 7]; 2878 | var t; 2879 | for (var i = 0; i < arr.length; i++) { 2880 | var rand = parseInt(Math.random() * arr.length); 2881 | t = arr[rand]; 2882 | arr[rand] = arr[i]; 2883 | arr[i] = t; 2884 | } 2885 | for (var i = 0; i < arr.length; i++) { 2886 | if (arr[i] == 0) { 2887 | 专项(); 2888 | } else if (arr[i] == 1) { 2889 | 每周(); 2890 | } else if (arr[i] == 2) { 2891 | 视频学习(); 2892 | } else if (arr[i] == 3) { 2893 | } else if (arr[i] == 4) { 2894 | 挑战(); 2895 | 四人(); 2896 | 双人(); 2897 | } else if (arr[i] == 5) { 2898 | 本地(); 2899 | 文章和广播(); 2900 | } else if (arr[i] == 6) { 2901 | } else if (arr[i] == 7) { 2902 | 每日(); 2903 | 2904 | } 2905 | } 2906 | question_list = null; 2907 | article_list = null; 2908 | // 取消访问异常处理循环 2909 | try { 2910 | if (id_handling_access_exceptions) clearInterval(id_handling_access_exceptions); 2911 | logs.push("运行结束,取消异常处理"); 2912 | } catch (error) { } 2913 | back_table(); 2914 | if (hamibot.env.Token != null || hamibot.env.Token.length > 6) { 2915 | delay(1); 2916 | push_score(); 2917 | } 2918 | end = new Date().getTime(); 2919 | logs.push("运行结束,共耗时" + parseInt(end - start) / 1000 + "秒"); 2920 | console.log("3s后自动关闭悬浮窗,查看日志请到hamibot内查看"); 2921 | if (consoleshow == true) { 2922 | desc("工作").click(); 2923 | delay(3); 2924 | console.hide(); 2925 | } 2926 | hamibot.postMessage(Date.now().toString(), { 2927 | telemetry: true, // 由用户决定是否发送报告 2928 | data: { 2929 | title: "study异常处理最终版", 2930 | attachments: [ 2931 | { 2932 | type: "json", 2933 | data: JSON.stringify({ 2934 | // 要收集的信息,根据脚本需要自行收集,这里仅作演示 2935 | app: app.versionName, // Hamibot 版本 2936 | currentActivity: currentActivity(), // 当前运行的 Activity 2937 | // 自定义日志,仅作参考 2938 | logs: logs, 2939 | }), 2940 | }, 2941 | ], 2942 | }, 2943 | }); 2944 | device.cancelKeepingAwake(); 2945 | hamibot.exit(); 2946 | exit(); 2947 | } 2948 | 2949 | function 专项() { 2950 | if (zhuanxiang_txt == true && zhuanxiang != 0) { 2951 | console.info("开始专项答题"); 2952 | logs.push("开始专项答题"); 2953 | delay(1); 2954 | if (!text("排行榜").exists()) { 2955 | console.info("进入我要答题"); 2956 | questionShow(); // 进入我要答题 2957 | delay(1); 2958 | } 2959 | zhuanxiangAnswer(); 2960 | delay(0.5); 2961 | } 2962 | } 2963 | 2964 | function 每周() { 2965 | if (meizhou_txt == true && meizhou != 0) { 2966 | logs.push("开始每周答题"); 2967 | console.info("开始每周答题"); 2968 | delay(1); 2969 | if (!text("排行榜").exists()) { 2970 | console.info("进入我要答题"); 2971 | questionShow(); // 进入我要答题 2972 | delay(1); 2973 | } 2974 | meizhouAnswer(); 2975 | delay(0.5); 2976 | } 2977 | } 2978 | 2979 | function 双人() { 2980 | if (doubleCount != 0 && shuangren == true) { 2981 | console.info("开始双人答题"); 2982 | logs.push("开始双人答题"); 2983 | delay(2); 2984 | if (!text("排行榜").exists()) { 2985 | console.info("进入我要答题"); 2986 | questionShow(); // 进入我要答题 2987 | delay(1); 2988 | } 2989 | while (!text("排行榜").exists()) { 2990 | console.info("等待我要答题界面"); 2991 | delay(1); 2992 | } 2993 | var textOrder = text("排行榜").findOnce().parent(); 2994 | while (text("排行榜").exists()) { 2995 | console.info("点击双人答题,悬浮窗位置改变"); 2996 | textOrder.child(9).click(); 2997 | delay(1); 2998 | } 2999 | zsyAnswer(); 3000 | delay(1); 3001 | console.setPosition(0, device.height / 2); 3002 | } 3003 | } 3004 | 3005 | function 四人() { 3006 | if (zsyCount != 0 && siren == true) { 3007 | // delay(2); 3008 | console.info("开始四人答题"); 3009 | logs.push("开始四人答题"); 3010 | delay(2); 3011 | if (!text("排行榜").exists()) { 3012 | console.info("进入我要答题"); 3013 | questionShow(); // 进入我要答题 3014 | delay(1); 3015 | } 3016 | while (!text("排行榜").exists()) { 3017 | console.info("等待我要答题界面"); 3018 | delay(1); 3019 | } 3020 | var textOrder = text("排行榜").findOnce().parent(); 3021 | while (text("排行榜").exists()) { 3022 | console.info("点击四人赛答题,悬浮窗位置改变"); 3023 | textOrder.child(8).click(); 3024 | delay(1); 3025 | } 3026 | zsyAnswer(); 3027 | delay(0.5); 3028 | console.setPosition(0, device.height / 2); 3029 | //delay(1); 3030 | // back(); 3031 | } 3032 | } 3033 | 3034 | function 挑战() { 3035 | // tzCount = 1; 3036 | if (tzCount != 0 && tiaozhan == true) { 3037 | news = false; 3038 | console.info("开始挑战答题"); 3039 | logs.push("开始挑战答题"); 3040 | if (!text("排行榜").exists()) { 3041 | console.info("进入我要答题"); 3042 | questionShow(); // 进入我要答题 3043 | delay(1); 3044 | } 3045 | delay(1); 3046 | challengeQuestion(); //挑战答题 3047 | handling_access_exceptions(); 3048 | delay(0.5); 3049 | } 3050 | } 3051 | 3052 | function 每日() { 3053 | // dayCount = 1; 3054 | if (dayCount != 0 && meiri == true) { 3055 | console.info("开始每日答题"); 3056 | logs.push("开始每日答题"); 3057 | if (!text("排行榜").exists()) { 3058 | console.info("进入我要答题"); 3059 | questionShow(); // 进入我要答题 3060 | delay(1); 3061 | } 3062 | delay(1); 3063 | dailyAnswer(); // 每天答题 3064 | delay(0.5); 3065 | handling_access_exceptions(); 3066 | } 3067 | } 3068 | function 等待主页(waitNum) { 3069 | console.warn("等待加载主页"); 3070 | if (text("排行榜").exists()) { 3071 | delay(0.5); 3072 | back(); 3073 | delay(0.5); 3074 | back(); 3075 | delay(0.5); 3076 | } else { 3077 | waitNum++; 3078 | 3079 | if (waitNum > 1) { 3080 | back_table(); 3081 | } 3082 | } 3083 | } 3084 | function 视频学习() { 3085 | var x = 1; 3086 | if (text("排行榜").exists()) { 3087 | delay(0.5); 3088 | back(); 3089 | delay(0.5); 3090 | back(); 3091 | delay(0.5); 3092 | } 3093 | while (!desc("工作").exists()) { 3094 | //等待加载出主页 3095 | console.info("等待加载主页"); 3096 | 等待主页(1); 3097 | delay(2); 3098 | } 3099 | while (vCount != 0 && video != "a") { 3100 | // logs.push("当前第" + x + "次看视频"); 3101 | if (video == "b") videoStudy_news(x); //看视频 3102 | 3103 | console.info("等待五秒,然后确认视频是否已满分。"); 3104 | delay(5); 3105 | getScores(2); 3106 | 3107 | x++; 3108 | if (x > 2) { 3109 | //尝试三次 3110 | console.info("尝试2次,跳过。"); 3111 | break; 3112 | } 3113 | } 3114 | } 3115 | 3116 | function 本地() { 3117 | if (myScores["本地频道"] != 1) { 3118 | console.info("开始本地频道"); 3119 | logs.push("开始本地频道"); 3120 | if (text("排行榜").exists()) { 3121 | delay(0.5); 3122 | back(); 3123 | delay(0.5); 3124 | back(); 3125 | delay(0.5); 3126 | } 3127 | while (!desc("工作").exists()) { 3128 | //等待加载出主页 3129 | console.info("等待加载主页"); 3130 | if (text("排行榜").exists()) { 3131 | delay(0.5); 3132 | back(); 3133 | delay(0.5); 3134 | back(); 3135 | delay(0.5); 3136 | } 3137 | delay(2); 3138 | } 3139 | localChannel(); //本地频道 3140 | } 3141 | } 3142 | 3143 | function 文章和广播() { 3144 | if (text("排行榜").exists()) { 3145 | delay(0.5); 3146 | back(); 3147 | delay(0.5); 3148 | back(); 3149 | delay(0.5); 3150 | } 3151 | while (!desc("工作").exists()) { 3152 | //等待加载出主页 3153 | console.info("等待加载主页"); 3154 | 等待主页(1); 3155 | delay(2); 3156 | } 3157 | if (rTime != 0 && articles == true) { 3158 | listenToRadio(); //听电台广播 3159 | h = device.height; //屏幕高 3160 | w = device.width; //屏幕宽 3161 | x = (w / 3) * 2; 3162 | h1 = (h / 6) * 5; 3163 | h2 = h / 6; 3164 | delay(1); 3165 | swipe(x, h1, x, h2, 100); 3166 | } 3167 | var r_start = new Date().getTime(); //广播开始时间 3168 | var x = 0; 3169 | while (aCount != 0 && articles == true) { 3170 | aTime = hamibot.env.time1; 3171 | articleStudy(x); //学习文章,包含点赞、分享和评论 3172 | console.info("等待五秒,然后确认文章是否已满分。"); 3173 | delay(5); 3174 | getScores(1); 3175 | 3176 | x++; 3177 | if (x > 2) { 3178 | //尝试三次 3179 | console.info("尝试3次未满分,暂时跳过。"); 3180 | break; 3181 | } 3182 | } 3183 | if (articles == true) { 3184 | var end = new Date().getTime(); //广播结束时间 3185 | var radio_time = parseInt((end - r_start) / 1000); //广播已经收听的时间 3186 | radio_timing(parseInt((end - r_start) / 1000), rTime - radio_time); //广播剩余需收听时间 3187 | if (rTime != 0) { 3188 | stopRadio(); 3189 | } 3190 | } 3191 | } 3192 | 3193 | //toastLog(logs); 3194 | -------------------------------------------------------------------------------- /接听电话.js: -------------------------------------------------------------------------------- 1 | auto.waitFor(); 2 | var { huaweiphone } = hamibot.env; 3 | if (huaweiphone == "接听") { 4 | toastLog("接听"); 5 | if (className("android.widget.ImageButton").desc("接听").click()) toastLog('dest接听点击成功') 6 | else className("android.widget.ImageButton").clickable(true).depth(11).findOnce(1).bounds().click(); 7 | } 8 | 9 | if (huaweiphone == "拒绝") { 10 | toastLog("拒绝"); 11 | if (className("android.widget.ImageButton").desc("拒绝").click()) toastLog('dest拒绝点击成功'); 12 | else className("android.widget.ImageButton").clickable(true).depth(11).findOnce(1).bounds().click(); 13 | } 14 | 15 | if (huaweiphone == "结束通话") { 16 | toastLog("结束通话"); 17 | if (className("android.widget.ImageButton").desc("结束通话").click() || className("android.widget.ImageButton").desc("挂断视频通话").click()) { 18 | toastLog('dest结束通话 或挂断视频电话点击成功'); 19 | } 20 | else { 21 | className("android.widget.ImageButton").clickable(true).depth(8).findOnce(1).bounds().click(); 22 | 23 | toastLog("挂断视频通话"); 24 | 25 | className("android.widget.ImageButton").clickable(true).depth(10).findOnce(1).bounds().click(); 26 | } 27 | } -------------------------------------------------------------------------------- /配置.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "label": "订阅", 4 | "type": "select", 5 | "name": "ssub", 6 | "options": { 7 | "a": "关闭订阅", 8 | "b": "翻遍全部,直到订阅完成", 9 | "c": "只查看上新" 10 | } 11 | }, 12 | { 13 | "name": "consoleshow", 14 | "type": "checkbox", 15 | "label": "日志窗体显示", 16 | "help": " " 17 | }, 18 | { 19 | "name": "init_true", 20 | "type": "checkbox", 21 | "label": "重新加载题库", 22 | "help": " " 23 | }, 24 | { 25 | "name": "article", 26 | "type": "checkbox", 27 | "label": "文章学习和广播收听", 28 | "help": " " 29 | }, 30 | { 31 | "label": "视频学习", 32 | "type": "select", 33 | "name": "video", 34 | "options": { 35 | "a": "不进行学习", 36 | "b": "百灵视频学习", 37 | "c": "看电视视频学习", 38 | "d": "新百灵视频学习" 39 | } 40 | }, 41 | { 42 | "name": "meiri", 43 | "type": "checkbox", 44 | "label": "每日答题", 45 | "help": " " 46 | }, 47 | { 48 | "name": "tiaozhan", 49 | "type": "checkbox", 50 | "label": "挑战答题", 51 | "help": " " 52 | }, 53 | { 54 | "name": "checkbox_01", 55 | "type": "checkbox", 56 | "label": "专项答题(建议手动答题)", 57 | "help": "不保证全部正确" 58 | }, 59 | { 60 | "name": "select", 61 | "type": "select", 62 | "label": "专项答题模式选择", 63 | "options": { 64 | "a": "不向下滑动,只答当天的题目,没有则返回", 65 | "b": "向下滑动,直到找到可答题的题目" 66 | }, 67 | "validation": "required", 68 | "help": "" 69 | }, 70 | { 71 | "name": "checkbox_02", 72 | "type": "checkbox", 73 | "label": "每周答题(建议手动答题)", 74 | "help": "不保证全部正确" 75 | }, 76 | { 77 | "name": "selectm", 78 | "type": "select", 79 | "label": "每周答题模式选择", 80 | "options": { 81 | "a": "不向下滑动,只答当天的题目,没有则返回", 82 | "b": "向下滑动,直到找到可答题的题目" 83 | }, 84 | "validation": "required", 85 | "help": "" 86 | }, 87 | { 88 | "name": "首轮不答", 89 | "type": "checkbox", 90 | "label": "首轮不答", 91 | "help": "勾选之前,需要配置以下信息" 92 | }, 93 | { 94 | "name": "delay_click", 95 | "type": "range", 96 | "label": "四人/双人点击答案延迟时间ms毫秒*30 最多延迟3000ms", 97 | "help": "说明:0ms最快,越大越慢--(点击答案时间)" 98 | }, 99 | { 100 | "name": "checkbox_03", 101 | "type": "checkbox", 102 | "label": "四人答题", 103 | "help": "勾选之前,需要配置以下信息" 104 | }, 105 | { 106 | "name": "shuangren", 107 | "type": "checkbox", 108 | "label": "双人答题", 109 | "help": "勾选之前,需要配置以下信息" 110 | }, 111 | { 112 | "name": "delay_s", 113 | "type": "number", 114 | "label": "四人/双人点击的延迟时间ms毫秒", 115 | "validation": "required", 116 | "help": "说明:0ms最快,越大越慢--(文字识别速度影响最大)" 117 | }, 118 | { 119 | "name": "select_01", 120 | "type": "select", 121 | "label": "文字识别(OCR)类型选择", 122 | "options": { 123 | "c": "hamibot内置OCR->推荐", 124 | "a": "华为OCR接口,需要填入以下关于华为的内容", 125 | "d": "百度OCR接口,需要填入以下关于百度的内容", 126 | "b": "第三方OCR插件,需要安装第三方插件" 127 | }, 128 | "validation": "required", 129 | "help": "帮助:选择适合自己手机的文字识别,建议都试一遍" 130 | }, 131 | { 132 | "name": "AK", 133 | "type": "text", 134 | "label": "百度OCR的API Key", 135 | "help": " " 136 | }, 137 | { 138 | "name": "SK", 139 | "type": "text", 140 | "label": "百度OCR的Secret Key", 141 | "help": " " 142 | }, 143 | { 144 | "name": "endpoint", 145 | "type": "text", 146 | "label": "华为OCR的Endpoint", 147 | "help": " " 148 | }, 149 | { 150 | "name": "username", 151 | "type": "text", 152 | "label": "华为OCR刚刚新建的用户名-username", 153 | "help": " " 154 | }, 155 | { 156 | "name": "password", 157 | "type": "text", 158 | "label": "华为OCR刚刚新建的用户名密码-password", 159 | "help": " " 160 | }, 161 | { 162 | "name": "domainname", 163 | "type": "text", 164 | "label": "华为OCR的账号名-domainname", 165 | "help": " " 166 | }, 167 | { 168 | "name": "projectname", 169 | "type": "text", 170 | "label": "华为OCR的项目名-projectname", 171 | "help": " " 172 | }, 173 | { 174 | "name": "project_Id", 175 | "type": "text", 176 | "label": "华为OCR的projectId", 177 | "help": " " 178 | }, 179 | { 180 | "name": "xxxxxxx", 181 | "type": "link", 182 | "label": "------------------------------------------------------------------------------------------", 183 | "help": "" 184 | }, 185 | { 186 | "name": "alltime", 187 | "type": "number", 188 | "label": "看门狗-脚本运行的最长时间,超时或错误则自动重启脚本-时间s秒", 189 | "validation": "required", 190 | "placeholder": "2000", 191 | "help": "部分手机可能出现不可控错误,一般重启脚本解决,故设置看门狗" 192 | }, 193 | { 194 | "name": "time1", 195 | "type": "number", 196 | "label": "文章学习时间自定义---每篇文章的秒数", 197 | "validation": "required", 198 | "help": " " 199 | }, 200 | { 201 | "name": "time2", 202 | "type": "number", 203 | "label": "视频学习时间自定义---每个视频的秒数", 204 | "validation": "required", 205 | "help": " " 206 | }, 207 | { 208 | "name": "xianzhi", 209 | "type": "checkbox", 210 | "label": "四人/双人不受积分限制开关", 211 | "help": "说明:勾选后再一次运行脚本,四人/双人会再答题一次" 212 | }, 213 | { 214 | "name": "another", 215 | "type": "number", 216 | "label": "四人/双人额外的随机答题次数(乱答)", 217 | "help": "" 218 | }, 219 | { 220 | "name": "stronger", 221 | "type": "select", 222 | "label": "每日、每周、专项答题增强模式", 223 | "options": { 224 | "a": "关闭", 225 | "b": "使用华为OCR识别答案", 226 | "c": "使用百度OCR识别答案" 227 | }, 228 | "validation": "required", 229 | "help": "" 230 | }, 231 | { 232 | "name": "sct_token", 233 | "type": "text", 234 | "label": "sct_token 专门异常消息推送", 235 | "help": "注:sct_token+的Token,否则留空即可" 236 | }, 237 | { 238 | "name": "Token", 239 | "type": "text", 240 | "label": "push+ 消息推送", 241 | "help": "注:有需要的自行填写push+的Token,否则留空即可" 242 | }, 243 | { 244 | "name": "TELEMETRY", 245 | "type": "checkbox", 246 | "label": "发送使用数据和错误报告", 247 | "help": "帮助开发者改进脚本,这个报告会被认为是机密的,匿名的。" 248 | } 249 | ] 250 | --------------------------------------------------------------------------------