PerlでのMastdon toot

マストドンでの自動トゥート作った。

Perlは、https通信ができるように、必要な対応はしておいてください。

【参考】

engineer-milione.com

<<インスタンス>>は、利用しているインスタンスの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);
}