App-SpreadRevolutionaryDate
view release on metacpan or search on metacpan
lib/App/SpreadRevolutionaryDate/BlueskyLite.pm view on Meta::CPAN
#
# This file is part of App-SpreadRevolutionaryDate
#
# This software is Copyright (c) 2019-2026 by Gérald Sédrati.
#
# This is free software, licensed under:
#
# The GNU General Public License, Version 3, June 2007
#
use 5.014;
use utf8;
package App::SpreadRevolutionaryDate::BlueskyLite;
$App::SpreadRevolutionaryDate::BlueskyLite::VERSION = '0.54';
# ABSTRACT: Simple Class to post status to BlueSky.
use LWP::UserAgent;
use DateTime;
use JSON qw(encode_json decode_json);
use URI;
use Encode qw(decode_utf8);
use File::Type;
use File::Basename;
use namespace::autoclean;
sub _fetch_embed_url_card {
my $self = shift;
my $url = shift || return;
my $card = {uri => $url};
my $ua = LWP::UserAgent->new(env_proxy => 1, timeout => 10, agent =>'App::SpreadRevolutionaryDate bot');
my $response = $ua->get($url);
return unless $response->is_success;
my $content = $response->content;
return unless $content;
if ($content =~ /<meta\s+property="og:title"\s+content="([^"]+)"/) {
my $title = $1;
($card->{title}) = decode_utf8($title);
} else {
$card->{title} = '';
}
if ($content =~ /<meta\s+property="og:description"\s+content="([^"]+)"/) {
my $description = $1;
($card->{description}) = decode_utf8($description);
} else {
$card->{description} = '';
}
if ($content =~ /<meta\s+property="og:image"\s+content="([^"]+)"/) {
my $img_url = $1;
unless ($img_url =~ m!://!) {
$url = "$url/" unless $url =~ m!/$!;
$img_url = $url . $img_url;
}
my $img_response = $ua->get($img_url);
return unless $img_response->is_success;
my $blob_req = HTTP::Request->new('POST', 'https://bsky.social/xrpc/com.atproto.repo.uploadBlob');
$blob_req->header('Content-Type' => $img_response->header('Content-Type'));
$blob_req->content($img_response->content);
my $blob_response = $self->{ua}->request($blob_req);
return unless $blob_response->is_success;
my $blob_content = decode_json($blob_response->decoded_content);
($card->{thumb}) = $blob_content->{blob};
}
return $card;
}
sub _lookup_repo {
my $self = shift;
my $account = shift || return;
$account .= '.bsky.social' unless $account =~ /[â
]/;
my $uri = URI->new('https://bsky.social/xrpc/com.atproto.identity.resolveHandle');
$uri->query_form(handle => $account);
my $response = $self->{ua}->get($uri);
return if !$response->is_success;
my $content = decode_json($response->decoded_content);
return $content->{did};
}
( run in 0.748 second using v1.01-cache-2.11-cpan-97f6503c9c8 )