[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)
[/รหัส]

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

คาลิโคบอต


แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. ผู้รับผิดชอบข้อมูล: Miguel ÁngelGatón
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา

  1.   auroszx dijo

    เฮ้ฉันไม่ควรพลาดบอทของพล่ามที่คุณขี่ IRC 😛บทความที่น่าสนใจมาก

  2.   ยุติ dijo

    คำอธิบายที่ง่ายและชัดเจน
    จะเกิดอะไรขึ้นถ้ารหัส python ไม่มีการเยื้องทั้งหมด

  3.   rafa dijo

    บทความที่ยอดเยี่ยมและการเชื่อมต่อกับ IRC เพื่อตั้งโปรแกรมบอทนั้นง่ายเพียงใด :) ...

    มันทำให้ฉันนึกถึงช่วงเวลานั้นที่เรารู้สึกเหมือนเป็นโปรแกรมเมอร์เมื่อเขียนสคริปต์สำหรับ mIRC ในการแชทบน MSN หรือ MSNGroups

  4.   ทรูโกะ 22 dijo

    น่าสนใจฉันเก็บไว้😀

  5.   เจเนซิสวาร์กัสเจ (@elprincipiodeto) dijo

    ที่ยอดเยี่ยม!

  6.   เอลินซ์ dijo

    มีประโยชน์มากขอบคุณ Son_Link!

    ทักทาย!

  7.   ดีบิลลี่ dijo

    ไชโย…

    ทำตามบรรทัดของคุณและทดสอบสิ่งเดียวที่ได้ผลคือ
    นำเข้าซ็อกเก็ต
    นำเข้าสตริง

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

    การเปลี่ยนช่องและการตั้งชื่อตอนนี้ด้านล่างทำให้ฉันเกิดข้อผิดพลาดทางไวยากรณ์

    ฉันถามคนรู้จักคนอื่น ๆ แล้วพวกเขาบอกว่ามันไม่เหมือนงูเหลือม

    ฉันไม่รู้ว่าฉันทำอะไรผิดหรือทำไมฉันคัดลอกทุกอย่างแล้ววางลงใน python แล้วป้อนและเชื่อมต่อกับช่อง แต่หลังจาก 250 วินาทีช่องจะลบออกเพราะไม่มีการตอบสนองจาก pong ...

  8.   พินฟราย dijo

    รหัสที่สมบูรณ์ใช้ไม่ได้สำหรับฉันย่อหน้าสุดท้ายคือสิ่งที่ล้มเหลวและฉันไม่พบข้อผิดพลาด ถ้าฉันลบส่วนนั้นมันจะเชื่อมต่อและทำงานได้อย่างสมบูรณ์ ทดสอบกับ Python 2.7.3 บน Windows 7

    PS: ในกรณีของฉันฉันเชื่อมต่อกับเซิร์ฟเวอร์ด้วยรหัสผ่านและเพิ่มบรรทัดเหล่านี้:
    PASS = » Passdelbot »
    s.send ("PASS% s \ r \ n"% PASS)

  9.   ปลาโลมา dijo

    สวัสดี Son Link ขอบคุณมากสำหรับบทความนี้น่าสนใจมากฉันไม่สามารถตอบสนองต่อคำสั่งที่ส่งไปได้ โปรแกรมไม่เข้าสู่ if และฉันไม่สามารถหาสาเหตุได้
    ฉันรอคำตอบของคุณ
    กราเซีย