--- title: "πŸ—£οΈ IRC Π±ΠΎΡ‚ Π½Π° Python 3" date: 2022-09-23T22:54:34+03:00 draft: false tags: [python, irc, tutorial] --- ## Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π­Ρ‚ΠΎ руководство своСго Ρ€ΠΎΠ΄Π° ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΡƒΠΆΠ΅ Ρ€Π°Π·ΠΌΠ΅ΡˆΡ‘Π½Π½ΠΎΠΉ Π² сСти ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΏΠΎ написанию IRC Π±ΠΎΡ‚Π°. ## ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» IRC ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» IRC ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. IRC ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» **TCP** ΠΈ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ криптографичСский **TLS**. Π’ Π΄Π°Π½Π½ΠΎΠΌ руководствС для общСния я Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ `socket` ΠΈΠ· страндартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Python. ΠžΠ±Ρ‰Π΅Π½ΠΈΠ΅ с сСрвСром осущСстваляСтся посрСдством ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄, Π²ΠΎΡ‚ основныС ΠΈΠ· Π½ΠΈΡ…: ### `USER` Команда, для привСтствия с сСрвСром. ```text USER : ``` НапримСр: ```text USER iiiypuk localhost localhost :Alexander ``` ### PASS ΠŸΠ°Ρ€ΠΎΠ»ΡŒ, Ссли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для Π·Π°Ρ…ΠΎΠ΄Π° Π½Π° сСрвСр. ### NICK Команда для смСны Π½ΠΈΠΊΠ°. ### PONG ΠžΡ‚Π²Π΅Ρ‚ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ сСрвСра `PING`. ### JOIN Команда для Π²Ρ…ΠΎΠ΄Π° Π² ΠΊΠ°Π½Π°Π». ```text JOIN # ``` ### PART Команда, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· ΠΊΠ°Π½Π°Π»Π°. МоТно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ΡƒΡ…ΠΎΠ΄Π° ΠΈΠ· ΠΊΠ°Π½Π°Π»Π°, добисав Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Ρ‚. ```text PART #support_chanel ``` ### PRIVMSG Команда, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ сообщСниС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΈΠ»ΠΈ Π½Π° ΠΊΠ°Π½Π°Π». ```text PRIVMSG : ``` ### QUIT Команда, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ сСрвСра. ## ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ сСрвСра Помимо ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π½Π° сСрвСр, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΎΡ‚ сСрвСра. ### PING Π‘Π΅Ρ€Π²Π΅Ρ€ врСмя ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ посылаСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ PING, Π½Π° случай, Ссли ΠΊΠ»ΠΈΠ΅Π½Ρ‚ повиснСт. Если быстро Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΏΠΈΠ½Π³ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ PONG, сСрвСр Ρ€Π°Π·ΠΎΡ€Π²Ρ‘Ρ‚ соСдинСниС. ### : ```text :!@ ``` `` событиС, созданноС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ``. НапримСр `` ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» Ρ‚Π΅Π±Π΅ сообщСниС ΠΈΠ»ΠΈ Π²Ρ‹ΠΊΠΈΠ½ΡƒΠ» тСбя ΠΈΠ· ΠΊΠ°Π½Π°Π»Π°. ### PRIVMSG ```text PRIVMSG : ``` НовоС сообщСниС, Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΈΠ»ΠΈ Π² ΠΊΠ°Π½Π°Π». ### KICK ```text KICK ``` ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ `` ΠΊΠΈΠΊΠ½ΡƒΠ»ΠΈ с ΠΊΠ°Π½Π°Π»Π° ``. ## ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ сСрвСру ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ```python server = 'iiiypuk.me' # адрСс сСрвСра channel = '#admin' # имя ΠΊΠ°Π½Π°Π»Π° botnick = 'porteus' # Π½ΠΈΠΊ Π±ΠΎΡ‚Π° ``` Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ socket ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠΌΡΡ ΠΊ сСрвСру. ```python import socket irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) irc.connect((server, 6667)) ``` Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сСрвСром этого Π½Π΅ достаточно, Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг, это "рСгистрация" Π±ΠΎΡ‚Π° Π½Π° сСрвСрС. ```python irc.send(str.encode('USER ' + botnick + ' localhost localhost :This is a bot!\n')) irc.send(str.encode('NICK ' + botnick + '\n')) irc.send(str.encode('JOIN '+ channel +'\n')) ``` ΠžΠ±Ρ€Π°Ρ‚ΠΈΠ» Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ `str.encode`, которая ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ **UTF-8** строку Π² Π½Π°Π±ΠΎΡ€ Π±Π°ΠΉΡ‚ΠΎΠ². Если ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΡŽ строку, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ `TypeError`: ```text Traceback (most recent call last): File "/home/user/Temp/IRCBOT/./bot.py", line 14, in irc.send('USER ' + botnick + ' localhost localhost :This is a bot!\n') TypeError: a bytes-like object is required, not 'str' ``` МоТно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ `b` ΠΏΠ΅Ρ€Π΅Π΄ строкой ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ `bytes()` для прСобразования строк Π² Π½Π°Π±ΠΎΡ€ Π±Π°ΠΉΡ‚ΠΎΠ², Π½ΠΎ я Π»ΡƒΡ‡ΡˆΠ΅ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΡŽ ΠΊΠΎΠ΄, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ `encode`. ```python irc.send(b'USER ' + bytes(botnick, encoding = 'utf-8') + b' localhost localhost :This is a bot!\n') ``` И Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ сообщСния ΠΎΡ‚ сСрвСра. ```python while True: text = irc.recv(2040) print(text) ``` НиТС ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡŽ ΠΏΠΎΠ»Π½Ρ‹ΠΉ листинг ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ```python #!/usr/bin/env python3 import socket server = 'iiiypuk.me' channel = '#admin' botnick = 'porteus' irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print('Connecting to: ' + server) irc.connect((server, 6667)) irc.send(str.encode('USER ' + botnick + ' localhost localhost :This is a bot!\n')) irc.send(str.encode('NICK ' + botnick + '\n')) irc.send(str.encode('JOIN '+ channel +'\n')) while True: text = irc.recv(2040) print(text) if text.find(str.encode('PING')) != -1: irc.send(str.encode('PONG ' + str(text.split()[1]) + '\r\n')) ``` Π― Π² Π³Π»Π°Π²Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΎΡ‚Π²Π΅Ρ‚ Π·Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ сСрвСра **PING**. ## ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ дСйствия Π§Π΅Ρ€Π΅Π· ΠΈΠ½ΡΡ‚ΡƒΠΊΡ†ΠΈΡŽ `if` Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π±ΠΎΡ‚Ρƒ ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π‘ΠΎΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ UNIX. ```python # !time - return current timestamp if text.find(str.encode('!time')) != -1: ts = time.time() irc.send(str.encode('PRIVMSG #admin :{}\r\n'.format(int(ts)))) ``` Код Π±ΠΎΡ‚Π° ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎ этой ссылкС. [iiiypuk/snipplets.dev:Python/irc-bot.py](https://git.a2s.su/iiiypuk/snipplets.dev/src/branch/master/~/Python/irc-bot.py) ## ΠŸΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти На ΠΌΠΎΠ΅ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ скрипт потрСбляСт ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 6,8-7.0Mb. ```text Linux porteus.example.net 5.18.8-porteus #1 SMP PREEMPT_DYNAMIC Sat Jul 2 10:05:31 MSK 2022 x86_64 Intel(R) Core(TM)2 Duo CPU T6570 @ 2.10GHz GenuineIntel GNU/Linux ``` Π’ΠΎΡ‚ ΠΆΠ΅ самый ΠΊΠΎΠ΄, Π½ΠΎ Π½Π° [Crystal](https://crystal-lang.org/) потрСбляСт 1.7Mb памяти. ## Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ * Internet Relay Chat Protocol RFC [[Бсылка]](http://web.archive.org/web/20170929015000/http://www2.irchelp.org:80/irchelp/rfc/rfc.html) * How do i program a simple IRC bot in python? [[Бсылка]](https://stackoverflow.com/questions/2968408/how-do-i-program-a-simple-irc-bot-in-python) * ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ описаниС ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° IRC ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΡ‚Π° [[Бсылка]](https://eax.me/irc-descr/) * ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ IRC-Π±ΠΎΡ‚ Π½Π° Python, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈ Ρ‡Π΅ΠΌ Ρ‚ΡƒΡ‚ Slack, Gitter ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ Π²Π΅Π±-Ρ‡Π°Ρ‚Ρ‹ [[Бсылка]](https://eax.me/python-irc-bot/)