def ajax_php(self, step=1, params=None): """ step=1:发送请求,校验参数w step=2:滑动滑块 """ if step == 1: params = { 'gt': self.gt, 'challenge': self.challenge, 'lang': 'zh-cn', 'w': get_full_page_w2(self.gt, self.challenge, self.s) + '1', 'callback': 'geetest_' + now_str() } resp = fetch(self.session, url=ajax_php_url, headers=common_login_headers, params=params) if resp is None: self.res = Resp.TIMEOUT return False if step != 1: res = json.loads(re.search(r'\((.*?)\)', resp.text, re.S).group(1)) if res['data']['result'] != 'success': self.res = Resp.SLIDE_ERR return False self.validate = res['data']['validate'] self.sec_code = self.validate + '|jordan' return True
def get_slide_images(self): """获取验证码图片的地址""" params = { 'is_next': 'true', 'type': 'slide3', 'gt': self.gt, 'challenge': self.challenge, 'lang': 'zh-cn', 'https': 'true', 'protocol': 'https://', 'offline': 'false', 'product': 'popup', 'api_server': 'captcha-api.com', 'width': '100%', 'callback': 'geetest_' + now_str() } resp = fetch(self.session, url=get_php_url, headers=common_login_headers, params=params) if resp is None: self.res = Resp.TIMEOUT return False res = json.loads(re.search(r'\((.*?)\)', resp.text, re.S).group(1)) # 获得滑动验证码图片的URL(带缺口+不带缺口) self.bg_url = prefix_url + res['data']['bg'] self.full_bg_url = prefix_url + res['data']['fullbg'] logger.info( f'滑动验证码图片,bg_url:{self.bg_url}, full_bg_url:{self.full_bg_url}') # 更新gt/challenge self.gt = res['data']['gt'] self.challenge = res['data']['challenge'] return True
def get_shots(player_id: int, season_id: int): franchise_id_map = get_abbr_to_franchise_id_map() for season_type in [SeasonType.regular_season, SeasonType.playoffs]: url = shotchartdetail.build_shotchartdetail_url( player_id=player_id, season_id=season_id, season_type=season_type) res = fetch( url=url, description=f"get_shots {player_id} {season_id} {season_type.name}" ) shots = res["resultSets"][0]["rowSet"] fshots = [] indexes_to_remove = [0, 4, 6, 10, 19] for shot in shots: shot.append(season_type.value) shot[-3] = franchise_id_map[shot[-3]] shot[-2] = franchise_id_map[shot[-2]] # if shot[12] == None: # print(*shot) # if shot[16] < 18: # shot[12] = "2PT Field Goal" fshot = tuple( [v for i, v in enumerate(shot) if i not in indexes_to_remove]) fshots.append(fshot) insert_shots(fshots)
def not_found(e): page = random.randint(1, rs.url["all"]) url = (SOURCE_BASE + 'all/{}.csv').format(page) data = parser(fetch(url)) return render_template('404.html', data=data, meta=meta, val=int(time.time())), 404
def get_track(self): """获取滑动轨迹""" resp1 = fetch(self.session, url=self.bg_url, headers=common_login_headers) resp2 = fetch(self.session, url=self.full_bg_url, headers=common_login_headers) if not (resp1 and resp2): self.res = Resp.TIMEOUT return False img1 = Image.open(BytesIO(resp1.content)) img2 = Image.open(BytesIO(resp2.content)) # 计算偏移量 self.offset = calculate_offset(img1, img2) # 根据偏移量获取轨迹 self.track = get_track(self.offset) if self.track is None: self.res = Resp.TRACK_ERR return self.track is not None
async def cmd_start(message: Message, state: FSMContext): await state.reset_data() await state.reset_state() await FormState.withBrands.set() brandList: list = fetch('api/params/brands') mapedBrandList = list(map(lambda brand: FormItem(brand), brandList)) await state.update_data(brands=mapedBrandList) await message.answer( 'Поїхали! Оберiть марку авто🚙', reply_markup=catalogueList(mapedBrandList, CONFIRM_BUTTON_CALLBACK_BRAND_DATA))
def set_gt_challenge(self) -> bool: """发送网络请求,拿到gt和challenge""" params = dict(t=now_str()) resp = fetch(self.session, url=gt_register_url, headers=common_login_headers, params=params) if resp is None: logger.warning('无法获取gt/challenge...') self.res = Resp.TIMEOUT return False res = resp.json() logger.info(f'gt/challenge请求结果:{res}') self.gt, self.challenge = res['gt'], res['challenge'] return True
def member(page=1, id=None, pages=rs.url["member"], base_url='member', endpoint='member'): if page > int(pages): abort(404) url = (SOURCE_BASE + base_url + '/{}.csv').format(page) data = hash_url(parser(fetch(url))) return render_template('member.html', data=data, meta=meta, id=id, pagination=gen_pagination(page, pages), endpoint=endpoint, val=int(time.time()))
def get_php(self): """注册参数s:s经过多层加密拼接成w""" params = { 'gt': self.gt, 'challenge': self.challenge, 'lang': 'zh-cn', 'w': get_full_page_w1(self.gt, self.challenge, self.s), 'callback': 'geetest_' + now_str() } resp = fetch(self.session, url=get_php_url, headers=common_login_headers, params=params) if resp is None: logger.warning('无法注册参数s...') self.res = Resp.TIMEOUT return resp is not None
def member_home(hash_url, page=1, id=None, base_url='source', endpoint='member_home'): if hash_url not in rs.url["source"].keys(): abort(404) if page > rs.url["source"][hash_url]: abort(404) url = (SOURCE_BASE + base_url + '/{0}/{1}.csv').format(hash_url, page) data = parser(fetch(url)) return render_template('home.html', data=data, meta=meta, id=id, pagination=gen_pagination( page, rs.url["source"][hash_url]), endpoint=endpoint, kwargs={'hash_url': hash_url}, val=int(time.time()))
def get_players(season_id: int): url = commonallplayers.build_players_url(season_id=season_id) res = fetch(url=url, description=f"get_players {season_id}") # print(res["resultSets"][0]["headers"]) players = res["resultSets"][0]["rowSet"] fplayers = [] # indexes_to_remove = [0, 4, 6, 10, 19] indexes_to_remove = [] for player in players: fplayer = tuple( [v for i, v in enumerate(player) if i not in indexes_to_remove]) fplayers.append(fplayer) for p in fplayers: ( id, name_last_first, name_first_last, _roster_status, season_from, season_to, playercode, franchise_id, _team_city, _team_name, _team_abbr, _team_code, _games_plgames_playedayed, _otherleague_exp_ch, ) = p franchise_id = None if franchise_id == 0 else franchise_id insert_player( id=id, name_last_first=name_last_first, name_first_last=name_first_last, season_from=season_from, season_to=season_to, code=playercode, franchise_id=franchise_id, )
def date_year_month(y, m, page=1, id=None, date=rs.url["date"], base_url='date', endpoint='date_year_month', kwargs=None): year_ok = None for year in date: if year['year'] == y: year_ok = year break if not year_ok: print("not year ok", y, date) abort(404) is_month_ok = m in year_ok['month'].keys() if not is_month_ok: print("not month ok", m) abort(404) is_page_ok = page <= year_ok['month'][m] if not is_page_ok: print("not page ok", page) abort(404) url = (SOURCE_BASE + base_url + '/{0:04d}{1:02d}/{2}.csv').format( y, m, page) data = parser(fetch(url)) return render_template('home.html', data=data, meta=meta, id=id, pagination=gen_pagination(page, year_ok['month'][m]), endpoint=endpoint, kwargs=kwargs if kwargs else { 'y': y, 'm': m }, val=int(time.time()))
async def selectYears(message: Message, state: FSMContext): messageText = message.text validateResult = validateYear(messageText) if bool(validateResult): await state.update_data(years=validateResult) await FormState.withPrice.set() priceList: list = fetch('api/params/price') mapedPriceList = list(map(lambda price: FormItem(price), priceList)) await state.update_data(price=mapedPriceList) await message.answer( 'Оберiть цiновий дiапазон (в долларах <b>США</b>)💵', reply_markup=catalogueList(mapedPriceList, CONFIRM_BUTTON_CALLBACK_PRICE_DATA), parse_mode=ParseMode.HTML) else: await message.answer( text= 'Здається, що Ви ввели невiрну дату🤕.\nКорректний формат має бути точний рiк (наприклад, <b>2007</b>) або перiод (<b>2001-2007</b>)🧐', parse_mode=ParseMode.HTML)
def rss(base_url='all'): url = SOURCE_BASE + base_url + '/rss.xml' return fetch(url, type="xml"), 200, { 'Content-Type': 'text/xml; charset=utf-8' }