From 2f78b812baeaf681320e96476384f081e3a365da Mon Sep 17 00:00:00 2001 From: Vxrtrauter Date: Fri, 17 Oct 2025 20:23:44 +0200 Subject: [PATCH 1/8] add besic scraping with message retrieving logic; still featuring full testing & debug outpus --- core/data/scrapers/monkrus.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 core/data/scrapers/monkrus.py diff --git a/core/data/scrapers/monkrus.py b/core/data/scrapers/monkrus.py new file mode 100644 index 0000000..64c25ad --- /dev/null +++ b/core/data/scrapers/monkrus.py @@ -0,0 +1,18 @@ +from bs4 import BeautifulSoup +import requests + + + +def scrape_monkrus_telegram(): + telegram_channel = "https://t.me/s/real_monkrus/rss" + + response = requests.get(telegram_channel) + print(response.status_code) # rm later + + soup = BeautifulSoup(response.text, 'html.parser') + posts_txt = soup.find_all('div', class_=["tgme_widget_message_wrap js-widget_message_wrap", "tgme_widget_message_wrap js-widget_message_wrap date_visible"]) + + print(posts_txt) + + +scrape_monkrus_telegram() \ No newline at end of file From 5637e8065703f226761f80d18b33e93694a5b0fc Mon Sep 17 00:00:00 2001 From: Vxrtrauter Date: Fri, 17 Oct 2025 21:23:17 +0200 Subject: [PATCH 2/8] added some more testing stuff --- core/data/scrapers/monkrus.py | 14 +++++++++++--- core/utils/data/state.py | 7 +++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/core/data/scrapers/monkrus.py b/core/data/scrapers/monkrus.py index 64c25ad..3b60645 100644 --- a/core/data/scrapers/monkrus.py +++ b/core/data/scrapers/monkrus.py @@ -1,18 +1,26 @@ +from core.utils.data.state import state, Post from bs4 import BeautifulSoup import requests def scrape_monkrus_telegram(): - telegram_channel = "https://t.me/s/real_monkrus/rss" + telegram_channel = "https://t.me/s/real_monkrus/" + posts: list[Post] = [] response = requests.get(telegram_channel) print(response.status_code) # rm later - soup = BeautifulSoup(response.text, 'html.parser') - posts_txt = soup.find_all('div', class_=["tgme_widget_message_wrap js-widget_message_wrap", "tgme_widget_message_wrap js-widget_message_wrap date_visible"]) + soup = BeautifulSoup(response.text, "html.parser") + posts = soup.find_all("div", class_=["tgme_widget_message_wrap js-widget_message_wrap", "tgme_widget_message_wrap js-widget_message_wrap date_visible"]) + + for post in posts: + posts_txt = post.find("div", class_="tgme_widget_message_text js-message_text") # this doesnt work + + print(posts_txt) + scrape_monkrus_telegram() \ No newline at end of file diff --git a/core/utils/data/state.py b/core/utils/data/state.py index 633415e..deb9558 100644 --- a/core/utils/data/state.py +++ b/core/utils/data/state.py @@ -20,3 +20,10 @@ class AppState: aria2_threads: int = 4 state = AppState(posts=[], post_titles=[], post_urls=[], post_author=[], downloads=[], download_path="") + +@dataclass +class Post: + id: int + title: str + url: str + author: str From 1cab671a130aa7de9ee191be6e35e1fc8419a8bb Mon Sep 17 00:00:00 2001 From: Vxrtrauter Date: Sat, 18 Oct 2025 01:08:36 +0200 Subject: [PATCH 3/8] add more testing stuff --- core/data/scrapers/monkrus.py | 11 ++++++----- core/utils/data/state.py | 5 +---- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/core/data/scrapers/monkrus.py b/core/data/scrapers/monkrus.py index 3b60645..ea4bf8c 100644 --- a/core/data/scrapers/monkrus.py +++ b/core/data/scrapers/monkrus.py @@ -12,14 +12,15 @@ def scrape_monkrus_telegram(): print(response.status_code) # rm later soup = BeautifulSoup(response.text, "html.parser") - posts = soup.find_all("div", class_=["tgme_widget_message_wrap js-widget_message_wrap", "tgme_widget_message_wrap js-widget_message_wrap date_visible"]) + bubbles = soup.find_all("div", class_="tgme_widget_message_bubble") - for post in posts: - posts_txt = post.find("div", class_="tgme_widget_message_text js-message_text") # this doesnt work + for bubble in bubbles: + post_txt = bubble.find("div", class_="tgme_widget_message_text js-message_text") # this doesnt work + if post_txt.b: + posts.append(Post(text=post_txt.get_text())) - - print(posts_txt) + print(post_txt.b.text) diff --git a/core/utils/data/state.py b/core/utils/data/state.py index deb9558..ebedd07 100644 --- a/core/utils/data/state.py +++ b/core/utils/data/state.py @@ -23,7 +23,4 @@ state = AppState(posts=[], post_titles=[], post_urls=[], post_author=[], downloa @dataclass class Post: - id: int - title: str - url: str - author: str + text: str From 7e5e3033e6f3b52d557c45ccce5e0322e4289a39 Mon Sep 17 00:00:00 2001 From: Vxrtrauter Date: Sat, 18 Oct 2025 01:22:11 +0200 Subject: [PATCH 4/8] add scraping logic --- core/data/scrapers/monkrus.py | 18 ++++++++++++++---- core/utils/data/state.py | 5 ++++- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/core/data/scrapers/monkrus.py b/core/data/scrapers/monkrus.py index ea4bf8c..d3cdff4 100644 --- a/core/data/scrapers/monkrus.py +++ b/core/data/scrapers/monkrus.py @@ -15,12 +15,22 @@ def scrape_monkrus_telegram(): bubbles = soup.find_all("div", class_="tgme_widget_message_bubble") for bubble in bubbles: - post_txt = bubble.find("div", class_="tgme_widget_message_text js-message_text") # this doesnt work - if post_txt.b: - posts.append(Post(text=post_txt.get_text())) + post_txt = bubble.find("div", class_="tgme_widget_message_text js-message_text") + + title = post_txt.b.text + url = bubble.find("a", href=lambda x: x and x.startswith("https://uztracker.net")) - print(post_txt.b.text) + + posts.append(Post( + id = len(posts) + 1, + title = title, + url = url, + author = "m0nkrus" + + )) + + print(posts) diff --git a/core/utils/data/state.py b/core/utils/data/state.py index ebedd07..deb9558 100644 --- a/core/utils/data/state.py +++ b/core/utils/data/state.py @@ -23,4 +23,7 @@ state = AppState(posts=[], post_titles=[], post_urls=[], post_author=[], downloa @dataclass class Post: - text: str + id: int + title: str + url: str + author: str From 1822a150d7beafb3a13dc0455f50797d671285a6 Mon Sep 17 00:00:00 2001 From: Vxrtrauter Date: Sat, 18 Oct 2025 01:33:12 +0200 Subject: [PATCH 5/8] finnish monkrus scraper (probably) --- core/data/scrapers/monkrus.py | 22 +++++++--------------- core/utils/data/state.py | 7 ------- 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/core/data/scrapers/monkrus.py b/core/data/scrapers/monkrus.py index d3cdff4..aad7aef 100644 --- a/core/data/scrapers/monkrus.py +++ b/core/data/scrapers/monkrus.py @@ -1,4 +1,4 @@ -from core.utils.data.state import state, Post +from core.utils.data.state import state from bs4 import BeautifulSoup import requests @@ -6,11 +6,9 @@ import requests def scrape_monkrus_telegram(): telegram_channel = "https://t.me/s/real_monkrus/" - posts: list[Post] = [] + posts: list[dict] = [] response = requests.get(telegram_channel) - print(response.status_code) # rm later - soup = BeautifulSoup(response.text, "html.parser") bubbles = soup.find_all("div", class_="tgme_widget_message_bubble") @@ -20,18 +18,12 @@ def scrape_monkrus_telegram(): title = post_txt.b.text url = bubble.find("a", href=lambda x: x and x.startswith("https://uztracker.net")) - - - posts.append(Post( + posts.append(dict( + author = "m0nkrus", id = len(posts) + 1, title = title, - url = url, - author = "m0nkrus" - + url = url["href"] )) - print(posts) - - - -scrape_monkrus_telegram() \ No newline at end of file + posts.reverse() # reverse to show most recent posts (bubbles) at top of list + return(posts) \ No newline at end of file diff --git a/core/utils/data/state.py b/core/utils/data/state.py index deb9558..633415e 100644 --- a/core/utils/data/state.py +++ b/core/utils/data/state.py @@ -20,10 +20,3 @@ class AppState: aria2_threads: int = 4 state = AppState(posts=[], post_titles=[], post_urls=[], post_author=[], downloads=[], download_path="") - -@dataclass -class Post: - id: int - title: str - url: str - author: str From c99ce339e07325834617a643aa228a101cb01f36 Mon Sep 17 00:00:00 2001 From: Vxrtrauter Date: Sat, 18 Oct 2025 01:49:00 +0200 Subject: [PATCH 6/8] fully impl. monkrus scraper (+ add search logic to scraper) --- core/data/scrapers/monkrus.py | 16 ++++++++-------- core/interface/gui.py | 2 +- core/interface/utils/searchhelper.py | 20 ++++++++++++++++++-- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/core/data/scrapers/monkrus.py b/core/data/scrapers/monkrus.py index aad7aef..e38a791 100644 --- a/core/data/scrapers/monkrus.py +++ b/core/data/scrapers/monkrus.py @@ -1,10 +1,9 @@ -from core.utils.data.state import state from bs4 import BeautifulSoup import requests -def scrape_monkrus_telegram(): +def scrape_monkrus_telegram(query): telegram_channel = "https://t.me/s/real_monkrus/" posts: list[dict] = [] @@ -18,12 +17,13 @@ def scrape_monkrus_telegram(): title = post_txt.b.text url = bubble.find("a", href=lambda x: x and x.startswith("https://uztracker.net")) - posts.append(dict( - author = "m0nkrus", - id = len(posts) + 1, - title = title, - url = url["href"] - )) + if query.lower() in title.lower(): + posts.append(dict( + author = "m0nkrus", + id = len(posts) + 1, + title = title, + url = url["href"] + )) posts.reverse() # reverse to show most recent posts (bubbles) at top of list return(posts) \ No newline at end of file diff --git a/core/interface/gui.py b/core/interface/gui.py index 1c8caf7..6b4e5bd 100644 --- a/core/interface/gui.py +++ b/core/interface/gui.py @@ -139,7 +139,7 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): toolbar.setLayoutDirection(Qt.RightToLeft) self.tracker_list = QComboBox() - self.tracker_list.addItems(["rutracker", "uztracker"]) + self.tracker_list.addItems(["rutracker", "uztracker", "m0nkrus"]) self.tracker_list.activated.connect(self.set_tracker) diff --git a/core/interface/utils/searchhelper.py b/core/interface/utils/searchhelper.py index 6fdd3dc..cf6f22a 100644 --- a/core/interface/utils/searchhelper.py +++ b/core/interface/utils/searchhelper.py @@ -1,6 +1,6 @@ -import asyncio from core.data.scrapers.uztracker import scrape_uztracker from core.data.scrapers.rutracker import scrape_rutracker +from core.data.scrapers.monkrus import scrape_monkrus_telegram from core.utils.network.jsonhandler import split_data, format_data from core.utils.data.state import state @@ -55,4 +55,20 @@ def return_pressed(self): if state.debug: print(f"No response from rutracker") self.softwareList.clear() - self.show_empty_results(True) \ No newline at end of file + self.show_empty_results(True) + + elif state.tracker == "m0nkrus": + state.posts = scrape_monkrus_telegram(search_text) + + if state.posts == []: + if state.debug: + print(f"No Results for {search_text}") + self.softwareList.clear() + self.show_empty_results(True) + else: + state.post_titles, _, state.post_author = format_data(state.posts) + self.show_empty_results(False) + self.post_author_list.clear() + self.post_author_list.addItems(state.post_author) + self.softwareList.clear() + self.softwareList.addItems(state.post_titles) From bd8320a26ccca6a85434477a0a0c6f28d3bc32e9 Mon Sep 17 00:00:00 2001 From: Vxrtrauter Date: Sat, 18 Oct 2025 02:25:15 +0200 Subject: [PATCH 7/8] improve monkrus scraper for more results --- core/data/scrapers/monkrus.py | 58 +++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/core/data/scrapers/monkrus.py b/core/data/scrapers/monkrus.py index e38a791..6bfd1ea 100644 --- a/core/data/scrapers/monkrus.py +++ b/core/data/scrapers/monkrus.py @@ -1,29 +1,41 @@ from bs4 import BeautifulSoup import requests - - def scrape_monkrus_telegram(query): - telegram_channel = "https://t.me/s/real_monkrus/" + post = 100 + max_posts = 250 posts: list[dict] = [] + added = set() + + while post <= max_posts: + url = f"https://t.me/s/real_monkrus/{post}" + response = requests.get(url) + soup = BeautifulSoup(response.text, "html.parser") + bubbles = soup.find_all("div", class_="tgme_widget_message_bubble") + + if not bubbles: + break + + for bubble in bubbles: + post_txt = bubble.find("div", class_="tgme_widget_message_text js-message_text") + if not post_txt or not post_txt.b: + continue + + title = post_txt.b.text + link = bubble.find("a", href=lambda x: x and x.startswith("https://uztracker.net")) + + if query.lower() in title.lower() and link: + post_url = link["href"] + if post_url not in added: + added.add(post_url) + posts.append(dict( + author="m0nkrus", + id=len(posts) + 1, + title=title, + url=post_url + )) + + post += 22 - response = requests.get(telegram_channel) - soup = BeautifulSoup(response.text, "html.parser") - bubbles = soup.find_all("div", class_="tgme_widget_message_bubble") - - for bubble in bubbles: - post_txt = bubble.find("div", class_="tgme_widget_message_text js-message_text") - - title = post_txt.b.text - url = bubble.find("a", href=lambda x: x and x.startswith("https://uztracker.net")) - - if query.lower() in title.lower(): - posts.append(dict( - author = "m0nkrus", - id = len(posts) + 1, - title = title, - url = url["href"] - )) - - posts.reverse() # reverse to show most recent posts (bubbles) at top of list - return(posts) \ No newline at end of file + posts.reverse() + return(posts) From 10c935e852d618194839dc4576b9ce3df73b1aaa Mon Sep 17 00:00:00 2001 From: Vxrtrauter Date: Sat, 18 Oct 2025 02:31:00 +0200 Subject: [PATCH 8/8] fix tracker.py to handle m0nkrus scraper for downloads --- core/utils/data/tracker.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/utils/data/tracker.py b/core/utils/data/tracker.py index dbd5090..172788d 100644 --- a/core/utils/data/tracker.py +++ b/core/utils/data/tracker.py @@ -19,6 +19,12 @@ def get_item_url(item, posts, post_titles): # softwarelist currentitem, post lis if state.debug: print("Found post URL: ", post_links[0]) return post_links[0] + if state.tracker == "m0nkrus": + item_dict = posts[post_index] + _, post_links, _ = format_data([item_dict]) + if state.debug: + print("Found post URL: ", post_links[0]) + return post_links[0] return None