このブログを検索

2011/03/20

指定したユーザーの最新のツイートを30件表示する

指定したユーザーの最新のツイートを30件表示する。PHP。perlの例は少ないので。

$num_of_tweets = 30;
$user_name = "your_name";

$contents = file_get_contents('http://search.twitter.com/search.atom?q=from:'.$user_name.'&rpp='.$num_of_tweets);

$xml = simplexml_load_string($contents);

print '

'.$user_name.'

'; print '
'; for ($i = 0; $i < $num_of_tweets; $i++ ) { $tweet = $xml->entry[$i]->title; $tweet = mb_convert_encoding($tweet,"SJIS","UTF-8"); $date_tweeted = $xml->entry[$i]->published; $date_tweeted = date('Y/m/d H:i:s',strtotime($date_tweeted)); print $tweet.' ('.$date_tweeted.')

'; } print '
';


件数を100件にしたが、うまくいかなかった。

phpでoauthを使う場合の定番とされているものがあるようだ。

https://github.com/abraham/twitteroauth

OAuth.php

twitteroauth.php

この二つのファイルをダウンロードしておく。

下記がサンプル。上記二つのファイルはこのスクリプト自体と同じ場所においておく。

require_once('twitteroauth.php');

$consumer_key = 'xxxxxxxxxxxxxxx';
$consumer_secret = 'xxxxxxxxxxxxxxxxx';
$oauth_token = 'xxxxxxxxxxxxxxxxxxxx';
$oauth_secret = 'xxxxxxxxxxxxxxxxxxxxx';

$connection = new TwitterOAuth($consumer_key, $consumer_secret, $oauth_token, $oauth_secret);
$content = $connection->get('account/verify_credentials');

$connection->post('statuses/update', array('status' => date(DATE_RFC822)));

実行しても何も表示されないが、twitterの自分のページを見ると、日付と時刻がtweetされているだろう。

今は自分のアプリケーションで自分のアカウントでツイートしているから、スクリプトに自分のconsumer key/secret, oauth token/secretを書き込んでいるが、実際には oauth token/secretは、利用者のそれを取得する必要がある。そのやり方も公開している人がいて、今ためしたらoauthによる認証まではできているようなのだが、肝心のそのあとのAPI操作ができない・・・

session_start();
require_once('twitteroauth.php');

$consumer_key = 'xxxxxxxxxx';
$consumer_secret = 'xxxxxxxxxxxxxxx';
$state = $_SESSION['oauth_state'];
$session_token = $_SESSION['oauth_request_token'];
$oauth_token = $_REQUEST['oauth_token'];
$section = $_REQUEST['section'];

if ($_REQUEST['test'] === 'clear') {
    session_destroy();
    session_start();
}

if ($_REQUEST['oauth_token'] != NULL && $_SESSION['oauth_state'] === 'start') {
    $_SESSION['oauth_state'] = $state = 'returned';
}

switch ($state) {
    default:
        $to = new TwitterOAuth($consumer_key, $consumer_secret);
        $tok = $to->getRequestToken();

        $_SESSION['oauth_request_token'] = $token = $tok['oauth_token'];
        $_SESSION['oauth_request_token_secret'] = $tok['oauth_token_secret'];
        $_SESSION['oauth_state'] = "start";

        $request_link = $to->getAuthorizeURL($token);

        $content = 'Click on the link to go to twitter to authorize your account.';
        $content .= '
'.$request_link.''; //(A) $req = $to->OAuthRequest("https://twitter.com/statuses/update.xml","POST",array("status"=>"test")); header("Location: $request_link"); break; case 'returned': if ($_SESSION['oauth_access_token'] === NULL && $_SESSION['oauth_access_token_secret'] === NULL) { $to = new TwitterOAuth($consumer_key, $consumer_secret, $_SESSION['oauth_request_token'],$_SESSION['oauth_request_token_secret']); $tok = $to->getAccessToken(); $_SESSION['oauth_access_token'] = $tok['oauth_token']; $_SESSION['oauth_access_token_secret'] = $tok['oauth_token_secret']; //(B) $req = $to->OAuthRequest("https://twitter.com/statuses/update.xml","POST",array("status"=>"test")); } $_SESSION['username'] = $tok["screen_name"]; //(C) $req = $to->OAuthRequest("https://twitter.com/statuses/update.xml","POST",array("status"=>"test")); header("Location: /"); }


最初は(C)のところだろうと書いてみたが、internal server errorになる。

(A),(B)に書いてみるとエラーにならないがtweetもされない。

2011/03/19

blockしているユーザの一括解除

blockしているユーザの一覧が見たくて、検索するとそういうページがあるのだが、その解除が一括でできない。半分くらい解除して、メンドクサイしこれくらいは簡単に作れるだろうと、やってみる。API辞典みたいな本は持っているのでblock一覧APIをタイプしてみるが Could not authenticate you となってしまう。そうだ、アプリを登録しないといけないのだ。
#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use Net::Twitter;

my $twit = Net::Twitter->new(
traits => [qw/API::REST OAuth WrapError/],
consumer_key    => 'xxxxxxxxxxxxxxxxxxxxxxx',
consumer_secret => 'xxxxxxxxxxxxxxxxxxxxxxx',
ssl => 1,
);
$twit->access_token       ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
$twit->access_token_secret('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');

my $array_ref = $twit->blocking();

#print Dumper $array_ref;

foreach my $hash_ref(@$array_ref){
print "$hash_ref->{'screen_name'}\n";
}


exit;
__END__


できた。

これでブロックしているユーザの一覧が表示される。WindowsXPで、ActivePerlをインストールして、Net::Twitterをインストールしておいて、Twitterのホームページでアプリケーションの登録をして、cosumuer_keyとかはその結果を書く。酒を飲みながらいろいろサーチしながら、すぐできました。

次は、これらのユーザのブロック解除ですね。

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use Net::Twitter;

my $twit = Net::Twitter->new(
traits => [qw/API::REST OAuth WrapError/],
consumer_key    => 'xxxxxxxxxxxxxxxxxxxx',
consumer_secret => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
ssl => 1,
);
$twit->access_token       ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
$twit->access_token_secret('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');

my $array_ref = $twit->blocking();

foreach my $hash_ref(@$array_ref){
$twit->destroy_block($hash_ref->{'id'});
}

exit;
__END__


blockしているユーザを取得するまでは同じで、それに対して destroy_block をするだけ。ただし、このときの引数はscreen_nameではなくてidです。いいなあ、twitter。今回の震災でも、強さがはっきりわかりました。apiを公開するかどうかが、流行るかどうかですね。こんな感じで、followしている・されているユーザの一覧、followされてるユーザ全員のfollow, followしているユーザ全員のunfollowなども一瞬でできる。

2011/02/13

EMobileのD25HW

衝動的に買ってしまった。そして1,2日使って、「いらなかったかな」と思い始めている。iPhoneを使っているのだが、電波状況の悪さが気になり始めた。
Wifiはつながる場所に行かないと使えない。たとえば通勤中などはほとんど意味がない。オンにしているとそこらじゅうにあるが使えないAPがたくさん見つかるだけである。ある技術者でない人が「Wimaxがいい」というのをきいて、使ってみようと思った。この手のモノは、素人が「いい」と言わないものでないとダメだ。買ったのはWimaxではなかったが。なんでEMobileにしたかというのは、あまりちゃんとした理由がない。なんとなく、よく見聞きする名前だったからだ。EMobileといえば、数年前に高速の無線LANサービスを始めて話題になった。わたしもいいなと思ったが価格とサービスエリアの狭さにより使う気にならなかった。
キャンペーン中で、最初に払うのは1円のみ。ビックカメラのポイントで払った。
月額料金はコースがいくつかあるが、一番高い定額コースにした。4400円くらい(1年後から4800円くらいになる)。家で使っている光の固定回線よりちょっと安い程度である。年額5万円くらいだ。契約手続きをしている時点でようやく、こいつも充電が必要だ、ということに気づいた。
だが、電話もなにもしないんだから数日くらい持つだろうと思って、東海道線のなかでyoutubeを見まくっていたら、あっというまに電池の残りが減っていた。iPhoneの充電ケーブルにくわえてこいつのも持ち歩かなきゃダメか。エネループを使った携帯充電器がよく使われているようだけど、充電するための電池をまた充電するって、まあある程度持つにしても、なんかバカらしいな・・・
今まではyoutubeなんか外ではほとんど見れなかったが、Pocket Wifiがあればたいていのものはほとんど止まらずに見れた。今のところ、メリットはそれくらいである。今いる職場のある部屋ではSoftbankの電波が届かないのだがEMならと思ったがダメだった。これは痛かった。てっきりあそこはSoftbankだけダメなのかと思ったがそうではなかったようだ。youtubeの動画をゆっくり見るなんてことは、家で眠れないときなどにやればよい。ワンセグつきの携帯を持ったときも感じたことだが、動画なんか、落ち着いた場所で見るものだ。歩きながら、電車の中などで見るようなものではない。携帯のワンセグは、最初だけ珍しさからみたが、のちにほとんど見なくなった。それからインターネット自体も、そんなに大容量のデータのやりとりをすることはない。pocket wifiを使ってすぐに、iPhoneで感じていた「そこそこ便利だけどもうちょっと速くなれば最高なんだけどなあ」というくらいのところが、実は一番人がインターネットのありがたさを感じるのではないかと思った。
あと、買おうと決めてカウンターへ歩いていくときにドコモのpocket wifiがあるのを見て、『あっ、ドコモにすればよかった』と思った。まだ使い始めたばかりなので、いい使い道が見つかるかもしれないけどね。

2011/01/03

amebloから移行したブログの画像を取得

use LWP::Simple;
$filename=1;

while(<>){
    chomp;
    $url=$_;
    $file = $filename.'.jpg';
    getstore($url,$file);
    $filename++;
}

amebloから移行したブログの画像を取得する。画像のurlはファイルに書いてあり、それを引数とする。本当はそのurl一覧も取得したかったのだがなぜかできないので、そこはしかたなく手でコピペした。

centos5.5をいれて、ファイルサーバにする。メインのPCはスペックが低く、動画再生中に止まることがある。 centosをインストールすると入るtotemとかいうプレイヤーでは、mpegすら再生できない。コーデックがないのかとかいろいろやってみたが どうにもならず、xineをインストールすることで解決した。

centosではyumを使ってアップデートをするようだが、標準の「レポジトリ(ソフトウェア保管場所)」にあるソフトウェアはごく標準的なものしかないようなので、 dagというレポジトリから取ってくる。xineは標準レポジトリにはない。grep xineとすると xinetdしか引っかからない。

2010/12/21

vmstat

print "r,b,swpd,free,buff,cache,si,so,bi,bo,in,cs,us,sy,id,wa,st,\n";

while(<>){
    if(/\d/){
        chomp;
        $_ =~ s/\t//;
        @array = split / /, $_;
        foreach(@array){
            if($_ =~ /.+/){
                print;
                print",";
            }
        }
        print "\n";
    }
}

2010/11/05

print reverse<>;

引数に指定したファイルの内容をすべて表示するperlスクリプトを書け、と言われたら、私なら以下のように書く。

open IN,"<".$ARGV[0];

while(){
    print;
}


そしてperlって簡単だなァ・・・とニタニタする。しかし、実は以下のように書けばいいのである。

while(<>){
    print;
}


そしてもっと恐ろしいことには、

print <>;


でよい。そして、このときの引数は複数あってもよい。指定されただけのファイルについて、内容を表示する。そして、以下のようにすると、ファイル内容を逆順に、つまり最後の行から順に先頭の行まで表示する・・・

print reverse<>;


・・・・・。これは、実は一番最後のスクリプトを見たのである。そして、これでこうならもしかして、と、今書いたのと逆にさかのぼっていったのである。

これは、「初めてのPerl」からのネタです。「初P」では「ダイヤモンド演算子」ということでその使い方が説明してあるのでそれを読んでいればわかることですが、私はここを飛ばしていたのです。そして5章のハッシュのところを読み、最後の問題の答えを見ていたら、6章の答えである

print reverse<>;


が目に入ったわけです。今日は仕事がちょっとヒマだったので「初P」を読んでいたのですが、何度か吹き出しました。こういう冗談って、なかなか書けないですよね。絵文字も、(笑)ともかかずに、マジメな顔してあきらかに冗談であることがわかる文章を書くのって、難しいものです。

オブジェクト指向@perl

これもほぼ丸パクリである。

元は車だったのだが、人間に変えた。

package Man;

sub new{

    my $this = shift;
    my ( $name, $gender ) = @_ ;

    print "$nameさんが誕生しました。\n" ;

    my $man = {"Name" => $name,
    "Gender" => $gender,
    "Age" => 0,
    "Money" => 0 } ;

    bless $man, $this;
    return $man ;

}

# デストラクタ
sub DESTROY{

    my $this = shift;
    print "$this->{Name}($this->{Age})さんが死にました。\n";

}

sub tosi{
    $this = shift ;
    $this->{Age}++;
    print "$this->{Name}さんが$this->{Age}才になりました。\n\n" ;
}

sub tellage{
    my $this = shift;
    print "わたしは$this->{Name}、$this->{Age}才です。\n";
}

package main;

my $taro = new Man "太郎", "Male";

my $hanako = new Man "花子", "Female";

$taro->tosi;

print"\n";

$taro->tosi;

$hanako->tellage;
$hanako->tosi;
$hanako->tosi;
$hanako->tosi;
$hanako->tosi;
$hanako->tellage;

print"\n";


実行した結果。

C:\>perl man.pl
太郎さんが誕生しました。
花子さんが誕生しました。
太郎さんが1才になりました。


太郎さんが2才になりました。

わたしは花子、0才です。
花子さんが1才になりました。

花子さんが2才になりました。

花子さんが3才になりました。

花子さんが4才になりました。

わたしは花子、4才です。

太郎(2)さんが死にました。
花子(4)さんが死にました。

C:\>


最後の「死にました」は、何もしていないのに表示される。

終了するときに自動的にデストラクタが動いているようだ。

こういうものは、「C++入門」とかを読んで何度かやってみたことがあるが、いつもサンプルを写して、一部を今回のように変えて、「フーン・・・」で終わっている。おもしろそうだな、とは思うのだが・・・。