كيف يمكنني جعل Perl's Jabber::SimpleSend يعمل مع دردشة Gmail؟

StackOverflow https://stackoverflow.com/questions/799648

  •  18-09-2019
  •  | 
  •  

سؤال

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

#!/usr/bin/env perl
use Jabber::SimpleSend qw(send_jabber_message);
send_jabber_message('me@gmail.com',
                    'CENSORED',
                    'you@gmail.com',
                    '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%40gmail.com@talk.google.com',
                    'CENSORED',
                    'you%40gmail.com@talk.google.com',
                    '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::Select مأخذ توصيل إلى الخادم الوجهة، ويمرر IO::Select نفسه مرجعًا مباركًا، والذي لا ينبغي أبدًا أن يكون غير محدد بالطريقة التي يستخدمها بها XML::Stream.

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


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

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

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

استنادًا إلى خطأ XML الأصلي واحتمال أن يصبح معرف الجلسة سيئًا، يبدو أن الخادم إما يرسل بيانات سيئة في مرحلة ما بشكل غير متوقع إلى XML::Stream وغير محسوبة بواسطة الوحدات النمطية التي تستخدمه.لست مقتنعًا بأن foo%40gmail.com@talk.google.com هو التنسيق الصحيح لاسم المستخدم، لكنني لا أعرف كيف يمكن أن يتسبب ذلك في حدوث هذه الأخطاء دون أن يقوم خادم Jabber بشيء خاطئ.

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


تحديث: على أية حال، لقد قمت بتثبيت الوحدة وأتلقى نفس الأخطاء بالضبط.Authen::SASL::Perl::PLAIN وجميع المتطلبات الأساسية الأخرى موجودة.وعندما أقوم بتعيين اسم المستخدم على gmailaccountname@talk.google.com وتمكين التحذيرات العامة (على سبيل المثال، #!/usr/bin/perl -w أو perl -w filename.pl)، يكشف XML::Stream عن مجموعة من الملفات غير المحددة مشكلات القيمة، ويقوم SimpleSend فعليًا بإصدار التحذير "تعذر الاتصال بخادم Jabber"!(لا، ​​لا أعرف ماذا يعني ذلك حقًا:()).


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

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

مما يعزز فكرة أن الخادم يفعل شيئًا غير عادي، وهو ما لا يكلف XML::Stream عناء طرح استثناء له.

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

تحديث الأول: حول الخطأ الثاني، يبدو أنك تفتقد وحدات مصادقة 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
scroll top