<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>暇なときブログ &#187; Perl メモ</title>
	<atom:link href="http://blog.photoble.net/archives/category/memo/perl-memo/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.photoble.net</link>
	<description>暇なときまったり更新のフォトブログ。葉っぱフォト多しｗ</description>
	<lastBuildDate>Sat, 24 Jul 2010 05:58:00 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>PerlでOAuth④ &#8211; Twitter</title>
		<link>http://blog.photoble.net/archives/971</link>
		<comments>http://blog.photoble.net/archives/971#comments</comments>
		<pubDate>Wed, 28 Oct 2009 14:21:14 +0000</pubDate>
		<dc:creator>Nori</dc:creator>
				<category><![CDATA[OAuth@Twitter]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://blog.photoble.net/?p=971</guid>
		<description><![CDATA[いよいよAPIを叩いてみます。

# ■なにかつぶやいてみる例
# このソースはかなり簡略化してますので、自分のソースに合った改変は必須かと思います。
# statuses/updateを使用して、結果をXMLで受け取る [...]]]></description>
			<content:encoded><![CDATA[<p>いよいよAPIを叩いてみます。</p>
<pre class="brush:Perl">
# ■なにかつぶやいてみる例
# このソースはかなり簡略化してますので、自分のソースに合った改変は必須かと思います。
# statuses/updateを使用して、結果をXMLで受け取る例です。

use LWP::UserAgent;
use Encode;
use Net::OAuth;
$Net::OAuth::PROTOCOL_VERSION = Net::OAuth::PROTOCOL_VERSION_1_0A;

# 前回取得したアクセストークンとシークレット
my $access_token = 'アクセストークン';
my $access_secret = 'トークンシークレット';

# 各APIメソッド毎にURLとリクエストメソッドが異なるので注意
my $API_Method_url = 'https://twitter.com/statuses/update.xml';
my $request_method = 'POST'; 

# なにかつぶやく
my $message = 'PENTAX K-7は良いカメラだぜぃ';

# OAuthリクエスト
my $request = Net::OAuth->request("<strong>protected resource</strong>")->new(
        consumer_key 	=> 'Twitterから取得したキー',
        consumer_secret => 'Twitterから取得しシークレット',
        request_url => $API_Method_url,
        request_method => $request_method,
        signature_method => 'HMAC-SHA1',
        timestamp => time,
        nonce => 'ランダム文字列',　# 毎回変更
        token => $access_token,
        token_secret => $access_secret,
        extra_params => { status => decode_utf8($message) },
   );

# extra_paramsに各APIメソッドのパラメータ値のハッシュをセットする（今回は"status"）
# decode_utf8についてはNet::OAuthのドキュメント(下記URL)を見てください。
# http://search.cpan.org/~kgrennan/Net-OAuth-0.19/lib/Net/OAuth.pm#I18N

$request->sign;

my $ua = LWP::UserAgent->new;
my $http_hdr = HTTP::Headers->new('User-Agent' => $ClientUA_name);
my $http_req = HTTP::Request->new($request_method, $API_Method_url, $http_hdr, $request->to_post_body);
my $http_res = $ua->request($http_req);

# 結果のXML
my $res_xml = $http_res->content;
</pre>
<p>これでつぶやくはず。。。</p>
<p>あ、ソースは全部utf8で書いてます。<br />
あ、エラー処理とか全力で省いてます。<br />
あ、今回色々試したい事もあったので、Net::OAuthにしましたですが、Net::Twitterとか使ったほうが、以外に簡単かもしれませんよ？ｗ</p>
<p>2010/02/06追記： Syntax-Hilighter入れてみたｗ</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.photoble.net/archives/971/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PerlでOAuth③ &#8211; Twitter</title>
		<link>http://blog.photoble.net/archives/962</link>
		<comments>http://blog.photoble.net/archives/962#comments</comments>
		<pubDate>Wed, 28 Oct 2009 13:37:06 +0000</pubDate>
		<dc:creator>Nori</dc:creator>
				<category><![CDATA[OAuth@Twitter]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://blog.photoble.net/?p=962</guid>
		<description><![CDATA[さて、先の記事でリクエストトークンを取得しましたが、このままでは使えない訳で、このトークン値を使ってTwitterにリダイレクトしてユーザの承認を行います。
この辺の処理はブラウザ/デスクトップベースのクライアントかによ [...]]]></description>
			<content:encoded><![CDATA[<p>さて、先の記事でリクエストトークンを取得しましたが、このままでは使えない訳で、このトークン値を使ってTwitterにリダイレクトしてユーザの承認を行います。<br />
この辺の処理はブラウザ/デスクトップベースのクライアントかによっても違ってきますし、Botのようなクライアントなら自分で承認すればOKですが、他のユーザが使う場合なら各ユーザに承認してもらう必要もあり、各トークンの管理等も含めて複雑になって行きます。</p>
<p>今回はbotがつぶやく仕様、これです。<br />
botがつぶやくには、つぶやくTwitterアカウントでログインして、アプリの承認を自分で行います。</p>
<pre class="brush:Perl">
# 前回のソースから直接承認画面にリダイレクトする場合。
my $authorize_url = 'http://twitter.com/oauth/authorize';
my $request_token = '[取得したリクエストトークン]';
print "Location: ".$authorize_url."?oauth_token=".$request_token."\n\n";
</pre>
<p>リダイレクトすると、Twitteのアプリ承認画面が開きます。<br />
この画面で許可を選択すれば、コールバックURLへリダイレクトされます。<br />
※デスクトップクライアントの場合は、ここで暗証番号らしき数字が表示されるみたいです。それは、またの機会に確認してみます。</p>
<p>コールバックURLにリダイレクトされると同時に、承認済リクエストトークンとヴェリファイア値がPOSTされるので、適当な方法でこのPOST値を拾います。簡単な方法だとCGIモジュールとか。。。<br />
で、今度はこの各値を使って、アクセストークンとシークレットを取得します。</p>
<pre class="brush:Perl">
# アクセストークンとシークレットの取得 --------------------
# このソースは簡略化してますので、自分のソースに合った改変は必須かと思います。

use CGI;
use LWP::UserAgent;
use Net::OAuth;
$Net::OAuth::PROTOCOL_VERSION = Net::OAuth::PROTOCOL_VERSION_1_0A;

my $q = CGI->new;
my $access_token = $q->param('oauth_token');　#承認済みトークン
my $access_verifier = $q->param('oauth_verifier');　#ヴェリファイア

my $access_token_url = 'http://twitter.com/oauth/access_token';
my $request_method = 'POST'; #アクセストークン取得はpostなので注意

my $request = Net::OAuth->request("access token")->new(
    consumer_key => 'Twitterから取得したキー',
    consumer_secret => 'Twitterから取得しシークレット',
    request_url => $access_token_url,
    request_method => $request_method,
    signature_method => 'HMAC-SHA1',
    timestamp => time,
    nonce => 'ランダム文字列',　#毎回変更
    callback => '',
    token => $access_token,
    verifier => $access_verifier,
    token_secret => '',
    );

my $ua = LWP::UserAgent->new;
my $http_hdr = HTTP::Headers->new('User-Agent' => $ClientUA_name);
my $http_req = HTTP::Request->new($request_method, $access_token_url, $http_hdr, $request->to_post_body);
my $http_res = $ua->request($http_req);

my $AccessTokenStr = $http_res->content;
</pre>
<p>こんな感じです。$AccessTokenStrは前回同様に分解して下さい。</p>
<p>2010/02/06追記： Syntax-Hilighter入れてみたｗ</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.photoble.net/archives/962/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PerlでOAuth② &#8211; Twitter</title>
		<link>http://blog.photoble.net/archives/957</link>
		<comments>http://blog.photoble.net/archives/957#comments</comments>
		<pubDate>Wed, 28 Oct 2009 12:12:25 +0000</pubDate>
		<dc:creator>Nori</dc:creator>
				<category><![CDATA[OAuth@Twitter]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://blog.photoble.net/?p=957</guid>
		<description><![CDATA[まず、Twitterのアプリ登録ページで各種設定を行い、Consumer KeyとConsumer Secretを取得します。とりあえず後でも変更は可能なので、アプリ名とか決まって無くても、間に合わせで設定しても大丈夫。 [...]]]></description>
			<content:encoded><![CDATA[<p>まず、Twitterのアプリ登録ページで各種設定を行い、Consumer KeyとConsumer Secretを取得します。とりあえず後でも変更は可能なので、アプリ名とか決まって無くても、間に合わせで設定しても大丈夫。<br />
ただ、Application Typeの設定によって、承認済リクエストトークンとヴェリファイアの取得方法が変わって来るので、ココはきちんと設定しておきましょう。今回の例はブラウザベースで話を進めます。</p>
<p>で、コンシューマキーとシークレットを取得したら、その各値を使ってRequestTokenを取得します。</p>
<pre class="brush:Perl">
# ■リクエストトークンの取得
# このソースは簡略化してますので、自分のソースに合った改変は必須かと思います。
use LWP::UserAgent;
use Net::OAuth;
$Net::OAuth::PROTOCOL_VERSION = Net::OAuth::PROTOCOL_VERSION_1_0A;

my $request_token_url = 'http://twitter.com/oauth/request_token';
my $request_method = 'GET';

my $request = Net::OAuth->request("request token")->new(
    consumer_key 	=> 'Twitterから取得したキー',
    consumer_secret => 'Twitterから取得しシークレット',
    request_url => $request_token_url,
    request_method => $request_method,
    signature_method => 'HMAC-SHA1',
    timestamp => time,
    nonce => 'ランダム文字列', #要毎回変更
    callback => 'http://yoursite',　#アプリ登録時のコールバックアドレス
    );
# nonceとtimestampについてはhttp://oauth.net/core/1.0/#nonce を参照

$request->sign;

my $ua = LWP::UserAgent->new;
my $http_hdr = HTTP::Headers->new('Authorization' => $request->to_authorization_header);
my $http_req = HTTP::Request->new($request_method, $request_token_url, $http_hdr);
my $http_res = $ua->request($http_req);

my $RequestTokenStr = $http_res->content;
</pre>
<p>以上ｗ<br />
$RequestTokenStrには<br />
「oauth_token=[未承認RequestToken値]&#038;oauth_token_secret=[ReuestTokenSecret値]&#038;oauth_callback_confirmed=true」な感じで値が返りますので、Net::OAuth->responseや、その他お好みの方法で各値に分解します。</p>
<p>2010/02/06追記： Syntax-Hilighter入れてみたｗ</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.photoble.net/archives/957/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PerlでOAuth① &#8211; Twitter</title>
		<link>http://blog.photoble.net/archives/927</link>
		<comments>http://blog.photoble.net/archives/927#comments</comments>
		<pubDate>Wed, 28 Oct 2009 09:25:45 +0000</pubDate>
		<dc:creator>Nori</dc:creator>
				<category><![CDATA[OAuth@Twitter]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://blog.photoble.net/?p=927</guid>
		<description><![CDATA[TwitterのOAuthについて、大まかな流れとしては、
①Twitterでアプリケーション登録を行う
②①で取得したコンシューマキーとシークレットを使って、未承認リクエストトークンとシークレットを取得
③未承認リクエ [...]]]></description>
			<content:encoded><![CDATA[<p>TwitterのOAuthについて、大まかな流れとしては、<br />
①Twitterで<a href="http://twitter.com/apps" target="_blank">アプリケーション登録</a>を行う<br />
②①で取得したコンシューマキーとシークレットを使って、未承認リクエストトークンとシークレットを取得<br />
③未承認リクエストトークンを使ってTwitterにリダイレクト<br />
④アプリケーションの承認（ユーザ側）<br />
⑤コールバック用スクリプトで、承認済みリクエストトークンとベリファイアを受け取る<br />
⑥リクエストトークンとベリファイアを使ってアクセストークンとシークレットを取得する<br />
⑦アクセストークンとシークレットでAPIを叩く</p>
<p>ざっとこんな感じ。。。ｗ<br />
今の所アクセストークンの有効期限は無いみたいなので、一度取得したらそのまま使い続けられるようです。</p>
<p>使ったOAuthの為のモジュールは<a href="http://search.cpan.org/~kgrennan/Net-OAuth/lib/Net/OAuth.pm" target="_blank">Net::OAuth</a>で、OAuthのヘッダやPOST値を生成してLWP::UserAgentでGET/POSTします。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.photoble.net/archives/927/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>URLエンコード/デコード</title>
		<link>http://blog.photoble.net/archives/1024</link>
		<comments>http://blog.photoble.net/archives/1024#comments</comments>
		<pubDate>Fri, 16 May 2008 11:11:28 +0000</pubDate>
		<dc:creator>Nori</dc:creator>
				<category><![CDATA[Perl メモ]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://blog.photoble.net/?p=1024</guid>
		<description><![CDATA[
# URLエンコード
$str =~ s/([^\w ])/'%'. unpack( 'H2', $1 )/eg;
$str =~ tr/ /+/;

# URLデコード
$str =~ tr/+/ /;
$str = [...]]]></description>
			<content:encoded><![CDATA[<pre class="brush:Perl">
# URLエンコード
$str =~ s/([^\w ])/'%'. unpack( 'H2', $1 )/eg;
$str =~ tr/ /+/;

# URLデコード
$str =~ tr/+/ /;
$str =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack( 'H2', $1 )/eg;

# URLエンコード
use URI::Escape;
$str = uri_escape( $str );

# URLデコード
use URI::Escape;
$str = uri_unescape( $str );
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.photoble.net/archives/1024/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>1秒以下のSLEEP</title>
		<link>http://blog.photoble.net/archives/1028</link>
		<comments>http://blog.photoble.net/archives/1028#comments</comments>
		<pubDate>Tue, 06 May 2008 11:43:32 +0000</pubDate>
		<dc:creator>Nori</dc:creator>
				<category><![CDATA[Perl メモ]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://blog.photoble.net/?p=1028</guid>
		<description><![CDATA[
# 昔はこんな風にselectで代用してた
select(undef, undef, undef, 0.5);    # 500ms(0.5秒)のsleep

# Time::HiResが使えるなら、usleepを使い [...]]]></description>
			<content:encoded><![CDATA[<pre class="brush:Perl">
# 昔はこんな風にselectで代用してた
select(undef, undef, undef, 0.5);    # 500ms(0.5秒)のsleep

# Time::HiResが使えるなら、usleepを使いませう
# usleepは1秒以下のsleepが可能
# 引数はμ秒で指定、戻り値は実際にsleepしたμ秒
use Time::HiRes qw( usleep );
$micsec = usleep( 500000 );    # 500ms(0.5秒)のsleep
$micsec = usleep( 1000 );    # 1ms(0.001秒)のsleep
$micsec = usleep( 10 );    # 10μs(0.00001秒)のsleep

# CPAN - Time::HiRes - http://search.cpan.org/dist/Time-HiRes/
#
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.photoble.net/archives/1028/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
