はろー。こんにちは。
最近暖かくなったり寒くなったりよくわからん毎日ですね
しかし体調を崩すことは全くありません。丈夫なもんです
ところで今回は簡単なスクリプトを Perl で書いて、コマンドラインから扱いやすいように usage を出力されるようにしてみました
$ grep --help usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]] [-e pattern] [-f file] [--binary-files=value] [--color=when] [--context[=num]] [--directories=action] [--label] [--line-buffered] [--null] [pattern] [file ...]
具体的にこんなやつです
Linux コマンドを使う時確認するやつですよね
そこで実装する実際のスクリプトは、Twitter で該当のツイートをリツイートしているユーザーの情報を標準出力するスクリプトを書きました
実装は以下です
実装
#!/usr/bin/perl use strict; use warnings; use feature qw( say state ); use Net::Twitter; use Getopt::Long qw(:config posix_default no_ignore_case gnu_compat); use Data::Validator; use Encode qw ( encode_utf8 ); my $tweet_id; my $print_key; my $help; GetOptions('i=i' => \$tweet_id, 'p=s' => \$print_key, h => \$help); if ($help) { die show_help(); } validate( tweet_id => $tweet_id, print_key => $print_key ); my $account = { consumer_key => '%CONSUMER_KEY%', consumer_secret => '%CONSUMER_SECRET%', access_token => '%ACCESS_TOKEN%', access_token_secret => '%ACCESS_TOKEN_SECRET%', }; my $nt = Net::Twitter->new({ traits => [qw/API::RESTv1_1/], consumer_key => $account->{consumer_key}, consumer_secret => $account->{consumer_secret}, access_token => $account->{access_token}, access_token_secret => $account->{access_token_secret}, }); my $retweet_user_ids = $nt->retweeters_ids({ id => $tweet_id, stringify_ids => 'true', }); my $user; my $retweet_user_list = []; map { $user = $nt->show_user({ user_id => $_}); push @$retweet_user_list, $user } @{ $retweet_user_ids->{ids} }; map { say encode_utf8 $_->{$print_key} } @$retweet_user_list; sub validate { eval { state $rule = Data::Validator->new( tweet_id => { isa => 'Int' }, print_key => { isa => 'Str' }, ); my $args = $rule->validate(@_); }; if ($@) { die show_help(); exit; } } sub show_help { my $help_doc = <<EOF; get retweet info script Usage: perl $0 [options] Options: -i : tweet_id (Int) -p : print_key (Str) ex ) id, screen_name, location https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-users-show -h : help Author okkun_sh <okkun.sh\@gmail.com> (\@okkun_sh on Twitter) EOF return $help_doc; }
使用方法
$ perl get_retweet_info.pl -h get retweet info script Usage: perl get_retweet_info.pl [options] Options: -i : tweet_id (Int) -p : print_key (Str) ex ) id, screen_name, location https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-users-show -h : help Author okkun_sh <okkun.sh@gmail.com> (@okkun_sh on Twitter) $perl get_retweet_info.pl -i 1111111111 -p screen_name
-h をすることで usage が出力されるようになります
これでoption -i でツイート id の指定、
-p でリツイートしているユーザーの情報の指定をすればよいということがわかりますね
コードのポイントは、この部分です
GetOptions でオプションの引数の指定をしており、引数に対してバリデーションをかけてエラー時は usage が出力されるようにハンドリングしています
また -h を指定時は usage が出力されるようにもしています
use Getopt::Long; use Data::Validator; my $tweet_id; my $print_key; my $help; GetOptions('i=i' => \$tweet_id, 'p=s' => \$print_key, h => \$help); if ($help) { die show_help(); } validate( tweet_id => $tweet_id, print_key => $print_key ); sub validate { eval { state $rule = Data::Validator->new( tweet_id => { isa => 'Int' }, print_key => { isa => 'Str' }, ); my $args = $rule->validate(@_); }; if ($@) { die show_help(); exit; } } sub show_help { my $help_doc = <<EOF; get retweet info script Usage: perl $0 [options] Options: -i : tweet_id (Int) -p : print_key (Str) ex ) id, screen_name, location https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-users-show -h : help Author okkun_sh <okkun.sh\@gmail.com> (\@okkun_sh on Twitter) EOF return $help_doc; }
スクリプト自体はさくっと作ったので動作は怪しいですが、usage の書き方自体は参考になると思います!
完成してから知りましたが、Twitter API ではリツイート情報の取得上限が最大100件らしく全てを取得しきれませんでした。。
もっとシンプルに書ける方法などあれば、コメントください!