diff options
| author | 2026-06-17 15:08:30 -0400 | |
|---|---|---|
| committer | 2026-06-17 15:08:30 -0400 | |
| commit | ef3f687db0f53f026e808c4284e084255c9e9dd5 (patch) | |
| tree | 9271108ff34145b17696344eb727e44756001e12 /src/portal/py/modules/fanbox.py | |
| parent | 22d3be9264087ed80d034df0e805bd8101a7d381 (diff) | |
| download | camu-ef3f687db0f53f026e808c4284e084255c9e9dd5.tar.gz camu-ef3f687db0f53f026e808c4284e084255c9e9dd5.tar.bz2 camu-ef3f687db0f53f026e808c4284e084255c9e9dd5.zip | |
Update portal to avoid TLS fingerprinting
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/portal/py/modules/fanbox.py')
| -rw-r--r-- | src/portal/py/modules/fanbox.py | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/src/portal/py/modules/fanbox.py b/src/portal/py/modules/fanbox.py index 6e0f188..d50c173 100644 --- a/src/portal/py/modules/fanbox.py +++ b/src/portal/py/modules/fanbox.py @@ -1,21 +1,20 @@ import log import json -import httpx from typing import Optional, Any from json.decoder import JSONDecodeError -from base import USER_AGENT, Search, Module, Method, ParsedJson +from base import USER_AGENT, HttpResponse, Search, Module, Method, ParsedJson from post import Url, PostType, Date, DateType, DateMeta, Post, User, Image, File, Tag from query_parser import QueryParser -from modules.common import reformat_pixiv_date, get_current_utc_time +from modules.common import parse_pixiv_date, get_current_utc_time -BASE_URL = "https://api.fanbox.cc" +BASE_URL = 'https://api.fanbox.cc' class FanboxBase(Search): def __init__(self, userdata: Any) -> None: super().__init__() self.module: FanboxModule = userdata - def check_api_response(self, response: Optional[httpx.Response]) -> Optional[ParsedJson]: + def check_api_response(self, response: Optional[HttpResponse]) -> Optional[ParsedJson]: if not response: return None try: @@ -32,13 +31,13 @@ class FanboxBase(Search): kwargs['unique_id'] = unique_id kwargs['raw_responses'] = {} kwargs['raw_responses']['api'] = json.dumps(data, separators=(',', ':'), indent=None) - publish_date = reformat_pixiv_date(data['publishedDatetime']).timestamp() + publish_date = parse_pixiv_date(data['publishedDatetime']).timestamp() current_date = get_current_utc_time().timestamp() kwargs['dates'] = [ Date(DateType.CREATED, (publish_date, publish_date), DateMeta.NONE), Date(DateType.RETRIEVED, (current_date, current_date), DateMeta.NONE) ] - update_date = reformat_pixiv_date(data['updatedDatetime']).timestamp() + update_date = parse_pixiv_date(data['updatedDatetime']).timestamp() if update_date != publish_date: kwargs['dates'].append(Date(DateType.EDITED, (update_date, update_date), DateMeta.NONE)) user = User(unique_id=f'fanbox:u:{data['user']['userId']}', username=data['user']['name']) @@ -81,6 +80,12 @@ class FanboxBase(Search): return post def request_post(self, post_id: int) -> Optional[Post]: + ''' + url = f'{BASE_URL}/post.getComments?postId={post_id}&limit=10' + obj = self.check_api_response(self.module.do_request(Method.GET, url)) + if not obj: + return None + ''' url = f'{BASE_URL}/post.info?postId={post_id}' obj = self.check_api_response(self.module.do_request(Method.GET, url)) if not obj: @@ -124,11 +129,14 @@ class FanboxUser(FanboxBase): return False for link in obj: self.pagination.append(link) + if len(self.pagination) == 0: + log.warn(f'Found 0 posts for user.') return True def request_page(self, num: int) -> bool: if len(self.pagination) == 0: if not self.request_pagination(): + log.error('Failed to load user\'s posts.') self.errored = True return False if num >= len(self.pagination): @@ -169,6 +177,7 @@ class FanboxModule(Module): self.parser.add_command('post', FanboxPost) self.parser.add_command('user', FanboxUser) self.parser.add_command('supporting', FanboxSupporting) + # @TODO: At some point verify if tls-client supports zstd. self.headers['Accept-Encoding'] = 'gzip, deflate, br, zstd' self.headers['Accept-Language'] = 'en-US,en;q=0.5' self.headers['Alt-Used'] = 'api.fanbox.cc' @@ -176,9 +185,9 @@ class FanboxModule(Module): self.headers['Referer'] = 'https://www.fanbox.cc/' self.headers['User-Agent'] = USER_AGENT self.cookies['FANBOXSESSID'] = sessid + self.cookies['cf_clearance'] = cf_clearance self.cookies['privacy_policy_agreement'] = '7' self.cookies['privacy_policy_notification'] = '0' - self.cookies['cf_clearance'] = cf_clearance def search(self, query: str, *extra_args: Any) -> Optional[Search]: return self.parser.parse_query(query) |