Skip to content

Commit

Permalink
Changed spam-bot detector
Browse files Browse the repository at this point in the history
  • Loading branch information
tabuna committed Mar 20, 2024
1 parent 5294d1f commit c5f9092
Show file tree
Hide file tree
Showing 4 changed files with 756 additions and 40 deletions.
117 changes: 117 additions & 0 deletions app/Services/SpamDetector.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
<?php

namespace App\Services;

use AssistedMindfulness\NaiveBayes\Classifier;
use Illuminate\Support\Str;

class SpamDetector
{
public const SPAM = 'spam';
public const HAM = 'ham';

private $stopWords = [
'в личку', 'писать в лc', 'пишите в лс', 'в лuчные сообщенuя',
'личных сообщениях', 'заработок удалённо', 'заработок в интернете',
'заработок в сети', 'для yдaлённoгo зaрaбoткa', 'детали в ЛС',
'Ищу партнеров', 'криптовалюта', 'пассивный доход', 'пассивный заработок',
'партнерская программа', 'быстрые деньги', 'работа на дому',
'инвестиции', 'финансовая независимость', 'заработок без вложений',
'много денег сразу', 'легкий заработок', 'увеличение прибыли',
'сомнительные схемы', 'способы заработка', 'работа без опыта',
'получи доход', 'обогащение в интернете', 'заработок на кликах',
'маркетинговые сети', 'продажа абонементов', 'продажа товаров',
'заработок на опросах', 'финансовая свобода', 'интернет-маркетинг',
'пассивные инвестиции', 'интернет-предпринимательство',
'денежный поток', 'финансовый успех', 'продажа продукции',
'финансовые советы', 'онлайн-бизнес', 'продажа услуг',
'бонусная программа', 'маркетинг в интернете', 'маркетинговые инструменты',
'пассивный доход в сети', 'прибыльные схемы', 'финансовые инвестиции',
'заработок на вложениях', 'консультации по заработку',
'финансовая консультация', 'заработок на сайтах', 'доход без риска',
'финансовые возможности', 'инвестирование средств', 'партнерские сети',
'финансовые инструменты', 'финансовые стратегии', 'заработок на криптовалюте',
'биткоин', 'эфириум', 'трейдинг', 'доход в сети', 'увеличение капитала',
'заработок на рефералах', 'финансовый рост', 'увеличение дохода',
'инвестиции в интернете', 'заработок на акциях', 'инвестиционные возможности',
'вложения с доходом', 'инвестиционный рост', 'пассивный доход на автопилоте',
'финансовый успех в интернете', 'блокчейн', 'инвестиции в криптовалюту',
'инвестирование в фонды', 'финансовая стабильность', 'биржевая торговля',
'пассивный доход без риска', 'финансовые решения', 'инвестирование в недвижимость',
'заработок на форексе', 'инвестирование в доллары', 'успешный заработок',
'финансовая защита', 'инвестиции в будущее', 'реальный заработок',
'финансовый инструментарий', 'инвестиции в золото', 'инвестиции в криптовалютные фонды',
'увеличение прибыли в интернете', 'инвестирование в акции',
'финансовая безопасность',
];

/**
* Constructor to initialize the SpamDetector with a message.
*
* @param string $message The message to analyze
*/
public function __construct(private string $message)
{
}

/**
* Check if the message contains any stop words.
*
* @return bool True if stop words are found, otherwise false
*/
public function containsStopWords(): bool
{
return Str::of($this->message)->contains($this->stopWords, true);
}

/**
* Check if the message is spam using a Naive Bayes classifier.
*
* @return bool True if classified as spam, otherwise false
*/
public function checkByClassifier(): bool
{
$classifier = new Classifier();

// Train the classifier with spam and ham messages
$this->trainClassifier($classifier, 'classifiers/spam.json', static::SPAM);
$this->trainClassifier($classifier, 'classifiers/ham.json', static::HAM);

return $classifier->guess($this->message) === static::SPAM;
}

/**
* Train the Naive Bayes classifier with messages from a JSON file.
*
* @param \AssistedMindfulness\NaiveBayes\Classifier $classifier The classifier instance
* @param string $fileName The path to the JSON file containing messages
* @param string $label The label to assign to the messages (spam or ham)
*
* @return void
*/
private function trainClassifier(Classifier $classifier, string $fileName, string $label): void
{
$messages = json_decode(file_get_contents(storage_path($fileName)));
foreach ($messages as $message) {
$classifier->learn($message, $label);
}
}

/**
* Check if the message is classified as spam by either containing stop words or the classifier.
*
* @return bool True if classified as spam, otherwise false
*/
public function isSpam()
{
if ($this->containsStopWords()) {
return true;
}

if ($this->checkByClassifier()) {
return true;
}

return false;
}
}
42 changes: 2 additions & 40 deletions app/Services/TelegramBot.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,11 @@

namespace App\Services;

use AssistedMindfulness\NaiveBayes\Classifier;
use Illuminate\Http\Client\Response;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
use NotificationChannels\Telegram\TelegramMessage;

class TelegramBot
{
public const SPAM = 'spam';
public const HAM = 'ham';

private $token;

/**
Expand Down Expand Up @@ -76,40 +70,8 @@ public function deleteMessage($chatId, $messageId): Response
*/
public function isSpam(string $message): bool
{
$classifier = new Classifier();

$classifier
/**
* Spam
*/
->learn('Здрaвcтвyйте, прeдостaвляю yдалённyю зaнятoсть. 770$+ в нeдeлю Кoмy интepeсно, пишитe "+" в личные', static::SPAM)
->learn('Всeх привeтствую. Нyжны пaртнёры для удалённoгo сoтрудничeства. Пoдробнoсти в лс', static::SPAM)

/**
* Hamming
*/
->learn('а учусь я потому что хочу работу нормальную найти и чтоб дети жили нормально)', static::HAM)
->learn('у тебя переменная передается не так надо массив ->asyncParameters()', static::HAM)
->learn('MVC. Можно ещё там использовать сервис контейнеры, фасады, view-model', static::HAM)
->learn('Попробуем, спасибо 🙏', static::HAM)
->learn('https://laravel.com/docs/', static::HAM)
->learn('Да', static::HAM)
->learn('Получилось', static::HAM);
$detector = new SpamDetector($message);

TelegramMessage::create()
->to(config('services.telegram-bot-api.chat_id'))
->line('Сообщение было классифицировано как '.$classifier->most($message))
->line('')
->line('*📂 Текст сообщения*')
->escapedLine($message)
->send();

return Str::of($message)->contains([
'yдалённyю',
'в нeдeлю',
'интepeсно',
'пaртнёры',
'сoтрудничeств',
]);
return $detector->isSpam();
}
}
Loading

0 comments on commit c5f9092

Please sign in to comment.