discord-havoc/util/litterbox.py

106 lines
3.7 KiB
Python
Raw Permalink Normal View History

2025-02-16 13:16:53 -05:00
"""
Litterbox (Catbox) Uploader (Async)
"""
import traceback
from typing import Optional, Union
from io import BufferedReader
from aiohttp import ClientSession, ClientTimeout, FormData
import magic
import logging
import random
import os
litterbox_api_url: str = "https://litterbox.catbox.moe/resources/internals/api.php"
http_headers: dict[str, str] = {
2025-04-17 14:35:56 -04:00
"accept": "*/*",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53",
"Accept-Language": "en-US,en;q=0.9,it;q=0.8,es;q=0.7",
"referer": "https://www.google.com/",
"cookie": "DSID=AAO-7r4OSkS76zbHUkiOpnI0kk-X19BLDFF53G8gbnd21VZV2iehu-w_2v14cxvRvrkd_NjIdBWX7wUiQ66f-D8kOkTKD1BhLVlqrFAaqDP3LodRK2I0NfrObmhV9HsedGE7-mQeJpwJifSxdchqf524IMh9piBflGqP0Lg0_xjGmLKEQ0F4Na6THgC06VhtUG5infEdqMQ9otlJENe3PmOQTC_UeTH5DnENYwWC8KXs-M4fWmDADmG414V0_X0TfjrYu01nDH2Dcf3TIOFbRDb993g8nOCswLMi92LwjoqhYnFdf1jzgK0",
}
2025-02-16 13:16:53 -05:00
class LitterboxAsync:
def __init__(self) -> None:
self.headers: dict[str, str] = http_headers
self.api_path = litterbox_api_url
2025-04-17 14:35:56 -04:00
2025-02-16 13:16:53 -05:00
def generateRandomFileName(self, fileExt: Optional[str] = None) -> str:
"""
Generate Random Filename
2025-04-17 14:35:56 -04:00
2025-02-16 13:16:53 -05:00
Args:
fileExt (Optional[str]): File extension to use for naming
Returns:
str
"""
if not fileExt:
2025-04-17 14:35:56 -04:00
fileExt = "png"
2025-02-16 13:16:53 -05:00
return f"{random.getrandbits(32)}.{fileExt}"
2025-04-17 14:35:56 -04:00
async def upload(
self, file: Union[str, bytes, BufferedReader], time="1h"
) -> Optional[str]:
2025-02-16 13:16:53 -05:00
"""
Upload File to Litterbox
2025-04-17 14:35:56 -04:00
2025-02-16 13:16:53 -05:00
Args:
file (Union[str, bytes, BufferedReader]): File to upload (accepts either filepath or io.BufferedReader)
time (str): Expiration time, default: 1h
Returns:
Optional[str]
"""
try:
if not file:
return None
if isinstance(file, str):
if not os.path.exists(file):
logging.critical("Could not find %s", file)
return None
if isinstance(file, BufferedReader):
file = file.read()
2025-04-17 14:35:56 -04:00
fileExt: str = "png"
2025-02-16 13:16:53 -05:00
if isinstance(file, str):
if file.find(".") > 0:
fileExt = "".join(file.split(".")[-1:])
2025-04-17 14:35:56 -04:00
file = open(file, "rb").read()
2025-02-16 13:16:53 -05:00
with magic.Magic(flags=magic.MAGIC_MIME) as m:
if isinstance(file, BufferedReader):
content_type = str(m.id_buffer(file))
else:
2025-04-17 14:35:56 -04:00
content_type = str(m.id_filename(file))
2025-02-16 13:16:53 -05:00
post_data: FormData = FormData()
2025-04-17 14:35:56 -04:00
post_data.add_field(name="reqtype", value="fileupload")
post_data.add_field(name="userhash", value="")
post_data.add_field(name="time", value=time)
post_data.add_field(
name="fileToUpload",
value=file,
filename=self.generateRandomFileName(fileExt),
content_type=content_type,
2025-02-16 13:16:53 -05:00
)
async with ClientSession() as session:
2025-04-17 14:35:56 -04:00
async with await session.post(
self.api_path,
headers=self.headers,
data=post_data,
timeout=ClientTimeout(connect=5, sock_read=70),
) as request:
2025-02-16 13:16:53 -05:00
request.raise_for_status()
return await request.text()
except:
traceback.print_exc()
return None
finally:
if isinstance(file, BufferedReader):
try:
file.close()
except:
return None