通途

教务网验证码识别,已适配西南交通大学(swjtu),石家庄铁道大学,新乡医学院三全学院,四川城市职业学院(scuvc),阿坝师范学院(旧版教务),四川国际标榜职业技术学院,四川交通职业技术学院(svtcc),四川工商学院(abtc)

目前為 2020-04-09 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name 通途
  3. // @namespace http://tampermonkey.net/
  4. // @version 2.3
  5. // @description 教务网验证码识别,已适配西南交通大学(swjtu),石家庄铁道大学,新乡医学院三全学院,四川城市职业学院(scuvc),阿坝师范学院(旧版教务),四川国际标榜职业技术学院,四川交通职业技术学院(svtcc),四川工商学院(abtc)
  6. // @author kaka
  7. // @match http://jwc.swjtu.edu.cn/service/login.html
  8. // @match http://jwc.swjtu.edu.cn/vatuu/YouthIndexAction?setAction=index
  9. // @match http://jwc.polus.edu.cn/service/login.html
  10. // @match http://jwc.abtu.edu.cn/service/login.html
  11. // @match http://jwb.sqmc.edu.cn/service/login*
  12. // @match http://jwc.svtcc.edu.cn/service/login*
  13. // @match http://jwc.scuvc.com/service/login*
  14. // @match http://jwxt.stbu.edu.cn/service/login*
  15.  
  16. // @match *.vatuu.com/service/login*
  17. // @match *.vvtuu.com/service/login*
  18. // @connect aip.baidubce.com
  19. // @connect localhost
  20. // @grant unsafewindow
  21. // @grant GM_xmlhttpRequest
  22. // @grant GM_getValue
  23. // @grant GM_setValue
  24. // @run-at document-end
  25. // ==/UserScript==
  26. (function() {
  27. 'use strict';
  28. let setting = {
  29. ran_img : document.querySelector("#randomPhoto > img"), //验证码图片元素
  30. ran_img_url:window.location.origin+'/vatuu/GetRandomNumberToJPEG?test='+new Date().getTime(),//验证码图片请求url
  31. ran_text : document.getElementById('ranstring'),//验证码填写元素
  32. other_data:['document.querySelector("#password")',//其它必填项#######################自动处理,下次跟新再说(逃
  33. 'document.querySelector("#username")'],//必须是字符串,目前想不到更好的解决办法
  34. submit:document.querySelector("#submit2"),//登陆按钮
  35. nostop:true,//错误后允许重试
  36. err_total:5, //各环节允许最大错误
  37. apis:[['iKGARn6BhGgU82W9xzLUIatb','hES0Zae2iLdP1iotenC8zlGo9qA3r0Hc'],
  38. ['UjcQzcjSpyYGrXKyPy3dBdoW','65GqKnF5jH3QR9ZEIr8j1ppKWuDRLgI7'],
  39. ['Vt2YOiA6CZTnnpaZCEHLTTl6','LIeZdRFmg8odzPCLR8yPPdNeZDKA7yWM'],
  40. ['xCEG3OUq0mKzIThFiGPh9AES','mpCK1RI4sFIkX79QDDy6qO2GmCCGC6TS']],
  41. }
  42.  
  43.  
  44.  
  45.  
  46. function autologin(){
  47. if(other_data_done()){//其它信息也填了就登陆
  48. setting.submit.click();
  49.  
  50. }
  51.  
  52. }
  53. function enter_login(){
  54. document.onkeydown = function(ev){
  55. var e = ev || event;
  56. if(e.keyCode ==13){
  57. setting.submit.click();
  58. }
  59. }}
  60. function other_data_done(){
  61. if(eval(setting.other_data.join('.value&&')+'.value')){return true}
  62. }
  63.  
  64. function get_random_img(callback){
  65. let httpRequest = new XMLHttpRequest();
  66. httpRequest.open('GET',setting.ran_img_url, true);
  67. httpRequest.responseType = 'blob';
  68. httpRequest.send();
  69. /**
  70. * 获取图片后进行base64编码
  71. */
  72. httpRequest.onreadystatechange = function () {
  73. if (httpRequest.readyState == 4 && httpRequest.status == 200) {
  74. let img = httpRequest.response;
  75. var reader = new FileReader();
  76. reader.readAsDataURL(img);
  77. reader.onload = function (e) {
  78. setting.ran_img.src = e.target.result;
  79. // console.log("!!!!!!!!!!!!!")
  80. // console.log(ran_img.src);
  81. let bs64_str_temp = e.target.result;
  82. let bs64_str = bs64_str_temp.split(",")[1];
  83. callback(bs64_str);
  84. }
  85. };
  86. };
  87. }
  88. function get_access_url(){
  89. let randomapi = setting.apis[setting.ran_api_num];
  90. return 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id='+randomapi[0]+'&client_secret='+randomapi[1]
  91. }
  92.  
  93. function setCookie(cname, cvalue, exp) {
  94. var d = new Date();
  95. d.setTime(d.getTime() + (exp*1000)-5000);
  96. var expires = "expires="+d.toUTCString();
  97. document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
  98. }
  99.  
  100. function getCookie(cname) {
  101. var name = cname + "=";
  102. var ca = document.cookie.split(';');
  103. for(var i = 0; i < ca.length; i++) {
  104. var c = ca[i];
  105. while (c.charAt(0) == ' ') {
  106. c = c.substring(1);
  107. }
  108. if (c.indexOf(name) == 0) {
  109. return c.substring(name.length, c.length);
  110. }
  111. }
  112. return "";
  113. }
  114.  
  115. function get_access(){
  116. let access_token = getCookie("access_token_"+setting.ran_api_num);
  117. if (access_token != "") {//access未过期
  118. setting.access_token =access_token
  119. } else {
  120. try{
  121. GM_xmlhttpRequest({
  122. method: "GET",
  123. url:get_access_url(),
  124. onload: function(response) {
  125. let access_token =JSON.parse(this.responseText)["access_token"];
  126. let expires =JSON.parse(this.responseText)["expires_in"];
  127. setCookie("access_token_"+setting.ran_api_num, access_token, expires);
  128. setting.access_token = access_token
  129. }
  130. })
  131. }
  132. catch(err){
  133. //console.log('获取access_token失败');
  134.  
  135. if( err_access_num<=setting.err_total){
  136. err_access_num+=1;
  137. get_access()
  138. }else{
  139. setting.ran_text.placeholder = '失败,请自行输入';
  140. debugger;
  141. }
  142. }
  143. }
  144.  
  145. }
  146. function get_str(bs64_str){
  147.  
  148. let request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/webimage";
  149. request_url = request_url + "?access_token=" + setting.access_token;
  150. let data = 'image='+encodeURIComponent(bs64_str);
  151. //alert(encodeURIComponent(bs64_str));
  152. GM_xmlhttpRequest({
  153. method: 'POST',
  154. url: request_url,
  155. data: data,
  156. headers: {
  157. 'charset': 'UTF-8',
  158. "Content-Type": "text/plain"
  159. },
  160. onload: function(response) {
  161. // console.log("baidu_response");
  162. //console.log(response.responseText)
  163. try{
  164. let temp = JSON.parse(response.responseText);
  165. let rand_str = temp['words_result'][0]['words'];
  166. if(rand_str.length == 4){
  167. setting.ran_text.value = rand_str; //填写验证码
  168. if(other_data_done()){//其它信息也填了就登陆
  169. setting.submit.click();
  170. }
  171. }else{ //重来
  172.  
  173. throw "解析失败";
  174.  
  175. }
  176. }
  177. catch(err){
  178. // console.log(err);
  179. if(setting.nostop){
  180. if(err_num<=setting.err_total ){
  181. err_num+=1;
  182. //console.log(err_num)
  183. setting.ran_text.placeholder = '失败,重试中...';
  184. get_random_img(function( bs64_str){
  185. get_str(bs64_str)
  186. });
  187. }else{
  188. setting.ran_text.placeholder = '失败,请自行输入';
  189. return;
  190. }
  191. }
  192. }
  193. }
  194. })
  195. }
  196.  
  197.  
  198. //let bs64_str ;
  199. let err_num = 1;
  200. let err_access_num = 1;
  201. setting.ran_api_num = Math.floor(Math.random() * setting.apis.length)
  202. enter_login();
  203. document.querySelector("#ranstring").addEventListener('focus',function(){setting.nostop=false; setting.ran_text.placeholder = '检测到自行输入';})//用户选择自己写时,阻止继续执行
  204. setting.ran_text.placeholder = '尝试获取验证码中';
  205. get_random_img(function( bs64_str){
  206. get_access();
  207. get_str(bs64_str)
  208. });
  209. //setInterval(autologin,3000)
  210. autologin();//针对浏览器预先填写的用户
  211.  
  212. })();

QingJ © 2025

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