1
0
Fork 0
mirror of https://gitlab.com/ifiction/ifhub-telegram.git synced 2024-05-01 08:39:38 +03:00
ifhub-telegram/bot.php

136 lines
4 KiB
PHP

<?php
require_once ("vendor/autoload.php");
use Symfony\Component\Yaml\Yaml;
use Mremi\UrlShortener\Model\Link;
use Mremi\UrlShortener\Provider\Bitly\BitlyProvider;
use Mremi\UrlShortener\Provider\Bitly\GenericAccessTokenAuthenticator;
use Revolution\Mastodon\MastodonClient;
$config = Yaml::parse(file_get_contents('config.yml'));
$lastrun = 0;
if (file_exists('.lastrun') && !$config['DRY_RUN']) {
$lastrun = file_get_contents('.lastrun');
}
function get_text($url) {
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $url,
));
$resp = curl_exec($curl);
curl_close($curl);
return $resp;
}
function ellipse($str,$n_chars,$crop_str=' [...]')
{
$str = trim($str);
$buff = strip_tags($str);
if(strlen($buff) > $n_chars)
{
$cut_index=strpos($buff,' ',$n_chars);
$buff=substr($buff,0,($cut_index===false? $n_chars: $cut_index+1)).$crop_str;
}
return $buff;
}
function download($url, $outFile) {
$options = array(
CURLOPT_FILE => fopen($outFile, 'w'),
CURLOPT_TIMEOUT => 28800, // set this to 8 hours so we dont timeout on big files
CURLOPT_URL => $url
);
$ch = curl_init();
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);
}
$string = get_text('https://ifhub.club/rss/new/');
$service = new \Sabre\Xml\Service();
$service->elementMap = [
'{}item' => function(\Sabre\Xml\Reader $reader) {
return \Sabre\Xml\Deserializer\keyValue($reader, '');
},
'{}channel' => function(\Sabre\Xml\Reader $reader) {
return \Sabre\Xml\Deserializer\repeatingElements($reader, '{}item');
},
];
$articles = $service->parse($string)[0]['value'];
unset($string);
$pandoc = new \Pandoc\Pandoc();
$bitlyProvider = new BitlyProvider(
new GenericAccessTokenAuthenticator($config['BITLY_TOKEN'])
);
$telegram = new Longman\TelegramBot\Telegram(
$config['TELEGRAM_API_KEY'],
$config['TELEGRAM_BOT_NAME']
);
$mastodon = new MastodonClient();
foreach ($articles as $article) {
if (strtotime($article['pubDate']) <= $lastrun) {
continue;
}
$title = $article['title'];
$link = new Link;
$link->setLongUrl($article['link']);
$bitlyProvider->shorten($link);
$link = $link->getShortUrl();
$description = $article['description'];
$image = NULL;
preg_match('/<img.+src=[\'"](?P<src>.+?)[\'"].*>/i', $description, $image);
if (isset($image[1])) {
$image = $image[1];
}
$description = strip_tags($description, 'img');
$description = $pandoc->convert($description, "html", "markdown_github");
$description = str_replace('####', '#', $description);
$description = str_replace(' Читать дальше', '', $description);
if (!$config['DRY_RUN']) {
if ($config['TELEGRAM'] === true) {
$tdescription = "$title\n\n".$description;
$tdescription .= ": $link";
try {
$result = \Longman\TelegramBot\Request::sendMessage([
'chat_id' => $config['TELEGRAM_CHAT_ID'],
'text' => $tdescription,
'parse_mode' => 'Markdown'
]);
unset($tdescription);
if (!$config['DRY_RUN']) {
file_put_contents('.lastrun', time());
}
} catch (Longman\TelegramBot\Exception\TelegramException $e) {
echo $e;
}
}
if ($config['MASTODON'] === true) {
$mastodon->domain($config['MASTODON_SERVER'])->token($config['MASTODON_ACCESS_TOKEN']);
$limit = 500 - strlen($link) - strlen($title) - 20;
$mdescription = "$title\n\n".ellipse($description, $limit);
$mdescription .= "\n$link";
/*
if ($image) {
download('https://ifhub.club'.$image, './'.basename($image));
$attachment = $mastodon->post('/media', [
'file' => file_get_contents('./'.basename($image))
]);
var_dump($attachment);
unlink('./'.basename($image));
$mdescription .= $attachment->url;
}*/
$mastodon->status_post($mdescription);
if (!$config['DRY_RUN']) {
file_put_contents('.lastrun', time());
}
}
} else {
echo $description."\n";
echo $link;
}
}