/
scadl
/
SCADsTGHelper
Обзор
Документация
Войти
/
scadl
/
SCADsTGHelper
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
index.php
338 строк
14 KB
Alexandr
Initial commit
26 июн 2025, 22:39
26 июн 2025, 22:39
c643dfa
Код
Авторство
О чём код?
<?php error_reporting(E_ALL); ini_set('display_errors', 1); ini_set('display_startup_errors', 1); require 'config.php'; require 'vendor/autoload.php'; use PHPMailer\PHPMailer\PHPMailer; use PhpImap\Mailbox; // === Настройки и Переменные === $db = new PDO('sqlite:users.db'); $offset = 0; $readCommand = 0; $fileComment = ""; $lastUpdate = 0; $lastGroup = ""; $userFiles = []; $imapCounter = 0; @mkdir(__DIR__ . '/tmp', 0777, true); // === Подключение к SQLite === $db->exec("CREATE TABLE IF NOT EXISTS users (chat_id TEXT PRIMARY KEY, email TEXT)"); while (true) { $response = file_get_contents("https://api.telegram.org/bot$token/getUpdates?offset=$offset&timeout=5"); $data = json_decode($response, false); if (!isset($data->result)) { sleep(1); echo date('d-m-Y H:i:s') . " No update in this cycle. Offset: $offset \n"; //continue; } else { echo date('d-m-Y H:i:s') . " Got update. Offset: $offset \n"; //print_r($data); foreach ($data->result as $update) { $offset = $update->update_id + 1; if (!isset($update->message->chat->id)) { echo date('d-m-Y H:i:s') . " Got update, but no Chat_ID \n"; continue; } else { $chat_id = $update->message->chat->id; echo "Got update, with Chat_ID: $chat_id \n"; $text = isset($update->message->text) ? $update->message->text : ''; echo "Also got message: $text \n"; // Отрабатываем команду приветствия if ($text == "/start") { $email = getUSerEmail($chat_id); sendMessage($token, $chat_id, "👋 Привет! Это специальный бот-помощник.\n\nОн может:\n📤 Пересылать ваши файлы на email\n📥 Получать письма от вас и присылать их в Telegram\n\nВся коммуникация проходит через ящик: $emailUser\n\n"); if ($email) { sendMessage($token, $chat_id, "_ Ваш E-Mail: _ $email \n Вы можете его изменить, выполнив команду /email\n или прислать мне файлы для отправки на вашу почту", 'Markdown'); } else { sendMessage($token, $chat_id, "_ Введите ваш email, чтобы начать _\n", 'Markdown'); saveEmail($text, $chat_id); continue; } } // Обратываем команду сброса почты пользователя if ($text === '/email') { $delete = $db->prepare("DELETE FROM users WHERE chat_id = ?"); $delete->execute([$chat_id]); sendMessage($token, $chat_id, "📭 Ваш E-mail удалён. \nПожалуйста, укажите новый:"); continue; } if (filter_var($text, FILTER_VALIDATE_EMAIL)) { if (strpos($text, '@sevsu.ru') > 0) { $text = str_ireplace('@sevsu.ru', '@mail.sevsu.net', $text); } saveEmail($text, $chat_id); } if (strlen($text) > 0) { $fileComment = $text; } print ("Text length: " . strlen($text) . "\n"); // Ищем файлы в сообщениях пользователя $file = isset($update->message->document) ? $update->message->document : null; if ($file) { //Файлы есть, ищем подпись к файлам, если есть - сохраняем $fileMsg = isset($update->message->caption) ? $update->message->caption : ''; if ($fileMsg != "") { $fileComment = $fileMsg; print ("Got msg with files: $fileComment \n"); } // Раз получили файл отдельно или в группе, читаем его ID $file_id = $update->message->document->file_id; // Запрашиваем информацию о файле $info = json_decode(file_get_contents("https://api.telegram.org/bot$token/getFile?file_id=$file_id")); // Извелкаем из информации о файле путь к нему на сервере $url = "https://api.telegram.org/file/bot$token/" . $info->result->file_path; // Записываем путь к файлу на сервере Тг в массив $userFiles[] = $url; // Запоминаем имя файла $filename = basename($url); // Проверям, это группа, или отдельный файл. $groupId = isset($update->message->media_group_id) ? $update->message->media_group_id : null; if ($groupId) { print ("Got group file from user: $filename, from froup: $groupId \n"); $lastUpdate = time(); $lastGroup = $groupId; } else { print ("Got single file from user: $filename \n"); sendEmail($chat_id, $fileComment); } } } } if($imapCounter>60){ checkIncomingMail(); $imapCounter = 0; } $imapCounter+=1; if (time() - $lastUpdate > 5 && $lastGroup != "") { print ("All files from group $lastGroup sent to email processed \n"); sendEmail($update->message->chat->id, $fileComment); $lastGroup = ""; } } sleep(1); // чтобы не грузить CPU } function checkIncomingMail() { global $emailUser, $emailPass, $token, $db; @mkdir(__DIR__ . '/tmp/inbox', 0777, true); $sql = "SELECT chat_id, email FROM users"; $stmt = $db->query($sql); foreach ($stmt as $row) { $chat_id = $row['chat_id']; //print ("Got user: " . $row['chat_id'] . " with email: " . $row['email'] . "\n"); $mailbox = new Mailbox('{imap.mail.ru:993/imap/ssl}INBOX', $emailUser, $emailPass, false); $mailIDArray = $mailbox->searchMailbox('UNSEEN'); foreach ($mailIDArray as $mailID) { $mail = $mailbox->getMail($mailID); if ($mail->fromAddress == $row['email']) { print ("Got mail from user: " . $row['email'] . "\n"); $bodyMail = $mail->textPlain ?: $mail->textHtml ?: ''; $allAttachments = $mail->getAttachments(); sendMessage($token, $chat_id, "✉️ _ Получили письмо для вас _: \n" . $bodyMail . "\n\n" . " _ Прикреплений _ : * " . count($allAttachments)." *", 'Markdown'); foreach ($allAttachments as $attachment) { print ("Got attachment: " . $attachment->name . "\n"); file_put_contents(__DIR__ . '/tmp/inbox/' . $attachment->name, $attachment->getContents()); sendDocument($token, $chat_id, __DIR__ . '/tmp/inbox/' . $attachment->name); } //sendMessage($token, $chat_id, "✉️ Получили письмо от вас письмо: \n".$bodyMail."\n\n". "Прикреплений: ".count($mail->getAttachments())); } } $mailbox->disconnect(); } } // === Отправка сообщений в Telegram от бота пользователю === function sendMessage($token, $chat_id, $text, $mode = null) { $params = [ 'chat_id' => $chat_id, 'text' => $text, ]; if ($mode) { $params['parse_mode'] = $mode; } file_get_contents("https://api.telegram.org/bot$token/sendMessage?" . http_build_query($params)); } // === Сохранение email пользователя в базу === function saveEmail($email, $chat_id) { global $db, $token; if (filter_var($email, FILTER_VALIDATE_EMAIL)) { // Получили корректный емейл $insert = $db->prepare("INSERT OR REPLACE INTO users (chat_id, email) VALUES (?, ?)"); $insert->execute([$chat_id, $email]); sendMessage($token, $chat_id, "✅ Email сохранён. Теперь можете отправить файл."); $readCommand = 0; } else { sendMessage($token, $chat_id, "❌ Получили не E-Mail. Пробуйте еще раз."); } } // === Отправка письма с файлами от бота на емкейл пользователя === function sendEmail($chatId, $message = "") { global $emailUser, $emailPass, $token, $userFiles; sendMessage($token, $chatId, "✅ Файлы получены. Отправляем письмо.\n". "\n". "⏱️В случае получения новых файлов, следующее писмо будет отправлено через 60 сек. Все файлы полученные во вермя ожидания после отправки, будут объеденены в 1 письмо, озаглавленное последним сообщением.\n". "\n". "ℹ️ Обратите внимание, имена файлов изменены серверами Telegram. Время хранения файлов ~7 дней. "); $email = new PHPMailer(); $email->isSMTP(); $email->Mailer = 'smtp'; $email->Host = 'smtp.mail.ru'; $email->SMTPAuth = true; $email->Username = $emailUser; $email->Password = $emailPass; $email->SMTPSecure = 'tls'; // ssl - 465, tls - 587 $email->Port = 587; $email->CharSet = 'UTF-8'; // Устанавливаем кодировку $email->Encoding = 'base64'; // Способ кодирования (можно также 'quoted-printable') $email->setFrom($emailUser); $email->addReplyTo($emailUser); $email->addAddress(getUSerEmail($chatId)); $email->Subject = "Файлы от Помошника TGHelper"; $email->MessageID = "<" . uniqid() . "@scadsdnd.net>"; $email->XMailer = 'TGHelper PHP Mailer'; $email->SMTPKeepAlive = false; $email->SMTPAutoTLS = false; $email->isHTML(true); $email->Body = "<i>Собщение к файлам: </i><br>" . $message; $email->AltBody = "Собщение к файлам: \n" . $message; $email->SMTPDebug = 2; // Добавляем в письмо ссылки на файлы пользователя $email->Body .= "<br><br><i>Ваши Файлы: </i><br>"; foreach ($userFiles as $tgFile) { $email->Body .= "<a href='$tgFile' target='_blank'>" . basename($tgFile) . "</a><br>"; } // Отправляем письмо и сообщаем об результате отправки пользователю if (!$email->send()) { print ("E-mail error: " . $email->ErrorInfo); sendMessage($token, $chatId, "❌ Письмо не отправлено. Ошибка: " . $email->ErrorInfo); } else { print ("E-mail sent ok. Mail.Ru Cooldown 60 sec\n"); //sendMessage($token, $chatId, "✅ Письмо отправлено. \nмСледующее писмо будет отправлено через 60 сек."); } $userFiles = []; $fileComment = ''; // Стандартное ожидание между письмами у Mail.Ru sleep(60); } // === Отправка файлов в Telegram от бота пользователю === function sendDocument($token, $chat_id, $filepath, $message='') { try { if (class_exists('CURLFile')) { $fileParam = new CURLFile($filepath); } else { $fileParam = "@$filepath"; // для старого PHP } $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => "https://api.telegram.org/bot{$token}/sendDocument", CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: multipart/form-data"], CURLOPT_SSL_VERIFYPEER => false, CURLOPT_POSTFIELDS => [ 'chat_id' => $chat_id, 'caption' => $message, 'document' => $fileParam ], ]); $result = curl_exec($curl); $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); $error = curl_error($curl); curl_close($curl); echo "Response code: $http_code\n"; echo "Telegram Answer:\n$result\n"; echo "CURL Error: $error\n"; unlink($filepath); } catch (Exception $e) { echo "> File not sent. $e->getMessage()\n"; } } // === Получение email пользователя из базы === function getUSerEmail($chat_id) { global $db; // Получаем email из базы // - prepare(...) — подготавливает безопасный SQL-запрос с плейсхолдером (?), который позже будет заменён на конкретное значение. $stmt = $db->prepare("SELECT email FROM users WHERE chat_id = ?"); // Здесь мы передаём значение в подготовленный запрос. - Массив [$chat_id] подставляется вместо ? в запросе. - execute() выполняет запрос на базе. $stmt->execute([$chat_id]); // - fetchColumn() возвращает первое поле первой строки результата. - В нашем случае — это email, если он существует. - Если chat_id не найден — $email будет false return $stmt->fetchColumn(); }