通途

西南交通大学(swjtu)教务网验证码识别

目前为 2020-03-21 提交的版本。查看 最新版本

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

QingJ © 2025

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