Пишу бота для Steam на Python с помощью библиотеки steampy:
https://github.com/leoramme/steampy
Хочу получить словарь активных ордеров, используя метод get_my_market_listings()
Однако возвращается пустой словарь, а иногда и вовсе ошибка с кодом 400:
There was a problem getting the listings. http code: 400
НО:
Иногда он получает весь словарь с предметами, работает отлично, а иногда он выдаёт пустой словарь, хотя по факту там есть предметы на торговой площадке.
Сама реализация метода get_my_market_listings() в steampy/market:
@login_required
def get_my_market_listings(self) -> dict:
response = self._session.get("%s/market" % SteamUrl.COMMUNITY_URL)
if response.status_code != 200:
raise ApiException("There was a problem getting the listings. http code: %s" % response.status_code)
assets_descriptions = json.loads(text_between(response.text, "var g_rgAssets = ", ";\r\n"))
listing_id_to_assets_address = get_listing_id_to_assets_address_from_html(response.text)
listings = get_market_listings_from_html(response.text)
listings = merge_items_with_descriptions_from_listing(listings, listing_id_to_assets_address,
assets_descriptions)
if '<span id="tabContentsMyActiveMarketListings_end">' in response.text:
n_showing = int(text_between(response.text, '<span id="tabContentsMyActiveMarketListings_end">', '</span>'))
n_total = int(text_between(response.text, '<span id="tabContentsMyActiveMarketListings_total">', '</span>'))
if n_total > n_showing:
url = "%s/market/mylistings/render/?query=&start=%s&count=%s" % (SteamUrl.COMMUNITY_URL, n_showing, -1)
response = self._session.get(url)
if response.status_code != 200:
raise ApiException("There was a problem getting the listings. http code: %s" % response.status_code)
jresp = response.json()
listing_id_to_assets_address = get_listing_id_to_assets_address_from_html(jresp.get("hovers"))
listings_2 = get_market_sell_listings_from_api(jresp.get("results_html"))
listings_2 = merge_items_with_descriptions_from_listing(listings_2, listing_id_to_assets_address,
jresp.get("assets"))
listings["sell_listings"] = {**listings["sell_listings"], **listings_2["sell_listings"]}
return listings
В файле models.py есть класс SteamUrl:
class SteamUrl:
API_URL = "https://api.steampowered.com"
COMMUNITY_URL = "http://steamcommunity.com"
STORE_URL = 'https://store.steampowered.com'
В интернете увидел, как кто-то избавился от ошибки, заменив протокол с https на http, но мне это не помогло.
Пробовал вызывать метод каждые 30 секунд, если не получилось расспарсить страницу, но он всё время возвращает пустой словарь.
Алгоритм работы метода: предварительно авторизовавшись в аккаунт переходит по ссылке
https://steamcommunity.com/market/
на этой странице отображается первые 10 ордеров и кол-во страниц.
После того, как он прошелся по первым 10 предметам, он переходит по ссылкам вида
https://steamcommunity.com/market/mylistings/?quer...
(на этой странице отображается 100 ордеров)
Следующая страница открывается с параметром start=110 и count = 100
Я авторизован, поэтому, переходя по ссылке, мне отображается информация о предметах.
Когда он переходит по ссылке с параметром start = 1510 и выше, то вылетает ошибка 400
А бывает, что он дойдёт до конца и выведет целиком словарь предметов
Но ведёт он себя не предсказуемо
Кто знает как избавиться от ошибки 400 в стиме?