「PerlによるTwitter botの作り方」の版間の差分

提供: fukudat.net
ナビゲーションに移動検索に移動
 
(同じ利用者による、間の2版が非表示)
2行目: 2行目:
  
 
== インストール ==
 
== インストール ==
CPANからNet::Twitterをインストールする.
+
CPANから[https://metacpan.org/pod/Net::Twitter Net::Twitter]をインストールする.
 
<pre>
 
<pre>
 
$ cpan Net::Twitter
 
$ cpan Net::Twitter
125行目: 125行目:
 
* [http://dev.twitter.com/ Twitter developers portal] | [http://apiwiki.twitter.com/w/page/22554648/FrontPage Twitter API Wiki]
 
* [http://dev.twitter.com/ Twitter developers portal] | [http://apiwiki.twitter.com/w/page/22554648/FrontPage Twitter API Wiki]
 
* [http://search.cpan.org/dist/Net-Twitter/ CPAN Net::Twitter]
 
* [http://search.cpan.org/dist/Net-Twitter/ CPAN Net::Twitter]
* [[wiki-en:OAuth|OAuth]]
+
* [[wiki-ja:OAuth|OAuth]]
 
* [https://twitter.com/nowcast_azbjbn この方法で作られた天気予報bot] | [[Nowcast|詳細]]
 
* [https://twitter.com/nowcast_azbjbn この方法で作られた天気予報bot] | [[Nowcast|詳細]]
 
* [https://twitter.com/mita_rad この方法で作られた放射線量bot] | [[Gm-10|詳細]]
 
* [https://twitter.com/mita_rad この方法で作られた放射線量bot] | [[Gm-10|詳細]]

2022年3月14日 (月) 09:57時点における最新版

PerlのNet::Twitter packageを使用してTwitterを利用するbotの作り方.

インストール

CPANからNet::Twitterをインストールする.

$ cpan Net::Twitter

Net::Twitterは多くの外部packageに依存している[1]

必要なpackageは自動的にインストールされるはずだが,失敗することもある. その場合はエラーメッセージを見て,不足しているpackageを同様にcpanからインストールする.

例えばDateTimeが足りなくてエラーが出ていたら,

$ cpan DateTime

を実行すればよい.

Net::Twitterを使用するScriptの作成

つべこべ説明せずに,例を示す.

↓はキーワード検索する例である. (ファイル twitter-search.pl にセーブしておく).

#!/usr/bin/perl
use strict;
use Net::Twitter;
use utf8;
binmode STDOUT, ":utf8";

my $consumer_key = "<<<YOUR OWN consumer key>>>";
my $consumer_secret = "<<<YOUR OWN consumer secret>>>";
my $access_token = "<<<YOUR OWN access token>>>";
my $access_token_secret = "<<<YOUR OWN access token secret>>>";

my $handle = Net::Twitter->new({
    traits => [qw/OAuth API::RESTv1_1 API::Search/],
    consumer_key => $consumer_key,
    consumer_secret => $consumer_secret,
    access_token => $access_token,
    access_token_secret => $access_token_secret});

do_search($_) foreach @ARGV;

sub do_search {
    my $term = shift;

    my @results;
    my $rs = $handle->search({q=>$term, lang=>"ja", page=>1, rpp=>100});
    if (ref $rs eq 'HASH' && exists $rs->{results}) {
        if (@{$rs->{results}}) {
            print_post($_) foreach @{$rs->{results}};
        }
    }
}

sub print_post {
    my $t = shift;

    print "$t->{from_user} (on $t->{created_at})  $t->{text}\n";
}

しかし,まだ実行できない."<<<YOUR OWN...>>>" の部分を↓で示す方法で得られる文字列に置き換える.

アプリケーションの登録

Twitterは以前はBasic Authをサポートしていたらしいが,現在は廃止してしまった. ここではOAuthを使用する. このためにはTwitterのAPIを使用するアプリケーションは,Twitter developer portalでアプリケーションを登録して,

  • consumer key
  • consumer secret
  • access token
  • access token secret

を手に入れる必要がある.以下にその手順を示す.

  • ブラウザで http://dev.twitter.com/ を開いて,twitter accountでSing inする.
  • Create an Appリンクを押して,アプリケーションの登録に進む.
  • 登録するアプリケーションの詳細を入力する.
    • アプリケーション名: 適当に名づける
    • アプリケーションの説明: アプリケーションの説明書き
    • アプリケーションのウェブサイトURL: アプリケーションのユーザが見に行くページがったらそのURLを指定する.
    • 所属会社/団体: もしあれば入力する
    • アプリケーションの種類: Perlスクリプトの場合は クライアントアプリケーション を選択する.
    • 標準のアクセスタイプ: 読み書きするなら Read & Write を,読むだけなら Read-only を選択する.
    • アプリケーションのアイコン: アイコンイメージがあったら指定する.以上の設定はどれも後からでも変えられる.
    • 最後にCaptcha(変形した文字列)を読んだ通りにインプットしたら,アプリケーションを登録ボタンを押して登録を完了する.

すると,登録したアプリケーションの情報が掲載されているページが開く.(このページは,後でTwitter developer portalからYour appsボタンを押して登録したアプリケーションのページを選ぶといつでも表示できる.)

このページの OAuth 1.0a Settings セクションから,

  • Consumer key
  • Consumer secret

をコピーして,スクリプトの中に埋め込む.

さらに,をクリックして表示されるページから,

  • Access Token (oauth_token)
  • Access Token Secret (oauth_token_secret)

をコピーして,スクリプトの中に埋め込む.

以上で完成.

テスト実行

スクリプトを実行してみる.

$ chmod +x twitter-search.pl
$ ./twitter-search.pl "radioactive"

すると,キーワード (radioactive) を含む呟きを検索してその結果が100件出力されれば成功である.

呟くbot

呟くにはNet::Twitterのupdateメソッドを使う.例えば,

...
my $msg = "メッセージ";
my $handle = Net::Twitter->new({
    traits => [qw/OAuth API::REST/],
    consumer_key => $consumer_key,
    consumer_secret => $consumer_secret,
    access_token => $access_token,
    access_token_secret => $access_token_secret});
});
my $ret = $handle->update({status=>$msg});
print "Cannot post!!" unless $ret;

こんな感じ.

詳しくは,オンラインマニュアル または $ perldoc Net::Twitter でローカルのマニュアルを参照.

参考文献