|
import logging |
|
import base64 |
|
import requests |
|
import uvloop |
|
import aiofiles |
|
import aiohttp |
|
from bs4 import BeautifulSoup |
|
from akenoai import OldAkenoXToJs |
|
from akenoai.runner import run_fast |
|
from akenoai.clients import create_pyrogram |
|
from akenoai.clients.enums import ChatMembersFilter |
|
from fastapi.middleware.cors import CORSMiddleware |
|
|
|
from pyrogram.enums import * |
|
from pyrogram.errors import * |
|
from pyrogram.types import * |
|
from pyrogram import filters |
|
|
|
from config import API_ID, API_HASH, BOT_TOKEN, SESSION |
|
|
|
from src.catergory import router as catergory_router |
|
|
|
logger = logging.getLogger(__name__) |
|
LOGS = logging.getLogger("[akenox]") |
|
logger.setLevel(logging.DEBUG) |
|
|
|
js = OldAkenoXToJs() |
|
fast_app = js.get_app() |
|
|
|
origins = [ |
|
"https://randydev-meta-ai.hf.space" |
|
] |
|
fast_app.add_middleware( |
|
CORSMiddleware, |
|
allow_origins=origins, |
|
allow_credentials=True, |
|
allow_methods=["*"], |
|
allow_headers=["*"], |
|
) |
|
|
|
import uvloop |
|
|
|
uvloop.install() |
|
|
|
from src.combo import router as combo_router |
|
|
|
|
|
|
|
from src.sites_list_torrens import router as sites_list_torrens_router |
|
|
|
|
|
|
|
fast_app.include_router(combo_router) |
|
fast_app.include_router(catergory_router) |
|
|
|
|
|
|
|
fast_app.include_router(sites_list_torrens_router) |
|
|
|
|
|
|
|
|
|
bot = create_pyrogram( |
|
name="fastapi-bot", |
|
api_id=API_ID, |
|
api_hash=API_HASH, |
|
bot_token=BOT_TOKEN |
|
) |
|
|
|
user_client = create_pyrogram( |
|
name="fastapi-user", |
|
api_id=API_ID, |
|
api_hash=API_HASH, |
|
session_string=SESSION |
|
) |
|
|
|
def get_random_from_channel(link): |
|
clean_link = link.split("?")[0] |
|
target_link = clean_link.split("/c/") if "/c/" in clean_link else clean_link.split("/") |
|
random_id = int(target_link[-1].split("/")[-1]) if len(target_link) > 1 else None |
|
desired_username = target_link[3] if len(target_link) > 3 else None |
|
username = ( |
|
"@" + desired_username if desired_username else "-100" + target_link[1].split("/")[0] |
|
if len(target_link) > 1 else None |
|
) |
|
return username, random_id |
|
|
|
async def upload_to_catbox(dl_path: str) -> str: |
|
base_url = "https://catbox.moe/user/api.php" |
|
proxy_url = f"http://186.26.92.180:58339" |
|
async with aiohttp.ClientSession() as session: |
|
form_data = aiohttp.FormData() |
|
form_data.add_field("reqtype", "fileupload") |
|
|
|
async with aiofiles.open(dl_path, mode="rb") as file: |
|
file_data = await file.read() |
|
form_data.add_field( |
|
"fileToUpload", |
|
file_data, |
|
filename=dl_path.split("/")[-1], |
|
content_type="application/octet-stream" |
|
) |
|
|
|
async with session.post(base_url, data=form_data, proxy=proxy_url) as response: |
|
response.raise_for_status() |
|
return (await response.text()).strip() |
|
|
|
"""" |
|
@fast_app.on_event("startup") |
|
async def startup_event(): |
|
# user = await bot.start() |
|
# userbot = await user_client.start() |
|
LOGS.info(f"Started Bot: {user.me.first_name}") |
|
LOGS.info(f"Started UserBot: {userbot.me.first_name}") |
|
|
|
|
|
@fast_app.get("/user/status/ban") |
|
async def user_status_ban(username: str = None): |
|
username_ch = "RendyProjects" |
|
try: |
|
mention_user = await bot.get_users(username) |
|
user = await bot.get_chat_member(username_ch, username) |
|
if user.status == ChatMemberStatus.BANNED: |
|
return { |
|
"message": f"❌ you {mention_user.first_name} have been blocked from the RendyProjects", |
|
"is_ban": True, |
|
"user_id": mention_user.id |
|
} |
|
return { |
|
"message": "User is not banned", |
|
"is_ban": False, |
|
"user_id": mention_user.id |
|
} |
|
except PeerIdInvalid: |
|
return False |
|
except UserNotParticipant: |
|
return False |
|
|
|
async def hello(): |
|
return {"success": "hello world!"} |
|
|
|
@fast_app.get("/user/get_story") |
|
async def get_user_story(link: str = None): |
|
username, random_id = get_random_from_channel(link) |
|
try: |
|
stories = await user_client.get_stories(username, story_ids=[random_id]) |
|
except Exception as e: |
|
return {"error": str(e)} |
|
if stories: |
|
for story in stories: |
|
file_id = ( |
|
story.photo.file_id if story and story.photo else None |
|
or story.video.file_id if story and story.video else None |
|
) |
|
caption = story.caption or f"By {user_client.me.mention}" |
|
if file_id: |
|
image_path = await user_client.download_media(file_id) |
|
|
|
with open(image_path, "rb") as f: |
|
base64_image = base64.b64encode(f.read()).decode("utf-8") |
|
# url_dl = await upload_to_catbox(image_path) |
|
return { |
|
"download": base64_image, |
|
"random_file_id": file_id, |
|
"caption": caption |
|
} |
|
return { |
|
"download": None, |
|
"random_file_id": None, |
|
"caption": None |
|
} |
|
|
|
@fast_app.get("/user/media-dl/file_id") |
|
async def get_download_media_file(file_id: str = None): |
|
try: |
|
image_path = await user_client.download_media(file_id) |
|
except Exception as e: |
|
return {"error": str(e)} |
|
with open(image_path, "rb") as f: |
|
base64_image = base64.b64encode(f.read()).decode("utf-8") |
|
return { |
|
"download": base64_image, |
|
} |
|
""" |
|
|
|
ALERT_WARN = """ |
|
🚨 Security Alert: API Key Activity Detected! |
|
|
|
👁️ Full Log: |
|
|
|
`{text_log}` |
|
|
|
🔗 Need help? Contact support: @xpushz |
|
""" |
|
|
|
NOTIF_KEY = """ |
|
🚨 **Notification: API Key Expired (Premium Required)!** |
|
|
|
Your current API key has expired. To continue using premium features, please upgrade to **Premium v2** first. |
|
|
|
🔑 **API Key:** <spoiler>{api_key}</spoiler> |
|
|
|
🔗 Need help? Contact support: @xpushz |
|
""" |
|
|
|
""" |
|
@fast_app.get("/user/tg/notifications") |
|
async def user_send_notif(user_id: int = None, api_key: str = None): |
|
try: |
|
await bot.send_sticker( |
|
user_id, |
|
"CAACAgUAAyEGAASPgam4AAI5T2fTWtyF4FNdBlRL-PWcs_l3Y0emAAI-BwACj774VGLOns79NgeCHgQ" |
|
) |
|
await bot.send_message( |
|
user_id, |
|
text=NOTIF_KEY.format(api_key=api_key) |
|
) |
|
return {"status": True} |
|
except Exception as e: |
|
return None |
|
|
|
@fast_app.get("/user/tg/send_message") |
|
async def user_send_message(user_id: int = None, api_key: str = None, text_log: str = None): |
|
try: |
|
await bot.send_message( |
|
user_id, |
|
text=ALERT_WARN.format( |
|
api_key=api_key, |
|
text_log=text_log |
|
) |
|
) |
|
return {"status": True} |
|
except Exception as e: |
|
return None |
|
|
|
@fast_app.get("/user/author/admin") |
|
async def get_author_chat_admin(username: str = None): |
|
same_user = {} |
|
async for m in user_client.get_chat_members(username, filter=ChatMembersFilter.ADMINISTRATORS): |
|
if not m.user.is_bot and not m.user.is_deleted: |
|
same_user[m.user.id] = { |
|
"first_name": m.user.first_name, |
|
"username": m.user.username if m.user else None |
|
} |
|
return { |
|
"admin_list": same_user |
|
} |
|
|
|
@fast_app.get("/user/raw/getchat") |
|
async def get_chat_raw(username: str = None): |
|
try: |
|
user_id = None |
|
chat_raw = (await bot.get_chat(username)).raw |
|
ok = await user_client.get_chat(username) |
|
if ok.pinned_message.from_user: |
|
user_id = ok.pinned_message.from_user.id if ok.pinned_message.from_user else None |
|
if not user_id: |
|
user_id = None |
|
if user_id: |
|
response = await js.get_creation_date( |
|
user_id=user_id |
|
) |
|
except Exception as e: |
|
return {"error": f"Error try again invalid: {str(e)}"} |
|
return { |
|
"id": chat_raw.id, |
|
"about": chat_raw.about, |
|
"title": ok.title, |
|
"username": ok.username if ok else None, |
|
"photo": { |
|
"id": chat_raw.chat_photo.id, |
|
"small_file_id": ok.photo.small_file_id, |
|
"small_photo_unique_id": ok.photo.small_photo_unique_id, |
|
"big_file_id": ok.photo.big_file_id, |
|
"big_photo_unique_id": ok.photo.big_photo_unique_id, |
|
"date": chat_raw.chat_photo.date, |
|
"dc_id": chat_raw.chat_photo.dc_id, |
|
"has_animation": ok.photo.has_animation, |
|
"is_personal": ok.photo.is_personal |
|
}, |
|
"from_user": { |
|
"id": ok.pinned_message.from_user.id if ok.pinned_message.from_user else None, |
|
"first_name": ok.pinned_message.from_user.first_name if ok.pinned_message.from_user else None, |
|
"last_name": ok.pinned_message.from_user.last_name if ok.pinned_message.from_user else None, |
|
"status": ok.pinned_message.from_user.status.name if ok.pinned_message.from_user.status else None, |
|
"last_online_date": ok.pinned_message.from_user.last_online_date if ok.pinned_message.from_user else None, |
|
"username": ok.pinned_message.from_user.username if ok.pinned_message.from_user else None, |
|
"is_premium": ok.pinned_message.from_user.is_premium if ok.pinned_message.from_user else None, |
|
"is_scam": ok.pinned_message.from_user.is_scam if ok.pinned_message.from_user else None, |
|
"creation_date": response |
|
}, |
|
"can_view_participants": chat_raw.can_view_participants, |
|
"can_set_username": chat_raw.can_set_username, |
|
"can_set_stickers": chat_raw.can_set_stickers, |
|
"hidden_prehistory": chat_raw.hidden_prehistory, |
|
"can_set_location": chat_raw.can_set_location, |
|
"has_scheduled": chat_raw.has_scheduled, |
|
"can_view_stats": chat_raw.can_view_stats, |
|
"blocked": chat_raw.blocked, |
|
"can_delete_channel": chat_raw.can_delete_channel, |
|
"antispam": chat_raw.antispam, |
|
"participants_hidden": chat_raw.participants_hidden, |
|
"translations_disabled": chat_raw.translations_disabled, |
|
"stories_pinned_available": chat_raw.stories_pinned_available, |
|
"view_forum_as_messages": chat_raw.view_forum_as_messages, |
|
"restricted_sponsored": chat_raw.restricted_sponsored, |
|
"can_view_revenue": chat_raw.can_view_revenue, |
|
"paid_media_allowed": chat_raw.paid_media_allowed, |
|
"can_view_stars_revenue": chat_raw.can_view_stars_revenue, |
|
"paid_reactions_available": chat_raw.paid_reactions_available, |
|
"stargifts_available": chat_raw.stargifts_available, |
|
"participants_count": chat_raw.participants_count, |
|
"online_count": chat_raw.online_count, |
|
"pinned_msg_id": chat_raw.pinned_msg_id, |
|
"linked_chat_id": chat_raw.linked_chat_id, |
|
"pending_suggestions": chat_raw.pending_suggestions, |
|
"recent_requesters": chat_raw.recent_requesters, |
|
"available_reactions": { |
|
"allow_custom": chat_raw.available_reactions.allow_custom |
|
}, |
|
} |
|
|
|
async def send_to_telegram(user_id="@xpushz", text: str = None): |
|
return await bot.send_message(user_id, text=text) |
|
|
|
@fast_app.post("/log_captcha") |
|
async def log_captcha(data: dict): |
|
user_ip = data.get("user_ip", "Unknown IP") |
|
timestamp = data.get("challenge_ts", "No Timestamp") |
|
log_message = f"✅ CAPTCHA Verified\n🖥 IP: `{user_ip}`\n⏳ Time: `{timestamp}`" |
|
await send_to_telegram(text=log_message) |
|
return {"status": "logged"} |
|
""" |
|
|
|
@fast_app.get("/api/twitter") |
|
async def twitter_downloader(link: str): |
|
|
|
import akenoai as jsx |
|
import re |
|
if not link: |
|
return {"error": "required link"} |
|
urls = re.sub(r"(https?:\/\/)(?:www\.)?x\.com", r"\1twitter.com", link) |
|
if not urls: |
|
return {"error": None} |
|
response = await jsx.fetch_and_extract_urls( |
|
f"https://snapdownloader.com/tools/twitter-video-downloader/download?url={urls}", |
|
href_url=r"https://video", |
|
return_unsafe_href=True |
|
) |
|
return {"results": response} |
|
|
|
""" |
|
@fast_app.get("/user/get_user") |
|
async def get_user(user_id=None): |
|
try: |
|
get_users = await bot.get_users(user_id) |
|
response = await js.get_creation_date( |
|
user_id=get_users.id |
|
) |
|
except Exception: |
|
return {"error": "Error try again invalid"} |
|
return { |
|
"id": get_users.id, |
|
"is_self": get_users.is_self, |
|
"is_contact": get_users.is_contact, |
|
"is_mutual_contact": get_users.is_mutual_contact, |
|
"is_deleted": get_users.is_deleted, |
|
"is_bot": get_users.is_bot, |
|
"is_verified": get_users.is_verified, |
|
"is_restricted": get_users.is_restricted, |
|
"is_scam": get_users.is_scam, |
|
"is_fake": get_users.is_fake, |
|
"is_support": get_users.is_support, |
|
"is_premium": get_users.is_premium, |
|
"is_contact_require_premium": get_users.is_contact_require_premium, |
|
"is_close_friend": get_users.is_close_friend, |
|
"is_stories_hidden": get_users.is_stories_hidden, |
|
"is_stories_unavailable": get_users.is_stories_unavailable, |
|
"is_business_bot": get_users.is_business_bot, |
|
"first_name": get_users.first_name, |
|
"status": get_users.status.name, |
|
"last_online_date": get_users.last_online_date, |
|
"dc_id": get_users.dc_id, |
|
"username": get_users.username if get_users else None, |
|
"photo": { |
|
"small_file_id": get_users.photo.small_file_id, |
|
"small_photo_unique_id": get_users.photo.small_photo_unique_id, |
|
"big_file_id": get_users.photo.big_file_id, |
|
"has_animation": get_users.photo.has_animation, |
|
"is_personal": get_users.photo.is_personal |
|
}, |
|
"creation_date": response |
|
} |
|
""" |
|
|
|
js.custom_openapi( |
|
app=fast_app, |
|
title="AkenoX Beta AI API", |
|
version="1.0.0", |
|
summary="Use It Only For Personal Project", |
|
description="Free API By akenoai-lib", |
|
routes=fast_app.routes, |
|
) |
|
|
|
run_fast(build=fast_app, port=7860) |