Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
software-project-WS25
Telegram Team
Commits
f112d4ac
Commit
f112d4ac
authored
Oct 21, 2025
by
Pranav
Browse files
Performing sentiment analysis on the text data and categoring it as postive and negative
parent
f9cca2bb
Changes
1
Show whitespace changes
Inline
Side-by-side
Desktop/Telegram_Bot/services/telegram_listener.py
View file @
f112d4ac
...
@@ -10,9 +10,12 @@ from telethon.tl.types import InputChannel
...
@@ -10,9 +10,12 @@ from telethon.tl.types import InputChannel
from
telethon.tl.types
import
ReactionEmoji
,
ReactionCustomEmoji
,
ReactionPaid
from
telethon.tl.types
import
ReactionEmoji
,
ReactionCustomEmoji
,
ReactionPaid
from
pathlib
import
Path
from
pathlib
import
Path
from
dotenv
import
load_dotenv
from
dotenv
import
load_dotenv
from
transformers
import
pipeline
import
os
import
os
load_dotenv
(
dotenv_path
=
r
"Path of your venv file"
)
load_dotenv
(
dotenv_path
=
r
"C:\Users\prana\Desktop\Telegram_Bot\.env"
)
sentiment_analyzer
=
pipeline
(
"sentiment-analysis"
)
# Please create a .venv file. Add the environment variables over there.
# Please create a .venv file. Add the environment variables over there.
API_ID
=
int
(
os
.
getenv
(
"API_ID"
))
API_ID
=
int
(
os
.
getenv
(
"API_ID"
))
...
@@ -23,8 +26,7 @@ INVITE_LINK = os.getenv("INVITE_LINK")
...
@@ -23,8 +26,7 @@ INVITE_LINK = os.getenv("INVITE_LINK")
# These are the headers for the csv file.
# These are the headers for the csv file.
HEADER
=
[
"chat_id"
,
"message_id"
,
"sender_id"
,
"timestamp"
,
"text"
,
HEADER
=
[
"chat_id"
,
"message_id"
,
"sender_id"
,
"timestamp"
,
"text"
,
"has_media"
,
"media_type"
,
"file_name"
,
"file_size_kb"
,
"has_media"
,
"media_type"
,
"file_name"
,
"file_size_kb"
,
"views"
,
"reactions"
]
"views"
,
"reactions"
,
"sentiment"
]
async
def
ensure_joined
(
client
,
invite_url
:
str
):
async
def
ensure_joined
(
client
,
invite_url
:
str
):
...
@@ -47,15 +49,38 @@ async def ensure_joined(client, invite_url: str):
...
@@ -47,15 +49,38 @@ async def ensure_joined(client, invite_url: str):
pass
pass
return
entity
return
entity
def
serialize_reactions
(
message
):
def
safe_serialize_reactions
(
message
):
if
not
getattr
(
message
,
"reactions"
,
None
):
r
=
getattr
(
message
,
"reactions"
,
None
)
if
not
r
or
not
getattr
(
r
,
"results"
,
None
):
return
""
return
""
parts
=
[]
parts
=
[]
for
rc
in
message
.
reactions
.
results
:
for
rc
in
r
.
results
:
label
=
render_reaction_label
(
rc
.
reaction
)
label
=
render_reaction_label
(
rc
.
reaction
)
parts
.
append
(
f
"
{
label
}
:
{
rc
.
count
}
"
)
parts
.
append
(
f
"
{
label
}
:
{
rc
.
count
}
"
)
return
";"
.
join
(
parts
)
return
";"
.
join
(
parts
)
async
def
process_message_for_csv
(
message
):
sentiment
=
await
asyncio
.
to_thread
(
sentiment_analyzer
,
message
.
text
or
""
)
row
=
{
"chat_id"
:
message
.
chat_id
,
"message_id"
:
message
.
id
,
"sender_id"
:
getattr
(
message
,
"sender_id"
,
None
),
"timestamp"
:
message
.
date
.
isoformat
()
if
getattr
(
message
,
"date"
,
None
)
else
None
,
"text"
:
(
message
.
text
[:
3000
]
if
message
.
text
else
""
),
"has_media"
:
bool
(
message
.
media
),
"media_type"
:
type
(
message
.
media
).
__name__
if
message
.
media
else
""
,
"file_name"
:
getattr
(
message
.
file
,
"name"
,
""
)
if
getattr
(
message
,
"file"
,
None
)
else
""
,
"file_size_kb"
:
round
(
getattr
(
message
.
file
,
"size"
,
0
)
/
1024
,
2
)
if
getattr
(
message
,
"file"
,
None
)
else
""
,
"views"
:
getattr
(
message
,
"views"
,
None
),
"reactions"
:
safe_serialize_reactions
(
message
),
"sentiment"
:
sentiment
[
0
][
"label"
]
if
sentiment
else
""
}
try
:
write_csv_row
(
row
)
except
Exception
as
e
:
print
(
f
"CSV write error:
{
e
}
"
)
def
render_reaction_label
(
r
):
def
render_reaction_label
(
r
):
if
isinstance
(
r
,
ReactionEmoji
):
if
isinstance
(
r
,
ReactionEmoji
):
return
r
.
emoticon
# e.g., "👍"
return
r
.
emoticon
# e.g., "👍"
...
@@ -70,30 +95,14 @@ def render_reaction_label(r):
...
@@ -70,30 +95,14 @@ def render_reaction_label(r):
def
write_csv_row
(
row_dict
):
def
write_csv_row
(
row_dict
):
# Ensure file exists and has header; then append
# Ensure file exists and has header; then append
CSV_PATH
=
Path
(
"Path to csv file
"
)
CSV_PATH
=
Path
(
r
"C:\Users\prana\Desktop\HFT\telegram.csv
"
)
file_exists
=
os
.
path
.
exists
(
CSV_PATH
)
file_exists
=
os
.
path
.
exists
(
CSV_PATH
)
with
open
(
CSV_PATH
,
mode
=
"a"
,
newline
=
""
,
encoding
=
"utf-8"
)
as
f
:
with
open
(
CSV_PATH
,
mode
=
"a"
,
newline
=
""
,
encoding
=
"utf-8
-sig
"
)
as
f
:
writer
=
csv
.
DictWriter
(
f
,
fieldnames
=
HEADER
)
writer
=
csv
.
DictWriter
(
f
,
fieldnames
=
HEADER
)
if
not
file_exists
:
if
not
file_exists
:
writer
.
writeheader
()
writer
.
writeheader
()
writer
.
writerow
(
row_dict
)
writer
.
writerow
(
row_dict
)
async
def
process_message_for_csv
(
message
):
row
=
{
"chat_id"
:
message
.
chat_id
,
"message_id"
:
message
.
id
,
"sender_id"
:
getattr
(
message
,
"sender_id"
,
None
),
"timestamp"
:
(
message
.
date
.
isoformat
()
if
getattr
(
message
,
"date"
,
None
)
else
None
),
"text"
:
(
message
.
text
[:
3000
]
if
message
.
text
else
""
),
"has_media"
:
bool
(
message
.
media
),
"media_type"
:
type
(
message
.
media
).
__name__
if
message
.
media
else
""
,
"file_name"
:
getattr
(
message
.
file
,
"name"
,
""
)
if
getattr
(
message
,
"file"
,
None
)
else
""
,
"file_size_kb"
:
round
(
getattr
(
message
.
file
,
"size"
,
0
)
/
1024
,
2
)
if
getattr
(
message
,
"file"
,
None
)
else
""
,
"views"
:
getattr
(
message
,
"views"
,
None
),
"reactions"
:
serialize_reactions
(
message
)
}
write_csv_row
(
row
)
async
def
main
():
async
def
main
():
client
=
TelegramClient
(
SESSION
,
API_ID
,
API_HASH
)
client
=
TelegramClient
(
SESSION
,
API_ID
,
API_HASH
)
await
client
.
start
()
await
client
.
start
()
...
@@ -134,12 +143,12 @@ async def main():
...
@@ -134,12 +143,12 @@ async def main():
if
target
:
if
target
:
msgs
=
[]
msgs
=
[]
async
for
msg
in
client
.
iter_messages
(
target
,
limit
=
4
):
# After collecting
msgs
.
append
(
msg
)
msgs
=
[
msg
async
for
msg
in
client
.
iter_messages
(
target
,
limit
=
10
)]
for
m
in
reversed
(
msgs
):
for
m
in
reversed
(
msgs
):
await
process_message
(
m
)
await
process_message
(
m
)
@
client
.
on
(
events
.
NewMessage
(
chats
=
target
))
@
client
.
on
(
events
.
NewMessage
(
chats
=
target
))
async
def
handle_new
(
event
):
async
def
handle_new
(
event
):
message
=
event
.
message
message
=
event
.
message
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment