{
  "generated_at": "2026-09-19T12:44:47+00:00",
  "format": "news-monitor-error-log-v1",
  "error_count": 500,
  "errors": [
    {
      "id": 69979,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T12:10:05+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 69973,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T12:08:21+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69970,
      "source_id": "abakan24_culture",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1527, in connect\n    self.sock = self._context.wrap_socket(self.sock,\n                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 455, in wrap_socket\n    return self.sslsocket_class._create(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1041, in _create\n    self.do_handshake()\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1319, in do_handshake\n    self._sslobj.do_handshake()\nssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1010)\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1010)>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T12:07:13+00:00",
      "source_name": "Абакан 24 — культура и фестивали",
      "source_url": "https://abakan-news.ru/category/glavnoe/kultura/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69954,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T12:05:22+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 69946,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T12:03:15+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69940,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T12:03:08+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69939,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T12:02:07+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69928,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T12:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69917,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T11:08:00+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69914,
      "source_id": "abakan24_culture",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1527, in connect\n    self.sock = self._context.wrap_socket(self.sock,\n                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 455, in wrap_socket\n    return self.sslsocket_class._create(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1041, in _create\n    self.do_handshake()\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1319, in do_handshake\n    self._sslobj.do_handshake()\nssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1010)\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1010)>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T11:06:55+00:00",
      "source_name": "Абакан 24 — культура и фестивали",
      "source_url": "https://abakan-news.ru/category/glavnoe/kultura/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69898,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T11:05:06+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 69890,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T11:02:57+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69884,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T11:02:49+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69883,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T11:01:49+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69876,
      "source_id": "bezformata_abakan_turism",
      "error": "Источник не ответил вовремя",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 65, in fetch_text\n    body = response.read()\n           ^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 488, in read\n    return self._read_chunked(amt)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 621, in _read_chunked\n    while (chunk_left := self._get_chunk_left()) is not None:\n                         ^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 603, in _get_chunk_left\n    chunk_left = self._read_next_chunk_size()\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 554, in _read_next_chunk_size\n    line = self.fp.readline(_MAXLINE + 1)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 720, in readinto\n    return self._sock.recv_into(b)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1251, in recv_into\n    return self.read(nbytes, buffer)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1103, in read\n    return self._sslobj.read(len, buffer)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nTimeoutError: The read operation timed out\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 82, in fetch_text\n    raise FetchError(\"timeout\", \"Источник не ответил вовремя\") from exc\nnews_monitor.fetch.FetchError: Источник не ответил вовремя\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T11:00:33+00:00",
      "source_name": "БезФормата Абакан — Туризм",
      "source_url": "https://abakan.bezformata.com/turism/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69872,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T11:00:05+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69867,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T10:09:13+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 69861,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T10:07:37+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69858,
      "source_id": "abakan24_culture",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1527, in connect\n    self.sock = self._context.wrap_socket(self.sock,\n                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 455, in wrap_socket\n    return self.sslsocket_class._create(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1041, in _create\n    self.do_handshake()\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1319, in do_handshake\n    self._sslobj.do_handshake()\nssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1010)\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1010)>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T10:06:32+00:00",
      "source_name": "Абакан 24 — культура и фестивали",
      "source_url": "https://abakan-news.ru/category/glavnoe/kultura/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69842,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T10:04:35+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 69834,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T10:02:42+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69828,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T10:02:35+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69827,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T10:01:35+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69816,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T10:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69811,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T09:09:06+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 69805,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T09:07:09+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69802,
      "source_id": "abakan24_culture",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1527, in connect\n    self.sock = self._context.wrap_socket(self.sock,\n                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 455, in wrap_socket\n    return self.sslsocket_class._create(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1041, in _create\n    self.do_handshake()\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1319, in do_handshake\n    self._sslobj.do_handshake()\nssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1010)\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1010)>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T09:06:04+00:00",
      "source_name": "Абакан 24 — культура и фестивали",
      "source_url": "https://abakan-news.ru/category/glavnoe/kultura/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69786,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T09:04:18+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 69778,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T09:02:39+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69772,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T09:02:32+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69771,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T09:01:32+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69760,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T09:00:04+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69755,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T08:09:16+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 69749,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T08:07:36+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69746,
      "source_id": "abakan24_culture",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1527, in connect\n    self.sock = self._context.wrap_socket(self.sock,\n                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 455, in wrap_socket\n    return self.sslsocket_class._create(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1041, in _create\n    self.do_handshake()\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1319, in do_handshake\n    self._sslobj.do_handshake()\nssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1010)\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1010)>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T08:06:30+00:00",
      "source_name": "Абакан 24 — культура и фестивали",
      "source_url": "https://abakan-news.ru/category/glavnoe/kultura/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69730,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T08:04:41+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 69722,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T08:02:46+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69716,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T08:02:34+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69715,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T08:01:33+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69704,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T08:00:04+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69699,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T07:09:17+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 69693,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T07:07:40+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69690,
      "source_id": "abakan24_culture",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1527, in connect\n    self.sock = self._context.wrap_socket(self.sock,\n                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 455, in wrap_socket\n    return self.sslsocket_class._create(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1041, in _create\n    self.do_handshake()\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1319, in do_handshake\n    self._sslobj.do_handshake()\nssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1010)\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1010)>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T07:06:26+00:00",
      "source_name": "Абакан 24 — культура и фестивали",
      "source_url": "https://abakan-news.ru/category/glavnoe/kultura/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69674,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T07:04:39+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 69666,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T07:02:37+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69660,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T07:02:31+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69659,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T07:01:31+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69648,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T07:00:04+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69643,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T06:09:09+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 69637,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T06:07:28+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69634,
      "source_id": "abakan24_culture",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1527, in connect\n    self.sock = self._context.wrap_socket(self.sock,\n                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 455, in wrap_socket\n    return self.sslsocket_class._create(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1041, in _create\n    self.do_handshake()\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1319, in do_handshake\n    self._sslobj.do_handshake()\nssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1010)\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1010)>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T06:06:21+00:00",
      "source_name": "Абакан 24 — культура и фестивали",
      "source_url": "https://abakan-news.ru/category/glavnoe/kultura/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69618,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T06:04:36+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 69610,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T06:02:47+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69604,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T06:02:40+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69603,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T06:01:39+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69592,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T06:00:07+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69587,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T05:08:42+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 69581,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T05:07:06+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69578,
      "source_id": "abakan24_culture",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1527, in connect\n    self.sock = self._context.wrap_socket(self.sock,\n                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 455, in wrap_socket\n    return self.sslsocket_class._create(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1041, in _create\n    self.do_handshake()\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1319, in do_handshake\n    self._sslobj.do_handshake()\nssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1010)\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1010)>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T05:06:00+00:00",
      "source_name": "Абакан 24 — культура и фестивали",
      "source_url": "https://abakan-news.ru/category/glavnoe/kultura/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69562,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T05:04:14+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 69554,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T05:02:33+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69548,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T05:02:27+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69547,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T05:01:26+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69538,
      "source_id": "abakan_city_admin",
      "error": "Источник вернул HTTP 503",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 503: Service Unavailable\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 503\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T05:00:05+00:00",
      "source_name": "Абакан — городские новости",
      "source_url": "https://news.abakan.city/?g=101",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69536,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T05:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69531,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T04:09:01+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 69525,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T04:07:04+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69506,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T04:04:14+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 69498,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T04:02:34+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69492,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T04:02:29+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69491,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T04:01:28+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69480,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T04:00:02+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69475,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T03:08:42+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 69469,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T03:07:10+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69450,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T03:04:16+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 69442,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T03:02:37+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69436,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T03:02:26+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69435,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T03:01:26+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69424,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T03:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69419,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T02:08:27+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 69413,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T02:06:55+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69394,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T02:04:03+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 69386,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T02:02:41+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69380,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T02:02:31+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69379,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T02:01:30+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69368,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T02:00:02+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69363,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T01:08:30+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 69357,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T01:06:57+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69338,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T01:04:02+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 69330,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T01:02:39+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69324,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T01:02:29+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69323,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T01:01:28+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69312,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T01:00:02+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69307,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T00:09:44+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 69301,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T00:07:33+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69282,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T00:04:31+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 69274,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T00:02:50+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69268,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T00:02:40+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69267,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T00:01:40+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69256,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-19T00:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69251,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T23:10:01+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 69245,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T23:07:13+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69226,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T23:04:07+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 69218,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T23:02:41+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69212,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T23:02:29+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69211,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T23:01:28+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69200,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T23:00:02+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69195,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T22:10:04+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 69189,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T22:07:59+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69170,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T22:04:46+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 69162,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T22:03:04+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69156,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T22:02:48+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69155,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T22:01:42+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69144,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T22:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69139,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T21:08:55+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 69133,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T21:07:13+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69114,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T21:04:08+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 69106,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T21:02:52+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69100,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T21:02:40+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69099,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T21:01:39+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69088,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T21:00:04+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69083,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T20:08:31+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 69077,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T20:06:59+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69058,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T20:04:03+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 69050,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T20:02:47+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69044,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T20:02:36+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69043,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T20:01:35+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69032,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T20:00:02+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 69027,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T19:09:17+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 69021,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T19:07:31+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 69002,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T19:03:56+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 68994,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T19:02:54+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68988,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T19:02:43+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68987,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T19:01:42+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68976,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T19:00:02+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68971,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T18:09:10+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 68965,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T18:07:09+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68946,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T18:04:03+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 68938,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T18:02:56+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68932,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T18:02:45+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68931,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T18:01:45+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68920,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T18:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68915,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T17:09:51+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 68909,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T17:07:55+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68890,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T17:04:40+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 68882,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T17:02:57+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68876,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T17:02:45+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68875,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T17:01:45+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68868,
      "source_id": "bezformata_abakan_turism",
      "error": "Источник не ответил вовремя",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 65, in fetch_text\n    body = response.read()\n           ^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 488, in read\n    return self._read_chunked(amt)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 627, in _read_chunked\n    value.append(self._safe_read(chunk_left))\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 667, in _safe_read\n    data = self.fp.read(cursize)\n           ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 720, in readinto\n    return self._sock.recv_into(b)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1251, in recv_into\n    return self.read(nbytes, buffer)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1103, in read\n    return self._sslobj.read(len, buffer)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nTimeoutError: The read operation timed out\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 82, in fetch_text\n    raise FetchError(\"timeout\", \"Источник не ответил вовремя\") from exc\nnews_monitor.fetch.FetchError: Источник не ответил вовремя\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T17:00:31+00:00",
      "source_name": "БезФормата Абакан — Туризм",
      "source_url": "https://abakan.bezformata.com/turism/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68864,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T17:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68859,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T16:08:18+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 68853,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T16:06:41+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68834,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T16:04:12+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 68826,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T16:02:33+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68820,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T16:02:23+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68819,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T16:01:22+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68808,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T16:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68803,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T15:08:53+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 68797,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T15:07:00+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68778,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T15:04:24+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 68770,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T15:02:39+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68764,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T15:02:27+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68763,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T15:01:25+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68752,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T15:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68747,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T14:08:18+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 68741,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T14:06:42+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68722,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T14:04:13+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 68714,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T14:02:42+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68708,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T14:02:31+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68707,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T14:01:30+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68696,
      "source_id": "r19_tourism",
      "error": "Закреплённый сертификат источника истёк",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 159, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Закреплённый сертификат источника истёк\")\nnews_monitor.fetch.FetchError: Закреплённый сертификат источника истёк\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T14:00:04+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68691,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T13:09:06+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 68685,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T13:07:15+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68666,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T13:04:51+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 68658,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T13:03:12+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68652,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T13:02:59+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68651,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T13:01:59+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68644,
      "source_id": "bezformata_abakan_turism",
      "error": "Источник не ответил вовремя",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 65, in fetch_text\n    body = response.read()\n           ^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 488, in read\n    return self._read_chunked(amt)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 627, in _read_chunked\n    value.append(self._safe_read(chunk_left))\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 667, in _safe_read\n    data = self.fp.read(cursize)\n           ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 720, in readinto\n    return self._sock.recv_into(b)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1251, in recv_into\n    return self.read(nbytes, buffer)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1103, in read\n    return self._sslobj.read(len, buffer)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nTimeoutError: The read operation timed out\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 82, in fetch_text\n    raise FetchError(\"timeout\", \"Источник не ответил вовремя\") from exc\nnews_monitor.fetch.FetchError: Источник не ответил вовремя\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T13:00:50+00:00",
      "source_name": "БезФормата Абакан — Туризм",
      "source_url": "https://abakan.bezformata.com/turism/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68640,
      "source_id": "r19_tourism",
      "error": "Источник не ответил вовремя",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 168, in _fetch_with_pinned_certificate\n    connection.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 865, in create_connection\n    raise exceptions[0]\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 850, in create_connection\n    sock.connect(sa)\nTimeoutError: timed out\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 197, in _fetch_with_pinned_certificate\n    raise FetchError(\"timeout\", \"Источник не ответил вовремя\") from exc\nnews_monitor.fetch.FetchError: Источник не ответил вовремя\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T13:00:23+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68635,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T12:08:23+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 68629,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T12:06:36+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68610,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T12:04:12+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 68602,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T12:02:32+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68596,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T12:02:21+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68595,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T12:01:21+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68584,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T12:00:02+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68573,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T11:06:33+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68554,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T11:04:06+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 68546,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T11:02:33+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68540,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T11:02:24+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68539,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T11:01:24+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68528,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T11:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68526,
      "source_id": "tuva_nature_ministry",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 865, in create_connection\n    raise exceptions[0]\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 850, in create_connection\n    sock.connect(sa)\nOSError: [Errno 113] No route to host\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno 113] No route to host>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T10:08:03+00:00",
      "source_name": "Минприроды Тувы — события",
      "source_url": "https://mpr.rtyva.ru/events/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 68523,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T10:07:53+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 68517,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T10:06:16+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68498,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T10:04:04+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 68490,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T10:02:31+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68484,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T10:02:20+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68483,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T10:01:20+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68472,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T10:00:02+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68470,
      "source_id": "tuva_nature_ministry",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 865, in create_connection\n    raise exceptions[0]\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 850, in create_connection\n    sock.connect(sa)\nOSError: [Errno 113] No route to host\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno 113] No route to host>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T09:07:57+00:00",
      "source_name": "Минприроды Тувы — события",
      "source_url": "https://mpr.rtyva.ru/events/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 68467,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T09:07:47+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 68461,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T09:06:05+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68442,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T09:03:49+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 68434,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T09:02:35+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68428,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T09:02:25+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68427,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T09:01:25+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68416,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T09:00:04+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68414,
      "source_id": "tuva_nature_ministry",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 865, in create_connection\n    raise exceptions[0]\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 850, in create_connection\n    sock.connect(sa)\nOSError: [Errno 113] No route to host\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno 113] No route to host>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T08:07:58+00:00",
      "source_name": "Минприроды Тувы — события",
      "source_url": "https://mpr.rtyva.ru/events/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 68411,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T08:07:50+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 68405,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T08:06:16+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68386,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T08:03:59+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 68378,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T08:02:33+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68372,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T08:02:23+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68371,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T08:01:22+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68360,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T08:00:04+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68358,
      "source_id": "tuva_nature_ministry",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 865, in create_connection\n    raise exceptions[0]\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 850, in create_connection\n    sock.connect(sa)\nOSError: [Errno 113] No route to host\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno 113] No route to host>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T07:09:05+00:00",
      "source_name": "Минприроды Тувы — события",
      "source_url": "https://mpr.rtyva.ru/events/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 68355,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T07:08:52+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 68349,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T07:07:05+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68330,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T07:04:00+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 68322,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T07:02:38+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68316,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T07:02:24+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68315,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T07:01:24+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68304,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T07:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68293,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T06:08:18+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68292,
      "source_id": "abakan_ru_afisha",
      "error": "Источник не ответил вовремя",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 553, in error\n    result = self._call_chain(*args)\n             ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 745, in http_error_302\n    return self.parent.open(new, timeout=req.timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1348, in do_open\n    r = h.getresponse()\n        ^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1478, in getresponse\n    response.begin()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 343, in begin\n    version, status, reason = self._read_status()\n                              ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 304, in _read_status\n    line = str(self.fp.readline(_MAXLINE + 1), \"iso-8859-1\")\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 720, in readinto\n    return self._sock.recv_into(b)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1251, in recv_into\n    return self.read(nbytes, buffer)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1103, in read\n    return self._sslobj.read(len, buffer)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nTimeoutError: The read operation timed out\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 82, in fetch_text\n    raise FetchError(\"timeout\", \"Источник не ответил вовремя\") from exc\nnews_monitor.fetch.FetchError: Источник не ответил вовремя\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T06:07:17+00:00",
      "source_name": "Абакан.ру — афиша",
      "source_url": "https://abakan.ru/index.php/afisha",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68274,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T06:04:34+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 68266,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T06:02:50+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68260,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T06:02:42+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68259,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T06:01:41+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68252,
      "source_id": "bezformata_abakan_turism",
      "error": "Источник не ответил вовремя",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 65, in fetch_text\n    body = response.read()\n           ^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 488, in read\n    return self._read_chunked(amt)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 627, in _read_chunked\n    value.append(self._safe_read(chunk_left))\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 667, in _safe_read\n    data = self.fp.read(cursize)\n           ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 720, in readinto\n    return self._sock.recv_into(b)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1251, in recv_into\n    return self.read(nbytes, buffer)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1103, in read\n    return self._sslobj.read(len, buffer)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nTimeoutError: The read operation timed out\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 82, in fetch_text\n    raise FetchError(\"timeout\", \"Источник не ответил вовремя\") from exc\nnews_monitor.fetch.FetchError: Источник не ответил вовремя\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T06:00:29+00:00",
      "source_name": "БезФормата Абакан — Туризм",
      "source_url": "https://abakan.bezformata.com/turism/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68248,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T06:00:05+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68237,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T05:09:43+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68236,
      "source_id": "abakan_ru_afisha",
      "error": "Источник не ответил вовремя",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 553, in error\n    result = self._call_chain(*args)\n             ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 745, in http_error_302\n    return self.parent.open(new, timeout=req.timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1348, in do_open\n    r = h.getresponse()\n        ^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1478, in getresponse\n    response.begin()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 343, in begin\n    version, status, reason = self._read_status()\n                              ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 304, in _read_status\n    line = str(self.fp.readline(_MAXLINE + 1), \"iso-8859-1\")\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 720, in readinto\n    return self._sock.recv_into(b)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1251, in recv_into\n    return self.read(nbytes, buffer)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1103, in read\n    return self._sslobj.read(len, buffer)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nTimeoutError: The read operation timed out\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 82, in fetch_text\n    raise FetchError(\"timeout\", \"Источник не ответил вовремя\") from exc\nnews_monitor.fetch.FetchError: Источник не ответил вовремя\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T05:08:43+00:00",
      "source_name": "Абакан.ру — афиша",
      "source_url": "https://abakan.ru/index.php/afisha",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68218,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T05:05:53+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 68212,
      "source_id": "abakan_ru_main",
      "error": "Источник не ответил вовремя",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 553, in error\n    result = self._call_chain(*args)\n             ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 745, in http_error_302\n    return self.parent.open(new, timeout=req.timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1348, in do_open\n    r = h.getresponse()\n        ^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1478, in getresponse\n    response.begin()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 343, in begin\n    version, status, reason = self._read_status()\n                              ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 304, in _read_status\n    line = str(self.fp.readline(_MAXLINE + 1), \"iso-8859-1\")\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 720, in readinto\n    return self._sock.recv_into(b)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1251, in recv_into\n    return self.read(nbytes, buffer)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1103, in read\n    return self._sslobj.read(len, buffer)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nTimeoutError: The read operation timed out\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 82, in fetch_text\n    raise FetchError(\"timeout\", \"Источник не ответил вовремя\") from exc\nnews_monitor.fetch.FetchError: Источник не ответил вовремя\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T05:04:50+00:00",
      "source_name": "Абакан.ру — главный раздел",
      "source_url": "https://abakan.ru/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68210,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T05:03:30+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68204,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T05:03:22+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68203,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T05:02:22+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68193,
      "source_id": "abakan_ru_society",
      "error": "Источник не ответил вовремя",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 553, in error\n    result = self._call_chain(*args)\n             ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 745, in http_error_302\n    return self.parent.open(new, timeout=req.timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1348, in do_open\n    r = h.getresponse()\n        ^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1478, in getresponse\n    response.begin()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 343, in begin\n    version, status, reason = self._read_status()\n                              ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 304, in _read_status\n    line = str(self.fp.readline(_MAXLINE + 1), \"iso-8859-1\")\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 720, in readinto\n    return self._sock.recv_into(b)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1251, in recv_into\n    return self.read(nbytes, buffer)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1103, in read\n    return self._sslobj.read(len, buffer)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nTimeoutError: The read operation timed out\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 82, in fetch_text\n    raise FetchError(\"timeout\", \"Источник не ответил вовремя\") from exc\nnews_monitor.fetch.FetchError: Источник не ответил вовремя\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T05:01:05+00:00",
      "source_name": "Абакан.ру — Общество",
      "source_url": "https://abakan.ru/index.php/chto-proiskhodit/obshchestvo",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68192,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T05:00:04+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68181,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T04:06:45+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68162,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T04:03:52+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 68154,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T04:02:37+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68148,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T04:02:32+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68147,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T04:01:32+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68136,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T04:00:05+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68134,
      "source_id": "tuva_nature_ministry",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 865, in create_connection\n    raise exceptions[0]\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 850, in create_connection\n    sock.connect(sa)\nOSError: [Errno 113] No route to host\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno 113] No route to host>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T03:08:44+00:00",
      "source_name": "Минприроды Тувы — события",
      "source_url": "https://mpr.rtyva.ru/events/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 68125,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T03:06:51+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68106,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T03:03:59+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 68098,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T03:02:33+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68092,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T03:02:27+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68091,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T03:01:26+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68080,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T03:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68078,
      "source_id": "tuva_nature_ministry",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 865, in create_connection\n    raise exceptions[0]\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 850, in create_connection\n    sock.connect(sa)\nOSError: [Errno 113] No route to host\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno 113] No route to host>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T02:08:33+00:00",
      "source_name": "Минприроды Тувы — события",
      "source_url": "https://mpr.rtyva.ru/events/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 68071,
      "source_id": "khakassia_sport_calendar",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T02:07:48+00:00",
      "source_name": "Спортивный календарь Хакасии",
      "source_url": "https://stm19.ru/sport/calendar",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68069,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T02:06:43+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68050,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T02:03:58+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 68042,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T02:02:37+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68036,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T02:02:27+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68035,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T02:01:27+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 68024,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T02:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68022,
      "source_id": "tuva_nature_ministry",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 865, in create_connection\n    raise exceptions[0]\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 850, in create_connection\n    sock.connect(sa)\nOSError: [Errno 113] No route to host\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno 113] No route to host>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T01:08:56+00:00",
      "source_name": "Минприроды Тувы — события",
      "source_url": "https://mpr.rtyva.ru/events/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 68015,
      "source_id": "khakassia_sport_calendar",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T01:08:13+00:00",
      "source_name": "Спортивный календарь Хакасии",
      "source_url": "https://stm19.ru/sport/calendar",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 68013,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T01:07:10+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67994,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T01:04:00+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 67986,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T01:02:50+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67980,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T01:02:41+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67979,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T01:01:41+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67968,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T01:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67966,
      "source_id": "tuva_nature_ministry",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 865, in create_connection\n    raise exceptions[0]\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 850, in create_connection\n    sock.connect(sa)\nOSError: [Errno 113] No route to host\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno 113] No route to host>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T00:08:35+00:00",
      "source_name": "Минприроды Тувы — события",
      "source_url": "https://mpr.rtyva.ru/events/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 67957,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T00:06:46+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67938,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T00:03:46+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 67930,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T00:02:36+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67924,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T00:02:27+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67923,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T00:01:27+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67912,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-18T00:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67901,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T23:06:56+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67882,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T23:03:51+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 67874,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T23:02:40+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67868,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T23:02:31+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67867,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T23:01:30+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67856,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T23:00:04+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67845,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T22:06:57+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67826,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T22:03:53+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 67818,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T22:02:47+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67812,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T22:02:36+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67811,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T22:01:35+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67800,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T22:00:04+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67789,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T21:06:57+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67770,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T21:04:07+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 67762,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T21:02:54+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67756,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T21:02:42+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67755,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T21:01:42+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67744,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T21:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67733,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T20:07:37+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67714,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T20:04:15+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 67706,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T20:03:12+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67700,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T20:03:02+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67699,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T20:02:02+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67688,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T20:00:02+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67687,
      "source_id": "uprdor_enisey",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T19:09:37+00:00",
      "source_name": "Упрдор Енисей — дорожная обстановка",
      "source_url": "https://ens.rosavtodor.gov.ru/",
      "source_type": "site",
      "region": "khakassia_tuva"
    },
    {
      "id": 67677,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T19:07:38+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67658,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T19:04:19+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 67650,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T19:03:09+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67644,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T19:02:58+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67643,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T19:01:58+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67632,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T19:00:04+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67621,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T18:08:55+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67602,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T18:04:14+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 67594,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T18:03:14+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67588,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T18:03:06+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67587,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T18:02:06+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67576,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T18:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67571,
      "source_id": "kyzyl_city_tourism",
      "error": "Источник вернул HTTP 502",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 502: Bad Gateway\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 502\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T17:10:52+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 67565,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T17:08:21+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67546,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T17:04:46+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 67538,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T17:03:21+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67532,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T17:03:11+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67531,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T17:02:10+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67520,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T17:00:07+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67509,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T15:07:13+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67490,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T15:04:02+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 67482,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T15:02:39+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67476,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T15:02:31+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67475,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T15:01:30+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67464,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T15:00:04+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67459,
      "source_id": "kyzyl_city_tourism",
      "error": "Источник вернул HTTP 507",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 507: Insufficient Storage\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 507\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T14:08:43+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 67453,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T14:07:01+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67434,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T14:03:56+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 67426,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T14:02:35+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67420,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T14:02:26+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67419,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T14:01:26+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67408,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T14:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67403,
      "source_id": "kyzyl_city_tourism",
      "error": "Источник вернул HTTP 507",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 507: Insufficient Storage\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 507\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T13:08:55+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 67397,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T13:07:13+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67378,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T13:03:59+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 67370,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T13:02:38+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67364,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T13:02:29+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67363,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T13:01:27+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67352,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T13:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67341,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T12:07:05+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67322,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T12:04:05+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 67314,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T12:02:42+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67308,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T12:02:29+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67307,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T12:01:29+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67296,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T12:00:05+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67285,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T11:06:54+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67266,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T11:03:54+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 67258,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T11:02:44+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67252,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T11:02:31+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67251,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T11:01:30+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67240,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T11:00:05+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67229,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T10:06:45+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67210,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T10:03:50+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 67202,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T10:02:38+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67196,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T10:02:26+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67195,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T10:01:26+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67184,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T10:00:02+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67173,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T09:06:59+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67154,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T09:04:05+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 67146,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T09:02:45+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67140,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T09:02:32+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67139,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T09:01:32+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67128,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T09:00:04+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67117,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T08:07:04+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67098,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T08:04:00+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 67090,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T08:02:46+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67084,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T08:02:33+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67083,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T08:01:32+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67072,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T08:00:04+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67061,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T07:06:45+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67042,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T07:03:47+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 67034,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T07:02:36+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67028,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T07:02:25+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67027,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T07:01:25+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 67016,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T07:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 67011,
      "source_id": "kyzyl_city_tourism",
      "error": "Источник вернул HTTP 504",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 504: Gateway Timeout\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 504\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T06:09:46+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 67005,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T06:07:31+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66986,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T06:03:59+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 66978,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T06:02:41+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66972,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T06:02:30+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66971,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T06:01:30+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66960,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T06:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66949,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T05:07:11+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66930,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T05:03:53+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 66922,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T05:02:41+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66916,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T05:02:30+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66915,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T05:01:29+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66904,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T05:00:04+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66893,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T04:07:00+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66874,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T04:03:53+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 66866,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T04:02:37+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66860,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T04:02:27+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66859,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T04:01:27+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66848,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T04:00:05+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66837,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T03:07:11+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66818,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T03:03:53+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 66810,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T03:02:32+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66804,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T03:02:28+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66803,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T03:01:28+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66792,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T03:00:04+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66787,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T02:09:29+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 66781,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T02:07:20+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66762,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T02:03:54+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 66754,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T02:02:38+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66748,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T02:02:26+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66747,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T02:01:26+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66736,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T02:00:06+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66731,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T01:09:07+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 66725,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T01:07:25+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66706,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T01:04:14+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 66698,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T01:03:08+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66692,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T01:02:43+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66691,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T01:01:42+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66680,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T01:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66675,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T00:09:01+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 66669,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T00:07:07+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66650,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T00:03:58+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 66642,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T00:02:50+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66636,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T00:02:39+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66635,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T00:01:38+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66624,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-17T00:00:07+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66619,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T23:09:43+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 66613,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T23:06:51+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66594,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T23:03:55+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 66586,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T23:02:41+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66580,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T23:02:30+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66579,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T23:01:30+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66568,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T23:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66563,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T22:11:06+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 66557,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T22:08:02+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66538,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T22:04:25+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 66530,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T22:03:04+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66524,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T22:02:50+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66523,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T22:01:49+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66512,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T22:00:04+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66507,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T21:08:32+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 66501,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T21:06:46+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66482,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T21:03:52+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 66474,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T21:02:59+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66468,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T21:02:49+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66467,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T21:01:48+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66456,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T21:00:07+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66451,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T20:08:49+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 66445,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T20:06:49+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66426,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T20:03:48+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 66418,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T20:02:49+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66412,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T20:02:39+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66411,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T20:01:38+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66400,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T20:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66395,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T19:09:37+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 66389,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T19:07:56+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66370,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T19:04:39+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 66362,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T19:03:48+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66356,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T19:03:37+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66355,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T19:02:36+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66344,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T19:00:02+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66339,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T18:10:37+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 66333,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T18:08:21+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66314,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T18:04:43+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 66306,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T18:03:38+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66300,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T18:03:27+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66299,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T18:02:27+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66288,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T18:00:05+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66283,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T17:10:33+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 66277,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T17:08:34+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66259,
      "source_id": "zapovednik_khakassky",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1527, in connect\n    self.sock = self._context.wrap_socket(self.sock,\n                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 455, in wrap_socket\n    return self.sslsocket_class._create(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1041, in _create\n    self.do_handshake()\n  File \"/opt/alt/python312/lib64/python3.12/ssl.py\", line 1319, in do_handshake\n    self._sslobj.do_handshake()\nTimeoutError: _ssl.c:993: The handshake operation timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error _ssl.c:993: The handshake operation timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T17:04:55+00:00",
      "source_name": "Заповедник Хакасский",
      "source_url": "https://zapovednik-khakassky.ru/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66258,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T17:04:33+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 66250,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T17:03:15+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66244,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T17:03:00+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66243,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T17:01:59+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66232,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T17:00:04+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66227,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T15:08:38+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 66221,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T15:06:43+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66202,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T15:04:19+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 66194,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T15:02:55+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66188,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T15:02:42+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66187,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T15:01:41+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66176,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T15:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66171,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T13:08:22+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 66165,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T13:06:28+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66146,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T13:04:07+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 66138,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T13:02:45+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66132,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T13:02:33+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66131,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T13:01:32+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66120,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T13:00:05+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66115,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T11:07:54+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 66109,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T11:06:08+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66090,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T11:03:52+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 66082,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T11:02:40+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66076,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T11:02:28+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66075,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T11:01:27+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66064,
      "source_id": "r19_tourism",
      "error": "Сертификат источника не совпадает с закреплённым",
      "error_code": "tls_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 349, in <lambda>\n    source_getter = lambda url: fetch_text(\n                                ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 49, in fetch_text\n    return _fetch_with_pinned_certificate(\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 173, in _fetch_with_pinned_certificate\n    raise FetchError(\"tls_error\", \"Сертификат источника не совпадает с закреплённым\")\nnews_monitor.fetch.FetchError: Сертификат источника не совпадает с закреплённым\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T11:00:03+00:00",
      "source_name": "Правительство Республики Хакасия — Туризм",
      "source_url": "https://r-19.ru/news/turizm/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66059,
      "source_id": "kyzyl_city_tourism",
      "error": "Не удалось получить ответ источника",
      "error_code": "http_error",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1520, in connect\n    super().connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 841, in create_connection\n    for res in getaddrinfo(host, port, 0, SOCK_STREAM):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/socket.py\", line 978, in getaddrinfo\n    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsocket.gaierror: [Errno -2] Name or service not known\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1392, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [Errno -2] Name or service not known>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T09:07:41+00:00",
      "source_name": "Кызыл — новости и календарь событий",
      "source_url": "https://mkyzyl.ru/about/info/news/",
      "source_type": "site",
      "region": "tuva"
    },
    {
      "id": 66053,
      "source_id": "notabene_khakassia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T09:05:55+00:00",
      "source_name": "NotaBene Хакасия",
      "source_url": "https://t.me/s/notabenenews",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66034,
      "source_id": "vk_podslushanovhakasii",
      "error": "VK API: One of the parameters specified was missing or invalid: domain not domain",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 267, in parse\n    raise FetchError(\"auth_required\", f\"VK API: {message}\")\nnews_monitor.fetch.FetchError: VK API: One of the parameters specified was missing or invalid: domain not domain\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T09:03:35+00:00",
      "source_name": "Подслушано в Хакасии",
      "source_url": "https://vk.com/podslushanovhakasii",
      "source_type": "vk_wall",
      "region": "khakassia"
    },
    {
      "id": 66026,
      "source_id": "ctv7_culture_sport",
      "error": "Источник вернул HTTP 403",
      "error_code": "auth_required",
      "error_detail": "Traceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 88, in _open_request\n    return urlopen(request, timeout=timeout, context=context)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 215, in urlopen\n    return opener.open(url, data, timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 521, in open\n    response = meth(req, response)\n               ^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 630, in http_response\n    response = self.parent.error(\n               ^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 559, in error\n    return self._call_chain(*args)\n           ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 639, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 403: Forbidden\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 82, in parse\n    body, used_url = self._fetch_with_fallbacks(\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 76, in fetch_text\n    raise FetchError(code, f\"Источник вернул HTTP {exc.code}\") from exc\nnews_monitor.fetch.FetchError: Источник вернул HTTP 403\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T09:02:32+00:00",
      "source_name": "Юг Сибири — Культура и спорт",
      "source_url": "https://ctv7.ru/news/kultura-i-sport/",
      "source_type": "site",
      "region": "khakassia"
    },
    {
      "id": 66020,
      "source_id": "tg_vesti_khakasia",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T09:02:22+00:00",
      "source_name": "Вести. Хакасия",
      "source_url": "https://t.me/s/NewsKhakassia",
      "source_type": "telegram_channel",
      "region": "khakassia"
    },
    {
      "id": 66019,
      "source_id": "tg_abakan_smi",
      "error": "Не удалось получить ответ источника",
      "error_code": "timeout",
      "error_detail": "Traceback (most recent call last):\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1344, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1386, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1432, in _send_request\n    self.endheaders(body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1381, in endheaders\n    self._send_output(message_body, encode_chunked=encode_chunked)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1141, in _send_output\n    self.send(msg)\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1085, in send\n    self.connect()\n  File \"/opt/alt/python312/lib64/python3.12/http/client.py\", line 1051, in connect\n    self.sock = self._create_connection(\n                ^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 113, in _create_ipv4_connection\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 106, in _create_ipv4_connection\n    sock.connect(socket_address)\nTimeoutError: timed out\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 64, in fetch_text\n    with _open_request(request, timeout=timeout, context=context) as response:\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 90, in _open_request\n    return opener.open(request, timeout=timeout)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 515, in open\n    response = self._open(req, data)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 532, in _open\n    result = self._call_chain(self.handle_open, protocol, protocol +\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 492, in _call_chain\n    result = func(*args)\n             ^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 131, in http_open\n    return self.do_open(_IPv4HTTPConnection, request)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/alt/python312/lib64/python3.12/urllib/request.py\", line 1347, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error timed out>\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/monitor.py\", line 56, in check_source\n    items = engine.parse(source, date_from=date_from, date_to=date_to)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 225, in parse\n    body, _ = self._fetch_with_fallbacks(source, source.url, fallbacks)\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 62, in _fetch_with_fallbacks\n    raise last_error\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/engines.py\", line 58, in _fetch_with_fallbacks\n    return self.http_get(candidate_url), candidate_url\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/users/p/pavel-sbitnev/domains/xn----ctbblape7ajbnvfiddm6gsg.xn--p1ai/news_monitor/fetch.py\", line 80, in fetch_text\n    raise FetchError(code, \"Не удалось получить ответ источника\") from exc\nnews_monitor.fetch.FetchError: Не удалось получить ответ источника\n",
      "found": 0,
      "inserted": 0,
      "checked_at": "2026-09-16T09:01:22+00:00",
      "source_name": "Новости Абакана и Хакасии",
      "source_url": "https://t.me/s/abakan_smi",
      "source_type": "telegram_channel",
      "region": "khakassia"
    }
  ]
}