• Как узнать что на определенном поре запущен сервер minecraft?

    fdhadzh
    @fdhadzh
    Perfectionist with deadlines
    def isminecraft(addr, timeout=5):
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            s.connect(addr)
            s.settimeout(timeout)
    
            buf = struct.pack('xBB', 4, len(addr[0].encode('utf-8')))
            buf += addr[0].encode('utf-8')
            buf += struct.pack('HB', addr[1], 1)
    
            pkt = struct.pack('B', len(buf))
            pkt += buf
            pkt += b'\x01\x00'
    
            s.send(pkt)
    
            try:
                bufsize = struct.unpack('B', s.recv(3)[2:])[0]
                js = s.recv(bufsize, socket.MSG_WAITALL)
            except socket.timeout:
                return (False, None)
    
        try:
            response = json.loads(js)
            version = response['version']['name']
            return (True, version)
        except (ValueError, KeyError):
            return (False, None)


    Пример использования:

    addrs = [
        ('192.168.99.100', 22508),
        ('192.168.99.100', 32761),
    ]
    
    for addr in addrs:
        isok, version = isminecraft(addr)
    
        if isok:
            print('[%s] Minecraft version: %s' % (str(addr), version))
    Ответ написан
    Комментировать