Bluesky
view release on metacpan or search on metacpan
lib/Bluesky.pm view on Meta::CPAN
'application/octet-stream' );
my $at_http = $self->at->http;
my $url = sprintf( '%s/xrpc/%s', $self->at->host, 'com.atproto.repo.uploadBlob' );
my %headers = ( 'Content-Type' => $determined_mime, ( $at_http->auth ? ( 'Authorization' => $at_http->auth ) : () ), );
$headers{DPoP} = $at_http->_generate_dpop_proof( $url, 'POST' ) if $at_http->token_type eq 'DPoP';
state $http //= HTTP::Tiny->new;
my $res = $http->post( $url, { content => $bytes, headers => \%headers } );
my $content = $res->{content};
if ( $res->{success} ) {
$content = decode_json($content) if $content && ( $res->{headers}{'content-type'} // '' ) =~ m[json];
return $content->{blob};
}
my $msg = $res->{reason} // 'Unknown error';
if ( $content && ( $res->{headers}{'content-type'} // '' ) =~ m[json] ) {
my $json = decode_json($content);
$msg .= ': ' . $json->{message} if $json->{message};
}
return At::Error->new( message => $msg, fatal => 1 );
}
method uploadImages(@images) {
my @ret;
for my $img (@images) {
my $alt = '';
lib/Bluesky.pm view on Meta::CPAN
if ( $res->{success} ) {
( $card{title} ) = $res->{content} =~ m[<title>(.*?)</title>.*</head>]is;
( $card{description} ) = ( $res->{content} =~ m[<meta name="description" content="(.*?)".+</meta>.*</head>]is ) // '';
my ($image) = $res->{content} =~ m[<img.*?src="([^"]*)"[^>]*>(?:</img>)?]isp;
if ( defined $image ) {
if ( $image =~ /^data:/ ) {
$card{thumb} = $self->uploadFile($image);
}
else {
$res = $http->get( URI->new_abs( $image, $url ) );
$card{thumb} = $res->{success} ? $self->uploadFile( $res->{content}, $res->{headers}{'content-type'} ) : ();
}
}
}
{ '$type' => 'app.bsky.embed.external', external => \%card };
}
}
};
#
1;
t/000_compile.t view on Meta::CPAN
field validationStatus => D();
end;
}, 'reply to text post';
my $img = HTTP::Tiny->new->get('https://picsum.photos/500/300');
#~ use Data::Dump;
#~ ddx $img;
skip 1 unless $img->{success};
is my $image_reply = $bsky->createPost(
reply_to => $post->{uri},
embed => { images => [ { image => $img->{content}, alt => 'Lorem Picsum', mime => $img->{headers}{'content-type'} } ] },
text => <<'END' ),
Yet another test.
But with an image this time!
END
hash {
field cid => D();
field commit => hash {
field cid => D();
field rev => D();
( run in 0.772 second using v1.01-cache-2.11-cpan-524268b4103 )