Skip to content

Commit 6d88672

Browse files
feat: Add SMS and message analysis to scam detection AI
1 parent 92a45bc commit 6d88672

File tree

5 files changed

+104
-4
lines changed

5 files changed

+104
-4
lines changed

collections/scam-detection-ai/app.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from flask import Flask, render_template, request
22
from email_analyzer import analyze_email
33
from email_fetcher import fetch_emails
4+
from message_analyzer import analyze_message
45

56
app = Flask(__name__)
67

@@ -15,7 +16,14 @@ def analyze():
1516
analysis = analyze_email(email_text)
1617
total_score = sum(analysis.values())
1718
is_scam = total_score >= 3
18-
return render_template('result.html', analysis=analysis, is_scam=is_scam)
19+
return render_template('result.html', analysis=analysis, is_scam=is_scam, analysis_type='Email')
20+
21+
elif 'message_text' in request.form:
22+
message_text = request.form['message_text']
23+
analysis = analyze_message(message_text)
24+
total_score = sum(analysis.values())
25+
is_scam = total_score >= 2
26+
return render_template('result.html', analysis=analysis, is_scam=is_scam, analysis_type='Message')
1927

2028
elif 'fetch_emails' in request.form:
2129
username = request.form['username']
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import re
2+
3+
def analyze_message(message_text):
4+
"""
5+
Analyzes an SMS or other short message for potential scam indicators.
6+
7+
Args:
8+
message_text: The full text of the message.
9+
10+
Returns:
11+
A dictionary containing the analysis results.
12+
"""
13+
scam_indicators = {
14+
"shortened_urls": 0,
15+
"unusual_sender": 0,
16+
"urgent_requests": 0,
17+
"prize_offers": 0
18+
}
19+
20+
# Check for shortened URLs
21+
shortened_url_patterns = [r'bit\.ly', r't\.co', r'goo\.gl', r'tinyurl\.com']
22+
for pattern in shortened_url_patterns:
23+
if re.search(pattern, message_text):
24+
scam_indicators["shortened_urls"] = 1
25+
break
26+
27+
# Check for unusual sender (e.g., non-numeric sender ID)
28+
# This is a very basic check and would need to be improved.
29+
sender_match = re.search(r'From:\s*(\S+)', message_text, re.IGNORECASE)
30+
if sender_match:
31+
sender = sender_match.group(1)
32+
if not sender.isdigit() and len(sender) > 10:
33+
scam_indicators["unusual_sender"] = 1
34+
35+
# Check for urgent requests
36+
urgent_keywords = ["urgent", "verify", "confirm", "login", "account"]
37+
for keyword in urgent_keywords:
38+
if re.search(r'\b' + keyword + r'\b', message_text, re.IGNORECASE):
39+
scam_indicators["urgent_requests"] = 1
40+
break
41+
42+
# Check for prize offers
43+
prize_keywords = ["congratulations", "winner", "prize", "claim", "won"]
44+
for keyword in prize_keywords:
45+
if re.search(r'\b' + keyword + r'\b', message_text, re.IGNORECASE):
46+
scam_indicators["prize_offers"] = 1
47+
break
48+
49+
return scam_indicators
50+
51+
if __name__ == '__main__':
52+
sample_message = """
53+
From: 555-123-4567
54+
Congratulations! You've won a $1000 gift card. Click here to claim: http://bit.ly/fake-prize
55+
"""
56+
analysis = analyze_message(sample_message)
57+
print(analysis)
58+
59+
total_score = sum(analysis.values())
60+
if total_score >= 2:
61+
print("\nThis message is likely a scam!")
62+
else:
63+
print("\nThis message seems legitimate.")

collections/scam-detection-ai/templates/index.html

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,15 @@ <h2>Analyze Email Text</h2>
2222
<input type="submit" value="Analyze">
2323
</form>
2424

25+
<hr>
26+
27+
<h2>Analyze SMS/Message Text</h2>
28+
<form action="/analyze" method="post">
29+
<textarea name="message_text" placeholder="Paste message text here..."></textarea>
30+
<br><br>
31+
<input type="submit" value="Analyze">
32+
</form>
33+
2534
<div class="credentials">
2635
<h2>Fetch and Analyze Emails from Your Inbox</h2>
2736
<form action="/analyze" method="post">

collections/scam-detection-ai/templates/result.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
</style>
1313
</head>
1414
<body>
15-
<h1>Analysis Result</h1>
15+
<h1>{{ analysis_type }} Analysis Result</h1>
1616
<div class="result {{ 'scam' if is_scam else 'legit' }}">
17-
<h2>{{ 'This email is likely a scam!' if is_scam else 'This email seems legitimate.' }}</h2>
17+
<h2>{{ 'This ' + analysis_type.lower() + ' is likely a scam!' if is_scam else 'This ' + analysis_type.lower() + ' seems legitimate.' }}</h2>
1818
<ul>
1919
{% for indicator, value in analysis.items() %}
2020
{% if indicator != 'domain_analysis' %}
@@ -32,6 +32,6 @@ <h3>Domain Analysis</h3>
3232
{% endif %}
3333
</div>
3434
<br>
35-
<a href="/">Analyze another email</a>
35+
<a href="/">Analyze another message or email</a>
3636
</body>
3737
</html>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import unittest
2+
from message_analyzer import analyze_message
3+
4+
class TestMessageAnalyzer(unittest.TestCase):
5+
6+
def test_scam_message(self):
7+
scam_message = "Congratulations! You've won a prize. Click http://bit.ly/scam to claim."
8+
analysis = analyze_message(scam_message)
9+
self.assertEqual(analysis['shortened_urls'], 1)
10+
self.assertEqual(analysis['prize_offers'], 1)
11+
12+
def test_legitimate_message(self):
13+
legitimate_message = "Your appointment is confirmed for 3 PM tomorrow."
14+
analysis = analyze_message(legitimate_message)
15+
self.assertEqual(analysis['shortened_urls'], 0)
16+
self.assertEqual(analysis['prize_offers'], 0)
17+
self.assertEqual(analysis['urgent_requests'], 0)
18+
19+
if __name__ == '__main__':
20+
unittest.main()

0 commit comments

Comments
 (0)