• このエントリーをはてなブックマークに追加

はじめに

昨日(2011年5月21日(土))の 名古屋でPerlをゆるく語る会#yuruperl) にて話題に上がっていたので,戻ってから,私なりにまとめてまとめてみました.まぁまとめたというよりは,私なりのやり方で,みたいな.

以下,さくらのレンタルサーバのシステムなPerlを前提とした,TwitterへPOSTするスクリプトの準備云々についてダラダラと.

試した環境

「スタンダード」プランなサーバです.本ぶろぐで以前に使用していたサーバです.

「iwa-ya」というアカウント名なので,ホームディレクトリは /home/iwa-ya となります.以後,この文字列が出てきたら,宜置き換えてください.

おおまかな流れ

  1. Twitterサイド
  2. さくらサーバサイド
  3. 2つが交差するとき(ry

まぁつまり,Twitter側の設定を行い,さくらサーバ側の設定を行い,スクリプトを書こう,そんな流れです.

Twitterサイド: Tweetするための認証情報を取得する

スクリプトとかからTweetするには,TwitterからPOSTするための権限(?)を取得する必要があります.その情報は,「アプリケーション」という単位で割り当てられます.

とりあえずTweetしたいアカウントでログイン後,https://dev.twitter.com/apps へ行きましょう.

「アプリケーション」を登録する

ss-1306065230

「Register a new app」から,アプリケーション登録フォームへ進みます.

ss-1306065465

入力項目がたくさんありますが,次のものだけ入っていれば大丈夫でしょう,たぶん.

Application Name

アプリケーションの名前を入力します.ありきたりの名前の場合,「has already been taken」(既に取られてるよ)みたいなことを言われるので,ユニークな名前を入れるとよさげです.

Description

アプリケーションの概要を入力します.最低10文字は必要みたいです.

Application Type

「Client」を選択します.

Default Access type

POSTするには,「Twitter」というサービスへの「書き込み」,つまり「Write」の権限が必要です.

ということで,「Read & Write」を選択します.

ちなみに,「Read」は,タイムライとかの情報を「取得する」,つまり「読み出す」ための権限のことです.本エントリでは話題が外れるため(ry

その他

あとは,CAPTCHAを正確に入力し,同意事項をよく読んで「I Accept」すれば,登録完了です.

OAuth設定情報を確認する

ss-1306065613

https://dev.twitter.com/apps には,現在のアカウントで登録したアプリケーションの一覧が表示されます.ここで,アプリケーション名あたりをクリックすると...

ss-1306065794

そのアプリケーションの詳細情報が表示されます.

このページの「OAuth 1.0a Settings」という見出しの下に,次の2つの項目が確認できます:

  • Consumer key
  • Consumer secret

ここに表示されているランダムっぽい文字列が,Tweetするために必要な情報の一部となります.

Access Tokenを確認する

同ページ右上方部に...

ss-1306065927

「My Access Token」というリンクがあるので,この先へ進みます.

ss-1306066012

そのページに,次の2つの項目があります:

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

ここに表示されているランダムっぽい文字列も,Tweetするために必要な情報の一部です.

Tweetするために必要な情報

おさらい.Tweetするためには,次の4つの情報(文字列)が必要です:

  • Consumer key
  • Consumer secret
  • Access Token (oauth_token)
  • Access Token Secret (oauth_token_secret)

また,これらの情報は,秘密にしておきましょう!

さくらサーバサイド: Net::Twitter::Liteモジュールをインストールする

Perl で Twitter するための便利なモジュールとして,Net::TwitterNet::Twitter::Lite などがあります.

本エントリでは,Net::Twitter::Lite をインストールします.

cpanmをインストールする

まずは入れましょう!

/home/iwa-ya % mkdir -p local/bin
/home/iwa-ya % cd local/bin
/home/iwa-ya/local/bin % wget --no-check-certificate http://xrl.us/cpanm
--2011-05-22 17:02:19--  http://xrl.us/cpanm
xrl.us をDNSに問いあわせています... 207.171.7.197
xrl.us|207.171.7.197|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 301 Moved Permanently
場所: http://github.com/miyagawa/cpanminus/raw/master/cpanm [続く]
--2011-05-22 17:02:19--  http://github.com/miyagawa/cpanminus/raw/master/cpanm
github.com をDNSに問いあわせています... 207.97.227.239
github.com|207.97.227.239|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 301 Moved Permanently
場所: https://github.com/miyagawa/cpanminus/raw/master/cpanm [続く]
--2011-05-22 17:02:20--  https://github.com/miyagawa/cpanminus/raw/master/cpanm
github.com|207.97.227.239|:443 に接続しています... 接続しました。
警告: github.com の証明書(発行者: `/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certificates.godaddy.com/repository/CN=Go Daddy Secure Certification Authority/serialNumber=07969287')の検証に失敗しました:
  自己署名証明書です。
警告: 証明書に記載されている名前 `*.github.com' とホスト名 `github.com' が一致しません
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 167379 (163K) [text/plain]
`cpanm' に保存中
 
100%[=========================================================================================================================================================================================================================================>] 167,379      180K/s 時間 0.9s
 
2011-05-22 17:02:22 (180 KB/s) - `cpanm' へ保存完了 [167379/167379]
/home/iwa-ya/local/bin % chmod 700 cpanm

スクリプト用のディレクトリを作る

/home/iwa-ya/local/bin % cd
/home/iwa-ya % mkdir tweettest
/home/iwa-ya % cd tweettest
/home/iwa-ya/tweettest %

Net::Twitter::Liteモジュールをインストールする

cpanmコマンドで,Net::Twitter::Liteモジュール(とその依存モジュール)をインストールします.

管理者権限がないため,ユーザ権限で書き込める場所へ入れます.ここでは,先に作ったディレクトリの下の「extlib」というディレクトリにすべて入るように仕向けます.(-l オプション)

では実行.

/home/iwa-ya/tweettest % ~/local/bin/cpanm -lextlib Net::Twitter::Lite
==> Found dependencies: ExtUtils::MakeMaker, Module::Build
--> Working on ExtUtils::MakeMaker
Fetching http://search.cpan.org/CPAN/authors/id/M/MS/MSCHWERN/ExtUtils-MakeMaker-6.56.tar.gz ... OK
Configuring ExtUtils-MakeMaker-6.56 ... OK
Building ExtUtils-MakeMaker-6.56 ... OK
Successfully installed ExtUtils-MakeMaker-6.56
--> Working on Module::Build
Fetching http://search.cpan.org/CPAN/authors/id/D/DA/DAGOLDEN/Module-Build-0.3800.tar.gz ... OK
Configuring Module-Build-0.3800 ... OK
==> Found dependencies: Module::Metadata, CPAN::Meta, Perl::OSType, ExtUtils::CBuilder, version, ExtUtils::ParseXS, Parse::CPAN::Meta
--> Working on Module::Metadata
Fetching http://search.cpan.org/CPAN/authors/id/D/DA/DAGOLDEN/Module-Metadata-1.000004.tar.gz ... OK
Configuring Module-Metadata-1.000004 ... OK
==> Found dependencies: version
--> Working on version
Fetching http://search.cpan.org/CPAN/authors/id/J/JP/JPEACOCK/version-0.88.tar.gz ... OK
Configuring version-0.88 ... OK
Building version-0.88 ... OK
Successfully installed version-0.88 (upgraded from 0.76)
Building Module-Metadata-1.000004 ... OK
Successfully installed Module-Metadata-1.000004
--> Working on CPAN::Meta
Fetching http://search.cpan.org/CPAN/authors/id/D/DA/DAGOLDEN/CPAN-Meta-2.110930.tar.gz ... OK
Configuring CPAN-Meta-2.110930 ... OK
==> Found dependencies: Parse::CPAN::Meta, CPAN::Meta::YAML, Test::More, JSON::PP, Version::Requirements
--> Working on Parse::CPAN::Meta
Fetching http://search.cpan.org/CPAN/authors/id/D/DA/DAGOLDEN/Parse-CPAN-Meta-1.4401.tar.gz ... OK
Configuring Parse-CPAN-Meta-1.4401 ... OK
==> Found dependencies: JSON::PP, CPAN::Meta::YAML
--> Working on JSON::PP
Fetching http://search.cpan.org/CPAN/authors/id/M/MA/MAKAMAKA/JSON-PP-2.27200.tar.gz ... OK
Configuring JSON-PP-2.27200 ... OK
Building JSON-PP-2.27200 ... OK
Successfully installed JSON-PP-2.27200
--> Working on CPAN::Meta::YAML
Fetching http://search.cpan.org/CPAN/authors/id/D/DA/DAGOLDEN/CPAN-Meta-YAML-0.003.tar.gz ... OK
Configuring CPAN-Meta-YAML-0.003 ... OK
Building CPAN-Meta-YAML-0.003 ... OK
Successfully installed CPAN-Meta-YAML-0.003
Building Parse-CPAN-Meta-1.4401 ... OK
Successfully installed Parse-CPAN-Meta-1.4401
--> Working on Test::More
Fetching http://search.cpan.org/CPAN/authors/id/M/MS/MSCHWERN/Test-Simple-0.98.tar.gz ... OK
Configuring Test-Simple-0.98 ... OK
Building Test-Simple-0.98 ... OK
Successfully installed Test-Simple-0.98 (upgraded from 0.86)
--> Working on Version::Requirements
Fetching http://search.cpan.org/CPAN/authors/id/R/RJ/RJBS/Version-Requirements-0.101020.tar.gz ... OK
Configuring Version-Requirements-0.101020 ... OK
Building Version-Requirements-0.101020 ... OK
Successfully installed Version-Requirements-0.101020
Building CPAN-Meta-2.110930 ... OK
Successfully installed CPAN-Meta-2.110930
--> Working on Perl::OSType
Fetching http://search.cpan.org/CPAN/authors/id/D/DA/DAGOLDEN/Perl-OSType-1.002.tar.gz ... OK
Configuring Perl-OSType-1.002 ... OK
Building Perl-OSType-1.002 ... OK
Successfully installed Perl-OSType-1.002
--> Working on ExtUtils::CBuilder
Fetching http://search.cpan.org/CPAN/authors/id/D/DA/DAGOLDEN/ExtUtils-CBuilder-0.280202.tar.gz ... OK
Configuring ExtUtils-CBuilder-0.280202 ... OK
==> Found dependencies: IPC::Cmd
--> Working on IPC::Cmd
Fetching http://search.cpan.org/CPAN/authors/id/B/BI/BINGOS/IPC-Cmd-0.70.tar.gz ... OK
Configuring IPC-Cmd-0.70 ... OK
==> Found dependencies: Locale::Maketext::Simple, Module::Load::Conditional, Params::Check
--> Working on Locale::Maketext::Simple
Fetching http://search.cpan.org/CPAN/authors/id/J/JE/JESSE/Locale-Maketext-Simple-0.21.tar.gz ... OK
Configuring Locale-Maketext-Simple-0.21 ... OK
Building Locale-Maketext-Simple-0.21 ... OK
Successfully installed Locale-Maketext-Simple-0.21
--> Working on Module::Load::Conditional
Fetching http://search.cpan.org/CPAN/authors/id/B/BI/BINGOS/Module-Load-Conditional-0.44.tar.gz ... OK
Configuring Module-Load-Conditional-0.44 ... OK
==> Found dependencies: Module::Load, Module::CoreList, Params::Check
--> Working on Module::Load
Fetching http://search.cpan.org/CPAN/authors/id/B/BI/BINGOS/Module-Load-0.18.tar.gz ... OK
Configuring Module-Load-0.18 ... OK
Building Module-Load-0.18 ... OK
Successfully installed Module-Load-0.18
--> Working on Module::CoreList
Fetching http://search.cpan.org/CPAN/authors/id/B/BI/BINGOS/Module-CoreList-2.49.tar.gz ... OK
Configuring Module-CoreList-2.49 ... OK
Building Module-CoreList-2.49 ... OK
Successfully installed Module-CoreList-2.49 (upgraded from 2.17)
--> Working on Params::Check
Fetching http://search.cpan.org/CPAN/authors/id/B/BI/BINGOS/Params-Check-0.28.tar.gz ... OK
Configuring Params-Check-0.28 ... OK
Building Params-Check-0.28 ... OK
Successfully installed Params-Check-0.28
Building Module-Load-Conditional-0.44 ... OK
Successfully installed Module-Load-Conditional-0.44
Building IPC-Cmd-0.70 ... OK
Successfully installed IPC-Cmd-0.70
Building ExtUtils-CBuilder-0.280202 ... OK
Successfully installed ExtUtils-CBuilder-0.280202
--> Working on ExtUtils::ParseXS
Fetching http://search.cpan.org/CPAN/authors/id/D/DA/DAGOLDEN/ExtUtils-ParseXS-2.2206.tar.gz ... OK
Configuring ExtUtils-ParseXS-2.2206 ... OK
Building ExtUtils-ParseXS-2.2206 ... OK
Successfully installed ExtUtils-ParseXS-2.2206 (upgraded from 2.19)
Building Module-Build-0.3800 ... OK
Successfully installed Module-Build-0.3800
--> Working on Net::Twitter::Lite
Fetching http://search.cpan.org/CPAN/authors/id/M/MM/MMIMS/Net-Twitter-Lite-0.10004.tar.gz ... OK
Configuring Net-Twitter-Lite-0.10004 ... OK
==> Found dependencies: URI, JSON, Net::OAuth, JSON::Any
--> Working on URI
Fetching http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/URI-1.58.tar.gz ... OK
Configuring URI-1.58 ... OK
Building and testing URI-1.58 ... OK
Successfully installed URI-1.58 (upgraded from 1.37)
--> Working on JSON
Fetching http://search.cpan.org/CPAN/authors/id/M/MA/MAKAMAKA/JSON-2.53.tar.gz ... OK
Configuring JSON-2.53 ... OK
==> Found dependencies: JSON::XS
--> Working on JSON::XS
Fetching http://search.cpan.org/CPAN/authors/id/M/ML/MLEHMANN/JSON-XS-2.3.tar.gz ... OK
Configuring JSON-XS-2.3 ... OK
==> Found dependencies: common::sense
--> Working on common::sense
Fetching http://search.cpan.org/CPAN/authors/id/M/ML/MLEHMANN/common-sense-3.4.tar.gz ... OK
Configuring common-sense-3.4 ... OK
Building and testing common-sense-3.4 ... OK
Successfully installed common-sense-3.4
Building and testing JSON-XS-2.3 ... OK
Successfully installed JSON-XS-2.3
Building and testing JSON-2.53 ... OK
Successfully installed JSON-2.53
--> Working on Net::OAuth
Fetching http://search.cpan.org/CPAN/authors/id/K/KG/KGRENNAN/Net-OAuth-0.27.tar.gz ... OK
Configuring Net-OAuth-0.27 ... OK
==> Found dependencies: Digest::SHA1, Class::Accessor, Encode, Test::Warn
--> Working on Digest::SHA1
Fetching http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/Digest-SHA1-2.13.tar.gz ... OK
Configuring Digest-SHA1-2.13 ... OK
Building and testing Digest-SHA1-2.13 ... OK
Successfully installed Digest-SHA1-2.13 (upgraded from 2.11)
--> Working on Class::Accessor
Fetching http://search.cpan.org/CPAN/authors/id/K/KA/KASEI/Class-Accessor-0.34.tar.gz ... OK
Configuring Class-Accessor-0.34 ... OK
Building and testing Class-Accessor-0.34 ... OK
Successfully installed Class-Accessor-0.34
--> Working on Encode
Fetching http://search.cpan.org/CPAN/authors/id/D/DA/DANKOGAI/Encode-2.43.tar.gz ... OK
Configuring Encode-2.43 ... OK
Building and testing Encode-2.43 ... OK
Successfully installed Encode-2.43 (upgraded from 2.26)
--> Working on Test::Warn
Fetching http://search.cpan.org/CPAN/authors/id/C/CH/CHORNY/Test-Warn-0.23.tar.gz ... OK
Configuring Test-Warn-0.23 ... OK
==> Found dependencies: Sub::Uplevel, Tree::DAG_Node
--> Working on Sub::Uplevel
Fetching http://search.cpan.org/CPAN/authors/id/D/DA/DAGOLDEN/Sub-Uplevel-0.22.tar.gz ... OK
Configuring Sub-Uplevel-0.22 ... OK
Building and testing Sub-Uplevel-0.22 ... OK
Successfully installed Sub-Uplevel-0.22
--> Working on Tree::DAG_Node
Fetching http://search.cpan.org/CPAN/authors/id/C/CO/COGENT/Tree-DAG_Node-1.06.tar.gz ... OK
Configuring Tree-DAG_Node-1.06 ... OK
Building and testing Tree-DAG_Node-1.06 ... OK
Successfully installed Tree-DAG_Node-1.06
Building and testing Test-Warn-0.23 ... OK
Successfully installed Test-Warn-0.23
Building and testing Net-OAuth-0.27 ... OK
Successfully installed Net-OAuth-0.27
--> Working on JSON::Any
Fetching http://search.cpan.org/CPAN/authors/id/P/PE/PERIGRIN/JSON-Any-1.28.tar.gz ... OK
Configuring JSON-Any-1.28 ... OK
Building and testing JSON-Any-1.28 ... OK
Successfully installed JSON-Any-1.28
Building and testing Net-Twitter-Lite-0.10004 ... OK
Successfully installed Net-Twitter-Lite-0.10004
32 distributions installed
/home/iwa-ya/tweettest %

インストール完了です.

簡単なスクリプトを書く

まずは,認証に関する設定情報を,別のファイルにしてみます.ここでは conf.pl としました.

my $conf = {
    consumer_key        => $consumer_key,         # Consumer key
    consumer_secret     => $consumer_secret,      # Consumer secret
    access_token        => $access_token,         # Access Token (oauth_token)
    access_token_secret => $access_token_secret,  # Access Token Secret (oauth_token_secret)
};

別のPerlスクリプトから,

my $conf = do 'conf.pl';

とかすることで,conf.pl で定義されたハッシュリファレンスを読み込むことができます.

なお,このファイルは他のユーザに見られるべきではないので,

% chmod 600 conf.pl

とかしておきましょう.

続けて,Tweetするための単純なスクリプトです.(tweet.pl としました.)

use strict;
use warnings;
use utf8;
use FindBin;
use lib "${FindBin::Bin}/extlib/lib/perl5/", "${FindBin::Bin}/extlib/lib/perl5/i386-freebsd-64int";
use Net::Twitter::Lite;
use Encode;
 
my ($text) = @ARGV;
die 'no text'  unless defined $text;
 
$text = decode('utf-8', $text);
 
my $conf = do "${FindBin::Bin}/conf.pl";
my $tw = Net::Twitter::Lite->new(
    consumer_key    => $conf->{consumer_key},
    consumer_secret => $conf->{consumer_secret},
);
 
$tw->access_token($conf->{access_token});
$tw->access_token_secret($conf->{access_token_secret});
 
$tw->update($text);

Tweetしてみる

このスクリプトは,最初の引数文字列をTwitterへPOSTします.

% perl tweet.pl 豆テスト
%

ごく簡単なものなので,成功とかエラーとかのメッセージは何も出ません.まぁとにかく Twitter を覗いてみましょう.

ss-1306066664

お,POSTされてますね.

今後

あとは tweet.pl をいろいろイジることで,凝ったTweetスクリプトができてくるんじゃないでしょうか.

参考

おわりに

以上,さくらのレンタルサーバで,システムのPerlを使うことを前提とした,TwitterへPOSTするスクリプトを書くための準備についてまとめたようなまとまってないようなエントリでした.

なお,共有サーバでは,サーバに負荷をかけると,他のユーザさんのサイトの運営に影響が出てしまう可能性があるため,無茶なことは避けましょう!