Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

И опять чинил 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

В итоге, получилась такая схема: в «Яндексе» получаем координаты и айди населённого пункта у «Яндекса», по этому айди получаем информацию по пробкам. Далее по координатам получаем айди населённого пункта у «Гисметео», по которому получаем погоду.

Ей-богу я в полушаге от того, чтобы прекратить борьбу и забросить проект.