2012-04-10 6 views
0

私はAnyEvent :: Twitter :: Streamモジュールを使用しようとしています。私が従いたいTwitterのUIDをリストしたファイルを参照したいと思います。私は、コード自体にUIDを置くことができますし、次のように動作します:perlモジュールでこのパラメータを引用する方法

my $done = AnyEvent->condvar; 
     my $nt_filter = AnyEvent::Twitter::Stream->new(
      username => $cf{account}, 
      password => $cf{password}, 
      method => 'filter', 
      follow => '15855509,14760150,18598536', 
      on_tweet => sub { 
       #some code..... 
      }, 
      on_error => sub { 
       my $error = shift; 
       debug "ERROR: $error"; 
      }, 
      timeout => 45, 
     ); 
     $done->recv; 

しかし、私は、次のようなファイルを使用して同じことをしようとすると:

my $done = AnyEvent->condvar; 
     my $nt_filter = AnyEvent::Twitter::Stream->new(
      open UID_FILE, "/tmp/uids" or die $!; 

      my @uid_line = <UID_FILE>; 

      username => $cf{account}, 
      password => $cf{password}, 
      method => 'filter', 
      follow => @uid_file, 
      on_tweet => sub { 
        #some code.... 
      }, 
      on_error => sub { 
       my $error = shift; 
       debug "ERROR: $error"; 
      }, 
      timeout => 45, 
     ); 
     $done->recv; 

、それが失敗しました。 uidファイルには、次のような内容があります。

'15855509,14760150,18598536' 

私はフォーマットが正しくない示唆、ツイッターから406エラーを取得しています。私は引用符が何とか正しいとは思いませんか?

+0

貸出の可能性を排除するために、UIDファイルから行を整理する必要がありますか?実際のHTTPリクエストを比較して、何が起こっているのかを確認します。 HTTPScoopなどのツールを見つけて、それを記録します。 –

答えて

1

AnyEvent::Twitter::StreamモジュールのサブクラスAnyEvent:例えば、わずかすべてのアポストロフィを削除して得ることができると、あなたは、すべてのベースモジュールにアクセスする必要はありません。すべての機能は、newメソッドと指定したコールバックによって提供され、AnyEvent->condvarまたは$done->recvを呼び出すべきではありません。

@uid_lineへの呼び出しと割り当ては、AnyEvent::Twitter::Stream->newへのコールに属していません。

さらに、followパラメータの値を入力するために使用する変数は、@uid_lineの代わりに@uid_fileです。

あなた必要がありますが、彼らと助けを求めている場合は特に、あなたのプログラムの開始時にuse strict;use warnings;、。これは、あなたが他の方法で見落とすことができるような単純な間違いをトラップします。

通常、配列を使用して単一のスカラー値を指定することはできません。この例では、ファイルに1行しかないので(配列内に1つの要素しかないので)、間違っている可能性があります。

さらに、そこに属さない値にシングルクォートを渡します。コード内には、Perl文字列の開始と終了をマークするだけで表示されます。

私はあなたが

は、その後、あなたが書き込むことによってfollowパラメータを供給することができます(これらの行はAnyEvent::Twitter::Stream->newから前にコールを属していることに注意してください)この

open my $uid_fh, '<', '/tmp/uids' or die $!; 
my @uids; 
push @uids, /\d+/g for <$uid_fh>; 

のようなあなたのファイルからすべての小数点以下の文字列を読むことをお勧め

follow => join(',', @uids), 

これは明らかです。さらなる助けが必要な場合は再度お尋ねください。あなたのコードに組み込まれ


編集

これらの変更は、次のようになりますが、それは不完全であり、私はそれが正常に動作することを保証することはできません。

use strict; 
use warnings; 

use AnyEvent::Twitter::Stream; 

open my $uid_fh, '<', '/tmp/uids' or die $!; 
my @uids; 
push @uids, /\d+/g for <$uid_fh>; 

my %cf = (
    account => 'myaccount', 
    password => 'password', 
); 

my $nt_filter = AnyEvent::Twitter::Stream->new(
    username => $cf{account}, 
    password => $cf{password}, 
    method => 'filter', 
    follow => join(',', @uids), 
    on_tweet => sub { 
    #some code.... 
    }, 
    on_error => sub { 
    my $error = shift; 
    debug "ERROR: $error"; 
    }, 
    timeout => 45, 
); 
0

スカラーコンテキストで配列を渡そうとしているので、配列の要素数(ファイル内の行数)を1に設定することが可能です。

open UID_FILE, "/tmp/uids" or die $!; 

    # Load the first line of uids 
    my $uid_line = <UID_FILE>; 

    # Remove apostrophes from input. 
    # This may or may not be necessary 
    $uid_line =~ s/'//g; 

    # Don't forget to close the file 
    close(UID_FILE); 

    my $done = AnyEvent->condvar; 
    my $nt_filter = AnyEvent::Twitter::Stream->new(

     username => $cf{account}, 
     password => $cf{password}, 
     method => 'filter', 
     follow => $uid_line, 
     on_tweet => sub { 
       #some code.... 
     }, 
     on_error => sub { 
      my $error = shift; 
      debug "ERROR: $error"; 
     }, 
     timeout => 45, 
    ); 
    $done->recv; 

あなたはおそらく、あなたの入力行から先頭と末尾のアポストロフィを削除する必要があります。ファイル内のIDの唯一つの行があると仮定すると、

は、以下の作業を行います。たとえば:

$uid_line =~ s/^'//; 
$uid_line =~ s/'$//; 

おそらく

$uid_line =~ s/'//g; 
+0

@Borodinが指摘しているように、AnyEvent :: Twitter :: Stream-> newの呼び出しの外で開いているコードを更新しました。 – mttrb

関連する問題