稲沢市よりお届けしてます。

Perlをはじめとしたプログラミング周りのあれこれについて。Perl界のモブキャラとして暗躍します(謎)。

PerlでTwitterアプリ開発するときにSSLが必要になったっぽい- Net::Twitter

今さら感満開ですが、Twitterのつぶやきアプリ的なものを作ってみようと思った。もちろん大好物のPerlで。

APIキーの取得から、Access token取得の流れまで解説してくれた下記ブログを参考にさせていただきました。

http://d.hatena.ne.jp/ozuma/20121230/1356801529


あざっす!


とはいえ、若干の仕様変更があったようでその当たりの違いと、 Net::Twitterモジュールをインストールするときにちょっとハマったので、そのあたりをお伝えします。ちなみに、Windows7(64bit)、Perl(v5.16.3)ActivePerl でやりました。


僕が個人的にハマったところ。
(1)「C:\Users\perl48>cpanm Net::Twitter」でNet::Twitterモジュールをインストールできなかった。
(2)Twitterの開発者ページの「Consumer key」と「Consumer secret」の呼び名が「API key」と「API secret」に変わっていた。
(3)アプリの「Permissions」を変更した後に「Access token」を再生成(Regenerate)しなければいけなかった。
(4)SSL接続を要求されるように仕様が変わっていた




ということで、それぞれについて詳細をば。






(1)「C:\Users\perl48>cpanm Net::Twitter」でNet::Twitterモジュールをインストールできなかった。
 

「cpanm があればどんなモジュールだって一発インストールだぜ!!ワイルドだろ?」
 


と思っていたんですが、Net::Twitter は他のモジュールへの依存が複雑だからかエラーになりました。そのときの失敗画面がコチラ


 ↓ ↓ ↓



【解決策】
冷静にエラーメッセージを読んで、足りないモジュールをcpanコマンドでインストールすることで、無事Net::Twitterモジュールをインストール完了しました。


ちなみに、追加でインストールしたのは、「Sub::Identify」というモジュールと「MooseX::Role::WithOverloading」というモジュールでした。






(2)Twitterの開発者ページの「Consumer key」と「Consumer secret」の呼び名が「API key」と「API secret」に変わっていた。


これは、単純に呼び名が変わっただけで、使い方は同じでした。


今のアプリ管理画面はこんな感じです

 ↓ ↓ ↓






(3)アプリの「Permissions」を変更した後に「Access token」を再生成(Regenerate)しなければいけなかった。


無事、Access token をゲットしてスクリプトを動かしてみたら、「お前には書き込む権限ねぇよ!ROMってろハゲ!」というようなエラーメッセージが返ってきました。


管理画面に「Permission」というタブがあるので、そこで「Read, Write and Access direct messages」という何でもイケちゃいそうなやつを選んで「Update settings」をクリック!

 ↓ ↓ ↓



改めてスクリプトを動かしても、やっぱり、「お前には書き込む権限ねぇよ!ROMってろハゲ!」のエラーメッセージ。「半年間はROMっとかないといけないのかなぁ??」と思ってたときに飛び込んできたのが先ほどの画面の「Note:」って部分。



「Changes to the application permission model will only reflect in access tokens obtained after the permission model change is saved. You will need to re-negotiate existing access tokens to alter the permission level associated with each of your application's users.」


細かいことはよくわからんが、「アクセス権限を変えたら、アクセストークンも作り直せよ」的なことを言ってるんだろうな。で、アクセストークンを再生成したらできました。



【解決策】
管理画面で「Permissions」タブの「Access」を変更後、API keys タブの「Your access token」というところの「Token actions」の「Regenerate my access token」っていうボタンをクリック!






(4)SSL接続を要求されるように仕様が変わっていた
参考にさせてもらったブログのソースのまんまだと、「SSLじゃなきゃ、受け入れてあげないんだから!」っていうガードの固い女子っぽいエラーメッセージが返されました。



実際のエラーメッセージはこんな感じ

 ↓ ↓ ↓




「The Twitter API now requires SSL. Add ( ssl => 1 ) to the options passed to new
to enable it. For backwards compatibility, SSL is disabled by default in this
version. Passing the ssl option to new will disable this warning. If you are
using a Twitter API compatbile service that does not support SSL, add
( ssl => 0 ) to disable this warning and preserve non-SSL connections in future
upgrades.
SSL is required at simple_tweet.pl line 23」


ここまで書いてくれたら、さすがに何すればいいかわかるなぁ。親切なモジュール作者に感謝。


【解決策】
new するときに 「ssl => 1 」を追加。(下にあるソース参照してください)

#!/usr/bin/perl

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

my $api_key      = 'YOUR_API_KEY';
my $api_secret   = 'YOUR_API_SECRET';
my $token        = 'YOUR_TOKEN',;
my $token_secret = 'YOUR_TOKEN_SECRET',;

my $nt = Net::Twitter->new(
   traits => ['API::RESTv1_1'],
   consumer_key => $api_key,
   consumer_secret => $api_secret,
   access_token => $token,
   access_token_secret => $token_secret,
   ssl => 1,
);

my $text = 'そろそろ寝るか。';
my $result = $nt->update($text);

ということで、ちょいハマりしつつも無事動かせました。