def enter(): print('enter') session = Session() r = session.get(URL_ENTER) # 862 html = r.text soup = Soup(html) box = soup.find('aside', id='FilterBox') data = {} for select in box.findAll('select'): name = select.attrs['name'] value = select.findAll('option')[-1].attrs['value'] print(name, value) data[name] = value for input in box.findAll('input'): name = input.attrs['name'] value = input.attrs['value'] if name.startswith('rating_') or 'CSRF_TOKEN' in name: print(name, value) data[name] = value data.update({ 'filter_media': 'A', 'filter_order': 'date_new', 'filter_type': '0', }) r = session.post(URL_FILTER, data=data, headers={'Referer': r.url}) print(r) return session
def get_videos(url, cw=None): print_ = get_print(cw) info = {} user_id = re.find(r'twitch.tv/([^/?]+)', url, err='no user_id') print(user_id) session = Session() r = session.get(url) s = cut_pair(re.find(r'headers *: *({.*)', r.text, err='no headers')) print(s) headers = json_loads(s) payload = [{ 'operationName': 'ClipsCards__User', 'variables': { 'login': user_id, 'limit': 20, 'criteria': { 'filter': 'ALL_TIME' } }, 'extensions': { 'persistedQuery': { 'version': 1, 'sha256Hash': 'b73ad2bfaecfd30a9e6c28fada15bd97032c83ec77a0440766a56fe0bd632777' } }, }] videos = [] cursor = None cursor_new = None while True: if cursor: payload[0]['variables']['cursor'] = cursor r = session.post('https://gql.twitch.tv/gql', json=payload, headers=headers) #print(r) data = r.json() for edge in data[0]['data']['user']['clips']['edges']: url_video = edge['node']['url'] info['name'] = edge['node']['broadcaster']['displayName'] video = Video(url_video) video.id = int(edge['node']['id']) videos.append(video) cursor_new = edge['cursor'] print_('videos: {} / cursor: {}'.format(len(videos), cursor)) if cursor == cursor_new: print_('same cursor') break if cursor_new is None: break cursor = cursor_new if not videos: raise Exception('no videos') info['videos'] = sorted(videos, key=lambda video: video.id, reverse=True) return info
def get_video(url, session=None): if session is None: session = Session() session.headers['User-Agent'] = downloader.hdr['User-Agent'] session.headers['X-Directive'] = 'api' html = downloader.read_html(url, session=session) soup = Soup(html) for script in soup.findAll('script'): script = script.text or script.string or '' data = re.find('window.__NUXT__=(.+)', script) if data is not None: data = data.strip() if data.endswith(';'): data = data[:-1] data = json.loads(data) break else: raise Exception('No __NUXT__') info = data['state']['data']['video']['hentai_video'] query = info['slug'] #url_api = 'https://members.hanime.tv/api/v3/videos_manifests/{}?'.format(query) # old url_api = 'https://hanime.tv/rapi/v7/videos_manifests/{}?'.format( query) # new print(url_api) hdr = { 'x-signature': ''.join('{:x}'.format(randrange(16)) for i in range(32)), 'x-signature-version': 'web2', 'x-time': str(int(time())), } r = session.get(url_api, headers=hdr) print(r) data = json.loads(r.text) streams = [] for server in data['videos_manifest']['servers']: streams += server['streams'] streams_good = [] for stream in streams: url_video = stream['url'] if not url_video or 'deprecated.' in url_video: continue streams_good.append(stream) if not streams_good: raise Exception('No video available') print('len(streams_good):', len(streams_good)) for stream in streams_good: print(stream['extension'], stream['width'], stream['filesize_mbs'], stream['url']) stream = streams_good[0] return Video(info, stream), session
class PinterestAPI: HEADERS = {'Accept': 'application/json, text/javascript, */*, q=0.01', 'Accept-Language': 'en-US,en;q=0.5', 'X-Pinterest-AppState': 'active', 'X-APP-VERSION': 'cb1c7f9', 'X-Requested-With': 'XMLHttpRequest', 'Origin': BASE_URL + '/'} def __init__(self): self.session = Session() self.session.headers.update(self.HEADERS) def pin(self, pin_id): options = {'id': pin_id, 'field_set_key': 'detailed'} return self._call('Pin', options)['resource_response']['data'] def pin_related(self, pin_id): options = {'pin': pin_id, 'add_vase': True, 'pins_only': True} return self._pagination('RelatedPinFeed', options) def board(self, user, board): options = {'slug': board, 'username': user, 'field_set_key': 'detailed'} return self._call('Board', options)['resource_response']['data'] def board_pins(self, board_id): options = {'board_id': board_id} return self._pagination('BoardFeed', options) def board_related(self, board_id): options = {'board_id': board_id, 'add_vase': True} return self._pagination('BoardRelatedPixieFeed', options) def board_sections(self, board_id): options = {'board_id': board_id} return self._pagination('BoardSections', options) def board_section_pins(self, section_id): options = {'section_id': section_id} return self._pagination('BoardSectionPins', options) @try_n(4) @sleep_and_retry @limits(1, 4) # 1000 calls per hour def _call(self, resource, options): url = ('{}/resource/{}Resource/get/').format(BASE_URL, resource) params = {'data': json.dumps({'options': options}), 'source_url': ''} print('_call: {}, {}'.format(url, params)) r = self.session.get(url, params=params) print(r) s = r.text status_code = r.status_code try: data = json.loads(s) except ValueError: data = {} else: if status_code < 400 and not r.history: return data if status_code == 404 or r.history: raise Exception('Not Found') raise Exception('API request failed: {}'.format(status_code)) def _pagination(self, resource, options): while True: data = self._call(resource, options) for x in data['resource_response']['data']: yield x try: bookmarks = data['resource']['options']['bookmarks'] if not bookmarks or bookmarks[0] == '-end-' or bookmarks[0].startswith('Y2JOb25lO'): return options['bookmarks'] = bookmarks except KeyError: return