App-ActivityPubClient

 view release on metacpan or  search on metacpan

MANIFEST  view on Meta::CPAN

.perltidyrc
lib/App/ActivityPubClient.pm
Makefile.PL
MANIFEST			This list of files
MANIFEST.SKIP
script/ap-backup
script/ap-fetch
script/ap-represent
script/webfinger
t/pleroma.t
t/pleroma_user.json
t/pleroma_user.out
META.yml                                 Module YAML meta-data (added by MakeMaker)
META.json                                Module JSON meta-data (added by MakeMaker)

Makefile.PL  view on Meta::CPAN

use warnings;
use ExtUtils::MakeMaker;

WriteMakefile(
	NAME      => 'App::ActivityPubClient',
	ABSTRACT  => 'CLI-based client / toolbox for ActivityPub Client-to-Server',
	AUTHOR    => 'Haelwenn (lanodan) Monnier <contact+ap-client@hacktivis.me>',
	LICENSE   => 'bsd',
	VERSION   => 'v0.1.4',
	EXE_FILES =>
	  [ 'script/ap-fetch', 'script/ap-represent', 'script/ap-backup' ],
	MAN1PODS => {
		'script/ap-fetch' => 'blib/man1/ap-fetch.1',
		'script/ap-represent' => 'blib/man1/ap-represent.1',
		'script/ap-backup' => 'blib/man1/ap-backup.1',
	},
	PREREQ_PM => {
		'Exporter' => 0,
		'Getopt::Std' => 0,
		'HTTP::Request::Common' => 0,
		'JSON' => 0,
		'LWP::UserAgent' => 0,
		'MIME::Base64' => 0,
		'Scalar::Util' => 0,
	},

script/ap-backup  view on Meta::CPAN

our $VERSION = 'v0.1.4';

use Getopt::Std;
$Getopt::Std::STANDARD_HELP_VERSION = 1;
use LWP::UserAgent;
use MIME::Base64;
use JSON;

=head1 NAME

ap-backup - Backup an ActivityPub account

=head1 SYNOPSIS

B<ap-backup.pl> <-u user:password|-o OAuth-Bearer-Token> <url>

=head1 DESCRIPTION

ap-backup is used to backup an ActivityPub account, authentication is required.

=over 4

=item B<-u>

HTTP Basic Auth

=item B<-o>

OAuth2 Bearer Token

script/ap-backup  view on Meta::CPAN

		}

		#print "Saving ", $item->{"id"}, " to ", $filename, "\n";

		open(my $fh, '>', $filename) or die "couldn't open", $filename;
		print $fh encode_json($item);
		close $fh;
	}
}

sub apc2s_backup {
	my ($url) = @_;

	my $req = HTTP::Request->new(GET => $url);
	$req->header('Accept'        => 'application/activity+json');
	$req->header('Authorization' => $auth);

	my $res = $ua->request($req);

	if ($res->is_success) {
		print "Got $url\n";

script/ap-backup  view on Meta::CPAN

		my $content_match = /application\/([^+]*+)?json(; .*)?/;
		if ($content_type =~ $content_match) {
			my $response = decode_json($res->content);

			if ($response->{"type"} eq "OrderedCollection") {
				if (not $response->{"first"}) {
					die "“first” property of OrderedCollection undefined";
				}

				print "Fetching first property: ", $response->{"first"}, "\n";
				apc2s_backup($response->{"first"});
			} elsif ($response->{"type"} eq "OrderedCollectionPage") {
				if ($response->{"orderedItems"}) {
					save_collection($response->{"orderedItems"});
					print "next: ", $response->{"next"}, "\n"
					  if $response->{"next"};
					print "prev: ", $response->{"prev"}, "\n"
					  if $response->{"prev"};

					if ($response->{"next"}) {
						print "Fetching next property\n";
						apc2s_backup($response->{"next"});
					} else {
						print "No “next” property defined, done?\n";
					}
				} else {
					die
"OrderedCollectionPage without “orderedItems” defined is unsupported";
				}
			} elsif ($response->{"type"} eq "Person") {
				if ($response->{"outbox"}) {
					print "Fetching outbox property: ", $response->{"outbox"},
					  "\n";
					apc2s_backup($response->{"outbox"});
				} else {
					die "Person actor with no outbox";
				}
			} else {
				die "Unknown type: ", $response->{"type"};
			}
		} else {
			die "Got ", $content_type, " instead of ", $content_match;
		}
	} else {
		die "Got ", $res->status_line, " instead of 2xx";
	}
}

getopts("u:o:", \%options);

if ($#ARGV != 0) {
	print "usage: ap-backup.pl <-u user:password|-o OAuth-Bearer-Token> <url>\n";
	exit 1;
}

if (defined $options{u}) {
	$auth = "Basic " . encode_base64($options{u});
}
if (defined $options{o}) {
	$auth = "Bearer " . $options{o};
}

print "Authorization: $auth";
print "Fetching: ", $ARGV[0], "\n";
apc2s_backup($ARGV[0]);



( run in 0.382 second using v1.01-cache-2.11-cpan-3cd7ad12f66 )