使用RTM有些时日了,很想知道自己到底完成了多少个任务,以怎样的频率,然而RTM本身并不提供这些功能,幸运的是,它提供API,且CPAN模块WebService::RTMAgent实现了这个API。
编写基于RTM API的程序,首先需要申请API key,然后还需要一个认证的过程,认证辅助脚本如下:
#!/usr/bin/perl
use WebService::RTMAgent;
use strict;
use warnings;
my $ua = new WebService::RTMAgent;
$ua->api_key("your api key here");
$ua->api_secret("your secret key here");
$ua->init;
my $res = $ua->tasks_getList("filter=status:completed");
die $ua->error unless defined $res;
## Collect data
my %stat;
foreach my $list (@{$res->{tasks}}) {
foreach my $taskseries (@{$list->{list}}) {
my $list_id = $taskseries->{id};
next unless exists $taskseries->{taskseries};
foreach my $task (@{$taskseries->{taskseries}}) {
my %task_stat;
foreach my $t (@{$task->{task}}) {
my ($year, $month, undef) = split /-/, $t->{completed};
++$task_stat{$year}{$month};
}
# only count taskseries
foreach my $y (keys %task_stat) {
foreach my $m (keys %{$task_stat{$y}}) {
++$stat{$y}{$m};
}
}
}
}
}
## Output
sub simple_cvs_output {
my $input = shift;
for my $year (sort keys %$input) {
for my $month (sort keys %{$input->{$year}}) {
print "$year,$month,$input->{$year}{$month}n";
}
}
}
sub chart_stackedbars_output {
my $input = shift;
my $filename = shift;
require Chart::StackedBars;
my $chart = Chart::StackedBars->new(400, 300);
my %stat = %$input;
my @years = sort keys %stat;
$chart->add_dataset(@years);
my @months = map { sprintf "%02d", $_ } (1 .. 12);
for my $m (@months) {
my @count_per_month = map { (exists $stat{$_}->{$m}) ? $stat{$_}->{$m} : 0 } @years;
$chart->add_dataset(@count_per_month);
}
my %properties =
(
title => "statistics of netcasper's RTM accomplishment",
text_space => 5,
precision => 0,
x_label => 'Year',
y_label => 'Number of Task Series',
y_grid_lines => 'true',
legend => 'right',
legend_labels => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
);
$chart->set(%properties);
$chart->png($filename);
}
# simple_cvs_output(%stat);
chart_stackedbars_output(%stat, 'taskseries.png');
该脚本提供两种方式输出统计数据,默认是图形方式(参见下图),也可以使用csv方式输入。






