добавил оставшиеся файлы по тг + подстройка конфига под телеграф

This commit is contained in:
Fasutoa
2025-06-18 22:40:52 +05:00
parent 81d1a070b6
commit dcd7be9816
7 changed files with 608 additions and 1 deletions
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -44,7 +44,7 @@ class CreateTgPostJob implements ShouldQueue
public function handle()
{
$chat = TelegraphChat::find(4);
$chat = TelegraphChat::find(1);
$baseUrl = config('app.url');
$messageIds = [];
$captionSent = false;
BIN
View File
Binary file not shown.
+179
View File
@@ -0,0 +1,179 @@
<?php
namespace App\Services\Telegram;
use App\Jobs\CreateVkPost;
use App\Services\VK\VkService;
use Carbon\Carbon;
use DefStudio\Telegraph\Handlers\WebhookHandler;
use DefStudio\Telegraph\Models\TelegraphBot;
use DefStudio\Telegraph\Models\TelegraphChat;
use App\Models\Post;
//use DefStudio\Telegraph\Keyboard\Button;
//use DefStudio\Telegraph\Keyboard\Keyboard;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use App\Services\VK\VkAuthService;
use Illuminate\Support\Facades\Http;
class Handler extends WebhookHandler
{
public function publish(): void
{
try {
$post = Post::where('status', 'published')
->latest('publish_at')->first();
// if (!$post) {
// $this->reply("Нет опубликованных постов для отправки");
// return;
// }
$chat = TelegraphChat::find(4);
log::info($chat);
$chat->markdown('zov')->send();
$message = '';
$message .= "*{$post->title}*\n\n";
if (is_array($post->content)) {
$message .= $this->parseContentBlocks($post->content);
} elseif (is_string($post->content)) {
$contentBlocks = json_decode($post->content, true);
if (is_array($contentBlocks)) {
$message .= $this->parseContentBlocks($contentBlocks);
} else {
$message .= $this->convertToMarkdown($post->content);
}
} else {
$message .= $this->convertToMarkdown((string) $post->content);
}
if ($post->slug) {
$url = config('app.url') . "posts/{$post->slug}";
$message .= "\n\n[Читать полностью]($url)";
}
// Отправляем сообщение с Markdown
// $this->chat->markdown($message)->send();
// Обработка изображений и отправка сообщения в Telegram
if ($post->images) {
$images = is_string($post->images) ? json_decode($post->images, true) : $post->images;
$baseUrl = config('app.url'); // Базовый URL, например, https://your-domain.com
if (is_array($images) && !empty($images)) {
$mediaGroup = [];
foreach ($images as $index => $image) {
$mediaItem = [
'type' => 'photo',
'media' => config('app.url') . 'storage/' . ltrim($image, '/'),
];
// Добавляем текст только к первому изображению
if ($index === 0) {
$mediaItem['caption'] = $message; // Основной текст поста
$mediaItem['parse_mode'] = 'Markdown'; // Поддержка Markdown
}
$mediaGroup[] = $mediaItem;
}
// $chat = TelegraphChat::find(0);
// $chat->mediaGroup($mediaGroup)->send();
// $page = $chat->page()->content($mediaGroup)->create();
// $bot = TelegraphBot::first();
// $page = $bot->page()->title($post->title)->content($post->content)->create();
// $articleUrl = $page->url();
// $url = "https://api.telegram.org/bot7746238162:AAFGi4XwIZ0lnnNL72tlxrmqAgbHmRBMFVs/sendMessage";
//
// $publishDateTime = strtotime('2025-04-27 20:27:00');
// $scheduleDate = Carbon::parse($publishDateTime)->timestamp;
//
// $data = [
// 'chat_id' => $chat,
// 'text' => $articleUrl,
// 'schedule_date' => $scheduleDate
// ];
//
// $response = Http::post($url, $data);
// if ($response->failed()) {
// throw new \Exception('Ошибка при планировании поста: ' . $response->body());
// }
// $publishDate = $post->publish_at > now() ? $post->publish_at->timestamp : null;
// dispatch(new CreateVkPost($post->title, $message, $images, $post->id, $publishDate));
} else {
$this->chat->markdown($message)->send();
}
} else {
// Если нет изображений, отправляем только текст
Log::info('dasdsa');
$this->chat->markdown($message)->send();
}
} catch (\Exception $e) {
Log::error('Ошибка при публикации в Telegram: ' . $e->getMessage());
$this->reply("Произошла ошибка при отправке поста");
}
}
private function parseContentBlocks(array $blocks): string
{
$text = '';
foreach ($blocks as $block) {
$content = $this->decodeUnicode($block['data']['content'] ?? '');
switch ($block['type'] ?? '') {
case 'heading':
$text .= "*" . $content . "*\n\n";
break;
case 'paragraph':
$text .= $this->convertToMarkdown($content) . "\n\n";
break;
case 'list':
if (isset($block['data']['items'])) {
foreach ($block['data']['items'] as $item) {
$text .= "- " . $item . "\n";
}
$text .= "\n";
}
break;
default:
$text .= $content . "\n\n";
break;
}
}
return trim($text);
}
private function convertToMarkdown(string $text): string
{
// Декодируем HTML-сущности
$text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');
$text = $this->decodeUnicode($text);
$text = preg_replace('/<p>(.*?)<\/p>/', '$1', $text);
$text = preg_replace('/<b>(.*?)<\/b>/', '*$1*', $text);
$text = preg_replace('/<i>(.*?)<\/i>/', '_$1_', $text);
$text = preg_replace('/<strong>(.*?)<\/strong>/', '*$1*', $text);
$text = preg_replace('/<em>(.*?)<\/em>/', '_$1_', $text);
// Очищаем от HTML-тегов, декодируем оставшиеся сущности и экранируем спецсимволы для MarkdownV2
return strip_tags($text);
}
private function decodeUnicode(string $text): string
{
return preg_replace_callback(
'/\\\\u([0-9a-fA-F]{4})/',
function ($match) {
return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
},
$text
);
}
protected function handleUnknownCommand(string|\Illuminate\Support\Stringable $command): void
{
$this->reply("Неизвестная команда: {$command}");
}
}
+214
View File
@@ -0,0 +1,214 @@
<?php
namespace App\Services\Telegram;
use DefStudio\Telegraph\Models\TelegraphChat;
use Illuminate\Support\Facades\Log;
class TgService
{
// public function createPost($text, $images, $videos, $documents, $publishDate)
// {
// $chat = TelegraphChat::find(4);
// Log::info($images);
// if ($images !== []){
// $images = array_slice($images, 0, 10);
// $mediaGroup = $this->createMediaGroup($text, $images);
// $response = $chat->mediaGroup($mediaGroup)->send();
// if ($response->successful()) {
// $messages = $response->json()['result'];
// $mediaGroupId = $messages[0]['message_id'];
// $messageIds = array_map(function($msg) {
// return $msg['message_id'];
// }, $messages);
// return [$mediaGroupId, $messageIds];
// }
// }
// else{
// $response = $chat->markdown($text)->send();
// if ($response->successful()) {
// $messageId = $response->telegraphMessageId();
// }
// return [$messageId, null];
// }
// }
public function createPost($text, $images, $videos, $documents, $publishDate)
{
$chat = TelegraphChat::find(4);
Log::info($images);
Log::info($videos);
Log::info($documents);
if (!empty($images) || !empty($videos)) {
// Создаем медиагруппу из изображений и видео (до 10 элементов)
$mediaItems = [];
foreach ($images as $image) {
$mediaItems[] = ['type' => 'photo', 'media' => $image];
}
foreach ($videos as $video) {
$mediaItems[] = ['type' => 'video', 'media' => $video];
}
$mediaItems = array_slice($mediaItems, 0, 10);
if (!empty($mediaItems)) {
$mediaItems[0]['caption'] = $text;
$mediaItems[0]['parse_mode'] = 'Markdown';
}
$response = $chat->mediaGroup($mediaItems)->send();
if ($response->successful()) {
$messages = $response->json()['result'];
$mainMessageId = $messages[0]['message_id'];
$mediaMessageIds = array_map(function($msg) {
return $msg['message_id'];
}, $messages);
}
// // Отправляем документы
// $documentMessageIds = [];
// foreach ($documents as $document) {
// $response = $chat->document($document)->caption($text)->parseMode('Markdown')->send();
// if ($response->successful()) {
// $documentMessageIds[] = $response->telegraphMessageId();
// }
// }
// $allMessageIds = array_merge($mediaMessageIds, $documentMessageIds);
return [$mainMessageId, $mediaMessageIds];
} elseif (!empty($documents)) {
// Отправляем только документы
$documentMessageIds = [];
$mainMessageId = null;
foreach ($documents as $index => $document) {
$response = $chat->document($document)->caption($text)->parseMode('Markdown')->send();
if ($response->successful()) {
$messageId = $response->telegraphMessageId();
$documentMessageIds[] = $messageId;
if ($index == 0) {
$mainMessageId = $messageId;
}
}
}
return [$mainMessageId, $documentMessageIds];
} else {
// Отправляем только текст
$response = $chat->markdown($text)->send();
if ($response->successful()) {
$messageId = $response->telegraphMessageId();
return [$messageId, [$messageId]];
}
}
}
public function updatePost($post_id, $text, $images, $media_ids)
{
$chat = TelegraphChat::find(1);
if ($images !== []) {
try {
// if (count($images) !== count($media_ids)) {
// foreach ($media_ids as $messageId) {
// $chat->deleteMessage($messageId)->send();
// }
//
// $modifiedText = $text . "\n\n_(сообщение изменено)_";
//
// $result = $this->createPost($modifiedText, $images);
//
// return [
// 'post_id' => $result[0],
// 'media_ids' => $result[1] ?? []
// ];
// }
$firstMessageId = $media_ids[0];
$chat->editCaption($firstMessageId)
->markdown($text)
->send();
// $messageIds = [];
// $firstMessageId = null;
// foreach ($media_ids as $index => $messageId) {
// if (!isset($images[$index])) {
// continue;
// }
//
// $newMedia = $images[$index];
// $response = $chat->editMedia($messageId)
// ->photo(config('app.url') . $newMedia)
// ->send();
//
// if ($response->successful()) {
// $updatedMessageId = $response->json()['result']['message_id'];
// $messageIds[] = $updatedMessageId;
//
// if ($index === 0) {
// }
// }
// }
} catch (\Exception $e) {
Log::error('Ошибка при изменении поста ' . $e->getMessage());
return []; // Или null/исключение
}
} else {
// Для текстовых сообщений
$chat->edit($post_id)
->markdown($text)
->send();
}
// $chat = TelegraphChat::find(4);
// if ($images !== []){
// try {
// Log::info(json_encode($media_ids));
// $firstMessageId = $media_ids[0];
// foreach ($media_ids as $index => $messageId) {
// $newMedia = $images[$index];
// Log::info($newMedia);
// Log::info($messageId);
// $chat->editMedia($messageId)
// ->photo(config('app.url') . $newMedia)
// ->send();
// }
// $chat->editCaption($firstMessageId)
// ->markdown($text)
// ->send();
//
// } catch (\Exception $e) {
// Log::error('Ошибка при изменении поста ' . $e->getMessage());
// }
// }
// else{
// $chat->edit($post_id)->markdown($text)->send();
// }
}
private function createMediaGroup($text, $images)
{
try {
$baseUrl = config('app.url');
if (is_array($images) && !empty($images)) {
$mediaGroup = [];
foreach ($images as $index => $image) {
$mediaItem = [
'type' => 'photo',
'media' => $baseUrl . $image,
// https://crack-gar-specially.ngrok-free.app/storage/posts/gallery/01JT5R37Z05S119VCRRFEADSAG.jpg
];
if ($index === 0) {
$mediaItem['caption'] = $text;
$mediaItem['parse_mode'] = 'Markdown';
}
$mediaGroup[] = $mediaItem;
}
return $mediaGroup;
}
} catch (\Exception $e) {
Log::error('Ошибка при публикации в Telegram: ' . $e->getMessage());
}
}
}