И опять чинил PogodaStatusBar
Прям заметно, что эпоха открытого веба закончилась. Было время вокруг были открытые сервисы, используй сколько влезет. Потом всё как-то изменилось. Сначала стали появляться ограничения на количество запросов, потом все повально стали бороться с ботами, а то и и просто убирать сервисы из открытого доступа.
В общем, прошла неделя и мне снова прикрыли лавочку — урл «Гисметео», который я использовал, чтобы определять айди населённого пункта по названию вдруг меня забанил. На любой запрос выдаётся «доступ запрещён». Да что ж такое!
Полез я снова смотреть погодный плагин, смотреть как сделано там. Он же как-то определяет текущий населённый пункт, значит и я как-то могу получить эти данные. Оказалось, что есть у «Гисметео» ещё один сервис — services.gismeteo.net/inform-service/inf_chrome/cities/, который определяет местоположение по АйПи (ошибается в моём случае) или по координатам.
Координаты у меня уже есть, я их могу забрать у «Яндекса», надо только распарсить:
@functools.cache
def _getRegionData(self):
try:
url = "https://yandex.ru/tune/geo/"
content = urllib.request.urlopen(url).read().decode('utf-8')
region_data = re.search(r'data-bem="([^"]+coords[^"]+)"', content).group(1)
parsed_region_data = json.loads(html.unescape(region_data))
# {'id': xx, 'region': 'XXXXX', 'coords': ['XX.XXXXX', 'XX.XXXXX'], 'accuracy': 'XXXXXX'}
return parsed_region_data['checkbox']['auto']
except (IOError, AttributeError):
return None
В итоге, получилась такая схема: в «Яндексе» получаем координаты и айди населённого пункта у «Яндекса», по этому айди получаем информацию по пробкам. Далее по координатам получаем айди населённого пункта у «Гисметео», по которому получаем погоду.
Ей-богу я в полушаге от того, чтобы прекратить борьбу и забросить проект.