Exemple #1
0
    def send_heartbeat_packet(self, packet, check_start=False) -> bytes:
        heartbeat_error_count = 0
        while True:
            self.socket.sendto(packet, (config["cqu_server"]["server"], 61440))

            if heartbeat_error_count > 10:
                if config["behavior"]["unlimited_retry"]:
                    raise ConnectionResetError("重新登录")
                else:
                    exit()
            try:
                data, _ = self.socket.recvfrom(1024)
            except socket.timeout:
                log("心跳包发送失败,是否在其他地方登录?", warning=True)
                time.sleep(3)
                heartbeat_error_count += 1

                continue

            if check_start is True:
                if not data.startswith(b"\x07"):
                    log("心跳包发送失败", warning=True)
                    time.sleep(3)
                    heartbeat_error_count += 1

                    continue

            return data[16:20]
Exemple #2
0
 def __init__(self):
     self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
     try:
         self.socket.bind(("0.0.0.0", 61440))
     except OSError:
         log("绑定端口失败,是否有其他drcom正在运行?")
         exit()
     self.socket.settimeout(3)
Exemple #3
0
    def login(self, usr, pwd, server):
        error_counter = 0 if not config["behavior"][
            "unlimited_retry"] else -0x3fffffff  # min(int32)
        while True:
            salt = self.challenge(server,
                                  time.time() + random.randint(0xF, 0xFF))
            packet = make_packet(salt, usr, pwd, config["cqu_server"]["mac"])

            self.socket.sendto(packet, (server, 61440))
            data, address = self.socket.recvfrom(1024)

            if address == (server, 61440) and data[:1] == b"\x04":
                log("登录成功")
                break
            else:
                if data.startswith(b"\x05\x00\x00\x05\x03"):
                    log("帐号密码错误,无效的帐号密码已清除", error=True)
                    config.reset()
                    exit()
                elif data.startswith(b"\x05\x00\x00\x05\x04"):
                    log("帐号已欠费,请充值后再次登录", error=True)
                    exit()
                elif data.startswith(b"\x05\x00\x00\x05\x05"):
                    log("帐号已停机,请前往管理页面开机", error=True)
                    exit()
                else:
                    log("登录失败,原因未知", error=True)

                error_counter += 1
                if error_counter >= 5:
                    exit()

        return data[23:39], salt