PerlでのMastdon toot
マストドンでの自動トゥート作った。
Perlは、https通信ができるように、必要な対応はしておいてください。
【参考】
<<インスタンス>>は、利用しているインスタンスのURLを入れてください。
<<アクセストークン>>は、マストドンの「アカウント設定」「開発」でアプリを作成したら、設定されるので、それを入れてください。
なお、アプリには、アクセス権「write:statuses」を付与しておいてください。
ちなみに、インスタンスsocial.vivaldi.netは、LWP::UserAgentのUserAgentを拒否しているので、他のUserAgentを設定しました。
#/usr/bin/perl
use utf8;
use strict;
#use warnings;
use Encode qw(encode decode);
use LWP::UserAgent;
use HTTP::Request;
use constant {
##Mastdon
REQUEST_URI_M => 'https://<<インスタンス>>/api/v1/statuses',
ACCESS_TOKEN_M => 'Bearer <<アクセストークン>>',
};
sub tootMessage{
my $message = shift;
my $log = '';
#文字数チェックと改行除く。
my $c_text = $message;
$c_text =~ s/\r/ /sig;
$c_text =~ s/\n/ /sig;
my $length = length($c_text);
if($length > 500){
return("Message length[$length] too much at tootMessage.[$c_text]\n");
}
### リクエストパラメータの準備
my %param = (status => _encode_url($message), visibility => 'public');#visibiltyは適宜変更すること
my $res;
eval{
### リクエストを生成する
my $content = &_get_content(%param);
print $content."\n";
print REQUEST_URI_M."\n";
print ACCESS_TOKEN_M."\n";
my $req = HTTP::Request->new ('POST', REQUEST_URI_M, [Authorization => ACCESS_TOKEN_M, 'Content-Type' => 'application/x-www-form-urlencoded'], $content)
or die 'Failed to initialize HTTP::Request';
### リクエストを投げる
my $ua = LWP::UserAgent->new or die 'Failed to initialize LWP::UserAgent';
$ua->agent("");#UserAgentで拒否しているインスタンスがあるので、拒否しないUserAgentに設定する
$res = $ua->request ($req) or die 'Failed to request';
my $sl = $res->status_line;
$log .= "mastdon status_line is $sl.";
};
if($@){ chomp($@);$log .= $@;}
else{ $log .= "toot $c_text.";}
return ($log);
}
### POST するデータ文字列を生成する
sub _get_content {
my (%param) = @_;
join '&', map {
sprintf '%s=%s', $_, $param{$_};
} keys %param;
}
### 文字列を URL エンコードする
sub _encode_url {
my $str = encode('UTF-8',shift);
$str =~ s!([^a-zA-Z0-9_.~-])!sprintf '%%%02X',ord($1)!ge;
return ($str);
}