Slide 1

Slide 1 text

Olá! Eu sou Yan Orestes Produtor de conteúdo na 1 @yanorestes

Slide 2

Slide 2 text

Entendendo sockets no Python criando um bot no IRC 2

Slide 3

Slide 3 text

Entendendo sockets no Python criando um bot no IRC 3

Slide 4

Slide 4 text

Entendendo sockets no Python criando um bot no IRC 4

Slide 5

Slide 5 text

5 O que é que é tudo isso?

Slide 6

Slide 6 text

O que é IRC? 6

Slide 7

Slide 7 text

O que é IRC? 7 Internet Relay Chat

Slide 8

Slide 8 text

8

Slide 9

Slide 9 text

9 Estrutura básica do IRC

Slide 10

Slide 10 text

Construção simples Clientes Redes Servidores 10

Slide 11

Slide 11 text

Redes 11 Rizon

Slide 12

Slide 12 text

Redes Servidores 12 irc.rizon.io irc.namreeb.org solenoid.rizon.net irc.ircii.net irc.rizon.net Rizon

Slide 13

Slide 13 text

Clientes Redes Servidores 13 irc.rizon.io irc.namreeb.org solenoid.rizon.net irc.ircii.net irc.rizon.net Rizon

Slide 14

Slide 14 text

14 Mensagem privada Cliente-Servidor-Cliente

Slide 15

Slide 15 text

15 Mensagem privada Cliente-Servidor-Cliente Canais Cliente-Servidor-Broadcast

Slide 16

Slide 16 text

16 O que é um socket?

Slide 17

Slide 17 text

Uma forma de permitir que dois processos diferentes, que podem estar em uma mesma máquina ou não, se comuniquem 17

Slide 18

Slide 18 text

18

Slide 19

Slide 19 text

19

Slide 20

Slide 20 text

20

Slide 21

Slide 21 text

21 Modelo TCP/IP

Slide 22

Slide 22 text

22 Modelo TCP/IP Sockets!

Slide 23

Slide 23 text

23 O bot

Slide 24

Slide 24 text

24 Clientes Redes Servidores

Slide 25

Slide 25 text

25 Clientes Servidores Cliente/Servidor

Slide 26

Slide 26 text

26 O que o bot vai fazer?

Slide 27

Slide 27 text

27 O que o bot vai fazer?

Slide 28

Slide 28 text

Como fazer isso no Python? 28

Slide 29

Slide 29 text

Como fazer isso no Python? ● socket 29

Slide 30

Slide 30 text

Como fazer isso no Python? ● socket ● (re) ● (requests) 30

Slide 31

Slide 31 text

31 1. import socket 2. 3. s = socket.socket()

Slide 32

Slide 32 text

32 1. import socket 2. 3. s = socket.socket() É só isso?

Slide 33

Slide 33 text

33 Especificações do socket

Slide 34

Slide 34 text

34 Família de endereços

Slide 35

Slide 35 text

35 Família de endereços AF_UNIX X AF_INET X AF_INET6

Slide 36

Slide 36 text

36 AF_UNIX

Slide 37

Slide 37 text

37 AF_UNIX Diferentes processos no mesmo host

Slide 38

Slide 38 text

38 AF_UNIX Vários processos Uma aplicação

Slide 39

Slide 39 text

39 AF_INET

Slide 40

Slide 40 text

40 AF_INET Mais complicado e lento

Slide 41

Slide 41 text

41 AF_INET Endereços IPv4 para comunicação remota!

Slide 42

Slide 42 text

42 AF_INET6 Endereços IPv6 para comunicação remota!

Slide 43

Slide 43 text

43 Tipos de socket

Slide 44

Slide 44 text

44 Tipos de socket SOCK_STREAM X SOCK_DGRAM

Slide 45

Slide 45 text

45 Tipos de socket SOCK_STREAM X SOCK_DGRAM TCP X UDP

Slide 46

Slide 46 text

46 UDP

Slide 47

Slide 47 text

47 UDP Sem conexão.

Slide 48

Slide 48 text

48 UDP Sem conexão. Sem garantia.

Slide 49

Slide 49 text

49 UDP Bom para jogos online e livestreams!

Slide 50

Slide 50 text

50 TCP Garante o envio de todos os dados na ordem correta

Slide 51

Slide 51 text

51 1. import socket 2. 3. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 4. s.connect()

Slide 52

Slide 52 text

52 1. import socket 2. 3. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 4. s.connect(('irc.rizon.net', 6667))

Slide 53

Slide 53 text

53 Troca de dados ● socket.send(msg) ● socket.recv(n_bytes)

Slide 54

Slide 54 text

54 Main loop 1. while True: 2. msg = s.recv(2048).decode('utf8') 3. print(msg)

Slide 55

Slide 55 text

55 ERROR :Closing Link: 191.222.80.0 (Registration timed out)

Slide 56

Slide 56 text

56 ERROR :Closing Link: 191.222.80.0 (Registration timed out) Por quê?

Slide 57

Slide 57 text

57 Burocracias do IRC

Slide 58

Slide 58 text

58 Registro

Slide 59

Slide 59 text

59 Registro 1. PASS 2. NICK 3. USER

Slide 60

Slide 60 text

60 Registro 1. NICK 2. USER

Slide 61

Slide 61 text

61 Envio de comandos

Slide 62

Slide 62 text

62 Envio de comandos ● Enter => \r\n

Slide 63

Slide 63 text

63 Envio de comandos ● Enter => \r\n ● Bytes!!!

Slide 64

Slide 64 text

64 1. def envia_comando(sock, cmd): 2. cmd += '\r\n' 3. sock.send(cmd.encode('utf8'))

Slide 65

Slide 65 text

65 1. nick = 'TDCBot' 2. envia_comando(s, f'NICK {nick}') 3. envia_comando(s, f'USER {nick} {nick} {nick} :{nick}')

Slide 66

Slide 66 text

66 PING :1068475424

Slide 67

Slide 67 text

67 PING :1068475424

Slide 68

Slide 68 text

68 ERROR :Closing Link: 191.222.80.0 (Registration timed out)

Slide 69

Slide 69 text

69 ERROR :Closing Link: 191.222.80.0 (Registration timed out) Por quê?

Slide 70

Slide 70 text

70 Ping

Slide 71

Slide 71 text

71 Ping (Pong)

Slide 72

Slide 72 text

72 Ping (Pong) PING {msg}

Slide 73

Slide 73 text

73 Ping (Pong) PING {msg} PONG {msg}

Slide 74

Slide 74 text

74 Ping (Pong) PING {msg} PONG {msg}

Slide 75

Slide 75 text

75 Ping (Pong) PING {msg} PONG {msg} ...

Slide 76

Slide 76 text

76 Ping (Pong) PING {msg} PONG {msg} ...

Slide 77

Slide 77 text

77 1. ping_match = re.match('PING :(.*)', msg) 2. if ping_match: 3. pong = ping_match.group(1) 4. envia_comando(s, f'PONG :{pong}')

Slide 78

Slide 78 text

78 E agora...

Slide 79

Slide 79 text

79 E agora...

Slide 80

Slide 80 text

80 Funcionalidade do bot

Slide 81

Slide 81 text

81 Detecção de URL

Slide 82

Slide 82 text

82 Detecção de URL (e de nick)

Slide 83

Slide 83 text

83 url_match = re.match(f':([a-zA-Z]+)!.* PRIVMSG {nick} :.*(https?://[a-zA-Z0-9.]+)', msg)

Slide 84

Slide 84 text

84 1. if url_match: 2. req = get(url_match.group(2)) 3. title = re.search('(.*)', req.text) 4. if title: 5. envia_comando(s, f'PRIVMSG {url_match.group(1)} :{title.group(1)}')

Slide 85

Slide 85 text

Muito obrigado! Alguma pergunta? Você pode falar comigo através de ▪ @yanorestes ▪ [email protected] 85

Slide 86

Slide 86 text

Agradecimentos Agradecimentos especiais para todo mundo que ajudou em algo com essa palestra: ▪ Organização e participantes da TDC <3! ▪ Casa do Código - yANPyTHON - 15%! ▪ SlidesCarnival, pela template da apresentação 86