![]() |
Python - Descobrindo impressoras em uma range de IP | |
@CanalQb |
Descobrindo Impressoras em Rede com Python
Para realizar a descoberta de impressoras em uma rede local, o Python oferece o módulo socket
, que permite fazer uma varredura em intervalos de endereços IP e portas específicas usadas por impressoras. O exemplo a seguir mostra um código básico que busca impressoras no intervalo "192.168.1." na porta padrão 9100, que é a porta comum para impressão via protocolo RAW TCP/IP.
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 código, a função scan_printers
percorre todos os endereços IP dentro do intervalo especificado e tenta se conectar à porta 9100. Se a conexão for bem-sucedida (resultado zero), significa que uma impressora provavelmente está ativa naquele IP.
Recuperando o Modelo da Impressora
Além de encontrar impressoras, é possível consultar o modelo do dispositivo enviando um comando PJL (Printer Job Language) específico, que retorna informações de identificação da impressora. Veja a seguir como ampliar o script para obter essa informação:
import socket
def get_printer_info(ip, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1)
try:
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
except Exception:
return None
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)
O comando enviado é o @PJL INFO ID
, que muitos modelos de impressoras suportam para fornecer sua identificação. Caso o modelo não possa ser recuperado, o script exibirá apenas o IP da impressora encontrada.
Varredura em Múltiplos Intervalos de IP
Se sua rede for segmentada em diferentes sub-redes, você pode ajustar o script para verificar vários intervalos de IP. O exemplo abaixo mostra como fazer isso para três ranges comuns:
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 Exception:
print("Não foi possível obter informações sobre o modelo")
sock.close()
Neste script, cada faixa de IP é verificada em sequência. O comando PJL é enviado para cada dispositivo encontrado para tentar extrair o modelo da impressora.
Importante:
- Realize varreduras em redes sob sua autorização para evitar problemas legais ou de segurança.
- Este tipo de script pode ser considerado invasivo em algumas redes; use-o com responsabilidade.
Considerações Finais
Esse método é eficiente para descobrir impressoras ativas em uma rede local e identificar seus modelos, facilitando a administração e o monitoramento de equipamentos. Você pode adaptar o código para incluir logs, integração com bancos de dados ou notificações.
Para mais conteúdo técnico e tutoriais sobre Python e redes, visite o canal oficial do desenvolvedor no @CanalQb.
Este conteúdo é informativo. Ao utilizar scripts para varredura de redes e dispositivos, é fundamental avaliar individualmente os riscos e evitar aplicar o código em ambientes onde não se tem autorização ou conhecimento técnico suficiente.