This repository has been archived on 2023-06-06. You can view files and clone it, but cannot push or open issues or pull requests.
reeere/reeere/post.py

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}")