كيف يمكنني الحصول على Jabber في بيرل :: Simplesend للعمل مع دردشة Gmail؟

StackOverflow https://stackoverflow.com/questions/799648
  •  
  •  | 
  •   ( words)
 التحقق

سؤال

أحاول كتابة نص PERL بسيط لإرسال رسالة فورية. بدا الجابر كما قد يكون أكثر البروتوكول مواتية. لكن البرنامج النصي التالي يفشل:

#!/usr/bin/env perl
use Jabber::SimpleSend qw(send_jabber_message);
send_jabber_message('[email protected]',
                    'CENSORED',
                    '[email protected]',
                    'subject test',
                    "body test");

انها تقول:

Can't call method "can_read" on an undefined value at 
/opt/local/lib/perl5/site_perl/5.8.9/XML/Stream.pm line 1421.

كما يشير إجابة كارتمان، يجب أن يكون الكود في الواقع

#!/usr/bin/env perl
use Jabber::SimpleSend qw(send_jabber_message);
send_jabber_message('me%[email protected]',
                    'CENSORED',
                    'you%[email protected]',
                    'subject test',
                    "body test");

ولكن هذا فشل مع الخطأ التالي:

No SASL mechanism found
 at /usr/local/lib/perl5/site_perl/5.10.0/Authen/SASL.pm line 74

لدي وحدة Authen :: SASL CPAN المثبتة.

المحلول

Jabber :: Simplesend هي الطريقة الأسهل للتفاعل مع خادم Jabber القياسي ولكن لا تدع اسم الوحدة النمطية تضليلك: Gtalk هو في الواقع مختلف قليلا، تتطلب تشفير TLS (الذي Jabber :: Simplesend لن يفعله) ومضيف يتغيرون. سوف تحصل على نتائج أفضل باستخدام Net :: XMPP والتعامل مباشرة مع API لها.

يرى http://www.gridpp.ac.uk/wiki/nagios_jabber_notification. للحصول على تطبيق يعمل بشكل جيد، يعمل بشكل كامل في 75 خطا من بيرل باستخدام Net :: XMPP. إنه قد انسوع لإرسال إشعارات Nagios لكنه يفعل بالضبط ما تحتاجه.

نصائح أخرى

أنا لست على دراية بالقانون، ولكن هذا الخط في XML :: Stream هو المكان الذي تبدأ فيه الوحدة النمطية حلقة محددة (). الخط 523-524 هو المكان الذي يمر IO :: حدد مأخذ توصيل إلى الخادم الوجهة، و io :: SELECT نفسه يمر مرجعا مباركا، والذي يجب ألا يكون غير محمول بالطريقة XML :: دفق يستخدمه.

ربما يكون هناك شيء ما هو تعديل عنصر "تحديد" من كائن XML :: دفق في الوحدات النمطية JABBER، ربما في محاولة مضللة لتصحيح خطأ في اتصال الخادم. أنا آسف لم أستطع أن أكون أكثر تحديدا.


ردا على التحديث:

هذه أخطاء غريبة، وكنت معنى للنظر داخل وحدات Jabber على أي حال، لذلك أخذت في إلقاء نظرة على المصدر. يعتمد ما يلي على النظر إلى أحدث إصدارات الوحدات النمطية المستخدمة من CPAN. ربما لا يكون هذا مفيدا جدا إلا إذا كنت ترغب في بدء تصنيف هذه الوحدات النمطية وإضافة التعليمات البرمجية لمعرفة أين يحدث شيء غير متوقع. (يمكنك تخطي الفقرة التالية إذا لم تكن مهتما بوحدات "Jabber Modules".)

من المعلومات المحدثة، لقد تتبعت ذلك إلى النقطة التي يقوم بها Authen :: SASL :: Perl Croaks On Line 41. يحتاج إلى نتيجة من آلية Parent -> آلية، وهناك سببان من الأسباب المحتملة، على افتراض Authen :: SASL ISN تي مكسورة. إما أنه يتم استدعاء بشكل غير صحيح بدون حجج من Net :: بروتوكول XMPP :: البروتوكول (السطر 2968)، والذي يبدو غير مرجح أو "الآليات" التي حددتها في منشئ Authen :: SASL غير موجود. NET :: XMPP :: بروتوكول يحدد "الآليات" (GetStreamFeature يسمى، السطر 2958؛ تلك الطريقة المعرفة حول السطر 3340) مع return $self->{STREAM}->GetStreamFeature($self->GetStreamID(),$feature);, ، حيث ميزة $ هي مجرد سلسلة مرت من Callee وجزء الهوية من جلسة كائن XML :: Stream.

استنادا إلى خطأ XML الأصلي وإمكانية معرف الجلسة تسير سيئا، يبدو أن الخادم إما يرسل بيانات سيئة في مرحلة ما من غير متوقع إلى XML :: دفق غير متوقع وغير مسبوق من خلال الوحدات النمطية باستخدامها. أنا غير مقتنع بأن foo٪[email protected] هو تنسيق اسم المستخدم المناسب، لكنني لا أعرف كيف يمكن أن يسبب ذلك هذه الأخطاء دون خادم Jabber القيام بشيء خاطئ.

أود أن أبدأ بشكل جديد بأسماء مستخدمين مختلفة على خادم مختلف ومعرفة ما إذا كان Jabber: SimpleSend يعمل على الإطلاق، ثم حاول التقاط إخراج الخادم بطريقة ما لمعرفة ما هو XML :: Stream يختنق.


تحديث: ما يستحق، لقد قمت بتثبيت الوحدة ونصبح نفس الأخطاء بالضبط. Authen :: SASL :: PERL :: سهل وجميع الشروط الأساسية الأخرى موجودة. وعندما قمت بتعيين اسم المستخدم إلى [email protected] وتمكين التحذيرات العالمية (على سبيل المثال، # / USR / BIN / PERL -W أو PERL -W Filename.pl)، XML :: Stream يكشف عن مجموعة من غير محدد مشاكل القيمة، والممتعة في الواقع يبصق بالفعل التحذير "تعذر الاتصال بخادم Jabber"! (لا، ​​أنا لا أعرف ما يعني ذلك حقا :().


تحديث: كنت أحاول تثبيت NET :: JABBER :: BOT (استسلمت بعد بعض أخطاء وحدة SSL) لمعرفة ما إذا كان من شأنه أن يحل أي شيء، ولاحظت منشئته لديه هذا الخيار ولاحظ:

gtalk => 0 # Default to off, 1 for on. needed now due to gtalk differences from std jabber server.

الذي يعزز فكرة أن الخادم يقوم بعمل شيء غير عادي، أي XML :: دفق لا يكلف عناء رمي استثناء.

يجب أن يكون اسم المستخدم الخاص بك [email protected] ولكن اسم الخادم هو Talk.google.com. لذلك يجب أن تكون المعلمة الأولى لي @ gmail.com @ talk.google.com، لكنني لست متأكدا مما إذا كان Perl Can Grok هذا علامات مزدوجة @. قد تحاول الهروب أولا @ مع٪ 40 بحيث تكون المعلمة الأولى هي [email protected]

تحديث الأول: حول الخطأ الثاني، يبدو أنك تفتقد وحدات مصادقة SASL. Gmail يستخدم مصادقة SASL عادي. هل لديك /usr/local/lib/perl5/site_perl/5.10.0/authen/sasl/perl/plain.pm؟

يبدو أنك تحتاج إلى Authen :: SASL :: Cyrus (تطبيق C) أو Authen :: SASL :: PERL (تطبيق PERL) المراد تثبيته وكذلك Authen :: SASL (الذي يحاول ببساطة العثور على الخيار الأفضل مثبت عليه جهازك، و، بالنسبة لك، لا يجد ولا).

تحقق لمعرفة ما إذا كان لديك واحدة منها مثبتة.

هذه هي قراءتي للمصدر والدليل - لم أختبر هذا، YMMV.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow