Ultimas do CanalQb

Python - Descobrindo impressoras em uma range de IP

Python - Descobrindo impressoras em uma range de IP
Canal Qb

Para fazer o discovery de impressoras em rede, você pode utilizar o módulo socket do Python para fazer a varredura em um determinado intervalo de endereços IP e porta de impressão. Aqui está um exemplo de código Python que faz isso: 
import socket

def scan_printers(ip_range, port):
    for i in range(1, 255):
        ip = ip_range + str(i)
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(0.5)
        result = sock.connect_ex((ip, port))
        if result == 0:
            print("Printer found at", ip)
        sock.close()

ip_range = "192.168.1."
port = 9100

scan_printers(ip_range, port)
Nesse exemplo, a função scan_printers recebe um intervalo de endereços IP (no caso, "192.168.1.") e uma porta de impressão (no caso, 9100). O loop for percorre todos os endereços IP dentro do intervalo e tenta conectar na porta especificada utilizando o método connect_ex do socket. Se a conexão for bem-sucedida (ou seja, result é igual a zero), a função imprime uma mensagem informando que uma impressora foi encontrada no endereço IP correspondente.

Você pode ajustar o código para utilizar outros intervalos de endereços IP e portas de impressão, conforme necessário.

--*--
Para obter o modelo da impressora, você precisará se conectar à porta da impressora usando o protocolo apropriado para obter informações de identificação da impressora. Aqui está um exemplo de como modificar o código anterior para recuperar o modelo da impressora: 
import socket

def get_printer_info(ip, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(1)
    sock.connect((ip, port))
    sock.send(b'\x1B%-12345X@PJL INFO ID\r\n')
    data = sock.recv(1024)
    sock.close()
    for line in data.splitlines():
        line = line.decode('utf-8')
        if line.startswith('@PJL INFO ID'):
            model = line.split(':')[-1].strip()
            return model

def scan_printers(ip_range, port):
    for i in range(1, 255):
        ip = ip_range + str(i)
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(0.5)
        result = sock.connect_ex((ip, port))
        if result == 0:
            model = get_printer_info(ip, port)
            if model:
                print("Printer found at", ip, "Model:", model)
            else:
                print("Printer found at", ip)
        sock.close()

ip_range = "192.168.1."
port = 9100

scan_printers(ip_range, port)
Nesse exemplo, a função get_printer_info se conecta à porta especificada da impressora e envia um comando PJL para obter informações de identificação da impressora. Em seguida, o modelo é extraído da resposta usando uma expressão regular.

A função scan_printers agora chama get_printer_info para cada impressora encontrada e imprime o endereço IP e o modelo da impressora, se disponível. Se o modelo não puder ser recuperado, apenas o endereço IP é impresso.

--*--
Para realizar a descoberta de impressoras em rede, é possível utilizar a biblioteca socket do Python para realizar uma varredura de portas em um determinado intervalo de endereços IP. Para identificar o modelo da impressora, é necessário realizar uma conexão com o dispositivo e obter informações sobre ele.

Segue abaixo um exemplo de script Python que realiza a descoberta de impressoras em rede para os ranges de IP especificados: 
import socket

ip_ranges = ['10.0.1.', '10.0.2.', '10.140.']
printer_port = 9100

for ip_range in ip_ranges:
    for i in range(1, 255):
        ip_address = ip_range + str(i)
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(1)
        result = sock.connect_ex((ip_address, printer_port))
        if result == 0:
            print(f"Impressora encontrada no endereço: {ip_address}")
            try:
                sock.sendall(b'\x1b%-12345X@PJL INFO ID\r\n')
                response = sock.recv(1024)
                model = response.decode().split('\n')[2].split(':')[1].strip()
                print(f"Modelo: {model}")
            except:
                print("Não foi possível obter informações sobre o modelo")
        sock.close()
Neste exemplo, a lista ip_ranges contém os ranges de IP que serão varridos em busca de impressoras. O número da porta padrão para impressoras é o 9100, por isso é utilizado o valor printer_port para realizar a conexão com cada IP encontrado.

Ao encontrar um dispositivo na porta especificada, o script envia um comando específico para impressoras que retorna informações sobre o modelo do dispositivo. Em seguida, é feito o tratamento dessas informações e exibido na tela do usuário.

Caso deseje verificar outras faixas de IP, basta adicionar as mesmas à lista ip_ranges. É importante ressaltar que esse tipo de varredura pode ser considerado invasivo em alguns casos, por isso é importante tomar cuidado ao executá-la.

Nenhum comentário

Comente só assim vamos crescer juntos!

Observação: somente um membro deste blog pode postar um comentário.