Gmail 채팅 작업을 위해 Perl의 Jabber :: Simplesend를 어떻게 얻을 수 있습니까?

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

  •  18-09-2019
  •  | 
  •  

문제

인스턴트 메시지를 보내기 위해 간단한 Perl 스크립트를 작성하려고합니다. Jabber는 그것이 가장 도움이되는 프로토콜 인 것처럼 보였다. 그러나 다음 스크립트는 실패합니다.

#!/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.

Cartman의 답변이 지적했듯이 코드는 실제로

#!/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는 실제로 약간 다릅니다. 변화. Net :: XMPP를 사용하여 API를 직접 처리하면 더 나은 결과를 얻을 수 있습니다.

보다 http://www.gridpp.ac.uk/wiki/nagios_jabber_notification net :: xmpp를 사용하여 75 줄의 Perl에서 잘 작동하는 완전히 작동하는 구현. 그것은 Nagios 알림을 보내는 데 도움이되었지만 필요한 것을 정확하게 수행합니다.

다른 팁

코드에 익숙하지는 않지만 xml :: stream의 해당 라인은 모듈이 select () 루프를 시작하는 곳입니다. 523-524 행은 Passes Io :: 대상 서버에 소켓을 선택하고 io :: select 자체는 축복받은 참조를 전달합니다. 이는 xml :: 스트림이 사용하는 방식을 절대로 사용하지 않아야합니다.

Jabber 모듈에서 xml :: 스트림 객체의 "선택"요소를 수정하는 것이 아마도 서버 연결 오류를 수정하려는 잘못된 시도에서 아마도 무언가가있을 것입니다. 더 구체적이지 못해서 죄송합니다.


업데이트에 대한 응답으로 :

이것들은 이상한 오류이며, 어쨌든 Jabber 모듈 내부를 보는 것을 의미했습니다. 그래서 나는 소스를 살펴 보았습니다. 다음은 CPAN에서 사용할 수있는 최신 버전의 모듈을 살펴 보는 것입니다. 이 모듈을 서브 클래스를 시작하고 코드를 추가하여 예상치 못한 일이 발생하는 위치를 확인하지 않는 한 이것은 유용하지 않을 것입니다. (Jabber 모듈의 내부에 관심이 없다면 다음 단락을 건너 뛸 수 있습니다.)

업데이트 된 정보에서, 나는 authen :: sasl :: perl croaks 41의 지점으로 추적했다. $ parent-> 메커니즘의 결과가 필요하며, authen :: sasl isn을 가정 할 때 두 가지 가능한 원인이있다. 't 부러졌다. Net :: xmpp :: 프로토콜 (Line 2968)의 인수없이 잘못 호출되거나, 가능성이없는 것처럼 보이거나 Authen :: SASL이 존재하지 않는 "메커니즘"은 존재하지 않습니다. net :: xmpp :: 프로토콜은 "메커니즘"(GetStreamFeature 호출, 2958 행; 3340 행 주위에 정의 된 방법)을 정의합니다. return $self->{STREAM}->GetStreamFeature($self->GetStreamID(),$feature);, 여기서 $ feature는 callee에서 전달 된 문자열과 xml :: 스트림 객체의 세션의 ID 부분입니다.

원래 XML 오류와 세션 ID가 나빠질 가능성을 기반으로 서버는 어느 시점에서 XML :: 스트림에 예기치 않은 데이터를 보내고 사용하는 모듈에 의해 계정되지 않은 것으로 보입니다. Foo%40gmail.com@talk.google.com이 올바른 사용자 이름 형식이라고 확신하지는 않지만 Jabber 서버가 잘못된 일을하지 않으면 이러한 오류가 어떻게 발생할 수 있는지 모르겠습니다.

다른 서버에서 다른 사용자 이름으로 신선하게 시작하여 Jabber :: Simplesend가 전혀 작동하는지 확인한 다음 XML :: 스트림이 무엇을 질식시키는 지 확인하기 위해 서버의 출력을 캡처하려고합니다.


업데이트: 가치가있는 것에 대해 모듈을 설치했으며 동일한 오류가 발생합니다. Authen :: sasl :: perl :: plain과 다른 모든 전제 조건이 존재합니다. 그리고 사용자 이름을 gmailaccountname@talk.google.com으로 설정하고 Global Warnings (예 : #!/usr/bin/perl -w 또는 perl -w filename.pl)를 활성화하면 xml :: 스트림이 정의되지 않은 묶음을 드러냅니다. 가치 문제, 그리고 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이 Double@Signs를 grok 할 수 있는지 확실하지 않습니다. 첫 번째 매개 변수가 me%40gmail.com@talk.google.com이되도록 먼저 %40으로 탈출하려고 시도 할 수 있습니다.

업데이트 I : 두 번째 오류에 대해 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