117 lines
3.7 KiB
Python
117 lines
3.7 KiB
Python
import random
|
|
import string
|
|
import tempfile
|
|
from random import randint
|
|
from uuid import uuid4
|
|
|
|
import magic
|
|
import requests
|
|
|
|
mime = magic.Magic(mime=True)
|
|
|
|
|
|
def generate_random_boundary():
|
|
return ''.join(random.choices(string.ascii_letters + string.digits, k=30))
|
|
|
|
|
|
def random_with_n_digits(n):
|
|
range_start = 10 ** (n - 1)
|
|
range_end = (10 ** n) - 1
|
|
return randint(range_start, range_end)
|
|
|
|
|
|
def create_multipart_form_data(fields, boundary):
|
|
data = b''
|
|
for key, value in fields.items():
|
|
data += b'--' + boundary.encode() + b'\r\n'
|
|
data += f'Content-Disposition: form-data; name="{key}"'.encode()
|
|
if 'filename' in value:
|
|
data += f'; filename="{value["filename"]}"'.encode()
|
|
data += b'\r\n'
|
|
if 'content_type' in value:
|
|
data += f'Content-Type: {value["content_type"]}'.encode() + b'\r\n'
|
|
data += b'\r\n'
|
|
data += value['data'].encode() if isinstance(value['data'], str) else value['data']
|
|
data += b'\r\n'
|
|
data += b'--' + boundary.encode() + b'--\r\n'
|
|
return data
|
|
|
|
|
|
def post_data(text: str, thread_id: int, board: str):
|
|
url = f'http://reee.re/api/{board}/thread/{thread_id}/'
|
|
headers = {
|
|
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/113.0',
|
|
'Accept': '*/*',
|
|
'Accept-Language': 'en-US,en;q=0.5',
|
|
'Accept-Encoding': 'gzip, deflate',
|
|
'Referer': f'http://reee.re/{board}/',
|
|
'Origin': 'http://reee.re',
|
|
'DNT': '1',
|
|
'Connection': 'keep-alive',
|
|
'Pragma': 'no-cache',
|
|
'Cache-Control': 'no-cache',
|
|
}
|
|
|
|
boundary = f'---------------------------{generate_random_boundary()}'
|
|
headers['Content-Type'] = f'multipart/form-data; boundary={boundary}'
|
|
|
|
fields = {
|
|
'poster': {'data': ''},
|
|
'text': {'data': str(text)},
|
|
'image': {'data': '', 'filename': '', 'content_type': 'application/octet-stream'},
|
|
'board': {'data': str(board)},
|
|
'thread': {'data': str(thread_id)},
|
|
'user_id': {'data': str(uuid4())},
|
|
}
|
|
|
|
data = create_multipart_form_data(fields, boundary)
|
|
|
|
response = requests.post(url, headers=headers, data=data)
|
|
return response
|
|
|
|
|
|
def create_new_thread(image_path: str, board_id: str, text: str):
|
|
url = f'http://reee.re/api/{board_id}/thread/0/'
|
|
headers = {
|
|
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/113.0',
|
|
'Accept': '*/*',
|
|
'Accept-Language': 'en-US,en;q=0.5',
|
|
'Accept-Encoding': 'gzip, deflate',
|
|
'Referer': f'http://reee.re/{board_id}/',
|
|
'Origin': 'http://reee.re',
|
|
'DNT': '1',
|
|
'Connection': 'keep-alive',
|
|
'Pragma': 'no-cache',
|
|
'Cache-Control': 'no-cache',
|
|
}
|
|
|
|
boundary = generate_random_boundary()
|
|
headers['Content-Type'] = f'multipart/form-data; boundary={boundary}'
|
|
|
|
with open(image_path, 'rb') as f:
|
|
image_data = f.read()
|
|
|
|
fields = {
|
|
'poster': {'data': b''},
|
|
'text': {'data': str(text)},
|
|
'image': {'data': image_data, 'filename': f'image.{mime.from_file(image_path).split("/")[-1]}', 'content_type': mime.from_file(image_path)},
|
|
'board': {'data': board_id},
|
|
'user_id': {'data': str(uuid4())},
|
|
}
|
|
|
|
data = create_multipart_form_data(fields, boundary)
|
|
|
|
response = requests.post(url, headers=headers, data=data)
|
|
return response
|
|
|
|
|
|
def download_file(url):
|
|
response = requests.get(url)
|
|
if response.status_code == 200:
|
|
with tempfile.NamedTemporaryFile(delete=False) as f:
|
|
f.write(response.content)
|
|
file_path = f.name
|
|
return file_path
|
|
else:
|
|
raise Exception(f"Failed to download file: {response.status_code}")
|