[Python] IRC 용 봇 프로그래밍

오늘은 프로그램 방법을 가르쳐 드리겠습니다. 포구 파라 IRC. 우선, 모르는 사람들에게 봇은 IRC 채널에 연결하고 상호 작용하는 프로그램으로, 예를 들어 우리가 연결되어 있다는 따라서 스팸을 피하거나 일련의 주문을 인식하고 해당 코드를 실행합니다.
이미 봇이 준비되어 있지만, 솔직히 스스로 배울 수있는 프로그램을 만들고 싶은 분들 중 한 명이며, 작동하는 것을보고 큰 만족을드립니다 ^^

그 말로 튜토리얼로 넘어 갑시다.

봇을 프로그래밍하려면 일반 텍스트 편집기 누구든지 (nano, gedit, medit 등)파이썬 인터프리터 (2.6 또는 2.7이 필요합니다. 파이썬 3.x에서 작동하지 않습니다.).

먼저 우리는 필수 모듈,이 경우 두 가지만 필요합니다.

[코드] #! / usr / bin / env python
#-*-코딩 : utf-8-*-

수입 소켓
가져 오기 문자열
[/ 코드]

이제 우리는 구성 봇 :

[코드] HOST=»irc.desdelinux.그물"
PORT = 6667
NICK =»CalicoBot»
IDENT =»CalicoBot»
REALNAME =»CalicoBot»
CHAN =»# 홈»
읽기 버퍼 =»»
[/ 코드]

각 변수에 대해 설명하겠습니다.

  • HOST : 연결할 서버의 URL
  • 포트: 서버 포트. 기본적으로 6667입니다.
  • NICK, IDENT 및 REALNAME : 그들은 봇의 별명, 식별 및 실명에 해당합니다.
  • 찬 : 봇이 들어갈 채널
  • 읽기 버퍼 : 이 변수에는 서버에서 보낸 데이터가 저장됩니다.

봇이 구성되면 연결

[코드] s = socket.socket ()
s.connect ((HOST, PORT))
s.send ( "NICK % s \ r \ n"% NICK)
s.send ( "USER % s % s bla : % s \ r \ n"% (IDENT, HOST, REALNAME))
s.send ( "JOIN : % s \ r \ n"% CHAN)
[/ 코드]

첫 번째 줄에는 미스터리가 많지 않고 두 번째 줄은 서버 연결 마지막 세 명은 봇의 데이터를 서버로 보내 로그인을 진행합니다.

연결되면 무한 루프 우리가 갈 서버에서 /로 데이터 수신 및 전송:

[코드] 동안 1 :
readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = 임시 팝 ()
임시 줄 :
줄 = string.rstrip (줄)
line = line.split (CHAN + ':')

줄 [0] .find ( "PING")! = -1 인 경우 :
pingid = 줄 [0] .split () [1] s.send ( "PONG % s \ r \ n"% pingid)
[/ 코드]

위에 쓰여진 모든 줄 중에서 중요한 줄에 대해서만 설명하겠습니다.
line = line.split (CHAN + ':') 우리가하는 일은 서버가 우리에게 보내는 것을 나누는 것입니다. 채널에서 뭔가를 얻자.
예를 들어 다음 줄은 누군가 채널에 무언가를 썼음을 나타냅니다.

:son_link!sonlink@127.0.0.1 PRIVMSG #Home :Hola ^^

첫 번째는 사용자의 닉네임과 연결 데이터 (!로 구분), 명령 (이 경우 그가 작성했음을 나타냄), 채널 및 마지막으로 콜론 뒤에 보낸 메시지입니다. 이 튜토리얼에 속하지 않기 때문에 더 많은 명령을 설명하지 않겠습니다.

다른 중요한 라인은 if 뒤에 있습니다. 서버는 사용자가 여전히 연결되어 있는지 확인하기 위해 PING 명령을 자주 보냅니다. 이 경우 봇은 PING이 보낸 ID와 함께 PONG 명령을 전송하여 아직 연결되어 있음을 서버에 표시합니다.

이것으로 우리는 이미 봇의 기반을 가지고 있습니다. 이제 IRC 자체에서 왔든 사용자로부터 왔든, 특정 명령에 대해 우리가 원하는대로 봇이 응답하도록 만드는 방법을 설명하겠습니다.

IRC 명령에 응답 :

PING 및 PRIVMSG는 IRC 명령의 예입니다. 많은 명령이 있지만 앞서 말했듯이 자세히 다루지 않을 것입니다.
예를 들어, 연결하는 사용자에게 봇이 인사하도록 만들 수 있습니다.

[code] if line [0] .find ( 'JOIN')! = -1 :
name = line [0] .split ( '!') [0] .split ( ':') [1] if name! = NICK and name.find (HOST) == -1 :
s.send ( "PRIVMSG % s : @ % s ^^ \ n"% (CHAN, name))
[/ 코드]

먼저 서버가 명령을 보내는 지 확인합니다. JOIN 누군가가 서버에 연결되었음을 나타냅니다. 그런 다음 닉을 추출하고 닉이 IRC URL이 아닌지 확인합니다. (봇을 실행하자마자 URL이 표시되지 않으면) 마지막으로 인사 메시지를 보냅니다.

봇 명령 :

이제 내 봇을 어떻게 만드나요? 내 명령에 응답? 예를 더 잘 살펴 보겠습니다.

[code] if line [1] == '$ version':
s.send («PRIVMSG % s : CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ 코드]

이 예에서 누군가가 $ 버전 봇은 이름, 버전 및 작성자를 나타내는 메시지를 표시합니다. 예제의 전체 코드는 다음과 같습니다.

[코드] 소켓 가져 오기
가져 오기 문자열

HOST =»localhost»
PORT = 6667
NICK =»CalicoBot»
IDENT =»CalicoBot»
REALNAME =»CalicoBot»
CHAN =»# 홈»
읽기 버퍼 =»»
s = 소켓. 소켓 ()
s.connect ((HOST, PORT))
s.send ( "NICK % s \ r \ n"% NICK)
s.send ( "USER % s % s bla : % s \ r \ n"% (IDENT, HOST, REALNAME))
s.send ( "JOIN : % s \ r \ n"% CHAN)

동안 1 :

readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = 임시 팝 ()
임시 줄 :
인쇄 라인
줄 = string.rstrip (줄)
line = line.split (CHAN + ':')

줄 [0] .find ( "PING")! = -1 인 경우 :
pingid = 줄 [0] .split () [1] s.send ( "PONG % s \ r \ n"% pingid)

줄 [0] .find ( 'JOIN')! = -1 :
name = line [0] .split ( '!') [0] .split ( ':') [1] if name! = NICK and name.find (HOST) == -1 :
s.send ( "PRIVMSG % s : @ % s ^^ \ n"% (CHAN, name))

len (라인) <1 인 경우 :
줄 [1] == '$ 버전':
s.send («PRIVMSG % s : CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ 코드]

이 튜토리얼이 마음에 드셨기를 바라며, 물론 내 봇 코드에 대한 링크를 남겨 두어 전체 코드를 볼 수 있고 어떻게 작동하는지 더 잘 볼 수 있습니다. (개인용으로 일부 명령을 제거했지만).

칼리코봇


코멘트를 남겨주세요

귀하의 이메일 주소는 공개되지 않습니다. 필수 필드가 표시되어 있습니다 *

*

*

  1. 데이터 책임자 : Miguel Ángel Gatón
  2. 데이터의 목적 : 스팸 제어, 댓글 관리.
  3. 합법성 : 귀하의 동의
  4. 데이터 전달 : 법적 의무에 의한 경우를 제외하고 데이터는 제 XNUMX 자에게 전달되지 않습니다.
  5. 데이터 저장소 : Occentus Networks (EU)에서 호스팅하는 데이터베이스
  6. 권리 : 귀하는 언제든지 귀하의 정보를 제한, 복구 및 삭제할 수 있습니다.

  1.   오로스Zx

    Heh, IRC에서 타는 헛소리의 Bot을 놓칠 수 없었습니다. 😛 매우 흥미로운 기사.

  2.   중지

    매우 간단하고 명확한 설명.
    파이썬 코드에 모든 들여 쓰기가 누락되어 있다면 어떨까요?

  3.   라파

    훌륭한 기사와 봇을 프로그래밍하기 위해 IRC에 연결하는 것이 얼마나 쉬운 지 :)…

    MSN 또는 MSNGroups 채팅에서 mIRC 용 스크립트를 작성하는 프로그래머처럼 느껴지 던 시절이 생각납니다.

  4.   Truko22

    흥미 롭습니다 😀

  5.   Genesis Vargas J. (@ elprincipiodeto)

    우수!

  6.   엘링크스

    매우 유용합니다. Son_Link에게 감사드립니다!

    안녕하십니까!

  7.   디빌리스

    건배…

    당신의 라인을 따르고 작동하는 유일한 것은 테스트하는 것입니다
    수입 소켓
    가져 오기 문자열

    HOST =»localhost»
    PORT = 6667
    NICK =»CalicoBot»
    IDENT =»CalicoBot»
    REALNAME =»CalicoBot»
    CHAN =»# 홈»
    읽기 버퍼 =»»
    s = 소켓. 소켓 ()
    s.connect ((HOST, PORT))
    s.send ( "NICK % srn"% NICK)
    s.send ( "USER % s % s bla : % srn"% (IDENT, HOST, REALNAME))
    s.send ( "JOIN : % srn"% CHAN)

    채널과 닉을 변경하면 아래에서 오류 구문이 발생합니다.

    다른 지인들에게 물어 보니 파이썬처럼 보이지 않는다고합니다

    나는 내가 뭘 잘못하고 있는지 또는 왜 모든 것을 복사하여 파이썬에 붙여넣고 그것을 입력하면 채널에 연결되지만 250 초 후에 퐁에서 응답이 없기 때문에 채널이 제거합니다.

  8.   꼬집음

    전체 코드가 작동하지 않고 마지막 단락이 실패한 것이며 오류를 찾을 수 없습니다. 그 부분을 삭제하면 완벽하게 연결되어 작동합니다. Windows 2.7.3에서 Python 7으로 테스트되었습니다.

    추신 : 제 경우에는 암호로 서버에 연결하고 다음 줄을 추가합니다.
    PASS =»Passdelbot»
    s.send ( "PASS % s \ r \ n"% PASS)

  9.   돌고래

    Hi Son Link, 기사 주셔서 대단히 감사합니다. 매우 흥미 롭습니다. 전송 된 명령에 응답 할 수 없습니다. 프로그램이 마지막으로 들어 가지 않고 이유를 알 수 없습니다. "if len (line)> 1 :"
    나는 너의 대답을 기다린다.
    감사합니다