[simpcity] implement login with username & password (#8418)

This commit is contained in:
Mike Fährmann
2025-10-15 18:30:16 +02:00
parent b336049fac
commit d708181e5f
5 changed files with 50 additions and 5 deletions

View File

@@ -587,6 +587,7 @@ Description
* ``sankaku`` * ``sankaku``
* ``scrolller`` * ``scrolller``
* ``seiga`` * ``seiga``
* ``simpcity``
* ``subscribestar`` * ``subscribestar``
* ``tapas`` * ``tapas``
* ``tsumino`` * ``tsumino``

View File

@@ -728,7 +728,9 @@
}, },
"simpcity": "simpcity":
{ {
"cookies": null, "username": "",
"password": "",
"cookies" : null,
"order-posts": "desc" "order-posts": "desc"
}, },

View File

@@ -935,7 +935,7 @@ Consider all listed sites to potentially be NSFW.
<td>SimpCity Forums</td> <td>SimpCity Forums</td>
<td>https://simpcity.cr/</td> <td>https://simpcity.cr/</td>
<td>Forums, Posts, Threads</td> <td>Forums, Posts, Threads</td>
<td></td> <td>Supported</td>
</tr> </tr>
<tr id="simplyhentai" title="simplyhentai"> <tr id="simplyhentai" title="simplyhentai">
<td>Simply Hentai</td> <td>Simply Hentai</td>

View File

@@ -10,6 +10,7 @@
from .common import Extractor, Message from .common import Extractor, Message
from .. import text, exception from .. import text, exception
from ..cache import cache
BASE_PATTERN = r"(?:https?://)?(?:www\.)?simpcity\.(?:cr|su)" BASE_PATTERN = r"(?:https?://)?(?:www\.)?simpcity\.(?:cr|su)"
@@ -17,9 +18,13 @@ BASE_PATTERN = r"(?:https?://)?(?:www\.)?simpcity\.(?:cr|su)"
class SimpcityExtractor(Extractor): class SimpcityExtractor(Extractor):
"""Base class for simpcity extractors""" """Base class for simpcity extractors"""
category = "simpcity" category = "simpcity"
cookies_domain = "simpcity.cr"
cookies_names = ("ogaddgmetaprof_user",)
root = "https://simpcity.cr" root = "https://simpcity.cr"
def items(self): def items(self):
self.login()
extract_urls = text.re( extract_urls = text.re(
r'<(?:a [^>]*?href|iframe [^>]*?src)="([^"]+)').findall r'<(?:a [^>]*?href|iframe [^>]*?src)="([^"]+)').findall
@@ -36,12 +41,44 @@ class SimpcityExtractor(Extractor):
return self.request(url) return self.request(url)
except exception.HttpError as exc: except exception.HttpError as exc:
if exc.status == 403 and b">Log in<" in exc.response.content: if exc.status == 403 and b">Log in<" in exc.response.content:
msg = text.extr(exc.response.text, "blockMessage--error", "</")
raise exception.AuthRequired( raise exception.AuthRequired(
"'authenticated cookies'", None, ("username & password", "authenticated cookies"), None,
msg.rpartition(">")[2].strip()) self._extract_error(exc.response.text))
raise raise
def login(self):
if self.cookies_check(self.cookies_names):
return
username, password = self._get_auth_info()
if username:
self.cookies_update(self._login_impl(username, password))
@cache(maxage=365*86400, keyarg=1)
def _login_impl(self, username, password):
self.log.info("Logging in as %s", username)
url = f"{self.root}/login/login"
page = self.request(url).text
data = {
"_xfToken": text.extr(page, 'name="_xfToken" value="', '"'),
"login" : username,
"password": password,
"remember": "1",
"_xfRedirect": "",
}
response = self.request(url, method="POST", data=data)
if not response.history:
err = self._extract_error(response.text)
raise exception.AuthenticationError(f'"{err}"')
return {
cookie.name: cookie.value
for cookie in self.cookies
if cookie.domain.endswith(self.cookies_domain)
}
def _pagination(self, base, pnum=None): def _pagination(self, base, pnum=None):
base = f"{self.root}{base}" base = f"{self.root}{base}"
@@ -87,6 +124,10 @@ class SimpcityExtractor(Extractor):
page = self.request_page(url).text page = self.request_page(url).text
def _extract_error(self, html):
return text.unescape(text.extr(
html, "blockMessage--error", "</").rpartition(">")[2].strip())
def _parse_thread(self, page): def _parse_thread(self, page):
schema = self._extract_jsonld(page)["mainEntity"] schema = self._extract_jsonld(page)["mainEntity"]
author = schema["author"] author = schema["author"]

View File

@@ -526,6 +526,7 @@ AUTH_MAP = {
"sankaku" : "Supported", "sankaku" : "Supported",
"scrolller" : "Supported", "scrolller" : "Supported",
"seiga" : "Supported", "seiga" : "Supported",
"simpcity" : "Supported",
"smugmug" : _OAUTH, "smugmug" : _OAUTH,
"subscribestar" : "Supported", "subscribestar" : "Supported",
"tapas" : "Supported", "tapas" : "Supported",