[Python] برنامج بوت لـ IRC

سأعلمك اليوم كيفية برمجة أ بوت إلى IRC. بادئ ذي بدء ، بالنسبة لأولئك الذين لا يعرفون ، فإن الروبوت هو برنامج يتصل بقناة IRC ويتفاعل معها ، مما يسمح لنا ، على سبيل المثال ، بمراجعة القناة بدون أننا متصلون وبالتالي تجنب البريد العشوائي ، أو أنه يتعرف على سلسلة من الأوامر وينفذ الكود المقابل.
على الرغم من وجود روبوتات جاهزة بالفعل ، إلا أنني بصراحة أحد أولئك الذين يرغبون في إنشاء برامجهم الخاصة للتعلم والرضا الكبير الذي يمنحنا إياه بعد رؤيتها تعمل ^^

مع ذلك ، دعنا ننتقل إلى البرنامج التعليمي.

لبرمجة الروبوت ، سنحتاج إلى ملف محرر نص عادي cualquiera (nano، gedit، medit، etc) و مترجم بيثون (سيكون 2.6 أو 2.7 ضروريًا ، لا يعمل مع بيثون 3.x).

أولاً نقوم باستيراد ملف الوحدات المطلوبة، في هذه الحالة سنحتاج فقط اثنين:

[كود] #! / usr / bin / env python
# - * - الترميز: utf-8 - * -

مقبس الاستيراد
سلسلة الاستيراد
[/ الرمز]

الآن ننتقل إلى تكوين الروبوت:

[code] HOST=»irc.desdelinux.net»
المنفذ = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# الصفحة الرئيسية»
readbuffer = »»
[/ الرمز]

سأشرح كل متغير:

  • 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 ("الانضمام:٪ s \ r \ n"٪ CHAN)
[/ الرمز]

السطر الأول ليس به الكثير من الغموض ، والثاني يخلق اتصال الخادم وتقوم الثلاثة الأخيرة بإرسال بيانات الروبوت إلى الخادم لمتابعة تسجيل الدخول.

بمجرد الاتصال سنقوم بإنشاء ملف حلقة لا نهائية الذي سنذهب فيه استقبال وإرسال البيانات من / إلى الخادم:

[كود] بينما 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer، "\ n")
readbuffer = temp.pop ()
للخط في درجة الحرارة:
line = string.rstrip (line)
line = line.split (CHAN + ':')

إذا كان السطر [0]. ابحث عن ("PING")! = -1:
pingid = line [0] .split () [1] s.send ("PONG٪ s \ r \ n"٪ pingid)
[/ الرمز]

من بين جميع الأسطر المكتوبة أعلاه ، سأعلق فقط على الأسطر المهمة.
مع line = line.split (CHAN + ':') ما نقوم به هو تقسيم ما يرسله الخادم إلينا ومتى دعنا نحصل على شيء من القناة.
على سبيل المثال ، يشير السطر التالي إلى أن شخصًا ما كتب شيئًا ما على القناة:

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

الأول هو اسم المستخدم المستعار وبيانات الاتصال (مفصولة!) ، والأمر (في هذه الحالة يشير إلى أنه كتب) ، والقناة ، وأخيراً ، بعد النقطتين ، تم إرسال الرسالة. لن أشرح العديد من الأوامر لأن ذلك لا يقع ضمن هذا البرنامج التعليمي.

الخطوط المهمة الأخرى هي تلك هم بعد إذا. يرسل الخادم في كثير من الأحيان الأمر PING للتحقق مما إذا كان المستخدم لا يزال متصلاً. في هذه الحالة ، يرسل الروبوت الأمر PONG بمعرّف أرسله PING للإشارة إلى الخادم أنه لا يزال متصلاً.

مع هذا لدينا بالفعل قاعدة الروبوت. الآن سأشرع في شرح كيفية جعل الروبوت يستجيب وفقًا لما نريده لأوامر معينة ، سواء كانت من IRC نفسها أو من المستخدمين.

الاستجابة لأوامر IRC:

PING و PRIVMSG هي أمثلة لأوامر IRC. هناك العديد من الأوامر ، لكن كما قلت من قبل ، هذا شيء لن أخوض فيه في التفاصيل.
على سبيل المثال ، يمكننا جعل الروبوت يرحب بالمستخدمين المتصلين:

[كود] إذا السطر [0]. ابحث عن ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK and name.find (HOST) == -1:
s.send ("PRIVMSG٪ s: مرحبًا @٪ s ^^ \ n"٪ (CHAN ، الاسم))
[/ الرمز]

أولاً نتحقق مما إذا كان الخادم يرسل الأمر الانضمام مما يشير إلى أن شخصًا ما متصل بالخادم. ثم نستخرج النك ، ونتحقق من أن النك ليس عنوان url الخاص بـ IRC (إذا لم يكن الأمر كذلك بمجرد تشغيل الروبوت ، فسيتم الترحيب بعنوان url) وأخيرًا نرسل رسالة التحية.

أوامر البوت:

الآن كيف أصنع الروبوت الخاص بي الرد على أوامري؟ لنلق نظرة أفضل على مثال:

[كود] إذا كان السطر [1] == 'الإصدار $':
s.send («PRIVMSG٪ s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»٪ CHAN)
[/ الرمز]

في هذا المثال إذا كتب شخص ما الإصدار $ سيعرض الروبوت الرسالة التي تشير إلى اسمه وإصداره ومؤلفه. الكود الكامل للمثال هو هذا:

[كود] مأخذ الاستيراد
سلسلة الاستيراد

HOST = »مضيف محلي»
المنفذ = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# الصفحة الرئيسية»
readbuffer = »»
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 ("الانضمام:٪ s \ r \ n"٪ CHAN)

بينما 1:

readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer، "\ n")
readbuffer = temp.pop ()
للخط في درجة الحرارة:
خط الطباعة
line = string.rstrip (line)
line = line.split (CHAN + ':')

إذا كان السطر [0]. ابحث عن ("PING")! = -1:
pingid = line [0] .split () [1] s.send ("PONG٪ s \ r \ n"٪ pingid)

إذا كان السطر [0]. ابحث عن ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK and name.find (HOST) == -1:
s.send ("PRIVMSG٪ s: مرحبًا @٪ s ^^ \ n"٪ (CHAN ، الاسم))

إذا كان لين (خط) <1:
إذا كان السطر [1] == "إصدار بالدولار":
s.send («PRIVMSG٪ s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»٪ CHAN)
[/ الرمز]

أتمنى أن يعجبك هذا البرنامج التعليمي ، وبالطبع أترك لك رابط رمز الروبوت الخاص بي حتى تتمكن من رؤية الكود الخاص به بالكامل ويمكنك أن ترى بشكل أفضل كيف يعمل (على الرغم من أنني قمت بإزالة بعض الأوامر للاستخدام الشخصي).

كاليكوبوت


12 تعليقات ، اترك لك

اترك تعليقك

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها ب *

*

*

  1. المسؤول عن البيانات: ميغيل أنخيل جاتون
  2. الغرض من البيانات: التحكم في الرسائل الاقتحامية ، وإدارة التعليقات.
  3. الشرعية: موافقتك
  4. توصيل البيانات: لن يتم إرسال البيانات إلى أطراف ثالثة إلا بموجب التزام قانوني.
  5. تخزين البيانات: قاعدة البيانات التي تستضيفها شركة Occentus Networks (الاتحاد الأوروبي)
  6. الحقوق: يمكنك في أي وقت تقييد معلوماتك واستعادتها وحذفها.

  1.   أوروش قال

    هيه ، لا يمكنني أن أفتقد روبوت الهراء الذي تركب على IRC مقال ممتع للغاية.

  2.   سيزار قال

    شرح بسيط جدا وواضح.
    ماذا لو كان كود بيثون يفتقد كل المسافات البادئة.

  3.   رافا قال

    مقالة ممتازة ومدى سهولة الاتصال بـ IRC لبرمجة روبوت:) ...

    إنه يذكرني بتلك الأوقات عندما شعرنا بأن المبرمجين يكتبون نصوصًا لـ mIRC في محادثات MSN أو MSNGroups

  4.   تروكو 22 قال

    مثيرة للاهتمام احتفظ بها 😀

  5.   جينيسيس فارغاس ج. (@ Principiodeto) قال

    ممتاز!

  6.   إلينكس قال

    مفيد جدا ، شكرا Son_Link!

    تحيات!

  7.   com.dbillyx قال

    في صحتك…

    متابعة سطورك واختبار الشيء الوحيد الذي يعمل هو
    مقبس الاستيراد
    سلسلة الاستيراد

    HOST = »مضيف محلي»
    المنفذ = 6667
    NICK = »CalicoBot»
    IDENT = »CalicoBot»
    REALNAME = »CalicoBot»
    CHAN = »# الصفحة الرئيسية»
    readbuffer = »»
    s = socket.socket ()
    s.connect ((HOST، PORT))
    s.send ("NICK٪ srn"٪ NICK)
    s.send ("USER٪ s٪ s bla:٪ srn"٪ (IDENT، HOST، REALNAME))
    s.send ("الانضمام:٪ srn"٪ CHAN)

    تغيير القناة والنك الآن يلقي لي أدناه بناء جملة خطأ

    سألت معارف آخرين وأخبروني أن هذا لا يشبه الثعبان

    لا أعرف ما الذي أفعله بشكل خاطئ أو لماذا أنسخ كل شيء وألصقه في لغة python وأدخلها وتتصل بالقناة ولكن بعد 250 ثانية تزيلها القناة لأنه لم يكن هناك استجابة من pong ...

  8.   بينفري قال

    الكود الكامل لا يعمل معي ، الفقرة الأخيرة هي ما فشل ولا يمكنني العثور على الخطأ. إذا قمت بحذف هذا الجزء ، فإنه يتصل ويعمل بشكل مثالي. تم الاختبار مع Python 2.7.3 على Windows 7.

    ملاحظة: في حالتي ، أقوم بالاتصال بخادم بكلمة مرور وأضف هذه الأسطر:
    PASS = »Passdelbot»
    s.send ("PASS٪ s \ r \ n"٪ PASS)

  9.   دولفين قال

    مرحبًا يا بني لينك ، شكرًا جزيلاً لك على المقالة ، إنه ممتع جدًا ، لا يمكنني الرد على الأوامر المرسلة. لا ينتقل البرنامج إلى الأخير إذا لم أستطع معرفة السبب: "إذا كان len (سطر)> 1:"
    أنتظر جوابك.
    شكرا