[Python] ตั้งโปรแกรมบอทสำหรับ IRC

วันนี้ผมจะสอนวิธีการเขียนโปรแกรม ปากกระบอกปืน สำหรับ ไออาร์ซี. ก่อนอื่นสำหรับผู้ที่ไม่รู้จักบอทคือโปรแกรมที่เชื่อมต่อกับช่อง IRC และโต้ตอบกับมันซึ่งช่วยให้เราสามารถกลั่นกรองช่องได้โดยไม่ต้อง ที่เราเชื่อมต่อกัน ดังนั้นจึงหลีกเลี่ยงสแปมหรือรับรู้ชุดคำสั่งและดำเนินการรหัสที่เกี่ยวข้อง
ถึงแม้ว่าจะมีบอทพร้อมอยู่แล้ว แต่ฉันก็เป็นคนหนึ่งที่ชอบสร้างโปรแกรมของตัวเองเพื่อเรียนรู้และความพึงพอใจอย่างมากที่ได้รับหลังจากเห็นว่ามันใช้งานได้ ^^

จากที่กล่าวไปเรามาดูบทแนะนำกัน

ในการตั้งโปรแกรมบอทเราจะต้องมีไฟล์ โปรแกรมแก้ไขข้อความธรรมดา ใด (nano, gedit, medit ฯลฯ ) และ y ล่ามหลาม (2.6 หรือ 2.7 จำเป็น ไม่ทำงานกับ python 3.x).

ก่อนอื่นเรานำเข้าไฟล์ โมดูลที่จำเป็นในกรณีนี้เราต้องการเพียงสอง:

[code] #! / usr / bin / env python
# - * - การเข้ารหัส: utf-8 - * -

นำเข้าซ็อกเก็ต
นำเข้าสตริง
[/รหัส]

ตอนนี้เราดำเนินการต่อไป กำหนดค่า บอท:

[รหัส] HOST=»irc.desdelinux.สุทธิ"
พอร์ต = 6667
NICK = » CalicoBot »
IDENT = » CalicoBot »
REALNAME = » CalicoBot »
CHAN = » # หน้าแรก»
readbuffer = »»
[/รหัส]

ฉันจะอธิบายแต่ละตัวแปร:

  • พิธีกร: URL ของเซิร์ฟเวอร์ที่เราจะเชื่อมต่อ
  • ท่าเรือ: พอร์ตเซิร์ฟเวอร์ โดยค่าเริ่มต้นคือ 6667
  • NICK, IDENT และ REALNAME: พวกเขาสอดคล้องกับชื่อเล่นของบอทรหัสประจำตัวและชื่อจริง
  • ช่อง: ช่องที่บอทจะเข้า
  • Readbuffer: ในตัวแปรนี้ข้อมูลที่ส่งโดยเซิร์ฟเวอร์จะถูกบันทึก

เมื่อกำหนดค่าบอทของเราแล้วเราจะดำเนินการต่อ การเชื่อมต่อ

[code] s = socket.socket ()
s.connect ((โฮสต์พอร์ต))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("USER% s% s bla:% s \ r \ n"% (IDENT, HOST, REALNAME))
s.send ("เข้าร่วม:% s \ r \ n"% CHAN)
[/รหัส]

บรรทัดแรกไม่มีความลึกลับมากนักบรรทัดที่สองสร้างไฟล์ การเชื่อมต่อเซิร์ฟเวอร์ และสามคนสุดท้ายส่งข้อมูลของบอทไปยังเซิร์ฟเวอร์เพื่อดำเนินการเข้าสู่ระบบ

เมื่อเชื่อมต่อแล้วเราจะสร้างไฟล์ วนไม่มีสิ้นสุด ที่เราจะไป การรับและส่งข้อมูลจาก / ไปยังเซิร์ฟเวอร์:

[code] ขณะที่ 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
สำหรับบรรทัดในอุณหภูมิ:
line = string.rstrip (บรรทัด)
บรรทัด = line.split (CHAN + ':')

ถ้าบรรทัด [0] .find ("PING")! = -1:
pingid = line [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
[/รหัส]

จากทุกบรรทัดที่เขียนไว้ข้างต้นฉันจะแสดงความคิดเห็นเฉพาะในส่วนที่สำคัญเท่านั้น
กับ บรรทัด = line.split (CHAN + ':') สิ่งที่เราทำคือแบ่งสิ่งที่เซิร์ฟเวอร์ส่งมาให้เราเมื่อ มารับบางสิ่งจากช่อง
ตัวอย่างเช่นบรรทัดต่อไปนี้ระบุว่ามีคนเขียนบางอย่างในช่อง:

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

ประการแรกคือชื่อเล่นของผู้ใช้และข้อมูลการเชื่อมต่อ (คั่นด้วย!) คำสั่ง (ในกรณีนี้แสดงว่าเขาเขียน) ช่องและสุดท้ายหลังจากเครื่องหมายทวิภาคข้อความที่ส่ง ฉันจะไม่อธิบายคำสั่งอื่น ๆ อีกมากมายเนื่องจากไม่ได้อยู่ในบทช่วยสอนนี้

เส้นที่สำคัญอื่น ๆ คือเส้น อยู่หลัง if เซิร์ฟเวอร์มักจะส่งคำสั่ง PING เพื่อตรวจสอบว่าผู้ใช้ยังเชื่อมต่ออยู่หรือไม่ ในกรณีนี้บอทจะส่งคำสั่ง PONG พร้อม ID ที่ PING ส่งไปเพื่อระบุไปยังเซิร์ฟเวอร์ว่ายังเชื่อมต่ออยู่

ด้วยสิ่งนี้เรามีฐานของบอทอยู่แล้ว ตอนนี้ฉันจะอธิบายวิธีทำให้บอทตอบสนองตามสิ่งที่เราต้องการสำหรับคำสั่งบางอย่างไม่ว่าจะมาจาก IRC เองหรือจากผู้ใช้

การตอบสนองต่อคำสั่ง IRC:

PING และ PRIVMSG เป็นตัวอย่างของคำสั่ง IRC มีหลายคำสั่ง แต่อย่างที่บอกไปก่อนหน้านี้เป็นสิ่งที่จะไม่ลงรายละเอียด
ตัวอย่างเช่นเราสามารถทำให้บอททักทายผู้ใช้ที่เชื่อมต่อ:

[code] ถ้าบรรทัด [0] .find ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK และ name.find (HOST) == -1:
s.send ("PRIVMSG% s: ยินดีต้อนรับ @% s ^^ \ n"% (CHAN, name))
[/รหัส]

ก่อนอื่นให้ตรวจสอบว่าเซิร์ฟเวอร์ส่งคำสั่งหรือไม่ สมัคร ซึ่งระบุว่ามีคนเชื่อมต่อกับเซิร์ฟเวอร์ จากนั้นเราแยกนิคเราตรวจสอบว่านิคไม่ใช่ URL ของ IRC (ถ้าไม่ทันทีที่เราเรียกใช้บอทมันจะทักทาย url) และในที่สุดเราก็ส่งข้อความทักทาย

คำสั่ง Bot:

ตอนนี้ฉันจะสร้างบอทได้อย่างไร ตอบสนองต่อคำสั่งของฉันเองเหรอ? มาดูตัวอย่างกันดีกว่า:

[code] if บรรทัด [1] == '$ version':
s.send (« PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n »% CHAN)
[/รหัส]

ในตัวอย่างนี้หากมีคนเขียน $ รุ่น บอทจะแสดงข้อความที่ระบุชื่อเวอร์ชันและผู้แต่ง โค้ดที่สมบูรณ์ของตัวอย่างมีดังนี้:

[code] นำเข้าซ็อกเก็ต
นำเข้าสตริง

โฮสต์ = » localhost »
พอร์ต = 6667
NICK = » CalicoBot »
IDENT = » CalicoBot »
REALNAME = » CalicoBot »
CHAN = » # หน้าแรก»
readbuffer = »»
s = ซ็อกเก็ตซ็อกเก็ต ()
s.connect ((โฮสต์พอร์ต))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("USER% s% s bla:% s \ r \ n"% (IDENT, HOST, REALNAME))
s.send ("เข้าร่วม:% s \ r \ n"% CHAN)

ในขณะที่ 1:

readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
สำหรับบรรทัดในอุณหภูมิ:
สายการพิมพ์
line = string.rstrip (บรรทัด)
บรรทัด = line.split (CHAN + ':')

ถ้าบรรทัด [0] .find ("PING")! = -1:
pingid = line [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)

ถ้าบรรทัด [0] .find ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK และ name.find (HOST) == -1:
s.send ("PRIVMSG% s: ยินดีต้อนรับ @% s ^^ \ n"% (CHAN, name))

ถ้า len (บรรทัด) <1:
ถ้าบรรทัด [1] == '$ version':
s.send (« PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n »% CHAN)
[/รหัส]

ฉันหวังว่าคุณจะชอบบทช่วยสอนนี้และแน่นอนฉันปล่อยลิงก์ไปยังโค้ดของบอทของฉันไว้ให้คุณเพื่อที่คุณจะได้เห็นโค้ดแบบเต็มและคุณจะได้เห็นวิธีการทำงานที่ดีขึ้น (แม้ว่าฉันจะลบคำสั่งบางอย่างออกไปเพื่อการใช้งานส่วนตัว)

คาลิโคบอต