diff --git a/misskaty/__init__.py b/misskaty/__init__.py index 6982e12c..601f1409 100644 --- a/misskaty/__init__.py +++ b/misskaty/__init__.py @@ -42,7 +42,7 @@ MOD_NOLOAD = ["subscene_dl"] HELPABLE = {} cleanmode = {} botStartTime = time.time() -misskaty_version = "v2.11.2 - Stable" +misskaty_version = "v2.11.3 - Stable" uvloop.install() faulthandler_enable() diff --git a/misskaty/core/misskaty_patch/utils/handler_error.py b/misskaty/core/misskaty_patch/utils/handler_error.py index 3e4ae557..0581dddb 100644 --- a/misskaty/core/misskaty_patch/utils/handler_error.py +++ b/misskaty/core/misskaty_patch/utils/handler_error.py @@ -53,7 +53,7 @@ async def handle_error( f_errname = f"crash_{tgl_now.strftime('%d %B %Y')}.txt" LOGGER.error(traceback.format_exc()) with open(f_errname, "w+", encoding="utf-8") as log: - log.write(f"✍️ message: {m.text or m.caption}\n\n{traceback.format_exc()}") + log.write(f"✍️ Message: {m.text or m.caption}\n👱‍♂️ User: {m.from_user.id if m.from_user else m.sender_chat.id}\n\n{traceback.format_exc()}") log.close() if isinstance(m, pyrogram.types.Message): with contextlib.suppress(Exception): diff --git a/misskaty/plugins/admin.py b/misskaty/plugins/admin.py index 4b9834c4..cd6a6bda 100644 --- a/misskaty/plugins/admin.py +++ b/misskaty/plugins/admin.py @@ -470,7 +470,7 @@ async def demote(client, message, strings): umention = (await app.get_users(user_id)).mention await message.reply_text(f"Demoted! {umention}") except ChatAdminRequired: - await message.reply() + await message.reply("Please give permission to demote members..") # Pin Messages diff --git a/misskaty/plugins/imdb_search.py b/misskaty/plugins/imdb_search.py index 5f268bf4..b59c1576 100644 --- a/misskaty/plugins/imdb_search.py +++ b/misskaty/plugins/imdb_search.py @@ -2,6 +2,7 @@ # * @date 2023-06-21 22:12:27 # * @projectName MissKatyPyro # * Copyright ©YasirPedia All rights reserved +import httpx import json import logging import re @@ -138,6 +139,7 @@ async def imdb_search_id(kueri, message): r = await fetch.get( f"https://v3.sg.media-imdb.com/suggestion/titles/x/{quote_plus(kueri)}.json" ) + r.raise_for_status() res = r.json().get("d") if not res: return await k.edit_caption( @@ -175,6 +177,8 @@ async def imdb_search_id(kueri, message): ) buttons.add(*BTN) await k.edit_caption(msg, reply_markup=buttons) + except httpx.HTTPError as exc: + await k.edit_caption(f"HTTP Exception for IMDB Search - {exc}", disable_web_page_preview=True) except (MessageIdInvalid, MessageNotModified): pass except Exception as err: @@ -196,6 +200,7 @@ async def imdb_search_en(kueri, message): r = await fetch.get( f"https://v3.sg.media-imdb.com/suggestion/titles/x/{quote_plus(kueri)}.json" ) + r.raise_for_status() res = r.json().get("d") if not res: return await k.edit_caption( @@ -233,6 +238,8 @@ async def imdb_search_en(kueri, message): ) buttons.add(*BTN) await k.edit_caption(msg, reply_markup=buttons) + except httpx.HTTPError as exc: + await k.edit_caption(f"HTTP Exception for IMDB Search - {exc}", disable_web_page_preview=True) except (MessageIdInvalid, MessageNotModified): pass except Exception as err: @@ -265,6 +272,7 @@ async def imdbcari(_, query: CallbackQuery): r = await fetch.get( f"https://v3.sg.media-imdb.com/suggestion/titles/x/{quote_plus(kueri)}.json" ) + r.raise_for_status() res = r.json().get("d") if not res: return await query.message.edit_caption( @@ -297,6 +305,8 @@ async def imdbcari(_, query: CallbackQuery): ) buttons.add(*BTN) await query.message.edit_caption(msg, reply_markup=buttons) + except httpx.HTTPError as exc: + await query.message.edit_caption(f"HTTP Exception for IMDB Search - {exc}", disable_web_page_preview=True) except (MessageIdInvalid, MessageNotModified): pass except Exception as err: @@ -318,6 +328,7 @@ async def imdbcari(_, query: CallbackQuery): r = await fetch.get( f"https://v3.sg.media-imdb.com/suggestion/titles/x/{quote_plus(kueri)}.json" ) + r.raise_for_status() res = r.json().get("d") if not res: return await query.message.edit_caption( @@ -350,6 +361,8 @@ async def imdbcari(_, query: CallbackQuery): ) buttons.add(*BTN) await query.message.edit_caption(msg, reply_markup=buttons) + except httpx.HTTPError as exc: + await query.message.edit_caption(f"HTTP Exception for IMDB Search - {exc}", disable_web_page_preview=True) except (MessageIdInvalid, MessageNotModified): pass except Exception as err: @@ -367,6 +380,7 @@ async def imdb_id_callback(self: Client, query: CallbackQuery): await query.message.edit_caption("⏳ Permintaan kamu sedang diproses.. ") imdb_url = f"https://www.imdb.com/title/tt{movie}/" resp = await fetch.get(imdb_url) + resp.raise_for_status() sop = BeautifulSoup(resp, "lxml") r_json = json.loads( sop.find("script", attrs={"type": "application/ld+json"}).contents[0] @@ -510,6 +524,8 @@ async def imdb_id_callback(self: Client, query: CallbackQuery): await query.message.edit_caption( res_str, parse_mode=enums.ParseMode.HTML, reply_markup=markup ) + except httpx.HTTPError as exc: + await query.message.edit_caption(f"HTTP Exception for IMDB Search - {exc}", disable_web_page_preview=True) except AttributeError: await query.message.edit_caption("Maaf, gagal mendapatkan info data dari IMDB.") except (MessageNotModified, MessageIdInvalid): @@ -525,6 +541,7 @@ async def imdb_en_callback(self: Client, query: CallbackQuery): await query.message.edit_caption("⏳ Getting IMDb source..") imdb_url = f"https://www.imdb.com/title/tt{movie}/" resp = await fetch.get(imdb_url) + resp.raise_for_status() sop = BeautifulSoup(resp, "lxml") r_json = json.loads( sop.find("script", attrs={"type": "application/ld+json"}).contents[0] @@ -670,6 +687,8 @@ async def imdb_en_callback(self: Client, query: CallbackQuery): await query.message.edit_caption( res_str, parse_mode=enums.ParseMode.HTML, reply_markup=markup ) + except httpx.HTTPError as exc: + await query.message.edit_caption(f"HTTP Exception for IMDB Search - {exc}", disable_web_page_preview=True) except AttributeError: await query.message.edit_caption("Sorry, failed getting data from IMDB.") except (MessageNotModified, MessageIdInvalid): diff --git a/misskaty/plugins/web_scraper.py b/misskaty/plugins/web_scraper.py index 00ffaebc..c0a93c7a 100644 --- a/misskaty/plugins/web_scraper.py +++ b/misskaty/plugins/web_scraper.py @@ -4,6 +4,7 @@ * @projectName MissKatyPyro * Copyright @YasirPedia All rights reserved """ +import httpx import logging import re import traceback @@ -71,19 +72,20 @@ def split_arr(arr, size: 5): async def getDataTerbit21(msg, kueri, CurrentPage, strings): if not SCRAP_DICT.get(msg.id): try: - terbitjson = ( - (await fetch.get(f"{web['yasirapi']}/terbit21?q={kueri}")).json() - if kueri - else (await fetch.get("https://yasirapi.eu.org/terbit21")).json() - ) - except: - await msg.edit_msg(strings("err_getapi")) + if kueri: + terbitjson = await fetch.get(f"{web['yasirapi']}/terbit21?q={kueri}") + else: + terbitjson = await fetch.get(f"{web['yasirapi']}/terbit21") + terbitjson.raise_for_status() + except httpx.HTTPError as exc: + await msg.edit_msg(f"ERROR: Failed to fetch data from {exc.request.url} - {exc}") return None, None - if not terbitjson.get("result"): + res = terbitjson.json() + if not res.get("result"): await msg.edit_msg(strings("no_result"), del_in=5) return None, None SCRAP_DICT.add( - msg.id, [split_arr(terbitjson["result"], 6), kueri], timeout=1800 + msg.id, [split_arr(res["result"], 6), kueri], timeout=1800 ) try: index = int(CurrentPage - 1) @@ -113,18 +115,19 @@ async def getDataTerbit21(msg, kueri, CurrentPage, strings): async def getDatalk21(msg, kueri, CurrentPage, strings): if not SCRAP_DICT.get(msg.id): try: - lk21json = ( - (await fetch.get(f"{web['yasirapi']}/lk21?q={kueri}")).json() - if kueri - else (await fetch.get("https://yasirapi.eu.org/lk21")).json() - ) - except: - await msg.edit_msg(strings("err_getapi")) + if kueri: + lk21json = await fetch.get(f"{web['yasirapi']}/lk21?q={kueri}") + else: + lk21json = await fetch.get(f"{web['yasirapi']}/lk21") + lk21json.raise_for_status() + except httpx.HTTPError as exc: + await msg.edit_msg(f"ERROR: Failed to fetch data from {exc.request.url} - {exc}") return None, None - if not lk21json.get("result"): + res = lk21json.json() + if not res.get("result"): await msg.edit_msg(strings("no_result"), del_in=5) return None, None - SCRAP_DICT.add(msg.id, [split_arr(lk21json["result"], 6), kueri], timeout=1800) + SCRAP_DICT.add(msg.id, [split_arr(res["result"], 6), kueri], timeout=1800) try: index = int(CurrentPage - 1) PageLen = len(SCRAP_DICT[msg.id][0]) @@ -153,14 +156,19 @@ async def getDatalk21(msg, kueri, CurrentPage, strings): async def getDataPahe(msg, kueri, CurrentPage, strings): if not SCRAP_DICT.get(msg.id): try: - pahejson = (await fetch.get(f"{web['yasirapi']}/pahe?q={kueri}")).json() - except: - await msg.edit_msg(strings("err_getapi")) + if kueri: + pahejson = await fetch.get(f"{web['yasirapi']}/pahe?q={kueri}") + else: + pahejson = await fetch.get(f"{web['yasirapi']}/pahe") + pahejson.raise_for_status() + except httpx.HTTPError as exc: + await msg.edit_msg(f"ERROR: Failed to fetch data from {exc.request.url} - {exc}") return None, None - if not pahejson.get("result"): + res = pahejson.json() + if not res.get("result"): await msg.edit_msg(strings("no_result"), del_in=5) return None, None - SCRAP_DICT.add(msg.id, [split_arr(pahejson["result"], 6), kueri], timeout=1800) + SCRAP_DICT.add(msg.id, [split_arr(res["result"], 6), kueri], timeout=1800) try: index = int(CurrentPage - 1) PageLen = len(SCRAP_DICT[msg.id][0]) @@ -185,11 +193,13 @@ async def getDataPahe(msg, kueri, CurrentPage, strings): async def getDataKuso(msg, kueri, CurrentPage, user, strings): if not SCRAP_DICT.get(msg.id): kusodata = [] - data = await fetch.get( - f"{web['kusonime']}/?s={kueri}", follow_redirects=True - ) - if data.status_code != 200: - await msg.edit_msg(strings("err_getweb").format(err=err)) + try: + data = await fetch.get( + f"{web['kusonime']}/?s={kueri}", follow_redirects=True + ) + data.raise_for_status() + except httpx.HTTPError as exc: + await msg.edit_msg(f"ERROR: Failed to fetch data from {exc.request.url} - {exc}", disable_web_page_preview=True) return None, 0, None, None res = BeautifulSoup(data, "lxml").find_all("h2", {"class": "episodeye"}) for i in res: @@ -237,11 +247,13 @@ async def getDataKuso(msg, kueri, CurrentPage, user, strings): async def getDataMovieku(msg, kueri, CurrentPage, strings): if not SCRAP_DICT.get(msg.id): moviekudata = [] - data = await fetch.get( - f"{web['movieku']}/?s={kueri}", follow_redirects=True - ) - if data.status_code != 200: - await msg.edit_msg(strings("err_getweb").format(err=err)) + try: + data = await fetch.get( + f"{web['movieku']}/?s={kueri}", follow_redirects=True + ) + data.raise_for_status() + except httpx.HTTPError as exc: + await msg.edit_msg(f"ERROR: Failed to fetch data from {exc.request.url} - {exc}") return None, None r = BeautifulSoup(data, "lxml") res = r.find_all(class_="bx") @@ -277,11 +289,13 @@ async def getDataMovieku(msg, kueri, CurrentPage, strings): async def getDataNodrakor(msg, kueri, CurrentPage, user, strings): if not SCRAP_DICT.get(msg.id): nodrakordata = [] - data = await fetch.get( - f"{web['nodrakor']}/?s={kueri}", follow_redirects=True, - ) - if data.status_code != 200: - await msg.edit_msg(strings("err_getweb").format(err=err)) + try: + data = await fetch.get( + f"{web['nodrakor']}/?s={kueri}", follow_redirects=True, + ) + data.raise_for_status() + except httpx.HTTPError as exc: + await msg.edit_msg(f"HTTP Exception for {exc.request.url} - {exc}", disable_web_page_preview=True) return None, 0, None text = BeautifulSoup(data, "lxml") entry = text.find_all(class_="entry-header") @@ -327,11 +341,13 @@ async def getDataNodrakor(msg, kueri, CurrentPage, user, strings): async def getDataSavefilm21(msg, kueri, CurrentPage, user, strings): if not SCRAP_DICT.get(msg.id): sfdata = [] - data = await fetch.get( - f"{web['savefilm21']}/?s={kueri}", follow_redirects=True, - ) - if data.status_code != 200: - await msg.edit_msg(strings("err_getweb").format(err=err)) + try: + data = await fetch.get( + f"{web['savefilm21']}/?s={kueri}", follow_redirects=True, + ) + data.raise_for_status() + except httpx.HTTPError as exc: + await msg.edit_msg(f"HTTP Exception for {exc.request.url} - {exc}", disable_web_page_preview=True) return None, 0, None text = BeautifulSoup(data, "lxml") entry = text.find_all(class_="entry-header") @@ -376,14 +392,16 @@ async def getDataSavefilm21(msg, kueri, CurrentPage, user, strings): # Lendrive GetData async def getDataLendrive(msg, kueri, CurrentPage, user, strings): if not SCRAP_DICT.get(msg.id): - if kueri: - data = await fetch.get( - f"{web['lendrive']}/?s={kueri}", follow_redirects=True, - ) - else: - data = await fetch.get(web["lendrive"], follow_redirects=True) - if data.status_code != 200: - await msg.edit_msg(strings("err_getweb").format(err=err)) + try: + if kueri: + data = await fetch.get( + f"{web['lendrive']}/?s={kueri}", follow_redirects=True, + ) + else: + data = await fetch.get(web["lendrive"], follow_redirects=True) + data.raise_for_status() + except httpx.HTTPError as exc: + await msg.edit_msg(f"ERROR: Failed to fetch data from {exc.request.url} - {exc}", disable_web_page_preview=True) return None, 0, None res = BeautifulSoup(data, "lxml") lenddata = [] @@ -434,11 +452,13 @@ async def getDataLendrive(msg, kueri, CurrentPage, user, strings): # MelongMovie GetData async def getDataMelong(msg, kueri, CurrentPage, user, strings): if not SCRAP_DICT.get(msg.id): - data = await fetch.get( - f"{web['melongmovie']}/?s={kueri}", follow_redirects=True, - ) - if data.status_code != 200: - await msg.edit_msg(strings("err_getweb").format(err=err)) + try: + data = await fetch.get( + f"{web['melongmovie']}/?s={kueri}", follow_redirects=True, + ) + data.raise_for_status() + except httpx.HTTPError as exc: + await msg.edit_msg(f"HTTP Exception for {exc.request.url} - {exc}", disable_web_page_preview=True) return None, 0, None bs4 = BeautifulSoup(data, "lxml") melongdata = [] @@ -482,11 +502,13 @@ async def getDataMelong(msg, kueri, CurrentPage, user, strings): # GoMov GetData async def getDataGomov(msg, kueri, CurrentPage, user, strings): if not SCRAP_DICT.get(msg.id): - gomovv = await fetch.get( - f"{web['gomov']}/?s={kueri}", follow_redirects=True - ) - if gomovv.status_code != 200: - await msg.edit_msg(strings("err_getweb").format(err=err)) + try: + gomovv = await fetch.get( + f"{web['gomov']}/?s={kueri}", follow_redirects=True + ) + gomovv.raise_for_status() + except httpx.HTTPError as exc: + await msg.edit_msg(f"ERROR: Failed to fetch data from {exc.request.url} - {exc}", disable_web_page_preview=True) return None, 0, None text = BeautifulSoup(gomovv, "lxml") entry = text.find_all(class_="entry-header") @@ -542,7 +564,7 @@ async def getSame(msg, query, current_page, strings): else: data = cfse.get(web["samehadaku"]) if data.status_code != 200: - await msg.edit_msg(strings("err_getweb").format(err=err)) + await msg.edit_msg(strings("err_getweb").format(err=data.status_code)) return None, None res = BeautifulSoup(data.text, "lxml").find_all(class_="animposx") sdata = [] @@ -1348,12 +1370,15 @@ async def savefilm21_scrap(_, callback_query, strings): ) try: html = await fetch.get(link) + html.raise_for_status() soup = BeautifulSoup(html.text, "lxml") res = soup.find_all(class_="button button-shadow") res = "".join(f"{i.text}\n{i['href']}\n\n" for i in res) await callback_query.message.edit_msg( strings("res_scrape").format(link=link, kl=res), reply_markup=keyboard ) + except httpx.HTTPError as exc: + await callback_query.message.edit_msg(f"HTTP Exception for {exc.request.url} - {exc}", reply_markup=keyboard) except Exception as err: await callback_query.message.edit_msg(f"ERROR: {err}", reply_markup=keyboard) @@ -1384,6 +1409,7 @@ async def nodrakorddl_scrap(_, callback_query, strings): ) try: html = await fetch.get(link) + html.raise_for_status() soup = BeautifulSoup(html.text, "lxml") if "/tv/" in link: result = soup.find("div", {"entry-content entry-content-single"}).find_all("p") @@ -1404,6 +1430,8 @@ async def nodrakorddl_scrap(_, callback_query, strings): await callback_query.message.edit_msg( strings("res_scrape").format(link=link, kl=res), reply_markup=keyboard ) + except httpx.HTTPError as exc: + await callback_query.message.edit_msg(f"HTTP Exception for {exc.request.url} - {exc}", reply_markup=keyboard) except Exception as err: await callback_query.message.edit_msg(f"ERROR: {err}", reply_markup=keyboard) @@ -1415,6 +1443,7 @@ async def muviku_scrap(_, message, strings): try: link = message.text.split(maxsplit=1)[1] html = await fetch.get(link) + html.raise_for_status() soup = BeautifulSoup(html.text, "lxml") res = soup.find_all(class_="smokeurl") data = [] @@ -1432,6 +1461,8 @@ async def muviku_scrap(_, message, strings): return await message.reply( strings("invalid_cmd_scrape").format(cmd=message.command[0]) ) + except httpx.HTTPError as exc: + await message.reply(f"HTTP Exception for {exc.request.url} - {exc}") except Exception as e: await message.reply(f"ERROR: {str(e)}") @@ -1462,6 +1493,7 @@ async def melong_scrap(_, callback_query, strings): ) try: html = await fetch.get(link) + html.raise_for_status() soup = BeautifulSoup(html.text, "lxml") rep = "" for ep in soup.findAll(text=re.compile(r"(?i)episode\s+\d+|LINK DOWNLOAD")): @@ -1471,6 +1503,8 @@ async def melong_scrap(_, callback_query, strings): await callback_query.message.edit_msg( strings("res_scrape").format(link=link, kl=rep), reply_markup=keyboard ) + except httpx.HTTPError as exc: + await callback_query.message.edit_msg(f"HTTP Exception for {exc.request.url} - {exc}", reply_markup=keyboard) except Exception as err: await callback_query.message.edit_msg(f"ERROR: {err}", reply_markup=keyboard) @@ -1501,6 +1535,7 @@ async def gomov_dl(_, callback_query, strings): ) try: html = await fetch.get(link) + html.raise_for_status() soup = BeautifulSoup(html.text, "lxml") entry = soup.find(class_="gmr-download-wrap clearfix") hasil = soup.find(class_="title-download").text @@ -1511,6 +1546,8 @@ async def gomov_dl(_, callback_query, strings): await callback_query.message.edit_msg( strings("res_scrape").format(link=link, kl=hasil), reply_markup=keyboard ) + except httpx.HTTPError as exc: + await callback_query.message.edit_msg(f"HTTP Exception for {exc.request.url} - {exc}", reply_markup=keyboard) except Exception as err: await callback_query.message.edit_msg(f"ERROR: {err}", reply_markup=keyboard) @@ -1538,6 +1575,7 @@ async def lendrive_dl(_, callback_query, strings): ) try: hmm = await fetch.get(link) + hmm.raise_for_status() q = BeautifulSoup(hmm.text, "lxml") j = q.findAll("div", class_="soraurlx") kl = "" @@ -1551,5 +1589,7 @@ async def lendrive_dl(_, callback_query, strings): await callback_query.message.edit_msg( strings("res_scrape").format(link=link, kl=kl), reply_markup=keyboard ) + except httpx.HTTPError as exc: + await callback_query.message.edit_msg(f"HTTP Exception for {exc.request.url} - {exc}", reply_markup=keyboard) except Exception as err: await callback_query.message.edit_msg(f"ERROR: {err}", reply_markup=keyboard)