Skip to content

Commit c5f9092

Browse files
committed
Changed spam-bot detector
1 parent 5294d1f commit c5f9092

File tree

4 files changed

+756
-40
lines changed

4 files changed

+756
-40
lines changed

app/Services/SpamDetector.php

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
<?php
2+
3+
namespace App\Services;
4+
5+
use AssistedMindfulness\NaiveBayes\Classifier;
6+
use Illuminate\Support\Str;
7+
8+
class SpamDetector
9+
{
10+
public const SPAM = 'spam';
11+
public const HAM = 'ham';
12+
13+
private $stopWords = [
14+
'в личку', 'писать в лc', 'пишите в лс', 'в лuчные сообщенuя',
15+
'личных сообщениях', 'заработок удалённо', 'заработок в интернете',
16+
'заработок в сети', 'для yдaлённoгo зaрaбoткa', 'детали в ЛС',
17+
'Ищу партнеров', 'криптовалюта', 'пассивный доход', 'пассивный заработок',
18+
'партнерская программа', 'быстрые деньги', 'работа на дому',
19+
'инвестиции', 'финансовая независимость', 'заработок без вложений',
20+
'много денег сразу', 'легкий заработок', 'увеличение прибыли',
21+
'сомнительные схемы', 'способы заработка', 'работа без опыта',
22+
'получи доход', 'обогащение в интернете', 'заработок на кликах',
23+
'маркетинговые сети', 'продажа абонементов', 'продажа товаров',
24+
'заработок на опросах', 'финансовая свобода', 'интернет-маркетинг',
25+
'пассивные инвестиции', 'интернет-предпринимательство',
26+
'денежный поток', 'финансовый успех', 'продажа продукции',
27+
'финансовые советы', 'онлайн-бизнес', 'продажа услуг',
28+
'бонусная программа', 'маркетинг в интернете', 'маркетинговые инструменты',
29+
'пассивный доход в сети', 'прибыльные схемы', 'финансовые инвестиции',
30+
'заработок на вложениях', 'консультации по заработку',
31+
'финансовая консультация', 'заработок на сайтах', 'доход без риска',
32+
'финансовые возможности', 'инвестирование средств', 'партнерские сети',
33+
'финансовые инструменты', 'финансовые стратегии', 'заработок на криптовалюте',
34+
'биткоин', 'эфириум', 'трейдинг', 'доход в сети', 'увеличение капитала',
35+
'заработок на рефералах', 'финансовый рост', 'увеличение дохода',
36+
'инвестиции в интернете', 'заработок на акциях', 'инвестиционные возможности',
37+
'вложения с доходом', 'инвестиционный рост', 'пассивный доход на автопилоте',
38+
'финансовый успех в интернете', 'блокчейн', 'инвестиции в криптовалюту',
39+
'инвестирование в фонды', 'финансовая стабильность', 'биржевая торговля',
40+
'пассивный доход без риска', 'финансовые решения', 'инвестирование в недвижимость',
41+
'заработок на форексе', 'инвестирование в доллары', 'успешный заработок',
42+
'финансовая защита', 'инвестиции в будущее', 'реальный заработок',
43+
'финансовый инструментарий', 'инвестиции в золото', 'инвестиции в криптовалютные фонды',
44+
'увеличение прибыли в интернете', 'инвестирование в акции',
45+
'финансовая безопасность',
46+
];
47+
48+
/**
49+
* Constructor to initialize the SpamDetector with a message.
50+
*
51+
* @param string $message The message to analyze
52+
*/
53+
public function __construct(private string $message)
54+
{
55+
}
56+
57+
/**
58+
* Check if the message contains any stop words.
59+
*
60+
* @return bool True if stop words are found, otherwise false
61+
*/
62+
public function containsStopWords(): bool
63+
{
64+
return Str::of($this->message)->contains($this->stopWords, true);
65+
}
66+
67+
/**
68+
* Check if the message is spam using a Naive Bayes classifier.
69+
*
70+
* @return bool True if classified as spam, otherwise false
71+
*/
72+
public function checkByClassifier(): bool
73+
{
74+
$classifier = new Classifier();
75+
76+
// Train the classifier with spam and ham messages
77+
$this->trainClassifier($classifier, 'classifiers/spam.json', static::SPAM);
78+
$this->trainClassifier($classifier, 'classifiers/ham.json', static::HAM);
79+
80+
return $classifier->guess($this->message) === static::SPAM;
81+
}
82+
83+
/**
84+
* Train the Naive Bayes classifier with messages from a JSON file.
85+
*
86+
* @param \AssistedMindfulness\NaiveBayes\Classifier $classifier The classifier instance
87+
* @param string $fileName The path to the JSON file containing messages
88+
* @param string $label The label to assign to the messages (spam or ham)
89+
*
90+
* @return void
91+
*/
92+
private function trainClassifier(Classifier $classifier, string $fileName, string $label): void
93+
{
94+
$messages = json_decode(file_get_contents(storage_path($fileName)));
95+
foreach ($messages as $message) {
96+
$classifier->learn($message, $label);
97+
}
98+
}
99+
100+
/**
101+
* Check if the message is classified as spam by either containing stop words or the classifier.
102+
*
103+
* @return bool True if classified as spam, otherwise false
104+
*/
105+
public function isSpam()
106+
{
107+
if ($this->containsStopWords()) {
108+
return true;
109+
}
110+
111+
if ($this->checkByClassifier()) {
112+
return true;
113+
}
114+
115+
return false;
116+
}
117+
}

app/Services/TelegramBot.php

Lines changed: 2 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,11 @@
22

33
namespace App\Services;
44

5-
use AssistedMindfulness\NaiveBayes\Classifier;
65
use Illuminate\Http\Client\Response;
76
use Illuminate\Support\Facades\Http;
8-
use Illuminate\Support\Str;
9-
use NotificationChannels\Telegram\TelegramMessage;
107

118
class TelegramBot
129
{
13-
public const SPAM = 'spam';
14-
public const HAM = 'ham';
15-
1610
private $token;
1711

1812
/**
@@ -76,40 +70,8 @@ public function deleteMessage($chatId, $messageId): Response
7670
*/
7771
public function isSpam(string $message): bool
7872
{
79-
$classifier = new Classifier();
80-
81-
$classifier
82-
/**
83-
* Spam
84-
*/
85-
->learn('Здрaвcтвyйте, прeдостaвляю yдалённyю зaнятoсть. 770$+ в нeдeлю Кoмy интepeсно, пишитe "+" в личные', static::SPAM)
86-
->learn('Всeх привeтствую. Нyжны пaртнёры для удалённoгo сoтрудничeства. Пoдробнoсти в лс', static::SPAM)
87-
88-
/**
89-
* Hamming
90-
*/
91-
->learn('а учусь я потому что хочу работу нормальную найти и чтоб дети жили нормально)', static::HAM)
92-
->learn('у тебя переменная передается не так надо массив ->asyncParameters()', static::HAM)
93-
->learn('MVC. Можно ещё там использовать сервис контейнеры, фасады, view-model', static::HAM)
94-
->learn('Попробуем, спасибо 🙏', static::HAM)
95-
->learn('https://laravel.com/docs/', static::HAM)
96-
->learn('Да', static::HAM)
97-
->learn('Получилось', static::HAM);
73+
$detector = new SpamDetector($message);
9874

99-
TelegramMessage::create()
100-
->to(config('services.telegram-bot-api.chat_id'))
101-
->line('Сообщение было классифицировано как '.$classifier->most($message))
102-
->line('')
103-
->line('*📂 Текст сообщения*')
104-
->escapedLine($message)
105-
->send();
106-
107-
return Str::of($message)->contains([
108-
'yдалённyю',
109-
'в нeдeлю',
110-
'интepeсно',
111-
'пaртнёры',
112-
'сoтрудничeств',
113-
]);
75+
return $detector->isSpam();
11476
}
11577
}

0 commit comments

Comments
 (0)