วันนี้ผมจะสอนวิธีการเขียนโปรแกรม ปากกระบอกปืน สำหรับ ไออาร์ซี. ก่อนอื่นสำหรับผู้ที่ไม่รู้จักบอทคือโปรแกรมที่เชื่อมต่อกับช่อง 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 มีหลายคำสั่ง แต่อย่างที่บอกไปก่อนหน้านี้เป็นสิ่งที่จะไม่ลงรายละเอียด
ตัวอย่างเช่นเราสามารถทำให้บอททักทายผู้ใช้ที่เชื่อมต่อ:
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)
[/รหัส]
ฉันหวังว่าคุณจะชอบบทช่วยสอนนี้และแน่นอนฉันปล่อยลิงก์ไปยังโค้ดของบอทของฉันไว้ให้คุณเพื่อที่คุณจะได้เห็นโค้ดแบบเต็มและคุณจะได้เห็นวิธีการทำงานที่ดีขึ้น (แม้ว่าฉันจะลบคำสั่งบางอย่างออกไปเพื่อการใช้งานส่วนตัว)
เฮ้ฉันไม่ควรพลาดบอทของพล่ามที่คุณขี่ IRC 😛บทความที่น่าสนใจมาก
คำอธิบายที่ง่ายและชัดเจน
จะเกิดอะไรขึ้นถ้ารหัส python ไม่มีการเยื้องทั้งหมด
มันแก้ได้แล้ว ^^
บทความที่ยอดเยี่ยมและการเชื่อมต่อกับ IRC เพื่อตั้งโปรแกรมบอทนั้นง่ายเพียงใด :) ...
มันทำให้ฉันนึกถึงช่วงเวลานั้นที่เรารู้สึกเหมือนเป็นโปรแกรมเมอร์เมื่อเขียนสคริปต์สำหรับ mIRC ในการแชทบน MSN หรือ MSNGroups
น่าสนใจฉันเก็บไว้😀
ที่ยอดเยี่ยม!
มีประโยชน์มากขอบคุณ Son_Link!
ทักทาย!
ไชโย…
ทำตามบรรทัดของคุณและทดสอบสิ่งเดียวที่ได้ผลคือ
นำเข้าซ็อกเก็ต
นำเข้าสตริง
โฮสต์ = » 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 ...
คุณใช้ Python เวอร์ชันใด
ใช้ได้กับ python 2.6 และ 2.7 เท่านั้นไม่ใช่กับ 3.x
ฉันจะแก้ไขรายการเพื่อให้ชัดเจนขึ้น
รหัสที่สมบูรณ์ใช้ไม่ได้สำหรับฉันย่อหน้าสุดท้ายคือสิ่งที่ล้มเหลวและฉันไม่พบข้อผิดพลาด ถ้าฉันลบส่วนนั้นมันจะเชื่อมต่อและทำงานได้อย่างสมบูรณ์ ทดสอบกับ Python 2.7.3 บน Windows 7
PS: ในกรณีของฉันฉันเชื่อมต่อกับเซิร์ฟเวอร์ด้วยรหัสผ่านและเพิ่มบรรทัดเหล่านี้:
PASS = » Passdelbot »
s.send ("PASS% s \ r \ n"% PASS)
สวัสดี Son Link ขอบคุณมากสำหรับบทความนี้น่าสนใจมากฉันไม่สามารถตอบสนองต่อคำสั่งที่ส่งไปได้ โปรแกรมไม่เข้าสู่ if และฉันไม่สามารถหาสาเหตุได้
ฉันรอคำตอบของคุณ
กราเซีย
ฉันเพิ่งเพิ่มลิงก์ไปยังโค้ดทั้งหมดของบอทเนื่องจากมันแปลงสัญลักษณ์และโค้ดบางตัวแสดงโค้ด html
อย่างไรก็ตามฉันจะพยายามแสดงทุกอย่างให้ถูกต้อง