CHange interface gomov and IMDB

This commit is contained in:
yasir 2022-12-25 13:58:40 +07:00
parent a19a6af25c
commit 505d616359
5 changed files with 750 additions and 334 deletions

View file

@ -1,3 +0,0 @@
{
"python.linting.enabled": true
}

View file

@ -45,7 +45,9 @@ def draw_multiple_line_text(image, text, font, text_start_height):
lines = textwrap.wrap(text, width=50) lines = textwrap.wrap(text, width=50)
for line in lines: for line in lines:
line_width, line_height = font.getsize(line) line_width, line_height = font.getsize(line)
draw.text(((image_width - line_width) / 2, y_text), line, font=font, fill="black") draw.text(
((image_width - line_width) / 2, y_text), line, font=font, fill="black"
)
y_text += line_height y_text += line_height
@ -55,8 +57,12 @@ def welcomepic(pic, user, chat, count, id):
background = background.resize((1024, 500), Image.ANTIALIAS) background = background.resize((1024, 500), Image.ANTIALIAS)
pfp = Image.open(pic).convert("RGBA") pfp = Image.open(pic).convert("RGBA")
pfp = circle(pfp) pfp = circle(pfp)
pfp = pfp.resize((265, 265)) # Resizes the Profilepicture so it fits perfectly in the circle pfp = pfp.resize(
font = ImageFont.truetype("Calistoga-Regular.ttf", 37) # <- Text Font of the Member Count. Change the text size for your preference (265, 265)
) # Resizes the Profilepicture so it fits perfectly in the circle
font = ImageFont.truetype(
"Calistoga-Regular.ttf", 37
) # <- Text Font of the Member Count. Change the text size for your preference
member_text = f"User#{count}, Selamat Datang {user}" # <- Text under the Profilepicture with the Membercount member_text = f"User#{count}, Selamat Datang {user}" # <- Text under the Profilepicture with the Membercount
draw_multiple_line_text(background, member_text, font, 395) draw_multiple_line_text(background, member_text, font, 395)
draw_multiple_line_text(background, chat, font, 47) draw_multiple_line_text(background, chat, font, 47)
@ -67,15 +73,23 @@ def welcomepic(pic, user, chat, count, id):
size=20, size=20,
align="right", align="right",
) )
background.paste(pfp, (379, 123), pfp) # Pastes the Profilepicture on the Background Image background.paste(
background.save(f"downloads/welcome#{id}.png") # Saves the finished Image in the folder with the filename pfp, (379, 123), pfp
) # Pastes the Profilepicture on the Background Image
background.save(
f"downloads/welcome#{id}.png"
) # Saves the finished Image in the folder with the filename
return f"downloads/welcome#{id}.png" return f"downloads/welcome#{id}.png"
@app.on_chat_member_updated(filters.group & filters.chat(-1001128045651)) @app.on_chat_member_updated(filters.group & filters.chat(-1001128045651))
@capture_err @capture_err
async def member_has_joined(c: app, member: ChatMemberUpdated): async def member_has_joined(c: app, member: ChatMemberUpdated):
if not member.new_chat_member or member.new_chat_member.status in {"banned", "left", "restricted"} or member.old_chat_member: if (
not member.new_chat_member
or member.new_chat_member.status in {"banned", "left", "restricted"}
or member.old_chat_member
):
return return
user = member.new_chat_member.user if member.new_chat_member else member.from_user user = member.new_chat_member.user if member.new_chat_member else member.from_user
if user.id in SUDO: if user.id in SUDO:
@ -94,15 +108,21 @@ async def member_has_joined(c: app, member: ChatMemberUpdated):
pass pass
mention = f"<a href='tg://user?id={user.id}'>{user.first_name}</a>" mention = f"<a href='tg://user?id={user.id}'>{user.first_name}</a>"
joined_date = datetime.fromtimestamp(time.time()).strftime("%Y.%m.%d %H:%M:%S") joined_date = datetime.fromtimestamp(time.time()).strftime("%Y.%m.%d %H:%M:%S")
first_name = f"{user.first_name} {user.last_name}" if user.last_name else user.first_name first_name = (
f"{user.first_name} {user.last_name}" if user.last_name else user.first_name
)
id = user.id id = user.id
dc = user.dc_id or "Member tanpa PP" dc = user.dc_id or "Member tanpa PP"
count = await app.get_chat_members_count(member.chat.id) count = await app.get_chat_members_count(member.chat.id)
try: try:
pic = await app.download_media(user.photo.big_file_id, file_name=f"pp{user.id}.png") pic = await app.download_media(
user.photo.big_file_id, file_name=f"pp{user.id}.png"
)
except AttributeError: except AttributeError:
pic = "img/profilepic.png" pic = "img/profilepic.png"
welcomeimg = await welcomepic(pic, user.first_name, member.chat.title, count, user.id) welcomeimg = await welcomepic(
pic, user.first_name, member.chat.title, count, user.id
)
temp.MELCOW[f"welcome-{member.chat.id}"] = await c.send_photo( temp.MELCOW[f"welcome-{member.chat.id}"] = await c.send_photo(
member.chat.id, member.chat.id,
photo=welcomeimg, photo=welcomeimg,
@ -111,18 +131,30 @@ async def member_has_joined(c: app, member: ChatMemberUpdated):
userspammer = "" userspammer = ""
# Spamwatch Detection # Spamwatch Detection
try: try:
headers = {"Authorization": "Bearer XvfzE4AUNXkzCy0DnIVpFDlxZi79lt6EnwKgBj8Quuzms0OSdHvf1k6zSeyzZ_lz"} headers = {
apispamwatch = (await http.get(f"https://api.spamwat.ch/banlist/{user.id}", headers=headers)).json() "Authorization": "Bearer XvfzE4AUNXkzCy0DnIVpFDlxZi79lt6EnwKgBj8Quuzms0OSdHvf1k6zSeyzZ_lz"
}
apispamwatch = (
await http.get(
f"https://api.spamwat.ch/banlist/{user.id}", headers=headers
)
).json()
if not apispamwatch.get("error"): if not apispamwatch.get("error"):
await app.ban_chat_member(member.chat.id, user.id, datetime.now() + timedelta(seconds=30)) await app.ban_chat_member(
member.chat.id, user.id, datetime.now() + timedelta(seconds=30)
)
userspammer += f"<b>#SpamWatch Federation Ban</b>\nUser {mention} [<code>{user.id}</code>] has been kicked because <code>{apispamwatch.get('reason')}</code>.\n" userspammer += f"<b>#SpamWatch Federation Ban</b>\nUser {mention} [<code>{user.id}</code>] has been kicked because <code>{apispamwatch.get('reason')}</code>.\n"
except Exception as err: except Exception as err:
LOGGER.error(f"ERROR in Spamwatch Detection. {err}") LOGGER.error(f"ERROR in Spamwatch Detection. {err}")
# Combot API Detection # Combot API Detection
try: try:
apicombot = (await http.get(f"https://api.cas.chat/check?user_id={user.id}")).json() apicombot = (
await http.get(f"https://api.cas.chat/check?user_id={user.id}")
).json()
if apicombot.get("ok") == "true": if apicombot.get("ok") == "true":
await app.ban_chat_member(member.chat.id, user.id, datetime.now() + timedelta(seconds=30)) await app.ban_chat_member(
member.chat.id, user.id, datetime.now() + timedelta(seconds=30)
)
userspammer += f"<b>#CAS Federation Ban</b>\nUser {mention} [<code>{user.id}</code>] detected as spambot and has been kicked. Powered by <a href='https://api.cas.chat/check?user_id={user.id}'>Combot AntiSpam.</a>" userspammer += f"<b>#CAS Federation Ban</b>\nUser {mention} [<code>{user.id}</code>] detected as spambot and has been kicked. Powered by <a href='https://api.cas.chat/check?user_id={user.id}'>Combot AntiSpam.</a>"
except Exception as err: except Exception as err:
LOGGER.error(f"ERROR in Combot API Detection. {err}") LOGGER.error(f"ERROR in Combot API Detection. {err}")
@ -151,7 +183,9 @@ async def save_group(bot, message):
await db.add_chat(message.chat.id, message.chat.title) await db.add_chat(message.chat.id, message.chat.title)
if message.chat.id in temp.BANNED_CHATS: if message.chat.id in temp.BANNED_CHATS:
# Inspired from a boat of a banana tree # Inspired from a boat of a banana tree
buttons = [[InlineKeyboardButton("Support", url=f"https://t.me/{SUPPORT_CHAT}")]] buttons = [
[InlineKeyboardButton("Support", url=f"https://t.me/{SUPPORT_CHAT}")]
]
reply_markup = InlineKeyboardMarkup(buttons) reply_markup = InlineKeyboardMarkup(buttons)
k = await message.reply( k = await message.reply(
text="<b>CHAT NOT ALLOWED 🐞\n\nMy admins has restricted me from working here ! If you want to know more about it contact support..</b>", text="<b>CHAT NOT ALLOWED 🐞\n\nMy admins has restricted me from working here ! If you want to know more about it contact support..</b>",
@ -166,7 +200,9 @@ async def save_group(bot, message):
return return
buttons = [ buttons = [
[ [
InlineKeyboardButton(" Help", url=f"https://t.me/{temp.U_NAME}?start=help"), InlineKeyboardButton(
" Help", url=f"https://t.me/{temp.U_NAME}?start=help"
),
InlineKeyboardButton("📢 Updates", url="https://t.me/YasirPediaChannel"), InlineKeyboardButton("📢 Updates", url="https://t.me/YasirPediaChannel"),
] ]
] ]
@ -179,10 +215,14 @@ async def save_group(bot, message):
for u in message.new_chat_members: for u in message.new_chat_members:
count = await app.get_chat_members_count(message.chat.id) count = await app.get_chat_members_count(message.chat.id)
try: try:
pic = await app.download_media(u.photo.big_file_id, file_name=f"pp{u.id}.png") pic = await app.download_media(
u.photo.big_file_id, file_name=f"pp{u.id}.png"
)
except AttributeError: except AttributeError:
pic = "img/profilepic.png" pic = "img/profilepic.png"
welcomeimg = await welcomepic(pic, u.first_name, message.chat.title, count, u.id) welcomeimg = await welcomepic(
pic, u.first_name, message.chat.title, count, u.id
)
if (temp.MELCOW).get(f"welcome-{message.chat.id}") is not None: if (temp.MELCOW).get(f"welcome-{message.chat.id}") is not None:
try: try:
await (temp.MELCOW[f"welcome-{message.chat.id}"]).delete() await (temp.MELCOW[f"welcome-{message.chat.id}"]).delete()
@ -213,7 +253,9 @@ async def leave_a_chat(bot, message):
except: except:
chat = chat chat = chat
try: try:
buttons = [[InlineKeyboardButton("Support", url=f"https://t.me/{SUPPORT_CHAT}")]] buttons = [
[InlineKeyboardButton("Support", url=f"https://t.me/{SUPPORT_CHAT}")]
]
reply_markup = InlineKeyboardMarkup(buttons) reply_markup = InlineKeyboardMarkup(buttons)
await bot.send_message( await bot.send_message(
chat_id=chat, chat_id=chat,
@ -245,12 +287,16 @@ async def disable_chat(bot, message):
if not cha_t: if not cha_t:
return await message.reply("Chat Not Found In DB") return await message.reply("Chat Not Found In DB")
if cha_t["is_disabled"]: if cha_t["is_disabled"]:
return await message.reply(f"This chat is already disabled:\nReason-<code> {cha_t['reason']} </code>") return await message.reply(
f"This chat is already disabled:\nReason-<code> {cha_t['reason']} </code>"
)
await db.disable_chat(chat_, reason) await db.disable_chat(chat_, reason)
temp.BANNED_CHATS.append(chat_) temp.BANNED_CHATS.append(chat_)
await message.reply("Chat Succesfully Disabled") await message.reply("Chat Succesfully Disabled")
try: try:
buttons = [[InlineKeyboardButton("Support", url=f"https://t.me/{SUPPORT_CHAT}")]] buttons = [
[InlineKeyboardButton("Support", url=f"https://t.me/{SUPPORT_CHAT}")]
]
reply_markup = InlineKeyboardMarkup(buttons) reply_markup = InlineKeyboardMarkup(buttons)
await bot.send_message( await bot.send_message(
chat_id=chat_, chat_id=chat_,
@ -295,7 +341,9 @@ async def gen_invite(bot, message):
try: try:
link = await bot.create_chat_invite_link(chat) link = await bot.create_chat_invite_link(chat)
except ChatAdminRequired: except ChatAdminRequired:
return await message.reply("Invite Link Generation Failed, Iam Not Having Sufficient Rights") return await message.reply(
"Invite Link Generation Failed, Iam Not Having Sufficient Rights"
)
except Exception as e: except Exception as e:
return await message.reply(f"Error {e}") return await message.reply(f"Error {e}")
await message.reply(f"Here is your Invite Link {link.invite_link}") await message.reply(f"Here is your Invite Link {link.invite_link}")
@ -308,11 +356,15 @@ async def adminlist(_, message):
return await message.reply("Perintah ini hanya untuk grup") return await message.reply("Perintah ini hanya untuk grup")
try: try:
administrators = [] administrators = []
async for m in app.get_chat_members(message.chat.id, filter=enums.ChatMembersFilter.ADMINISTRATORS): async for m in app.get_chat_members(
message.chat.id, filter=enums.ChatMembersFilter.ADMINISTRATORS
):
administrators.append(f"{m.user.first_name}") administrators.append(f"{m.user.first_name}")
res = "".join(f"~ {i}\n" for i in administrators) res = "".join(f"~ {i}\n" for i in administrators)
return await message.reply(f"Daftar Admin di <b>{message.chat.title}</b> ({message.chat.id}):\n~ {res}") return await message.reply(
f"Daftar Admin di <b>{message.chat.title}</b> ({message.chat.id}):\n~ {res}"
)
except Exception as e: except Exception as e:
await message.reply(f"ERROR: {str(e)}") await message.reply(f"ERROR: {str(e)}")
@ -324,14 +376,17 @@ async def kickme(_, message):
if len(message.text.split()) >= 2: if len(message.text.split()) >= 2:
reason = message.text.split(None, 1)[1] reason = message.text.split(None, 1)[1]
try: try:
await message.ban_member(message.from_user.id) await message.chat.ban_member(message.from_user.id)
txt = f"Pengguna {message.from_user.mention} menendang dirinya sendiri. Mungkin dia sedang frustasi 😕" txt = f"Pengguna {message.from_user.mention} menendang dirinya sendiri. Mungkin dia sedang frustasi 😕"
txt += f"\n<b>Alasan</b>: {reason}" if reason else "" txt += f"\n<b>Alasan</b>: {reason}" if reason else ""
await message.reply_text(txt) await message.reply_text(txt)
await message.unban_member(message.from_user.id) await message.chat.unban_member(message.from_user.id)
except RPCError as ef: except RPCError as ef:
await message.reply_text(f"Sepertinya ada error, silahkan report ke owner saya. \nERROR: {str(ef)}") await message.reply_text(
return f"Sepertinya ada error, silahkan report ke owner saya. \nERROR: {str(ef)}"
)
except Exception as err:
await message.reply(f"ERROR: {err}")
@app.on_message(filters.command("users") & filters.user(SUDO)) @app.on_message(filters.command("users") & filters.user(SUDO))

View file

@ -1,6 +1,6 @@
import json, traceback import json, traceback
from sys import version as pyver, platform from sys import version as pyver, platform
from misskaty import app, user, BOT_USERNAME from misskaty import app, user
from motor import version as mongover from motor import version as mongover
from misskaty.plugins.misc_tools import get_content from misskaty.plugins.misc_tools import get_content
from pyrogram import __version__ as pyrover from pyrogram import __version__ as pyrover
@ -38,11 +38,16 @@ PRVT_MSGS = {}
async def inline_menu(_, inline_query: InlineQuery): async def inline_menu(_, inline_query: InlineQuery):
if inline_query.query.strip().lower().strip() == "": if inline_query.query.strip().lower().strip() == "":
buttons = InlineKeyboard(row_width=2) buttons = InlineKeyboard(row_width=2)
buttons.add(*[(InlineKeyboardButton(text=i, switch_inline_query_current_chat=i)) for i in keywords_list]) buttons.add(
*[
(InlineKeyboardButton(text=i, switch_inline_query_current_chat=i))
for i in keywords_list
]
)
btn = InlineKeyboard(row_width=2) btn = InlineKeyboard(row_width=2)
bot_state = "Alive" if await app.get_me() else "Dead" bot_state = "Dead" if not await app.get_me() else "Alive"
ubot_state = "Alive" if await user.get_me() else "Dead" ubot_state = "Dead" if not await user.get_me() else "Alive"
btn.add( btn.add(
InlineKeyboardButton("Stats", callback_data="stats_callback"), InlineKeyboardButton("Stats", callback_data="stats_callback"),
InlineKeyboardButton("Go Inline!", switch_inline_query_current_chat=""), InlineKeyboardButton("Go Inline!", switch_inline_query_current_chat=""),
@ -62,21 +67,27 @@ async def inline_menu(_, inline_query: InlineQuery):
InlineQueryResultArticle( InlineQueryResultArticle(
title="Inline Commands", title="Inline Commands",
description="Help Related To Inline Usage.", description="Help Related To Inline Usage.",
input_message_content=InputTextMessageContent("Click A Button To Get Started."), input_message_content=InputTextMessageContent(
"Click A Button To Get Started."
),
thumb_url="https://hamker.me/cy00x5x.png", thumb_url="https://hamker.me/cy00x5x.png",
reply_markup=buttons, reply_markup=buttons,
), ),
InlineQueryResultArticle( InlineQueryResultArticle(
title="Github Repo", title="Github Dev",
description="Github Repo of This Bot.", description="Github Owner of Bot.",
input_message_content=InputTextMessageContent(f"<b>Github Repo @{BOT_USERNAME}</b>\n\nhttps://github.com/yasirarism/MissKatyPyro"), input_message_content=InputTextMessageContent(
"https://github.com/yasirarism"
),
thumb_url="https://hamker.me/gjc9fo3.png", thumb_url="https://hamker.me/gjc9fo3.png",
), ),
InlineQueryResultArticle( InlineQueryResultArticle(
title="Alive", title="Alive",
description="Check Bot's Stats", description="Check Bot's Stats",
thumb_url="https://yt3.ggpht.com/ytc/AMLnZu-zbtIsllERaGYY8Aecww3uWUASPMjLUUEt7ecu=s900-c-k-c0x00ffffff-no-rj", thumb_url="https://yt3.ggpht.com/ytc/AMLnZu-zbtIsllERaGYY8Aecww3uWUASPMjLUUEt7ecu=s900-c-k-c0x00ffffff-no-rj",
input_message_content=InputTextMessageContent(msg, disable_web_page_preview=True), input_message_content=InputTextMessageContent(
msg, disable_web_page_preview=True
),
reply_markup=btn, reply_markup=btn,
), ),
] ]
@ -89,8 +100,13 @@ async def inline_menu(_, inline_query: InlineQuery):
switch_pm_parameter="inline", switch_pm_parameter="inline",
) )
judul = inline_query.query.split(None, 1)[1].strip() judul = inline_query.query.split(None, 1)[1].strip()
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/61.0.3163.100 Safari/537.36"} headers = {
search_results = await http.get(f"https://www.google.com/search?q={judul}&num=20", headers=headers) "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/61.0.3163.100 Safari/537.36"
}
search_results = await http.get(
f"https://www.google.com/search?q={judul}&num=20", headers=headers
)
soup = BeautifulSoup(search_results.text, "lxml") soup = BeautifulSoup(search_results.text, "lxml")
data = [] data = []
for result in soup.select(".tF2Cxc"): for result in soup.select(".tF2Cxc"):
@ -113,7 +129,9 @@ async def inline_menu(_, inline_query: InlineQuery):
url=link, url=link,
description=snippet, description=snippet,
thumb_url="https://te.legra.ph/file/ed8ea62ae636793000bb4.jpg", thumb_url="https://te.legra.ph/file/ed8ea62ae636793000bb4.jpg",
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="Open Website", url=link)]]), reply_markup=InlineKeyboardMarkup(
[[InlineKeyboardButton(text="Open Website", url=link)]]
),
) )
) )
await inline_query.answer( await inline_query.answer(
@ -134,7 +152,7 @@ async def inline_menu(_, inline_query: InlineQuery):
_id = inline_query.query.split()[1] _id = inline_query.query.split()[1]
msg = inline_query.query.split(None, 2)[2].strip() msg = inline_query.query.split(None, 2)[2].strip()
if not msg or not msg.endswith(":"): if not (msg and msg.endswith(":")):
inline_query.stop_propagation() inline_query.stop_propagation()
try: try:
@ -151,7 +169,11 @@ async def inline_menu(_, inline_query: InlineQuery):
) )
prvte_msg = InlineKeyboardMarkup( prvte_msg = InlineKeyboardMarkup(
[ [
[InlineKeyboardButton("Show Message 🔐", callback_data=f"prvtmsg({inline_query.id})")], [
InlineKeyboardButton(
"Show Message 🔐", callback_data=f"prvtmsg({inline_query.id})"
)
],
[ [
InlineKeyboardButton( InlineKeyboardButton(
"Destroy☠ this msg", "Destroy☠ this msg",
@ -160,9 +182,14 @@ async def inline_menu(_, inline_query: InlineQuery):
], ],
] ]
) )
mention = f"@{penerima.username}" if penerima.username else f"<a href='tg://user?id={penerima.id}'>{penerima.first_name}</a>" mention = (
f"<a href='tg://user?id={penerima.id}'>{penerima.first_name}</a>"
msg_c = f"🔒 A <b>private message</b> to {mention} [<code>{penerima.id}</code>], " if not penerima.username
else f"@{penerima.username}"
)
msg_c = (
f"🔒 A <b>private message</b> to {mention} [<code>{penerima.id}</code>], "
)
msg_c += "Only he/she can open it." msg_c += "Only he/she can open it."
results = [ results = [
InlineQueryResultArticle( InlineQueryResultArticle(
@ -182,7 +209,9 @@ async def inline_menu(_, inline_query: InlineQuery):
switch_pm_parameter="inline", switch_pm_parameter="inline",
) )
query = inline_query.query.split(None, 1)[1].strip() query = inline_query.query.split(None, 1)[1].strip()
search_results = await http.get(f"https://api.github.com/search/repositories?q={query}") search_results = await http.get(
f"https://api.github.com/search/repositories?q={query}"
)
srch_results = json.loads(search_results.text) srch_results = json.loads(search_results.text)
item = srch_results.get("items") item = srch_results.get("items")
data = [] data = []
@ -205,7 +234,9 @@ async def inline_menu(_, inline_query: InlineQuery):
url=link, url=link,
description=deskripsi, description=deskripsi,
thumb_url="https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png", thumb_url="https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png",
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="Open Github Link", url=link)]]), reply_markup=InlineKeyboardMarkup(
[[InlineKeyboardButton(text="Open Github Link", url=link)]]
),
) )
) )
await inline_query.answer( await inline_query.answer(
@ -224,7 +255,9 @@ async def inline_menu(_, inline_query: InlineQuery):
switch_pm_parameter="inline", switch_pm_parameter="inline",
) )
query = inline_query.query.split(None, 1)[1].strip() query = inline_query.query.split(None, 1)[1].strip()
search_results = await http.get(f"https://api.hayo.my.id/api/pypi?package={query}") search_results = await http.get(
f"https://api.hayo.my.id/api/pypi?package={query}"
)
srch_results = json.loads(search_results.text) srch_results = json.loads(search_results.text)
data = [] data = []
for sraeo in srch_results: for sraeo in srch_results:
@ -245,7 +278,9 @@ async def inline_menu(_, inline_query: InlineQuery):
url=link, url=link,
description=deskripsi, description=deskripsi,
thumb_url="https://raw.githubusercontent.com/github/explore/666de02829613e0244e9441b114edb85781e972c/topics/pip/pip.png", thumb_url="https://raw.githubusercontent.com/github/explore/666de02829613e0244e9441b114edb85781e972c/topics/pip/pip.png",
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="Open Link", url=link)]]), reply_markup=InlineKeyboardMarkup(
[[InlineKeyboardButton(text="Open Link", url=link)]]
),
) )
) )
await inline_query.answer( await inline_query.answer(
@ -264,7 +299,9 @@ async def inline_menu(_, inline_query: InlineQuery):
switch_pm_parameter="inline", switch_pm_parameter="inline",
) )
judul = inline_query.query.split(None, 1)[1].strip() judul = inline_query.query.split(None, 1)[1].strip()
search_results = await http.get(f"https://api.abir-hasan.tk/youtube?query={judul}") search_results = await http.get(
f"https://api.abir-hasan.tk/youtube?query={judul}"
)
srch_results = json.loads(search_results.text) srch_results = json.loads(search_results.text)
asroe = srch_results.get("results") asroe = srch_results.get("results")
oorse = [] oorse = []
@ -276,7 +313,9 @@ async def inline_menu(_, inline_query: InlineQuery):
durasi = sraeo.get("accessibility").get("duration") durasi = sraeo.get("accessibility").get("duration")
publishTime = sraeo.get("publishedTime") publishTime = sraeo.get("publishedTime")
try: try:
deskripsi = "".join(f"{i['text']} " for i in sraeo.get("descriptionSnippet")) deskripsi = "".join(
f"{i['text']} " for i in sraeo.get("descriptionSnippet")
)
except: except:
deskripsi = "-" deskripsi = "-"
message_text = f"<a href='{link}'>{title}</a>\n" message_text = f"<a href='{link}'>{title}</a>\n"
@ -295,7 +334,9 @@ async def inline_menu(_, inline_query: InlineQuery):
url=link, url=link,
description=deskripsi, description=deskripsi,
thumb_url=thumb, thumb_url=thumb,
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="Watch Video 📹", url=link)]]), reply_markup=InlineKeyboardMarkup(
[[InlineKeyboardButton(text="Watch Video 📹", url=link)]]
),
) )
) )
await inline_query.answer( await inline_query.answer(
@ -314,7 +355,9 @@ async def inline_menu(_, inline_query: InlineQuery):
switch_pm_parameter="inline", switch_pm_parameter="inline",
) )
movie_name = inline_query.query.split(None, 1)[1].strip() movie_name = inline_query.query.split(None, 1)[1].strip()
search_results = await http.get(f"https://yasirapi.eu.org/imdb-search?q={movie_name}") search_results = await http.get(
f"https://yasirapi.eu.org/imdb-search?q={movie_name}"
)
res = json.loads(search_results.text).get("result") res = json.loads(search_results.text).get("result")
oorse = [] oorse = []
for midb in res: for midb in res:
@ -323,7 +366,11 @@ async def inline_menu(_, inline_query: InlineQuery):
stars = midb.get("s", "") stars = midb.get("s", "")
imdb_url = f"https://imdb.com/title/{midb.get('id')}" imdb_url = f"https://imdb.com/title/{midb.get('id')}"
year = f"({midb.get('y')})" if midb.get("y") else "" year = f"({midb.get('y')})" if midb.get("y") else ""
image_url = midb.get("i").get("imageUrl").replace(".jpg", "._V1_UX360.jpg") if midb.get("i") else "https://te.legra.ph/file/e263d10ff4f4426a7c664.jpg" image_url = (
midb.get("i").get("imageUrl").replace(".jpg", "._V1_UX360.jpg")
if midb.get("i")
else "https://telegra.ph/file/270955ef0d1a8a16831a9.jpg"
)
caption = f"<a href='{image_url}'>🎬</a>" caption = f"<a href='{image_url}'>🎬</a>"
caption += f"<a href='{imdb_url}'>{title} {year}</a>" caption += f"<a href='{imdb_url}'>{title} {year}</a>"
oorse.append( oorse.append(
@ -360,15 +407,15 @@ async def prvt_msg(_, c_q):
msg_id = str(c_q.matches[0].group(1)) msg_id = str(c_q.matches[0].group(1))
if msg_id not in PRVT_MSGS: if msg_id not in PRVT_MSGS:
await c_q.answer("Message now outdated !", show_alert=True) await c_q.answer("message now outdated !", show_alert=True)
return return
user_id, flname, sender_id, msg = PRVT_MSGS[msg_id] user_id, flname, sender_id, msg = PRVT_MSGS[msg_id]
if c_q.from_user.id in [user_id, sender_id]: if c_q.from_user.id == user_id or c_q.from_user.id == sender_id:
await c_q.answer(msg, show_alert=True) await c_q.answer(msg, show_alert=True)
else: else:
await c_q.answer(f"Only {flname} can see this Private Msg!", show_alert=True) await c_q.answer(f"only {flname} can see this Private Msg!", show_alert=True)
@app.on_callback_query(filters.regex(r"destroy\((.+)\)")) @app.on_callback_query(filters.regex(r"destroy\((.+)\)"))
@ -376,17 +423,17 @@ async def destroy_msg(_, c_q):
msg_id = str(c_q.matches[0].group(1)) msg_id = str(c_q.matches[0].group(1))
if msg_id not in PRVT_MSGS: if msg_id not in PRVT_MSGS:
await c_q.answer("Message now outdated !", show_alert=True) await c_q.answer("message now outdated !", show_alert=True)
return return
user_id, flname, sender_id, msg = PRVT_MSGS[msg_id] user_id, flname, sender_id, msg = PRVT_MSGS[msg_id]
if c_q.from_user.id in [user_id, sender_id]: if c_q.from_user.id == user_id or c_q.from_user.id == sender_id:
del PRVT_MSGS[msg_id] del PRVT_MSGS[msg_id]
by = "receiver" if c_q.from_user.id == user_id else "sender" by = "receiver" if c_q.from_user.id == user_id else "sender"
await c_q.edit_message_text(f"This secret message is ☠destroyed☠ by msg {by}") await c_q.edit_message_text(f"This secret message is ☠destroyed☠ by msg {by}")
else: else:
await c_q.answer(f"Only {flname} can see this Private Msg!", show_alert=True) await c_q.answer(f"only {flname} can see this Private Msg!", show_alert=True)
@app.on_callback_query(filters.regex("^imdbinl_")) @app.on_callback_query(filters.regex("^imdbinl_"))
@ -398,46 +445,82 @@ async def imdb_inl(_, query):
url = f"https://www.imdb.com/title/{movie}/" url = f"https://www.imdb.com/title/{movie}/"
resp = await get_content(url) resp = await get_content(url)
sop = BeautifulSoup(resp, "lxml") sop = BeautifulSoup(resp, "lxml")
r_json = json.loads(sop.find("script", attrs={"type": "application/ld+json"}).contents[0]) r_json = json.loads(
sop.find("script", attrs={"type": "application/ld+json"}).contents[0]
)
res_str = "" res_str = ""
type = f"<code>{r_json['@type']}</code>" if r_json.get("@type") else "" type = f"<code>{r_json['@type']}</code>" if r_json.get("@type") else ""
if r_json.get("name"): if r_json.get("name"):
try: try:
tahun = sop.select('ul[data-testid="hero-title-block__metadata"]')[0].find(class_="sc-8c396aa2-2 itZqyK").text tahun = (
sop.select('ul[data-testid="hero-title-block__metadata"]')[0]
.find(class_="sc-8c396aa2-2 itZqyK")
.text
)
except: except:
tahun = "-" tahun = "-"
res_str += f"<b>📹 Judul:</b> <a href='{url}'>{r_json['name']} [{tahun}]</a> (<code>{type}</code>)\n" res_str += f"<b>📹 Judul:</b> <a href='{url}'>{r_json['name']} [{tahun}]</a> (<code>{type}</code>)\n"
if r_json.get("alternateName"): if r_json.get("alternateName"):
res_str += f"<b>📢 AKA:</b> <code>{r_json.get('alternateName')}</code>\n\n" res_str += (
f"<b>📢 AKA:</b> <code>{r_json.get('alternateName')}</code>\n\n"
)
else: else:
res_str += "\n" res_str += "\n"
if sop.select('li[data-testid="title-techspec_runtime"]'): if sop.select('li[data-testid="title-techspec_runtime"]'):
durasi = sop.select('li[data-testid="title-techspec_runtime"]')[0].find(class_="ipc-metadata-list-item__content-container").text durasi = (
sop.select('li[data-testid="title-techspec_runtime"]')[0]
.find(class_="ipc-metadata-list-item__content-container")
.text
)
res_str += f"<b>Durasi:</b> <code>{GoogleTranslator('auto', 'id').translate(durasi)}</code>\n" res_str += f"<b>Durasi:</b> <code>{GoogleTranslator('auto', 'id').translate(durasi)}</code>\n"
if r_json.get("contentRating"): if r_json.get("contentRating"):
res_str += f"<b>Kategori:</b> <code>{r_json['contentRating']}</code> \n" res_str += f"<b>Kategori:</b> <code>{r_json['contentRating']}</code> \n"
if r_json.get("aggregateRating"): if r_json.get("aggregateRating"):
res_str += f"<b>Peringkat:</b> <code>{r_json['aggregateRating']['ratingValue']}⭐️ dari {r_json['aggregateRating']['ratingCount']} pengguna</code> \n" res_str += f"<b>Peringkat:</b> <code>{r_json['aggregateRating']['ratingValue']}⭐️ dari {r_json['aggregateRating']['ratingCount']} pengguna</code> \n"
if sop.select('li[data-testid="title-details-releasedate"]'): if sop.select('li[data-testid="title-details-releasedate"]'):
rilis = sop.select('li[data-testid="title-details-releasedate"]')[0].find(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link").text rilis = (
rilis_url = sop.select('li[data-testid="title-details-releasedate"]')[0].find(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link")["href"] sop.select('li[data-testid="title-details-releasedate"]')[0]
.find(
class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
)
.text
)
rilis_url = sop.select('li[data-testid="title-details-releasedate"]')[
0
].find(
class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
)[
"href"
]
res_str += f"<b>Rilis:</b> <a href='https://www.imdb.com{rilis_url}'>{rilis}</a>\n" res_str += f"<b>Rilis:</b> <a href='https://www.imdb.com{rilis_url}'>{rilis}</a>\n"
if r_json.get("genre"): if r_json.get("genre"):
genre = "".join(f"{GENRES_EMOJI[i]} #{i.replace('-', '_').replace(' ', '_')}, " if i in GENRES_EMOJI else f"#{i.replace('-', '_').replace(' ', '_')}, " for i in r_json["genre"]) genre = ""
for i in r_json["genre"]:
if i in GENRES_EMOJI:
genre += f"{GENRES_EMOJI[i]} #{i.replace('-', '_').replace(' ', '_')}, "
else:
genre += f"#{i.replace('-', '_').replace(' ', '_')}, "
genre = genre[:-2] genre = genre[:-2]
res_str += f"<b>Genre:</b> {genre}\n" res_str += f"<b>Genre:</b> {genre}\n"
if sop.select('li[data-testid="title-details-origin"]'): if sop.select('li[data-testid="title-details-origin"]'):
country = "".join( country = "".join(
f"{demoji(country.text)} #{country.text.replace(' ', '_').replace('-', '_')}, " f"{demoji(country.text)} #{country.text.replace(' ', '_').replace('-', '_')}, "
for country in sop.select('li[data-testid="title-details-origin"]')[0].findAll(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link") for country in sop.select('li[data-testid="title-details-origin"]')[
0
].findAll(
class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
)
) )
country = country[:-2] country = country[:-2]
res_str += f"<b>Negara:</b> {country}\n" res_str += f"<b>Negara:</b> {country}\n"
if sop.select('li[data-testid="title-details-languages"]'): if sop.select('li[data-testid="title-details-languages"]'):
language = "".join( language = "".join(
f"#{lang.text.replace(' ', '_').replace('-', '_')}, " f"#{lang.text.replace(' ', '_').replace('-', '_')}, "
for lang in sop.select('li[data-testid="title-details-languages"]')[0].findAll(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link") for lang in sop.select('li[data-testid="title-details-languages"]')[
0
].findAll(
class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
)
) )
language = language[:-2] language = language[:-2]
res_str += f"<b>Bahasa:</b> {language}\n" res_str += f"<b>Bahasa:</b> {language}\n"
@ -468,7 +551,9 @@ async def imdb_inl(_, query):
actors = actors[:-2] actors = actors[:-2]
res_str += f"<b>Pemeran:</b> {actors}\n\n" res_str += f"<b>Pemeran:</b> {actors}\n\n"
if r_json.get("description"): if r_json.get("description"):
summary = GoogleTranslator("auto", "id").translate(r_json.get("description")) summary = GoogleTranslator("auto", "id").translate(
r_json.get("description")
)
res_str += f"<b>📜 Plot: </b> <code>{summary}</code>\n\n" res_str += f"<b>📜 Plot: </b> <code>{summary}</code>\n\n"
if r_json.get("keywords"): if r_json.get("keywords"):
keywords = r_json["keywords"].split(",") keywords = r_json["keywords"].split(",")
@ -479,11 +564,15 @@ async def imdb_inl(_, query):
key_ = key_[:-2] key_ = key_[:-2]
res_str += f"<b>🔥 Kata Kunci:</b> {key_} \n" res_str += f"<b>🔥 Kata Kunci:</b> {key_} \n"
if sop.select('li[data-testid="award_information"]'): if sop.select('li[data-testid="award_information"]'):
awards = sop.select('li[data-testid="award_information"]')[0].find(class_="ipc-metadata-list-item__list-content-item").text awards = (
sop.select('li[data-testid="award_information"]')[0]
.find(class_="ipc-metadata-list-item__list-content-item")
.text
)
res_str += f"<b>🏆 Penghargaan:</b> <code>{GoogleTranslator('auto', 'id').translate(awards)}</code>\n\n" res_str += f"<b>🏆 Penghargaan:</b> <code>{GoogleTranslator('auto', 'id').translate(awards)}</code>\n\n"
else: else:
res_str += "\n" res_str += "\n"
res_str += f"<b>©️ IMDb by</b> @{BOT_USERNAME}" res_str += "<b>©️ IMDb by</b> @MissKatyRoBot"
if r_json.get("trailer"): if r_json.get("trailer"):
trailer_url = r_json["trailer"]["url"] trailer_url = r_json["trailer"]["url"]
markup = InlineKeyboardMarkup( markup = InlineKeyboardMarkup(

View file

@ -3,6 +3,7 @@ import aiohttp
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
import json import json
import traceback import traceback
import requests
from pyrogram import Client, filters from pyrogram import Client, filters
from deep_translator import GoogleTranslator from deep_translator import GoogleTranslator
from gtts import gTTS from gtts import gTTS
@ -14,19 +15,24 @@ from pyrogram.errors import (
WebpageMediaEmpty, WebpageMediaEmpty,
MessageTooLong, MessageTooLong,
) )
from misskaty.vars import COMMAND_HANDLER from info import COMMAND_HANDLER
from utils import extract_user, get_file_id, demoji from utils import extract_user, get_file_id, demoji
import time import time
from datetime import datetime from datetime import datetime
from logging import getLogger
from pykeyboard import InlineKeyboard from pykeyboard import InlineKeyboard
from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery from pyrogram.types import (
InlineKeyboardMarkup,
InlineKeyboardButton,
CallbackQuery,
InputMediaPhoto,
)
from misskaty.core.decorator.errors import capture_err from misskaty.core.decorator.errors import capture_err
from misskaty.helper.tools import rentry, GENRES_EMOJI from misskaty.helper.tools import rentry, GENRES_EMOJI
from misskaty.helper.http import http from misskaty import app
from misskaty import app, BOT_USERNAME import logging
LOGGER = getLogger(__name__) logger = logging.getLogger(__name__)
logger.setLevel(logging.ERROR)
__MODULE__ = "Misc" __MODULE__ = "Misc"
__HELP__ = """ __HELP__ = """
@ -52,18 +58,26 @@ def remove_html_tags(text):
async def stackoverflow(client, message): async def stackoverflow(client, message):
if len(message.command) == 1: if len(message.command) == 1:
return await message.reply("Give a query to search in StackOverflow!") return await message.reply("Give a query to search in StackOverflow!")
r = (await http.get(f"https://api.stackexchange.com/2.3/search/excerpts?order=asc&sort=relevance&q={message.command[1]}&accepted=True&migrated=False¬ice=False&wiki=False&site=stackoverflow")).json() r = (
requests.get(
f"https://api.stackexchange.com/2.3/search/excerpts?order=asc&sort=relevance&q={message.command[1]}&accepted=True&migrated=False¬ice=False&wiki=False&site=stackoverflow"
)
).json()
hasil = "" hasil = ""
for count, data in enumerate(r["items"], start=1): for count, data in enumerate(r["items"], start=1):
question = data["question_id"] question = data["question_id"]
title = data["title"] title = data["title"]
snippet = remove_html_tags(data["excerpt"])[:80].replace("\n", "").replace(" ", "") if len(remove_html_tags(data["excerpt"])) > 80 else remove_html_tags(data["excerpt"]).replace("\n", "").replace(" ", "") snippet = (
remove_html_tags(data["excerpt"])[:80].replace("\n", "").replace(" ", "")
if len(remove_html_tags(data["excerpt"])) > 80
else remove_html_tags(data["excerpt"]).replace("\n", "").replace(" ", "")
)
hasil += f"{count}. <a href='https://stackoverflow.com/questions/{question}'>{title}</a>\n<code>{snippet}</code>\n" hasil += f"{count}. <a href='https://stackoverflow.com/questions/{question}'>{title}</a>\n<code>{snippet}</code>\n"
try: try:
await message.reply(hasil) await message.reply(hasil)
except MessageTooLong: except MessageTooLong:
url = await rentry(hasil) url = await rentry(hasil)
await r.edit(f"Your text pasted to rentry because has long text:\n{url}") await msg.edit(f"Your text pasted to rentry because has long text:\n{url}")
except Exception as e: except Exception as e:
await message.reply(e) await message.reply(e)
@ -76,8 +90,11 @@ async def gsearch(client, message):
query = message.text.split(" ", maxsplit=1)[1] query = message.text.split(" ", maxsplit=1)[1]
msg = await message.reply_text(f"**Googling** for `{query}` ...") msg = await message.reply_text(f"**Googling** for `{query}` ...")
try: try:
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/61.0.3163.100 Safari/537.36"} headers = {
html = await http.get( "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/61.0.3163.100 Safari/537.36"
}
html = requests.get(
f"https://www.google.com/search?q={query}&gl=id&hl=id&num=17", f"https://www.google.com/search?q={query}&gl=id&hl=id&num=17",
headers=headers, headers=headers,
) )
@ -105,12 +122,14 @@ async def gsearch(client, message):
arr = json.dumps(data, indent=2, ensure_ascii=False) arr = json.dumps(data, indent=2, ensure_ascii=False)
parse = json.loads(arr) parse = json.loads(arr)
total = len(parse) total = len(parse)
res = "".join(f"<a href='{i['link']}'>{i['title']}</a>\n{i['snippet']}\n\n" for i in parse) res = "".join(
f"<a href='{i['link']}'>{i['title']}</a>\n{i['snippet']}\n\n" for i in parse
)
except Exception: except Exception:
exc = traceback.format_exc() exc = traceback.format_exc()
return await msg.edit(exc) return await msg.edit(exc)
await msg.edit( await msg.edit(
text=f"<b>Ada {total} Hasil Pencarian dari {query}:</b>\n{res}<b>Scraped by @{BOT_USERNAME}</b>", text=f"<b>Ada {total} Hasil Pencarian dari {query}:</b>\n{res}<b>Scraped by @MissKatyRoBot</b>",
disable_web_page_preview=True, disable_web_page_preview=True,
) )
@ -118,30 +137,45 @@ async def gsearch(client, message):
@app.on_message(filters.command(["tr", "trans", "translate"], COMMAND_HANDLER)) @app.on_message(filters.command(["tr", "trans", "translate"], COMMAND_HANDLER))
@capture_err @capture_err
async def translate(client, message): async def translate(client, message):
if message.reply_to_message and (message.reply_to_message.text or message.reply_to_message.caption): if message.reply_to_message and (
target_lang = "id" if len(message.command) == 1 else message.text.split()[1] message.reply_to_message.text or message.reply_to_message.caption
):
if len(message.command) == 1:
target_lang = "id"
else:
target_lang = message.text.split()[1]
text = message.reply_to_message.text or message.reply_to_message.caption text = message.reply_to_message.text or message.reply_to_message.caption
else: else:
if len(message.command) < 3: if len(message.command) == 1:
return await message.reply_text( return await message.reply_text(
"Berikan Kode bahasa yang valid.\n[Available options](https://telegra.ph/Lang-Codes-11-08).\n<b>Usage:</b> <code>/tr en</code>", "Berikan Kode bahasa yang valid.\n[Available options](https://telegra.ph/Lang-Codes-11-08).\n<b>Usage:</b> <code>/tr en</code>",
) )
target_lang = message.text.split(None, 2)[1] target_lang = message.text.split(None, 2)[1]
text = message.text.split(None, 2)[2] text = message.text.split(None, 2)[2]
msg = await message.reply("Menerjemahkan...") msg = await message.reply("Menerjemahkan...")
my_translator = GoogleTranslator(source='auto', target=target_lang)
try: try:
result = my_translator.translate(text=text) tekstr = (
return await msg.edit(f"Translation using source = {my_translator.source} and target = {my_translator.target}\n\n-> {result}") requests.get(
f"https://script.google.com/macros/s/AKfycbyhNk6uVgrtJLEFRUT6y5B2pxETQugCZ9pKvu01-bE1gKkDRsw/exec?q={text}&target={target_lang}"
)
).json()["text"]
except Exception as err:
return await msg.edit(f"Error: <code>{str(err)}</code>")
try:
await msg.edit(f"<code>{tekstr}</code>")
except MessageTooLong: except MessageTooLong:
url = await rentry(result) url = await rentry(tekstr.text)
return await msg.edit(f"Your translated text pasted to rentry because has long text:\n{url}") await msg.edit(
f"Your translated text pasted to rentry because has long text:\n{url}"
)
@app.on_message(filters.command(["tts"], COMMAND_HANDLER)) @app.on_message(filters.command(["tts"], COMMAND_HANDLER))
@capture_err @capture_err
async def tts(_, message): async def tts(_, message):
if message.reply_to_message and (message.reply_to_message.text or message.reply_to_message.caption): if message.reply_to_message and (
message.reply_to_message.text or message.reply_to_message.caption
):
if len(message.text.split()) == 1: if len(message.text.split()) == 1:
target_lang = "id" target_lang = "id"
else: else:
@ -170,7 +204,9 @@ async def tts(_, message):
pass pass
@app.on_message(filters.command(["tosticker"], COMMAND_HANDLER)) @app.on_message(
filters.command(["tosticker", "tosticker@MissKatyRoBot"], COMMAND_HANDLER)
)
@capture_err @capture_err
async def tostick(client, message): async def tostick(client, message):
try: try:
@ -186,26 +222,30 @@ async def tostick(client, message):
await message.reply_text(str(e)) await message.reply_text(str(e))
@app.on_message(filters.command(["toimage"], COMMAND_HANDLER)) @app.on_message(filters.command(["toimage", "toimage@MissKatyRoBot"], COMMAND_HANDLER))
@capture_err @capture_err
async def topho(client, message): async def topho(client, message):
try: try:
if not message.reply_to_message or not message.reply_to_message.sticker: if not message.reply_to_message or not message.reply_to_message.sticker:
return await message.reply_text("Reply ke sticker untuk mengubah ke foto") return await message.reply_text("Reply ke sticker untuk mengubah ke foto")
if message.reply_to_message.sticker.is_animated: if message.reply_to_message.sticker.is_animated:
return await message.reply_text("Ini sticker animasi, command ini hanya untuk sticker biasa.") return await message.reply_text(
"Ini sticker animasi, command ini hanya untuk sticker biasa."
)
photo = await client.download_media( photo = await client.download_media(
message.reply_to_message.sticker.file_id, message.reply_to_message.sticker.file_id,
f"tostick_{message.from_user.id}.jpg", f"tostick_{message.from_user.id}.jpg",
) )
await message.reply_photo(photo=photo, caption=f"Sticker -> Image\n@{BOT_USERNAME}") await message.reply_photo(
photo=photo, caption="Sticker -> Image\n@MissKatyRoBot"
)
os.remove(photo) os.remove(photo)
except Exception as e: except Exception as e:
await message.reply_text(str(e)) await message.reply_text(str(e))
@app.on_message(filters.command(["id"], COMMAND_HANDLER)) @app.on_message(filters.command(["id", "id@MissKatyRoBot"], COMMAND_HANDLER))
async def showid(client, message): async def showid(client, message):
chat_type = message.chat.type chat_type = message.chat.type
if chat_type == "private": if chat_type == "private":
@ -231,14 +271,20 @@ async def showid(client, message):
) )
file_info = get_file_id(message.reply_to_message) file_info = get_file_id(message.reply_to_message)
else: else:
_id += "<b>➲ User ID</b>: " f"<code>{message.from_user.id if message.from_user else 'Anonymous'}</code>\n" _id += (
"<b>➲ User ID</b>: "
f"<code>{message.from_user.id if message.from_user else 'Anonymous'}</code>\n"
)
file_info = get_file_id(message) file_info = get_file_id(message)
if file_info: if file_info:
_id += f"<b>{file_info.message_type}</b>: " f"<code>{file_info.file_id}</code>\n" _id += (
f"<b>{file_info.message_type}</b>: "
f"<code>{file_info.file_id}</code>\n"
)
await message.reply_text(_id, quote=True) await message.reply_text(_id, quote=True)
@app.on_message(filters.command(["info"], COMMAND_HANDLER)) @app.on_message(filters.command(["info", "info@MissKatyRoBot"], COMMAND_HANDLER))
async def who_is(client, message): async def who_is(client, message):
# https://github.com/SpEcHiDe/PyroGramBot/blob/master/pyrobot/plugins/admemes/whois.py#L19 # https://github.com/SpEcHiDe/PyroGramBot/blob/master/pyrobot/plugins/admemes/whois.py#L19
status_message = await message.reply_text("`Fetching user info...`") status_message = await message.reply_text("`Fetching user info...`")
@ -265,13 +311,23 @@ async def who_is(client, message):
if message.chat.type in (("supergroup", "channel")): if message.chat.type in (("supergroup", "channel")):
try: try:
chat_member_p = await message.chat.get_member(from_user.id) chat_member_p = await message.chat.get_member(from_user.id)
joined_date = datetime.fromtimestamp(chat_member_p.joined_date or time.time()).strftime("%Y.%m.%d %H:%M:%S") joined_date = datetime.fromtimestamp(
message_out_str += "<b>➲Joined this Chat on:</b> <code>" f"{joined_date}" "</code>\n" chat_member_p.joined_date or time.time()
).strftime("%Y.%m.%d %H:%M:%S")
message_out_str += (
"<b>➲Joined this Chat on:</b> <code>" f"{joined_date}" "</code>\n"
)
except UserNotParticipant: except UserNotParticipant:
pass pass
if chat_photo := from_user.photo: if chat_photo := from_user.photo:
local_user_photo = await client.download_media(message=chat_photo.big_file_id) local_user_photo = await client.download_media(message=chat_photo.big_file_id)
buttons = [[InlineKeyboardButton("🔐 Close", callback_data="close_data")]] buttons = [
[
InlineKeyboardButton(
"🔐 Close", callback_data=f"close#{message.from_user.id}"
)
]
]
reply_markup = InlineKeyboardMarkup(buttons) reply_markup = InlineKeyboardMarkup(buttons)
await message.reply_photo( await message.reply_photo(
photo=local_user_photo, photo=local_user_photo,
@ -282,7 +338,13 @@ async def who_is(client, message):
) )
os.remove(local_user_photo) os.remove(local_user_photo)
else: else:
buttons = [[InlineKeyboardButton("🔐 Close", callback_data="close_data")]] buttons = [
[
InlineKeyboardButton(
"🔐 Close", callback_data=f"close#{message.from_user.id}"
)
]
]
reply_markup = InlineKeyboardMarkup(buttons) reply_markup = InlineKeyboardMarkup(buttons)
await message.reply_text( await message.reply_text(
text=message_out_str, text=message_out_str,
@ -293,7 +355,17 @@ async def who_is(client, message):
await status_message.delete() await status_message.delete()
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.1.17 (KHTML, like Gecko) Version/7.1 Safari/537.85.10"} @app.on_callback_query(filters.regex("^close"))
async def close_callback(bot: Client, query: CallbackQuery):
i, userid = query.data.split("#")
if query.from_user.id != int(userid):
return await query.answer("⚠️ Access Denied!", True)
await query.message.delete()
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.1.17 (KHTML, like Gecko) Version/7.1 Safari/537.85.10"
}
async def get_content(url): async def get_content(url):
@ -344,18 +416,24 @@ async def mdl_callback(bot: Client, query: CallbackQuery):
await query.message.edit_text("Permintaan kamu sedang diproses.. ") await query.message.edit_text("Permintaan kamu sedang diproses.. ")
result = "" result = ""
try: try:
res = (await http.get(f"https://kuryana.vercel.app/id/{slug}")).json() res = requests.get(f"https://kuryana.vercel.app/id/{slug}").json()
result += f"<b>Title:</b> <a href='{res['data']['link']}'>{res['data']['title']}</a>\n" result += f"<b>Title:</b> <a href='{res['data']['link']}'>{res['data']['title']}</a>\n"
result += f"<b>AKA:</b> <code>{res['data']['others']['also_known_as']}</code>\n\n" result += (
f"<b>AKA:</b> <code>{res['data']['others']['also_known_as']}</code>\n\n"
)
result += f"<b>Rating:</b> <code>{res['data']['details']['score']}</code>\n" result += f"<b>Rating:</b> <code>{res['data']['details']['score']}</code>\n"
result += f"<b>Content Rating:</b> <code>{res['data']['details']['content_rating']}</code>\n" result += f"<b>Content Rating:</b> <code>{res['data']['details']['content_rating']}</code>\n"
result += f"<b>Type:</b> <code>{res['data']['details']['type']}</code>\n" result += f"<b>Type:</b> <code>{res['data']['details']['type']}</code>\n"
result += f"<b>Country:</b> <code>{res['data']['details']['country']}</code>\n" result += (
f"<b>Country:</b> <code>{res['data']['details']['country']}</code>\n"
)
if res["data"]["details"]["type"] == "Movie": if res["data"]["details"]["type"] == "Movie":
result += f"<b>Release Date:</b> <code>{res['data']['details']['release_date']}</code>\n" result += f"<b>Release Date:</b> <code>{res['data']['details']['release_date']}</code>\n"
elif res["data"]["details"]["type"] == "Drama": elif res["data"]["details"]["type"] == "Drama":
result += f"<b>Episode:</b> {res['data']['details']['episodes']}\n" result += f"<b>Episode:</b> {res['data']['details']['episodes']}\n"
result += f"<b>Aired:</b> <code>{res['data']['details']['aired']}</code>\n" result += (
f"<b>Aired:</b> <code>{res['data']['details']['aired']}</code>\n"
)
try: try:
result += f"<b>Aired on:</b> <code>{res['data']['details']['aired_on']}</code>\n" result += f"<b>Aired on:</b> <code>{res['data']['details']['aired_on']}</code>\n"
except: except:
@ -364,11 +442,17 @@ async def mdl_callback(bot: Client, query: CallbackQuery):
result += f"<b>Original Network:</b> <code>{res['data']['details']['original_network']}</code>\n" result += f"<b>Original Network:</b> <code>{res['data']['details']['original_network']}</code>\n"
except: except:
pass pass
result += f"<b>Duration:</b> <code>{res['data']['details']['duration']}</code>\n" result += (
result += f"<b>Genre:</b> <code>{res['data']['others']['genres']}</code>\n\n" f"<b>Duration:</b> <code>{res['data']['details']['duration']}</code>\n"
)
result += (
f"<b>Genre:</b> <code>{res['data']['others']['genres']}</code>\n\n"
)
result += f"<b>Synopsis:</b> <code>{res['data']['synopsis']}</code>\n" result += f"<b>Synopsis:</b> <code>{res['data']['synopsis']}</code>\n"
result += f"<b>Tags:</b> <code>{res['data']['others']['tags']}</code>\n" result += f"<b>Tags:</b> <code>{res['data']['others']['tags']}</code>\n"
btn = InlineKeyboardMarkup([[InlineKeyboardButton("🎬 Open MyDramaList", url=res["data"]["link"])]]) btn = InlineKeyboardMarkup(
[[InlineKeyboardButton("🎬 Open MyDramaList", url=res["data"]["link"])]]
)
await query.message.edit_text(result, reply_markup=btn) await query.message.edit_text(result, reply_markup=btn)
except Exception as e: except Exception as e:
await query.message.edit_text(f"<b>ERROR:</b>\n<code>{e}</code>") await query.message.edit_text(f"<b>ERROR:</b>\n<code>{e}</code>")
@ -382,18 +466,26 @@ async def mdl_callback(bot: Client, query: CallbackQuery):
async def imdb1_search(client, message): async def imdb1_search(client, message):
BTN = [] BTN = []
if message.sender_chat: if message.sender_chat:
return await message.reply("Mohon maaf fitur tidak tersedia untuk akun channel, harap ganti ke akun biasa..") return await message.reply(
"Mohon maaf fitur tidak tersedia untuk akun channel, harap ganti ke akun biasa.."
)
if len(message.command) == 1: if len(message.command) == 1:
return await message.reply("Berikan aku nama series atau movie yang ingin dicari. 🤷🏻‍♂️", quote=True) return await message.reply(
"Berikan aku nama series atau movie yang ingin dicari. 🤷🏻‍♂️", quote=True
)
r, judul = message.text.split(None, 1) r, judul = message.text.split(None, 1)
k = await message.reply("🔎 Sedang mencari di Database IMDB..", quote=True) k = await message.reply_photo(
"AgACAgIAAxkBAAEDNDdjp-jrxffihNHv2UiQ63B2p3txagACL8QxG0hfQEkmUDEHspsSUgAIAQADAgADeAAHHgQ",
caption="🔎 Sedang mencari di Database IMDB..",
quote=True,
)
msg = "" msg = ""
buttons = InlineKeyboard(row_width=4) buttons = InlineKeyboard(row_width=4)
try: try:
r = await get_content(f"https://yasirapi.eu.org/imdb-search?q={judul}") r = await get_content(f"https://yasirapi.eu.org/imdb-search?q={judul}")
res = json.loads(r).get("result") res = json.loads(r).get("result")
if not res: if not res:
return await k.edit("Tidak ada hasil ditemukan.. 😕") return await k.edit_caption("Tidak ada hasil ditemukan.. 😕")
msg += f"Ditemukan {len(res)} query dari <code>{judul}</code> ~ {message.from_user.mention}\n\n" msg += f"Ditemukan {len(res)} query dari <code>{judul}</code> ~ {message.from_user.mention}\n\n"
for count, movie in enumerate(res, start=1): for count, movie in enumerate(res, start=1):
title = movie.get("l") title = movie.get("l")
@ -401,30 +493,46 @@ async def imdb1_search(client, message):
type = movie.get("q").replace("feature", "movie").capitalize() type = movie.get("q").replace("feature", "movie").capitalize()
movieID = re.findall(r"tt(\d+)", movie.get("id"))[0] movieID = re.findall(r"tt(\d+)", movie.get("id"))[0]
msg += f"{count}. {title} {year} ~ {type}\n" msg += f"{count}. {title} {year} ~ {type}\n"
BTN.append(InlineKeyboardButton(text=count, callback_data=f"imdbid#{message.from_user.id}#{movieID}")) BTN.append(
InlineKeyboardButton(
text=count, callback_data=f"imdbid#{message.from_user.id}#{movieID}"
)
)
BTN.append(
InlineKeyboardButton(
text="❌ Close", callback_data=f"close#{message.from_user.id}"
)
)
buttons.add(*BTN) buttons.add(*BTN)
await k.edit(msg, reply_markup=buttons) await k.edit_caption(msg, reply_markup=buttons)
except Exception as err: except Exception as err:
await k.edit(f"Ooppss, gagal mendapatkan daftar judul di IMDb.\n\nERROR: {err}") await k.edit_caption(
f"Ooppss, gagal mendapatkan daftar judul di IMDb.\n\nERROR: {err}"
)
@app.on_callback_query(filters.regex("^imdbid")) @app.on_callback_query(filters.regex("^imdbid"))
async def imdbcb_backup(bot: Client, query: CallbackQuery): async def imdbcb_backup(bot: Client, query: CallbackQuery):
usr = query.message.reply_to_message
i, userid, movie = query.data.split("#") i, userid, movie = query.data.split("#")
if query.from_user.id != int(userid): if query.from_user.id != int(userid):
return await query.answer("⚠️ Akses Ditolak!", True) return await query.answer("⚠️ Akses Ditolak!", True)
try: try:
await query.message.edit_text("Permintaan kamu sedang diproses.. ") await query.message.edit_caption("Permintaan kamu sedang diproses.. ")
url = f"https://www.imdb.com/title/tt{movie}/" url = f"https://www.imdb.com/title/tt{movie}/"
resp = await get_content(url) resp = await get_content(url)
sop = BeautifulSoup(resp, "lxml") sop = BeautifulSoup(resp, "lxml")
r_json = json.loads(sop.find("script", attrs={"type": "application/ld+json"}).contents[0]) r_json = json.loads(
sop.find("script", attrs={"type": "application/ld+json"}).contents[0]
)
res_str = "" res_str = ""
type = f"<code>{r_json['@type']}</code>" if r_json.get("@type") else "" type = f"<code>{r_json['@type']}</code>" if r_json.get("@type") else ""
if r_json.get("name"): if r_json.get("name"):
try: try:
tahun = sop.select('ul[data-testid="hero-title-block__metadata"]')[0].find(class_="sc-8c396aa2-2 itZqyK").text tahun = (
sop.select('ul[data-testid="hero-title-block__metadata"]')[0]
.find(class_="sc-8c396aa2-2 itZqyK")
.text
)
except: except:
tahun = "-" tahun = "-"
res_str += f"<b>📹 Judul:</b> <a href='{url}'>{r_json['name']} [{tahun}]</a> (<code>{type}</code>)\n" res_str += f"<b>📹 Judul:</b> <a href='{url}'>{r_json['name']} [{tahun}]</a> (<code>{type}</code>)\n"
@ -433,31 +541,64 @@ async def imdbcb_backup(bot: Client, query: CallbackQuery):
else: else:
res_str += "\n" res_str += "\n"
if sop.select('li[data-testid="title-techspec_runtime"]'): if sop.select('li[data-testid="title-techspec_runtime"]'):
durasi = sop.select('li[data-testid="title-techspec_runtime"]')[0].find(class_="ipc-metadata-list-item__content-container").text durasi = (
sop.select('li[data-testid="title-techspec_runtime"]')[0]
.find(class_="ipc-metadata-list-item__content-container")
.text
)
res_str += f"<b>Durasi:</b> <code>{GoogleTranslator('auto', 'id').translate(durasi)}</code>\n" res_str += f"<b>Durasi:</b> <code>{GoogleTranslator('auto', 'id').translate(durasi)}</code>\n"
if r_json.get("contentRating"): if r_json.get("contentRating"):
res_str += f"<b>Kategori:</b> <code>{r_json['contentRating']}</code> \n" res_str += f"<b>Kategori:</b> <code>{r_json['contentRating']}</code> \n"
if r_json.get("aggregateRating"): if r_json.get("aggregateRating"):
res_str += f"<b>Peringkat:</b> <code>{r_json['aggregateRating']['ratingValue']}⭐️ dari {r_json['aggregateRating']['ratingCount']} pengguna</code> \n" res_str += f"<b>Peringkat:</b> <code>{r_json['aggregateRating']['ratingValue']}⭐️ dari {r_json['aggregateRating']['ratingCount']} pengguna</code> \n"
if sop.select('li[data-testid="title-details-releasedate"]'): if sop.select('li[data-testid="title-details-releasedate"]'):
rilis = sop.select('li[data-testid="title-details-releasedate"]')[0].find(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link").text rilis = (
rilis_url = sop.select('li[data-testid="title-details-releasedate"]')[0].find(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link")["href"] sop.select('li[data-testid="title-details-releasedate"]')[0]
res_str += f"<b>Rilis:</b> <a href='https://www.imdb.com{rilis_url}'>{rilis}</a>\n" .find(
class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
)
.text
)
rilis_url = sop.select('li[data-testid="title-details-releasedate"]')[
0
].find(
class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
)[
"href"
]
res_str += (
f"<b>Rilis:</b> <a href='https://www.imdb.com{rilis_url}'>{rilis}</a>\n"
)
if r_json.get("genre"): if r_json.get("genre"):
genre = "".join(f"{GENRES_EMOJI[i]} #{i.replace('-', '_').replace(' ', '_')}, " if i in GENRES_EMOJI else f"#{i.replace('-', '_').replace(' ', '_')}, " for i in r_json["genre"]) genre = ""
for i in r_json["genre"]:
if i in GENRES_EMOJI:
genre += (
f"{GENRES_EMOJI[i]} #{i.replace('-', '_').replace(' ', '_')}, "
)
else:
genre += f"#{i.replace('-', '_').replace(' ', '_')}, "
genre = genre[:-2] genre = genre[:-2]
res_str += f"<b>Genre:</b> {genre}\n" res_str += f"<b>Genre:</b> {genre}\n"
if sop.select('li[data-testid="title-details-origin"]'): if sop.select('li[data-testid="title-details-origin"]'):
country = "".join( country = "".join(
f"{demoji(country.text)} #{country.text.replace(' ', '_').replace('-', '_')}, " f"{demoji(country.text)} #{country.text.replace(' ', '_').replace('-', '_')}, "
for country in sop.select('li[data-testid="title-details-origin"]')[0].findAll(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link") for country in sop.select('li[data-testid="title-details-origin"]')[
0
].findAll(
class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
)
) )
country = country[:-2] country = country[:-2]
res_str += f"<b>Negara:</b> {country}\n" res_str += f"<b>Negara:</b> {country}\n"
if sop.select('li[data-testid="title-details-languages"]'): if sop.select('li[data-testid="title-details-languages"]'):
language = "".join( language = "".join(
f"#{lang.text.replace(' ', '_').replace('-', '_')}, " for lang in sop.select('li[data-testid="title-details-languages"]')[0].findAll(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link") f"#{lang.text.replace(' ', '_').replace('-', '_')}, "
for lang in sop.select('li[data-testid="title-details-languages"]')[
0
].findAll(
class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
)
) )
language = language[:-2] language = language[:-2]
res_str += f"<b>Bahasa:</b> {language}\n" res_str += f"<b>Bahasa:</b> {language}\n"
@ -488,7 +629,9 @@ async def imdbcb_backup(bot: Client, query: CallbackQuery):
actors = actors[:-2] actors = actors[:-2]
res_str += f"<b>Pemeran:</b> {actors}\n\n" res_str += f"<b>Pemeran:</b> {actors}\n\n"
if r_json.get("description"): if r_json.get("description"):
summary = GoogleTranslator("auto", "id").translate(r_json.get("description")) summary = GoogleTranslator("auto", "id").translate(
r_json.get("description")
)
res_str += f"<b>📜 Plot: </b> <code>{summary}</code>\n\n" res_str += f"<b>📜 Plot: </b> <code>{summary}</code>\n\n"
if r_json.get("keywords"): if r_json.get("keywords"):
keywords = r_json["keywords"].split(",") keywords = r_json["keywords"].split(",")
@ -499,56 +642,56 @@ async def imdbcb_backup(bot: Client, query: CallbackQuery):
key_ = key_[:-2] key_ = key_[:-2]
res_str += f"<b>🔥 Kata Kunci:</b> {key_} \n" res_str += f"<b>🔥 Kata Kunci:</b> {key_} \n"
if sop.select('li[data-testid="award_information"]'): if sop.select('li[data-testid="award_information"]'):
awards = sop.select('li[data-testid="award_information"]')[0].find(class_="ipc-metadata-list-item__list-content-item").text awards = (
sop.select('li[data-testid="award_information"]')[0]
.find(class_="ipc-metadata-list-item__list-content-item")
.text
)
res_str += f"<b>🏆 Penghargaan:</b> <code>{GoogleTranslator('auto', 'id').translate(awards)}</code>\n\n" res_str += f"<b>🏆 Penghargaan:</b> <code>{GoogleTranslator('auto', 'id').translate(awards)}</code>\n\n"
else: else:
res_str += "\n" res_str += "\n"
res_str += f"<b>©️ IMDb by</b> @{BOT_USERNAME}" res_str += "<b>©️ IMDb by</b> @MissKatyRoBot"
if r_json.get("trailer"): if r_json.get("trailer"):
trailer_url = r_json["trailer"]["url"] trailer_url = r_json["trailer"]["url"]
markup = InlineKeyboardMarkup( markup = InlineKeyboardMarkup(
[ [
[ [
InlineKeyboardButton("🎬 Open IMDB", url=f"https://www.imdb.com{r_json['url']}"), InlineKeyboardButton(
"🎬 Open IMDB", url=f"https://www.imdb.com{r_json['url']}"
),
InlineKeyboardButton("▶️ Trailer", url=trailer_url), InlineKeyboardButton("▶️ Trailer", url=trailer_url),
] ]
] ]
) )
else: else:
markup = InlineKeyboardMarkup([[InlineKeyboardButton("🎬 Open IMDB", url=f"https://www.imdb.com{r_json['url']}")]]) markup = InlineKeyboardMarkup(
[
[
InlineKeyboardButton(
"🎬 Open IMDB", url=f"https://www.imdb.com{r_json['url']}"
)
]
]
)
if thumb := r_json.get("image"): if thumb := r_json.get("image"):
try: try:
await query.message.reply_photo( await query.message.edit_media(
photo=thumb, InputMediaPhoto(thumb, caption=res_str), reply_markup=markup
quote=True,
caption=res_str,
reply_to_message_id=usr.id,
reply_markup=markup,
) )
except (MediaEmpty, PhotoInvalidDimensions, WebpageMediaEmpty): except (MediaEmpty, PhotoInvalidDimensions, WebpageMediaEmpty):
poster = thumb.replace(".jpg", "._V1_UX360.jpg") poster = thumb.replace(".jpg", "._V1_UX360.jpg")
await query.message.reply_photo( await query.message.edit_media(
photo=poster, InputMediaPhoto(poster, caption=res_str), reply_markup=markup
caption=res_str,
reply_to_message_id=usr.id,
reply_markup=markup,
) )
except Exception: except Exception:
await query.message.reply( await query.message.edit_caption(res_str, reply_markup=markup)
res_str,
reply_markup=markup,
disable_web_page_preview=False,
reply_to_message_id=usr.id,
)
await query.message.delete()
else: else:
await query.message.edit(res_str, reply_markup=markup, disable_web_page_preview=False) await query.message.edit_caption(res_str, reply_markup=markup)
await query.answer()
except MessageNotModified: except MessageNotModified:
pass pass
except Exception: except Exception:
exc = traceback.format_exc() exc = traceback.format_exc()
await query.message.edit_text(f"<b>ERROR:</b>\n<code>{exc}</code>") await query.message.edit_caption(f"<b>ERROR:</b>\n<code>{exc}</code>")
# IMDB Versi English # IMDB Versi English
@ -564,14 +707,18 @@ async def imdb_en_search(client, message):
quote=True, quote=True,
) )
r, title = message.text.split(None, 1) r, title = message.text.split(None, 1)
k = await message.reply("Searching Movie/Series in IMDB Database.. 😴", quote=True) k = await message.reply_photo(
"AgACAgIAAxkBAAEDNDdjp-jrxffihNHv2UiQ63B2p3txagACL8QxG0hfQEkmUDEHspsSUgAIAQADAgADeAAHHgQ",
caption="Searching Movie/Series in IMDB Database.. 😴",
quote=True,
)
msg = "" msg = ""
buttons = InlineKeyboard(row_width=4) buttons = InlineKeyboard(row_width=4)
try: try:
r = await get_content(f"https://yasirapi.eu.org/imdb-search?q={title}") r = await get_content(f"https://yasirapi.eu.org/imdb-search?q={title}")
res = json.loads(r).get("result") res = json.loads(r).get("result")
if not res: if not res:
return await k.edit("Sad, No Result.. 😕") return await k.edit_caption("Sad, No Result.. 😕")
msg = f"Found {len(res)} result from <code>{title}</code> ~ {message.from_user.mention}\n\n" msg = f"Found {len(res)} result from <code>{title}</code> ~ {message.from_user.mention}\n\n"
for count, movie in enumerate(res, start=1): for count, movie in enumerate(res, start=1):
titles = movie.get("l") titles = movie.get("l")
@ -579,31 +726,47 @@ async def imdb_en_search(client, message):
type = movie.get("qid").replace("feature", "movie").capitalize() type = movie.get("qid").replace("feature", "movie").capitalize()
movieID = re.findall(r"tt(\d+)", movie.get("id"))[0] movieID = re.findall(r"tt(\d+)", movie.get("id"))[0]
msg += f"{count}. {titles} {year} ~ {type}\n" msg += f"{count}. {titles} {year} ~ {type}\n"
BTN.append(InlineKeyboardButton(text=count, callback_data=f"imdben#{message.from_user.id}#{movieID}")) BTN.append(
InlineKeyboardButton(
text=count, callback_data=f"imdben#{message.from_user.id}#{movieID}"
)
)
BTN.append(
InlineKeyboardButton(
text="❌ Close", callback_data=f"close#{message.from_user.id}"
)
)
buttons.add(*BTN) buttons.add(*BTN)
await k.edit(msg, reply_markup=buttons) await k.edit_caption(msg, reply_markup=buttons)
except Exception as err: except Exception as err:
await k.edit(f"Ooppss, failed get movie list from IMDb.\n\nERROR: {err}") await k.edit_caption(
f"Ooppss, failed get movie list from IMDb.\n\nERROR: {err}"
)
@app.on_callback_query(filters.regex("^imdben")) @app.on_callback_query(filters.regex("^imdben"))
@capture_err @capture_err
async def imdb_en_callback(bot: Client, query: CallbackQuery): async def imdb_en_callback(bot: Client, query: CallbackQuery):
usr = query.message.reply_to_message
i, userid, movie = query.data.split("#") i, userid, movie = query.data.split("#")
if query.from_user.id != int(userid): if query.from_user.id != int(userid):
return await query.answer("⚠️ Access Denied!", True) return await query.answer("⚠️ Access Denied!", True)
await query.message.edit_text("<i>⏳ Processing your request..</i>") await query.message.edit_caption("<i>⏳ Processing your request..</i>")
try: try:
url = f"https://www.imdb.com/title/tt{movie}/" url = f"https://www.imdb.com/title/tt{movie}/"
resp = await get_content(url) resp = await get_content(url)
sop = BeautifulSoup(resp, "lxml") sop = BeautifulSoup(resp, "lxml")
r_json = json.loads(sop.find("script", attrs={"type": "application/ld+json"}).contents[0]) r_json = json.loads(
sop.find("script", attrs={"type": "application/ld+json"}).contents[0]
)
res_str = "" res_str = ""
type = f"<code>{r_json['@type']}</code>" if r_json.get("@type") else "" type = f"<code>{r_json['@type']}</code>" if r_json.get("@type") else ""
if r_json.get("name"): if r_json.get("name"):
try: try:
tahun = sop.select('ul[data-testid="hero-title-block__metadata"]')[0].find(class_="sc-8c396aa2-2 itZqyK").text tahun = (
sop.select('ul[data-testid="hero-title-block__metadata"]')[0]
.find(class_="sc-8c396aa2-2 itZqyK")
.text
)
except: except:
tahun = "-" tahun = "-"
res_str += f"<b>📹 Title:</b> <a href='{url}'>{r_json['name']} [{tahun}]</a> (<code>{type}</code>)\n" res_str += f"<b>📹 Title:</b> <a href='{url}'>{r_json['name']} [{tahun}]</a> (<code>{type}</code>)\n"
@ -612,31 +775,62 @@ async def imdb_en_callback(bot: Client, query: CallbackQuery):
else: else:
res_str += "\n" res_str += "\n"
if sop.select('li[data-testid="title-techspec_runtime"]'): if sop.select('li[data-testid="title-techspec_runtime"]'):
durasi = sop.select('li[data-testid="title-techspec_runtime"]')[0].find(class_="ipc-metadata-list-item__content-container").text durasi = (
sop.select('li[data-testid="title-techspec_runtime"]')[0]
.find(class_="ipc-metadata-list-item__content-container")
.text
)
res_str += f"<b>Duration:</b> <code>{durasi}</code>\n" res_str += f"<b>Duration:</b> <code>{durasi}</code>\n"
if r_json.get("contentRating"): if r_json.get("contentRating"):
res_str += f"<b>Category:</b> <code>{r_json['contentRating']}</code> \n" res_str += f"<b>Category:</b> <code>{r_json['contentRating']}</code> \n"
if r_json.get("aggregateRating"): if r_json.get("aggregateRating"):
res_str += f"<b>Rating:</b> <code>{r_json['aggregateRating']['ratingValue']}⭐️ from {r_json['aggregateRating']['ratingCount']} user</code> \n" res_str += f"<b>Rating:</b> <code>{r_json['aggregateRating']['ratingValue']}⭐️ from {r_json['aggregateRating']['ratingCount']} user</code> \n"
if sop.select('li[data-testid="title-details-releasedate"]'): if sop.select('li[data-testid="title-details-releasedate"]'):
rilis = sop.select('li[data-testid="title-details-releasedate"]')[0].find(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link").text rilis = (
rilis_url = sop.select('li[data-testid="title-details-releasedate"]')[0].find(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link")["href"] sop.select('li[data-testid="title-details-releasedate"]')[0]
.find(
class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
)
.text
)
rilis_url = sop.select('li[data-testid="title-details-releasedate"]')[
0
].find(
class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
)[
"href"
]
res_str += f"<b>Release Data:</b> <a href='https://www.imdb.com{rilis_url}'>{rilis}</a>\n" res_str += f"<b>Release Data:</b> <a href='https://www.imdb.com{rilis_url}'>{rilis}</a>\n"
if r_json.get("genre"): if r_json.get("genre"):
genre = "".join(f"{GENRES_EMOJI[i]} #{i.replace('-', '_').replace(' ', '_')}, " if i in GENRES_EMOJI else f"#{i.replace('-', '_').replace(' ', '_')}, " for i in r_json["genre"]) genre = ""
for i in r_json["genre"]:
if i in GENRES_EMOJI:
genre += (
f"{GENRES_EMOJI[i]} #{i.replace('-', '_').replace(' ', '_')}, "
)
else:
genre += f"#{i.replace('-', '_').replace(' ', '_')}, "
genre = genre[:-2] genre = genre[:-2]
res_str += f"<b>Genre:</b> {genre}\n" res_str += f"<b>Genre:</b> {genre}\n"
if sop.select('li[data-testid="title-details-origin"]'): if sop.select('li[data-testid="title-details-origin"]'):
country = "".join( country = "".join(
f"{demoji(country.text)} #{country.text.replace(' ', '_').replace('-', '_')}, " f"{demoji(country.text)} #{country.text.replace(' ', '_').replace('-', '_')}, "
for country in sop.select('li[data-testid="title-details-origin"]')[0].findAll(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link") for country in sop.select('li[data-testid="title-details-origin"]')[
0
].findAll(
class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
)
) )
country = country[:-2] country = country[:-2]
res_str += f"<b>Country:</b> {country}\n" res_str += f"<b>Country:</b> {country}\n"
if sop.select('li[data-testid="title-details-languages"]'): if sop.select('li[data-testid="title-details-languages"]'):
language = "".join( language = "".join(
f"#{lang.text.replace(' ', '_').replace('-', '_')}, " for lang in sop.select('li[data-testid="title-details-languages"]')[0].findAll(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link") f"#{lang.text.replace(' ', '_').replace('-', '_')}, "
for lang in sop.select('li[data-testid="title-details-languages"]')[
0
].findAll(
class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
)
) )
language = language[:-2] language = language[:-2]
res_str += f"<b>Language:</b> {language}\n" res_str += f"<b>Language:</b> {language}\n"
@ -677,51 +871,51 @@ async def imdb_en_callback(bot: Client, query: CallbackQuery):
key_ = key_[:-2] key_ = key_[:-2]
res_str += f"<b>🔥 Keywords:</b> {key_} \n" res_str += f"<b>🔥 Keywords:</b> {key_} \n"
if sop.select('li[data-testid="award_information"]'): if sop.select('li[data-testid="award_information"]'):
awards = sop.select('li[data-testid="award_information"]')[0].find(class_="ipc-metadata-list-item__list-content-item").text awards = (
sop.select('li[data-testid="award_information"]')[0]
.find(class_="ipc-metadata-list-item__list-content-item")
.text
)
res_str += f"<b>🏆 Awards:</b> <code>{awards}</code>\n\n" res_str += f"<b>🏆 Awards:</b> <code>{awards}</code>\n\n"
else: else:
res_str += "\n" res_str += "\n"
res_str += f"<b>©️ IMDb by</b> @{BOT_USERNAME}" res_str += "<b>©️ IMDb by</b> @MissKatyRoBot"
if r_json.get("trailer"): if r_json.get("trailer"):
trailer_url = r_json["trailer"]["url"] trailer_url = r_json["trailer"]["url"]
markup = InlineKeyboardMarkup( markup = InlineKeyboardMarkup(
[ [
[ [
InlineKeyboardButton("🎬 Open IMDB", url=f"https://www.imdb.com{r_json['url']}"), InlineKeyboardButton(
"🎬 Open IMDB", url=f"https://www.imdb.com{r_json['url']}"
),
InlineKeyboardButton("▶️ Trailer", url=trailer_url), InlineKeyboardButton("▶️ Trailer", url=trailer_url),
] ]
] ]
) )
else: else:
markup = InlineKeyboardMarkup([[InlineKeyboardButton("🎬 Open IMDB", url=f"https://www.imdb.com{r_json['url']}")]]) markup = InlineKeyboardMarkup(
[
[
InlineKeyboardButton(
"🎬 Open IMDB", url=f"https://www.imdb.com{r_json['url']}"
)
]
]
)
if thumb := r_json.get("image"): if thumb := r_json.get("image"):
try: try:
await query.message.reply_photo( await query.message.edit_media(
photo=thumb, InputMediaPhoto(thumb, caption=res_str), reply_markup=markup
quote=True,
caption=res_str,
reply_to_message_id=usr.id,
reply_markup=markup,
) )
except (MediaEmpty, PhotoInvalidDimensions, WebpageMediaEmpty): except (MediaEmpty, PhotoInvalidDimensions, WebpageMediaEmpty):
poster = thumb.replace(".jpg", "._V1_UX360.jpg") poster = thumb.replace(".jpg", "._V1_UX360.jpg")
await query.message.reply_photo( await query.message.edit_media(
photo=poster, InputMediaPhoto(poster, caption=res_str), reply_markup=markup
caption=res_str,
reply_to_message_id=usr.id,
reply_markup=markup,
) )
except Exception: except Exception:
await query.message.reply( await query.message.edit_caption(res_str, reply_markup=markup)
res_str,
reply_markup=markup,
disable_web_page_preview=False,
reply_to_message_id=usr.id,
)
await query.message.delete()
else: else:
await query.message.edit(res_str, reply_markup=markup, disable_web_page_preview=False) await query.message.edit_caption(res_str, reply_markup=markup)
await query.answer()
except Exception: except Exception:
exc = traceback.format_exc() exc = traceback.format_exc()
await query.message.edit_text(f"<b>ERROR:</b>\n<code>{exc}</code>") await query.message.edit_caption(f"<b>ERROR:</b>\n<code>{exc}</code>")

View file

@ -1,32 +1,24 @@
"""
* @author yasir <yasiramunandar@gmail.com>
* @date 2022-12-01 09:12:27
* @lastModified 2022-12-01 09:32:31
* @projectName MissKatyPyro
* Copyright @YasirPedia All rights reserved
"""
# This plugin to scrape from melongmovie, and lk21 # This plugin to scrape from melongmovie, and lk21
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
import aiohttp
import re import re
import requests
import traceback import traceback
from misskaty import app, BOT_USERNAME from misskaty import app
from pyrogram import filters from pyrogram import filters
from pyrogram.errors import MessageTooLong from pyrogram.errors import MessageTooLong
from misskaty.vars import COMMAND_HANDLER from info import COMMAND_HANDLER
from misskaty.core.decorator.errors import capture_err from misskaty.core.decorator.errors import capture_err
from misskaty.helper.tools import rentry from misskaty.helper.tools import rentry
from misskaty.helper.http import http
__MODULE__ = "WebScraper" __MODULE__ = "WebScraper"
__HELP__ = """ __HELP__ = """
/melongmovie - Scrape website data from MelongMovie Web. If without query will give latest movie list. /melongmovie - Scrape website data from MelongMovie Web. If without query will give latest movie list.
/lk21 [query <optional>] - Scrape website data from LayarKaca21. If without query will give latest movie list. /lk21 [query <opsional>] - Scrape website data from LayarKaca21. If without query will give latest movie list.
/pahe [query <optional>] - Scrape website data from Pahe.li. If without query will give latest post list. /terbit21 [query <opsional>] - Scrape website data from Terbit21. If without query will give latest movie list.
/terbit21 [query <optional>] - Scrape website data from Terbit21. If without query will give latest movie list. /savefilm21 [query <opsional>] - Scrape website data from Savefilm21. If without query will give latest movie list.
/savefilm21 [query <optional>] - Scrape website data from Savefilm21. If without query will give latest movie list. /movieku [query <opsional>] - Scrape website data from Movieku.cc
/movieku [query <optional>] - Scrape website data from Movieku.cc /gomov [query <opsional>] - Scrape website data from GoMov. If without query will give latest movie list.
/gomov [query <optional>] - Scrape website data from GoMov. If without query will give latest movie list.
""" """
@ -41,8 +33,15 @@ async def nodrakor(_, message):
msg = await message.reply("Sedang proses scrap, mohon tunggu..") msg = await message.reply("Sedang proses scrap, mohon tunggu..")
try: try:
headers = {"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"} headers = {
html = await http.get(f"https://109.234.34.246/?s={judul}", headers=headers) "User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
html = requests.get(
f"https://109.234.34.246/?s={judul}",
headers=headers,
allow_redirects=False,
verify=False,
)
soup = BeautifulSoup(html.text, "lxml") soup = BeautifulSoup(html.text, "lxml")
res = soup.find_all(class_="content-thumbnail text-center") res = soup.find_all(class_="content-thumbnail text-center")
data = [] data = []
@ -53,7 +52,9 @@ async def nodrakor(_, message):
if not data: if not data:
return await msg.edit("Oops, data film tidak ditemukan.") return await msg.edit("Oops, data film tidak ditemukan.")
res = "".join(f"<b>{i['judul']}</b>\n{i['link']}\n\n" for i in data) res = "".join(f"<b>{i['judul']}</b>\n{i['link']}\n\n" for i in data)
await msg.edit(f"<b>Hasil Pencarian di Nodrakor:</b>\n{res}\nScraped by @{BOT_USERNAME}") await msg.edit(
f"<b>Hasil Pencarian di Nodrakor:</b>\n{res}\nScraped by @MissKatyRoBot"
)
except Exception as e: except Exception as e:
await msg.edit(f"ERROR: {str(e)}") await msg.edit(f"ERROR: {str(e)}")
@ -62,15 +63,18 @@ async def nodrakor(_, message):
@app.on_message(filters.command(["ngefilm21"], COMMAND_HANDLER)) @app.on_message(filters.command(["ngefilm21"], COMMAND_HANDLER))
@capture_err @capture_err
async def ngefilm21(_, message): async def ngefilm21(_, message):
if len(message.command) == 1: try:
return await message.reply("Masukkan query yang akan dicari..!!") title = message.text.split(" ", maxsplit=1)[1]
title = message.text.split(" ", maxsplit=1)[1] except IndexError:
title = ""
msg = await message.reply("Sedang proses scrap, mohon tunggu..") msg = await message.reply("Sedang proses scrap, mohon tunggu..")
try: try:
headers = {"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"} headers = {
"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
html = await http.get(f"http://185.237.253.209/search?q={title}", headers=headers) html = requests.get(f"http://185.237.253.209/search?q={title}", headers=headers)
soup = BeautifulSoup(html.text, "lxml") soup = BeautifulSoup(html.text, "lxml")
res = soup.find_all("h2") res = soup.find_all("h2")
data = [] data = []
@ -88,21 +92,30 @@ async def ngefilm21(_, message):
await msg.edit(f"ERROR: {str(e)}") await msg.edit(f"ERROR: {str(e)}")
# Scrape Web From Movieku.CC
@app.on_message(filters.command(["movieku"], COMMAND_HANDLER)) @app.on_message(filters.command(["movieku"], COMMAND_HANDLER))
@capture_err @capture_err
async def movikucc(_, message): async def movikucc(_, message):
if len(message.command) == 1: try:
return await message.reply("Masukkan query yang akan dicari..!!") judul = message.text.split(" ", maxsplit=1)[1]
judul = message.text.split(" ", maxsplit=1)[1] except IndexError:
judul = ""
msg = await message.reply("Sedang proses scrap, mohon tunggu..") msg = await message.reply("Sedang proses scrap, mohon tunggu..")
try: try:
headers = {"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"} headers = {
html = await http.get(f"https://107.152.39.187/?s={judul}", headers=headers) "User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
html = requests.get(f"https://107.152.39.187/?s={judul}", headers=headers)
soup = BeautifulSoup(html.text, "lxml") soup = BeautifulSoup(html.text, "lxml")
data = soup.find_all(class_="bx") data = soup.find_all(class_="bx")
res = "".join(f"<b>Judul: {i.find_all('a')[0]['title']}</b>\nLink: {i.find_all('a')[0]['href']}\n\n" for i in data) res = "".join(
await msg.edit(f"<b>Hasil Scrap di Movieku.cc:</b>\n{res} ⚠️ Gunakan command /movieku_scrap <b>[link]</b> untuk mengambil link download (hanya untuk movie).") f"<b>Judul: {i.find_all('a')[0]['title']}</b>\nLink: {i.find_all('a')[0]['href']}\n\n"
for i in data
)
await msg.edit(
f"<b>Hasil Scrap di Movieku.cc:</b>\n{res} ⚠️ Gunakan command /movieku_scrap <b>[link]</b> untuk mengambil link download (hanya untuk movie)."
)
except Exception as e: except Exception as e:
await msg.edit(f"ERROR: {str(e)}") await msg.edit(f"ERROR: {str(e)}")
@ -114,11 +127,16 @@ async def savefilm21(_, message):
judul = message.text.split(" ", maxsplit=1)[1] judul = message.text.split(" ", maxsplit=1)[1]
except IndexError: except IndexError:
judul = "" judul = ""
msg = await message.reply("Sedang proses scrap, mohon tunggu..") msg = await message.reply("Sedang proses scrap, mohon tunggu..")
try: try:
headers = {"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"} headers = {
"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
html = await http.get(f"http://185.99.135.215/?s={judul}", headers=headers, follow_redirects=False) html = requests.get(
f"http://38.242.196.210/?s={judul}", headers=headers, allow_redirects=False
)
soup = BeautifulSoup(html.text, "lxml") soup = BeautifulSoup(html.text, "lxml")
res = soup.find_all(class_="entry-title") res = soup.find_all(class_="entry-title")
data = [] data = []
@ -129,8 +147,12 @@ async def savefilm21(_, message):
data.append({"judul": judul, "link": link}) data.append({"judul": judul, "link": link})
if not data: if not data:
return await msg.edit("Oops, data film tidak ditemukan") return await msg.edit("Oops, data film tidak ditemukan")
res = "".join(f"<b>Judul: {i['judul']}</b>\nLink: {i['link']}\n\n" for i in data) res = "".join(
await msg.edit(f"Hasil Scrap <code>{judul}</code> dari Savefilm21:\n{res}\n\n⚠️ Gunakan /savefilm21_scrap <b>[link]</b> untuk mengambil link downloadnya.") f"<b>Judul: {i['judul']}</b>\nLink: {i['link']}\n\n" for i in data
)
await msg.edit(
f"Hasil Scrap <code>{judul}</code> dari Savefilm21:\n{res}\n\n⚠️ Gunakan /savefilm21_scrap <b>[link]</b> untuk mengambil link downloadnya."
)
except Exception as e: except Exception as e:
await msg.edit(f"ERROR: {str(e)}") await msg.edit(f"ERROR: {str(e)}")
@ -145,9 +167,11 @@ async def melongmovie(_, message):
msg = await message.reply("Sedang proses scrap, mohon tunggu..") msg = await message.reply("Sedang proses scrap, mohon tunggu..")
try: try:
headers = {"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"} headers = {
"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
html = await http.get(f"http://167.99.31.48/?s={judul}", headers=headers) html = requests.get(f"http://167.99.31.48/?s={judul}", headers=headers)
soup = BeautifulSoup(html.text, "lxml") soup = BeautifulSoup(html.text, "lxml")
data = [] data = []
for res in soup.select(".box"): for res in soup.select(".box"):
@ -161,100 +185,107 @@ async def melongmovie(_, message):
data.append({"judul": title, "link": url, "kualitas": kualitas}) data.append({"judul": title, "link": url, "kualitas": kualitas})
if not data: if not data:
return await msg.edit("Oops, data film tidak ditemukan di melongmovie") return await msg.edit("Oops, data film tidak ditemukan di melongmovie")
res = "".join(f"<b>Judul: {i['judul']}</b>\n<b>Kualitas:</b> {i['kualitas']}\n<b>Link</b>: {i['link']}\n\n" for i in data) res = "".join(
f"<b>Judul: {i['judul']}</b>\n<b>Kualitas:</b> {i['kualitas']}\n<b>Link</b>: {i['link']}\n\n"
for i in data
)
# return await message.reply(json.dumps(data, indent=2, ensure_ascii=False)) # return await message.reply(json.dumps(data, indent=2, ensure_ascii=False))
return await msg.edit(res) return await msg.edit(res)
except Exception as e: except Exception as e:
await msg.edit(f"ERROR: {str(e)}") await msg.edit(f"ERROR: {str(e)}")
@app.on_message(filters.command(["pahe"], COMMAND_HANDLER))
@capture_err
async def pahe_scrap(_, message):
judul = message.text.split(" ", maxsplit=1)[1] if len(message.command) > 1 else ""
pesan = await message.reply("Please wait, scraping data..")
r = await http.get(f"https://yasirapi.eu.org/pahe?q={judul}")
res = r.json()
if not res["result"]:
return await pesan.edit("Yahh, no result found.")
data = "".join(f"**{count}. {i['judul']}**\n{i['link']}\n\n" for count, i in enumerate(res["result"], start=1))
try:
await pesan.edit(
f"**Daftar rilis movie terbaru di web Pahe**:\n{data}",
disable_web_page_preview=True,
)
except MessageTooLong:
msg = await rentry(data)
await pesan.edit(f"Karena hasil scrape terlalu panjang, maka hasil scrape di post ke rentry.\n\n{msg}")
@app.on_message(filters.command(["terbit21"], COMMAND_HANDLER)) @app.on_message(filters.command(["terbit21"], COMMAND_HANDLER))
@capture_err @capture_err
async def terbit21_scrap(_, message): async def terbit21_scrap(_, message):
if len(message.command) == 1: if len(message.command) == 1:
r = await http.get("https://yasirapi.eu.org/terbit21") async with aiohttp.ClientSession() as session:
res = r.json() r = await session.get(f"https://yasirapi.eu.org/terbit21")
data = "".join(f"**Judul: {i['judul']}**\n`{i['kategori']}`\n{i['link']}\n**Download:** [Klik Disini]({i['dl']})\n\n" for i in res["result"]) res = await r.json()
data = "".join(
f"**Judul: {i['judul']}**\n`{i['kategori']}`\n{i['link']}\n**Download:** [Klik Disini]({i['dl']})\n\n"
for i in res["result"]
)
try:
return await message.reply(
f"**Daftar rilis movie terbaru di web Terbit21**:\n{data}",
disable_web_page_preview=True,
)
except MessageTooLong:
msg = await rentry(data)
return await message.reply(
f"Karena hasil scrape terlalu panjang, maka hasil scrape di post ke rentry.\n\n{msg}"
)
judul = message.text.split(" ", maxsplit=1)[1]
msg = await message.reply(f"Mencari film di Terbit21 dg keyword {judul}..")
async with aiohttp.ClientSession() as session:
r = await session.get(f"https://yasirapi.eu.org/terbit21?q={judul}")
res = await r.json()
data = "".join(
f"**Judul: {i['judul']}**\n`{i['kategori']}`\n{i['link']}\n**Download:** [Klik Disini]({i['dl']})\n\n"
for i in res["result"]
)
if not res["result"]:
return await msg.edit("Yahh, ga ada hasil ditemukan")
try: try:
return await message.reply( await msg.edit(
f"**Daftar rilis movie terbaru di web Terbit21**:\n{data}", f"<b>Hasil pencarian query {judul} di lk21:</b>\n{data}",
disable_web_page_preview=True, disable_web_page_preview=True,
) )
except MessageTooLong: except MessageTooLong:
msg = await rentry(data) pesan = await rentry(data)
return await message.reply(f"Karena hasil scrape terlalu panjang, maka hasil scrape di post ke rentry.\n\n{msg}") await msg.edit(
judul = message.text.split(" ", maxsplit=1)[1] f"Karena hasil scrape terlalu panjang, maka hasil scrape di post ke rentry.\n\n{pesan}"
msg = await message.reply(f"Mencari film di Terbit21 dg keyword {judul}..") )
r = await http.get(f"https://yasirapi.eu.org/terbit21?q={judul}")
res = r.json()
data = "".join(f"**Judul: {i['judul']}**\n`{i['kategori']}`\n{i['link']}\n**Download:** [Klik Disini]({i['dl']})\n\n" for i in res["result"])
if not res["result"]:
return await msg.edit("Yahh, ga ada hasil ditemukan")
try:
await msg.edit(
f"<b>Hasil pencarian query {judul} di lk21:</b>\n{data}",
disable_web_page_preview=True,
)
except MessageTooLong:
pesan = await rentry(data)
await msg.edit(f"Karena hasil scrape terlalu panjang, maka hasil scrape di post ke rentry.\n\n{pesan}")
@app.on_message(filters.command(["lk21"], COMMAND_HANDLER)) @app.on_message(filters.command(["lk21"], COMMAND_HANDLER))
@capture_err @capture_err
async def lk21_scrap(_, message): async def lk21_scrap(_, message):
if len(message.command) == 1: if len(message.command) == 1:
msg = await message.reply("Mendapatkan daftar post film terbaru di lk21") msg = await message.reply(f"Mendapatkan daftar post film terbaru di lk21")
r = await http.get("https://yasirapi.eu.org/lk21") async with aiohttp.ClientSession() as session:
res = r.json() r = await session.get(f"https://yasirapi.eu.org/lk21")
res = await r.json()
if res.get("detail", None):
return await msg.edit(f"ERROR: {res['detail']}")
data = "".join(
f"**Judul: {i['judul']}**\n`{i['kategori']}`\n{i['link']}\n**Download:** [Klik Disini]({i['dl']})\n\n"
for i in res["result"]
)
try:
return await msg.edit(
f"**Daftar rilis movie terbaru di web LK21**:\n{data}",
disable_web_page_preview=True,
)
except MessageTooLong:
msg = await rentry(data)
await msg.edit(
f"Karena hasil scrape terlalu panjang, maka hasil scrape di post ke rentry.\n\n{msg}"
)
judul = message.text.split(" ", maxsplit=1)[1]
msg = await message.reply(f"Mencari film di lk21 dg keyword {judul}..")
async with aiohttp.ClientSession() as session:
r = await session.get(f"https://yasirapi.eu.org/lk21?q={judul}")
res = await r.json()
if res.get("detail", None): if res.get("detail", None):
return await msg.edit(f"ERROR: {res['detail']}") return await msg.edit(f"ERROR: {res['detail']}")
data = "".join(f"**Judul: {i['judul']}**\n`{i['kategori']}`\n{i['link']}\n**Download:** [Klik Disini]({i['dl']})\n\n" for i in res["result"]) data = "".join(
f"**Judul: {i['judul']}**\n`{i['kategori']}`\n{i['link']}\n**Download:** [Klik Disini]({i['dl']})\n\n"
for i in res["result"]
)
if not res["result"]:
return await msg.edit("Yahh, ga ada hasil ditemukan")
try: try:
return await msg.edit( await msg.edit(
f"**Daftar rilis movie terbaru di web LK21**:\n{data}", f"<b>Hasil pencarian query {judul} di lk21:</b>\n{data}",
disable_web_page_preview=True, disable_web_page_preview=True,
) )
except MessageTooLong: except MessageTooLong:
msg = await rentry(data) pesan = await rentry(data)
await msg.edit(f"Karena hasil scrape terlalu panjang, maka hasil scrape di post ke rentry.\n\n{msg}") return await msg.edit(
judul = message.text.split(" ", maxsplit=1)[1] f"Karena hasil scrape terlalu panjang, maka hasil scrape di post ke rentry.\n\n{pesan}"
msg = await message.reply(f"Mencari film di lk21 dg keyword {judul}..") )
r = await http.get(f"https://yasirapi.eu.org/lk21?q={judul}")
res = r.json()
if res.get("detail", None):
return await msg.edit(f"ERROR: {res['detail']}")
data = "".join(f"**Judul: {i['judul']}**\n`{i['kategori']}`\n{i['link']}\n**Download:** [Klik Disini]({i['dl']})\n\n" for i in res["result"])
if not res["result"]:
return await msg.edit("Yahh, ga ada hasil ditemukan")
try:
await msg.edit(
f"<b>Hasil pencarian query {judul} di lk21:</b>\n{data}",
disable_web_page_preview=True,
)
except MessageTooLong:
pesan = await rentry(data)
return await msg.edit(f"Karena hasil scrape terlalu panjang, maka hasil scrape di post ke rentry.\n\n{pesan}")
@app.on_message(filters.command(["gomov"], COMMAND_HANDLER)) @app.on_message(filters.command(["gomov"], COMMAND_HANDLER))
@ -265,22 +296,30 @@ async def gomov_scrap(_, message):
except IndexError: except IndexError:
judul = "" judul = ""
msg = await message.reply("Scraping GoMov Website..") msg = await message.reply(f"Scraping GoMov Website..")
try: try:
headers = {"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"} headers = {
"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
html = await http.get(f"https://185.173.38.216/?s={judul}", headers=headers) html = requests.get(f"https://185.173.38.216/?s={judul}", headers=headers)
soup = BeautifulSoup(html.text, "lxml") soup = BeautifulSoup(html.text, "lxml")
entry = soup.find_all(class_="entry-title") entry = soup.find_all(class_="entry-header")
DATA = [] DATA = []
for i in entry: for i in entry:
judul = i.find_all("a")[0].text genre = i.find(class_="gmr-movie-on").text
link = i.find_all("a")[0]["href"] judul = i.find(class_="entry-title").find("a").text
DATA.append({"judul": judul, "link": link}) link = i.find(class_="entry-title").find("a").get("href")
DATA.append({"judul": judul, "link": link, "genre": genre})
if not DATA: if not DATA:
return await msg.edit("Oops, data film tidak ditemukan di GoMov") return await msg.edit("Oops, data film tidak ditemukan di GoMov")
res = "".join(f"<b>Judul: {i['judul']}</b>\n{i['link']}\n\n" for i in DATA) res = "".join(
await msg.edit(f"<b>Hasil Pencarian di website GoMov:</b>\n{res}\nScraped by @{BOT_USERNAME}") f"<b>{num}. {i['judul']}</b>\n<code>{i['genre']}</code>\n{i['link']}\n\n"
for num, i in enumerate(DATA, start=1)
)
await msg.edit(
f"<b>Hasil Pencarian di website GoMov:</b>\n{res}\nScraped by @MissKatyRoBot"
)
except Exception: except Exception:
exc = traceback.format_exc() exc = traceback.format_exc()
await msg.edit(f"ERROR: <code>{exc}</code>") await msg.edit(f"ERROR: <code>{exc}</code>")
@ -291,15 +330,19 @@ async def gomov_scrap(_, message):
async def savefilm21_scrap(_, message): async def savefilm21_scrap(_, message):
try: try:
link = message.text.split(" ", maxsplit=1)[1] link = message.text.split(" ", maxsplit=1)[1]
headers = {"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"} headers = {
"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
html = await http.get(link, headers=headers, follow_redirects=False) html = requests.get(link, headers=headers, allow_redirects=False)
soup = BeautifulSoup(html.text, "lxml") soup = BeautifulSoup(html.text, "lxml")
res = soup.find_all(class_="button button-shadow") res = soup.find_all(class_="button button-shadow")
res = "".join(f"{i.text}\n{i['href']}\n\n" for i in res) res = "".join(f"{i.text}\n{i['href']}\n\n" for i in res)
await message.reply(f"<b>Hasil Scrap dari {link}</b>:\n\n{res}") await message.reply(f"<b>Hasil Scrap dari {link}</b>:\n\n{res}")
except IndexError: except IndexError:
return await message.reply("Gunakan command /savefilm21_scrap <b>[link]</b> untuk scrap link download") return await message.reply(
"Gunakan command /savefilm21_scrap <b>[link]</b> untuk scrap link download"
)
except Exception as e: except Exception as e:
await message.reply(f"ERROR: {str(e)}") await message.reply(f"ERROR: {str(e)}")
@ -309,27 +352,32 @@ async def savefilm21_scrap(_, message):
async def nodrakor_scrap(_, message): async def nodrakor_scrap(_, message):
try: try:
link = message.text.split(" ", maxsplit=1)[1] link = message.text.split(" ", maxsplit=1)[1]
headers = {"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"} headers = {
"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
html = await http.get(link, headers=headers, follow_redirects=False) html = requests.get(link, headers=headers, allow_redirects=False, verify=False)
soup = BeautifulSoup(html.text, "lxml") soup = BeautifulSoup(html.text, "lxml")
hasil = soup.find_all(class_="gmr-download-wrap clearfix")[0] hasil = soup.find_all(class_="gmr-download-wrap clearfix")[0]
await message.reply(f"<b>Hasil Scrap dari {link}</b>:\n{hasil}") await message.reply(f"<b>Hasil Scrap dari {link}</b>:\n{hasil}")
except IndexError: except IndexError:
return await message.reply("Gunakan command /nodrakor_scrap <b>[link]</b> untuk scrap link download") return await message.reply(
"Gunakan command /nodrakor_scrap <b>[link]</b> untuk scrap link download"
)
except Exception as e: except Exception as e:
await message.reply(f"ERROR: {str(e)}") await message.reply(f"ERROR: {str(e)}")
# Scrape Link Download Movieku.CC
@app.on_message(filters.command(["movieku_scrap"], COMMAND_HANDLER)) @app.on_message(filters.command(["movieku_scrap"], COMMAND_HANDLER))
@capture_err @capture_err
async def muviku_scrap(_, message): async def muviku_scrap(_, message):
try: try:
link = message.text.split(" ", maxsplit=1)[1] link = message.text.split(" ", maxsplit=1)[1]
headers = {"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"} headers = {
"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
html = await http.get(link, headers=headers) html = requests.get(link, headers=headers)
soup = BeautifulSoup(html.text, "lxml") soup = BeautifulSoup(html.text, "lxml")
res = soup.find_all(class_="smokeurl") res = soup.find_all(class_="smokeurl")
data = [] data = []
@ -344,19 +392,26 @@ async def muviku_scrap(_, message):
res = "".join(f"<b>Host: {i['kualitas']}</b>\n{i['link']}\n\n" for i in data) res = "".join(f"<b>Host: {i['kualitas']}</b>\n{i['link']}\n\n" for i in data)
await message.reply(res) await message.reply(res)
except IndexError: except IndexError:
return await message.reply("Gunakan command /movieku_scrap <b>[link]</b> untuk scrap link download") return await message.reply(
"Gunakan command /movieku_scrap <b>[link]</b> untuk scrap link download"
)
except Exception as e: except Exception as e:
await message.reply(f"ERROR: {str(e)}") await message.reply(f"ERROR: {str(e)}")
@app.on_message(filters.command(["melong"], COMMAND_HANDLER) & filters.user([617426792, 1985689491, 1172699512, 2024984460])) @app.on_message(
filters.command(["melong"], COMMAND_HANDLER)
& filters.user([617426792, 1985689491, 1172699512, 2024984460])
)
@capture_err @capture_err
async def melong_scrap(_, message): async def melong_scrap(_, message):
try: try:
link = message.text.split(" ", maxsplit=1)[1] link = message.text.split(" ", maxsplit=1)[1]
headers = {"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"} headers = {
"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
html = await http.get(link, headers=headers) html = requests.get(link, headers=headers)
soup = BeautifulSoup(html.text, "lxml") soup = BeautifulSoup(html.text, "lxml")
for ep in soup.findAll(text=re.compile(r"(?i)episode\s+\d+|LINK DOWNLOAD")): for ep in soup.findAll(text=re.compile(r"(?i)episode\s+\d+|LINK DOWNLOAD")):
hardsub = ep.findPrevious("div") hardsub = ep.findPrevious("div")
@ -364,4 +419,30 @@ async def melong_scrap(_, message):
rep = f"{hardsub}\n{softsub}" rep = f"{hardsub}\n{softsub}"
await message.reply(rep) await message.reply(rep)
except IndexError: except IndexError:
await message.reply("Gunakan command /melong <b>[link]</b> untuk scrap link download") await message.reply(
"Gunakan command /melong <b>[link]</b> untuk scrap link download"
)
@app.on_message(filters.command(["gomov_scrap"], COMMAND_HANDLER))
@capture_err
async def gomov_dl(_, message):
try:
link = message.text.split(" ", maxsplit=1)[1]
headers = {
"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
html = requests.get(link, headers=headers, verify=False)
soup = BeautifulSoup(html.text, "lxml")
entry = soup.find(class_="gmr-download-wrap clearfix")
hasil = soup.find(class_="title-download").text
for i in entry.find(class_="list-inline gmr-download-list clearfix"):
title = i.find("a").text
link = i.find("a")["href"]
hasil += f"\n{title}\n{link}\n"
await message.reply(hasil)
except IndexError:
await message.reply(
"Gunakan command /melong <b>[link]</b> untuk scrap link download"
)