寫了一個校園網小工具


最近用上了學校的校園網, 速度還行吧

不過校園網每次要 web登錄認證, 就有點無語, 像我這么懶的人怎么可能每次都要重新登錄一次

圍觀地址: https://github.com/jsxxzy/inet

原理很簡單, 無非就是登錄一個 POST 請求, 然后億點點細節就可以了

懶才是第一生產力啊..

原理分析 2020-11-29

最近真的閑的不行, 沒什么事情做, 奇怪的是室友不知道發生什么事了, 全都在學JAVA, 搞得我一臉懵逼(按理說不應該天天游戲嗎/霧)

所以就寫了一個java版本的校園網客戶端: https://github.com/jsxxzy/inetl

首先查看入口函數: /src/main/java/io/xxzy/App.java

      System.out.println(" login: 登錄");
      System.out.println("   get: 獲取保存的賬號密碼");
      System.out.println("  save: 保存賬號密碼");
      System.out.println("   fix: 初始化賬號密碼");
      System.out.println(" check: 查詢是否登錄");
      System.out.println("  info: 查詢信息");
      System.out.println("logout: 注銷");
      System.out.println("=============>");

登錄

校園網有登錄的網端

稍微看一下就知道這就是簡單的 post 請求

密碼是經過 md5 機密, 加幾個偏移值, 這幾個偏移值在 html 片段里都有

/**
   * 生成密碼
   * https://github.com/jsxxzy/ipsd
   * @return 密碼
   */
  public String CreatePassword(String p) {
    String offset1 = constvar.Pid + p + constvar.Calg;
    String md5 = utilsx.CreateMD5(offset1);
    return md5 + constvar.Calg + constvar.Pid;
  }

請求之后, 后台返回的html片段, 比較惡心的是, 居然不是utf-8, 所以還需要將其轉為utf-8格式

/**
   * 轉為 `utf-8`
   */
  static String toUTF8(String input) {
    return new String(input.getBytes(), StandardCharsets.UTF_8);
  }

返回的html里有你需要的一些信息, 用來判斷是否登錄成功, 我們需要運行這段js然后通過判斷變量msga來判斷

但是第一步是去除其 <!--

/**
   * 運營商的js寫的不標准, 此函數試圖去除一些不標准
   *
   * 一開口就老外包了...
   *
   * @param raw 源數據
   * @return 正確的`js-code`
   */
  public static String jsCodeRemoveCommit(String raw) {
    String cp = raw.trim();
    String left = "<!--";
    String right = "// -->";
    if (cp.startsWith(left)) {
      cp = cp.substring(left.length());
    };
    if (cp.endsWith(right)) {
      int endIndex = cp.length() - right.length();
      cp = cp.substring(0, endIndex);
    }
    return cp;
  }

判斷條件為, 若為空表示登錄成功, 若為 5 多台設備在線, 若為 1 表示賬號或密碼錯誤

查詢是否登錄

查詢是否登錄只是查詢信息alias

   // 未登錄將會自動跳轉到 `/0.htm` 登錄界面, 但判斷條件為 `title` 字符串為空
   String title = $.title();

查詢信息

查詢信息相對有點復雜, 訪問校園路由, 然后和登錄差不多, 先轉utf-8然后拿到js, 運行, 就可以拿到了

// 運行`js`
void InitData(Document $) {
    js jsRuntime = new js();
    Elements jsData = $.select(constvar.QueryInfoSelectText);
    String jsDataText = jsData.get(0).html();
    String jsInputData = utilsx.jsCodeRemoveCommit(jsDataText);
    jsRuntime.RunScript(jsInputData);
    String cacheTimeString = jsRuntime.GetString(constvar.InfoTime);
    try {
      this.Time = Integer.parseInt(cacheTimeString);
    } catch (NumberFormatException e) {
      e.printStackTrace();
    }
    this.Ipv6 = jsRuntime.GetString(constvar.InfoIpv6);
    this.Ipv4 = jsRuntime.GetString(constvar.InfoIpv4);
    this.UID = jsRuntime.GetString(constvar.InfoUID);
    this.Xip = jsRuntime.GetString(constvar.InfoXip);
    this.Portalname = jsRuntime.GetString(constvar.InfoPortalname);
    String cacheFlowData = jsRuntime.GetString(constvar.InfoFlow);
    try {
      this.Flow = Integer.parseInt(cacheFlowData);
    } catch (NumberFormatException e) {
    }

注銷

注銷比較簡單, 只是GET請求一下注銷的路由即可

get | save | fix

存儲賬號到本地, 比較簡單, 讀寫一個文件, 不過我自己實現了一個解析格式

/**
   * 解析格式
   */
  private String[] parseLocalAuth(String rawString) {
    String[] em = new String[0];
    if (rawString.length() == 0) {
      return em;
    }
    String[] arr = rawString.split(this.offset);
    if (arr.length <= 1) {
      return em;
    }
    String[] r = new String[2];
    r[0] = arr[0];
    r[1] = arr[1];
    return r;
  }

作者有話說

額, 迫於無聊編寫的, 以前一直對於java有偏見, 但是寫了以后發現好像還挺好的哈


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM