neddit

the frontend of the frontpage of the internet  https://neddit.ce9e.org
git clone https://git.ce9e.org/neddit.git

commit
32ba44b6c59bd586b886056cdb02356e68ae0f34
parent
c4d5f995b2b03425b5640401ad71b71e97f05052
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2026-06-01 05:32
implement js challenge

Diffstat

M neddit.py 39 ++++++++++++++++++++++++++++++++++++++-

1 files changed, 38 insertions, 1 deletions


diff --git a/neddit.py b/neddit.py

@@ -15,6 +15,7 @@ BASE_DIR = Path(__file__).parent
   15    15 HEADERS = {
   16    16     'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0',
   17    17 }
   -1    18 COOKIES = {}
   18    19 
   19    20 env = jinja2.Environment(
   20    21     loader=jinja2.FileSystemLoader(BASE_DIR / 'templates'),
@@ -95,14 +96,50 @@ def raise_for_status(response):
   95    96     response.raise_for_status()
   96    97 
   97    98 
   98    -1 async def fetch(url, **params):
   -1    99 async def fetch_cookie():
   -1   100     async with aiohttp.ClientSession() as session:
   -1   101         async with session.get(
   -1   102             'https://www.reddit.com/',
   -1   103             headers=HEADERS,
   -1   104             ssl=ssl.create_default_context(),
   -1   105         ) as response:
   -1   106             raise_for_status(response)
   -1   107             text = await response.text()
   -1   108 
   -1   109         m1 = re.search(r'name="token" value="([^"]*)"', text)
   -1   110         m2 = re.search(r'\(async e=>e\+e\)\("([^"]*)"\)', text)
   -1   111         params = {
   -1   112             'solution': m2[1] + m2[1],
   -1   113             'js_challenge': 1,
   -1   114             'token': m1[1],
   -1   115             'jsc_orig_r': '',
   -1   116         }
   -1   117 
   -1   118         async with session.get(
   -1   119             'https://www.reddit.com/',
   -1   120             headers=HEADERS,
   -1   121             params=params,
   -1   122             ssl=ssl.create_default_context(),
   -1   123         ) as response:
   -1   124             raise_for_status(response)
   -1   125 
   -1   126         for c in session.cookie_jar:
   -1   127             if c.key in ['loid', 'token_v2']:
   -1   128                 COOKIES[c.key] = c.value
   -1   129 
   -1   130 
   -1   131 async def fetch(url, is_retry=False, **params):
   99   132     async with aiohttp.ClientSession() as session:
  100   133         async with session.get(
  101   134             url,
  102   135             headers=HEADERS,
   -1   136             cookies=COOKIES,
  103   137             params={**params, 'raw_json': 1},
  104   138             ssl=ssl.create_default_context(),
  105   139         ) as response:
   -1   140             if response.status == 403 and not is_retry:
   -1   141                 await fetch_cookie()
   -1   142                 return await fetch(url, is_retry=True, **params)
  106   143             raise_for_status(response)
  107   144             return await response.json()
  108   145