60 lines
1.6 KiB
PHP
60 lines
1.6 KiB
PHP
<?php
|
|
|
|
namespace Lewisdale\Webmentions;
|
|
|
|
use Symfony\Component\DomCrawler\Crawler;
|
|
use Symfony\Component\HttpClient\HttpClient;
|
|
use Symfony\Contracts\HttpClient\HttpClientInterface;
|
|
|
|
class Webmention {
|
|
private readonly HttpClientInterface $client;
|
|
|
|
function __construct()
|
|
{
|
|
$this->client = HttpClient::create();
|
|
}
|
|
|
|
public function sendForPage(string $source) : void {
|
|
$urls = $this->getUrls($source);
|
|
|
|
foreach($urls as $target) {
|
|
$this->sendWebmention($source, $target);
|
|
}
|
|
}
|
|
|
|
private function getUrls(string $url) : array {
|
|
$page = file_get_contents($url);
|
|
$doc = new Crawler($page);
|
|
|
|
$urls = [];
|
|
foreach ($doc->filter('.h-entry a') as $anchor) {
|
|
$target_url = $anchor->attributes->getNamedItem('href')->textContent;
|
|
|
|
if ($target_url !== null && strlen($target_url)) {
|
|
$urls[] = $target_url;
|
|
}
|
|
}
|
|
return $urls;
|
|
}
|
|
|
|
private function sendWebmention(string $source, string $target) {
|
|
$endpoint = $this->getWebmentionEndpoint($target);
|
|
|
|
if ($endpoint) {
|
|
echo "Sending for " . $endpoint . "<br />";
|
|
$this->client->request('POST', $endpoint,
|
|
[
|
|
"body" => [
|
|
"source" => $source,
|
|
"target" => $target
|
|
]
|
|
]);
|
|
}
|
|
}
|
|
|
|
private function getWebmentionEndpoint(string $url) : string | null {
|
|
$response = $this->client->request('GET', $url);
|
|
return EndpointParser::parse($response);
|
|
}
|
|
}
|