Entendendo o socket no Python criando um bot de IRC | Alura
Frente a esse problema, nosso time de tecnologia me encarregou de criar algo que poderia nos ajudar com a comunicação, não decepcionando os clientes - um bot de IRC que, automaticamente, mandaria uma mensagem de boas vindas a todo mundo que entrasse no canal.
Tratando-se de comunicação entre dois processos diferentes, a saída quase sempre é a mesma - soquetes, ou, originalmente, sockets. Apesar de abstrato, esse conceito aparece para todos nós, usuários da Internet, cotidianamente!
O módulo socket abriga uma classe essencial, que representa, justamente, um socket. A classe tem o mesmo nome do módulo - socket. Assim, instanciá-la não deve ser muito difícil, certo? Basta importamos o módulo para nosso programa e chamarmos a função construtora dessa classe:
Em primeiro lugar, de alguma maneira o computador precisa saber, ao criar um socket, com o que ele vai conseguir se comunicar. Como já vimos, sockets podem ter funcionalidades bem diversas - podendo se comunicar com processos dentro ou fora de uma mesma máquina.
Além da família de endereços, precisamos especificar mais uma coisa - o tipo do socket. Como assim? O que acontece é que, na Internet, existem diversas formas e modelos para se efetuar uma comunicação. Assim, precisamos definir um, ao criarmos nosso objeto socket.
Em relação ao tipo do socket, existem duas constantes mais importantes - a SOCK_STREAM, que define sockets de fluxo, e a SOCK_DGRAM, que define sockets de datagrama. Mas, na prática, qual a diferença delas duas?
Com nosso objeto socket criado, partir para a parte de conexão não é difícil, basta um método - o connect(). E como o Python vai saber com quem se conectar? Bem, a princípio ele não sabe! Precisamos especificar isso através de um parâmetro na chamada do método.
A própria documentação do Python nos recomenda usar, nesse parâmetro, uma pequena potência de 2, "para melhor compatibilidade com as realidades de hardware e rede". Assim, podemos usar um valor como 2048 (2¹¹):
Hum… por que todos esses "NOTICE" e ainda essa mensagem de erro, no final? A mensagem avisa que a conexão está sendo fechada porque o tempo de registro expirou. Ué, fizemos algo errado? Que registro é esse?
Uma delas, por exemplo, diz respeito a tudo que é enviado do cliente para o servidor - todos os comandos devem terminar com a sequência de caracteres especiais '\r\n', representando um ENTER, o envio. Agora, podemos usar o método send() de nosso objeto socket para enviar o comando:
Certo! Podemos, agora, enviar o último comando de registro - o USER. O comando USER toma quatro parâmetros (username, hostname, servername e realname), todos os quais podem ser resumidos pelo próprio nick que escolhemos.
Precisamos já implementar um tipo de automatização - sempre que recebermos um PING, precisamos responder com um PONG. E como fazer isso?
:[email protected]1XXX17.82A3XXXB.69XXX77.IP PRIVMSG BotDaEmpresa :Oi, bot!
* BotDaEmpresa ([email protected]1ED94617.82A3866B.693A3A77.IP) has joined
:[email protected]1ED94617.82A3866B.693A3A77.IP JOIN :#minha-empresa
Nesse artigo, enfrentamos um problema empresarial de automatização no contato com clientes através do protocolo IRC.
Se gostou do post e quer aprender mais sobre essa linguagem, dê uma olhada em nossos cursos de Python!