commit 46b42b7d17ac5ed974633477f1ee880d45cc53f7 Author: valoka Date: Fri Jul 26 01:23:15 2024 +0900 Initial project version diff --git a/Config.ini b/Config.ini new file mode 100644 index 0000000..af6afed --- /dev/null +++ b/Config.ini @@ -0,0 +1,47 @@ +# Config.ini +# None is calling filedialog +[Path] +; Путь до файла шаблона, если выставить None, тогда произойдет вызов диалога для выбора +; (удобно при использовании на флешке) +PathToFile=G:\source\source\Pydroid\inform-template.docx + +[Main] +; Указывает количество подразделений которым нужно сделать информирование, +; если указать 1, то до Utverzhdau_1 попросту не увидит (удобно) +totalGuys=2 +; Параметр отвечающий за использование в работе БЯМ: 1 - НЕ использовать, 0 - использовать +; удобно, если запрос слишком большой, и/или находишся в бане от сервиса +noAI=1 +; Изменение количества одновременных запросов к сайту, сильно влияет на производительность, +; но при больших значениях сайт может выдать бан по адресу +limit=9 +; Изменение количества пула новостей, по умолчанию 40(добавить) +; newsLimit = 40 + +[Utverzhdau_0] +; Количество пробелов между словами в наименовании роты (жесткий костыль) +; spaces должен быть в любом случае, но значение 0 удалит все пробелы (исправить) +spaces=6 +; Указывает должность "Утверждающего" +commander=Командир +; Указать название роты +subdivision=2 спасательной роты +; Звание "Утверждающего" +rank=старший лейтенант +; ФИО "Утверждающего" +name=Э.Ю. Петросян + +; Пример другой роты +[Utverzhdau_1] +spaces=1 +commander=Начальник +subdivision=телекоммуникационного узла +rank=капитан +name=" М.А. Шахбанов" + +; Устарело для некоторых подразделений (мб стоит пофиксить это) +; Это нужно поскольку 2ср отностися к со, в случае тку - только рота +; Просто не трогай тут ничего +[Plan] +subdivision=2 спасательной роты +squad=спасательного отряда \ No newline at end of file diff --git a/ListOfSities.py b/ListOfSities.py new file mode 100644 index 0000000..7f20d49 --- /dev/null +++ b/ListOfSities.py @@ -0,0 +1,2377 @@ +cities = ['Абаза', +'Хакасия', +'С.-Петербург', +'С.-петербург', +'Абакан', +'Хакасия', +'Абдулино', +'Оренбургская область', +'Абинск', +'Краснодарский край', +'Агидель', +'Башкортостан', +'Агрыз', +'Татарстан', +'Адыгейск', +'Адыгея', +'Азнакаево', +'Татарстан', +'Азов', +'Ростовская область', +'Ак-Довурак', +'Тыва', +'Аксай', +'Ростовская область', +'Алагир', +'Северная Осетия', +'Алапаевск', +'Свердловская область', +'Алатырь', +'Чувашия', +'Алдан', +'Якутия', +'Алейск', +'Алтайский край', +'Александров', +'Владимирская область', +'Александровск', +'Пермский край', +'Александровск-Сахалинский', +'Сахалинская область', +'Алексеевка', +'Белгородская область', +'Алексин', +'Тульская область', +'Алзамай', +'Иркутская область', +'Алупка', +'не призн.', +'Крым', +'Алушта', +'не призн.', +'Крым', +'Альметьевск', +'Татарстан', +'Амурск', +'Хабаровский край', +'Анадырь', +'Чукотский АО', +'Анапа', +'Краснодарский край', +'Ангарск', +'Иркутская область', +'Андреаполь', +'Тверская область', +'Анжеро-Судженск', +'Кемеровская область', +'Анива', +'Сахалинская область', +'Апатиты', +'Мурманская область', +'Апрелевка', +'Московская область', +'Апшеронск', +'Краснодарский край', +'Арамиль', +'Свердловская область', +'Аргун', +'Чечня', +'Ардатов', +'Мордовия', +'Ардон', +'Северная Осетия', +'Арзамас', +'Нижегородская область', +'Аркадак', +'Саратовская область', +'Армавир', +'Краснодарский край', +'Армянск', +'не призн.', +'Крым', +'Арсеньев', +'Приморский край', +'Арск', +'Татарстан', +'Артём', +'Приморский край', +'Артёмовск', +'Красноярский край', +'Артёмовский', +'Свердловская область', +'Архангельск', +'Архангельская область', +'Асбест', +'Свердловская область', +'Асино', +'Томская область', +'Астрахань', +'Астраханская область', +'Аткарск', +'Саратовская область', +'Ахтубинск', +'Астраханская область', +'Ачинск', +'Красноярский край', +'Ачхой-Мартан', +'Чечня', +'Аша', +'Челябинская область', +'Бабаево', +'Вологодская область', +'Бабушкин', +'Бурятия', +'Бавлы', +'Татарстан', +'Багратионовск', +'Калининградская область', +'Байкальск', +'Иркутская область', +'Баймак', +'Башкортостан', +'Бакал', +'Челябинская область', +'Баксан', +'Кабардино-Балкария', +'Балабаново', +'Калужская область', +'Балаково', +'Саратовская область', +'Балахна', +'Нижегородская область', +'Балашиха', +'Московская область', +'Балашов', +'Саратовская область', +'Балей', +'Забайкальский край', +'Балтийск', +'Калининградская область', +'Барабинск', +'Новосибирская область', +'Барнаул', +'Алтайский край', +'Барыш', +'Ульяновская область', +'Батайск', +'Ростовская область', +'Бахчисарай', +'не призн.', +'Крым', +'Бежецк', +'Тверская область', +'Белая Калитва', +'Ростовская область', +'Белая Холуница', +'Кировская область', +'Белгород', +'Белгородская область', +'Белебей', +'Башкортостан', +'Белёв', +'Тульская область', +'Белинский', +'Пензенская область', +'Белово', +'Кемеровская область', +'Белогорск', +'Амурская область', +'Белогорск', +'не призн.', +'Крым', +'Белозерск', +'Вологодская область', +'Белокуриха', +'Алтайский край', +'Беломорск', +'Карелия', +'Белоозёрский', +'Московская область', +'Белорецк', +'Башкортостан', +'Белореченск', +'Краснодарский край', +'Белоусово', +'Калужская область', +'Белоярский', +'Ханты-Мансийский АО', +'Белый', +'Тверская область', +'Бердск', +'Новосибирская область', +'Березники', +'Пермский край', +'Берёзовский', +'Кемеровская область', +'Берёзовский', +'Свердловская область', +'Беслан', +'Северная Осетия', +'Бийск', +'Алтайский край', +'Бикин', +'Хабаровский край', +'Билибино', +'Чукотский АО', +'Биробиджан', +'Еврейская АО', +'Бирск', +'Башкортостан', +'Бирюсинск', +'Иркутская область', +'Бирюч', +'Белгородская область', +'Благовещенск', +'Башкортостан', +'Благовещенск', +'Амурская область', +'Благодарный', +'Ставропольский край', +'Бобров', +'Воронежская область', +'Богданович', +'Свердловская область', +'Богородицк', +'Тульская область', +'Богородск', +'Нижегородская область', +'Боготол', +'Красноярский край', +'Богучар', +'Воронежская область', +'Бодайбо', +'Иркутская область', +'Бокситогорск', +'Ленинградская область', +'Болгар', +'Татарстан', +'Бологое', +'Тверская область', +'Болотное', +'Новосибирская область', +'Болохово', +'Тульская область', +'Болхов', +'Орловская область', +'Большой Камень', +'Приморский край', +'Бор', +'Нижегородская область', +'Борзя', +'Забайкальский край', +'Борисоглебск', +'Воронежская область', +'Боровичи', +'Новгородская область', +'Боровск', +'Калужская область', +'Бородино', +'Красноярский край', +'Братск', +'Иркутская область', +'Бронницы', +'Московская область', +'Брянск', +'Брянская область', +'Бугульма', +'Татарстан', +'Бугуруслан', +'Оренбургская область', +'Будённовск', +'Ставропольский край', +'Бузулук', +'Оренбургская область', +'Буинск', +'Татарстан', +'Буй', +'Костромская область', +'Буйнакск', +'Дагестан', +'Бутурлиновка', +'Воронежская область', +'Валдай', +'Новгородская область', +'Валуйки', +'Белгородская область', +'Велиж', +'Смоленская область', +'Великие Луки', +'Псковская область', +'Великий Новгород', +'Новгородская область', +'Великий Устюг', +'Вологодская область', +'Вельск', +'Архангельская область', +'Венёв', +'Тульская область', +'Верещагино', +'Пермский край', +'Верея', +'Московская область', +'Верхнеуральск', +'Челябинская область', +'Верхний Тагил', +'Свердловская область', +'Верхний Уфалей', +'Челябинская область', +'Верхняя Пышма', +'Свердловская область', +'Верхняя Салда', +'Свердловская область', +'Верхняя Тура', +'Свердловская область', +'Верхотурье', +'Свердловская область', +'Верхоянск', +'Якутия', +'Весьегонск', +'Тверская область', +'Ветлуга', +'Нижегородская область', +'Видное', +'Московская область', +'Вилюйск', +'Якутия', +'Вилючинск', +'Камчатский край', +'Вихоревка', +'Иркутская область', +'Вичуга', +'Ивановская область', +'Владивосток', +'Приморский край', +'Владикавказ', +'Северная Осетия', +'Владимир', +'Волгоград', +'Волгоградская область', +'Волгодонск', +'Ростовская область', +'Волгореченск', +'Костромская область', +'Волжск', +'Марий Эл', +'Волжский', +'Волгоградская область', +'Вологда', +'Вологодская область', +'Володарск', +'Нижегородская область', +'Волоколамск', +'Московская область', +'Волосово', +'Ленинградская область', +'Волхов', +'Ленинградская область', +'Волчанск', +'Свердловская область', +'Вольск', +'Саратовская область', +'Воркута', +'Коми', +'Воронеж', +'Воронежская область', +'Ворсма', +'Нижегородская область', +'Воскресенск', +'Московская область', +'Воткинск', +'Удмуртия', +'Всеволожск', +'Ленинградская область', +'Вуктыл', +'Коми', +'Выборг', +'Ленинградская область', +'Выкса', +'Нижегородская область', +'Высоковск', +'Московская область', +'Высоцк', +'Ленинградская область', +'Вытегра', +'Вологодская область', +'Вышний Волочёк', +'Тверская область', +'Вяземский', +'Хабаровский край', +'Вязники', +'Вязьма', +'Смоленская область', +'Вятские Поляны', +'Кировская область', +'Гаврилов Посад', +'Ивановская область', +'Гаврилов-Ям', +'Ярославская область', +'Гагарин', +'Смоленская область', +'Гаджиево', +'Мурманская область', +'Гай', +'Оренбургская область', +'Галич', +'Костромская область', +'Гатчина', +'Ленинградская область', +'Гвардейск', +'Калининградская область', +'Гдов', +'Псковская область', +'Геленджик', +'Краснодарский край', +'Георгиевск', +'Ставропольский край', +'Глазов', +'Удмуртия', +'Голицыно', +'Московская область', +'Горбатов', +'Нижегородская область', +'Горно-Алтайск', +'Алтай', +'Горнозаводск', +'Пермский край', +'Горняк', +'Алтайский край', +'Городец', +'Нижегородская область', +'Городище', +'Пензенская область', +'Городовиковск', +'Калмыкия', +'Гороховец', +'Горячий Ключ', +'Краснодарский край', +'Грайворон', +'Белгородская область', +'Гремячинск', +'Пермский край', +'Грозный', +'Чечня', +'Грязи', +'Липецкая область', +'Грязовец', +'Вологодская область', +'Губаха', +'Пермский край', +'Губкин', +'Белгородская область', +'Губкинский', +'Ямало-Ненецкий АО', +'Гудермес', +'Чечня', +'Гуково', +'Ростовская область', +'Гулькевичи', +'Краснодарский край', +'Гурьевск', +'Калининградская область', +'Гурьевск', +'Кемеровская область', +'Гусев', +'Калининградская область', +'Гусиноозёрск', +'Бурятия', +'Гусь-Хрустальный', +'Давлеканово', +'Башкортостан', +'1730-е', +'Дагестанские Огни', +'Дагестан', +'Далматово', +'Курганская область', +'Дальнегорск', +'Приморский край', +'Дальнереченск', +'Приморский край', +'Данилов', +'Ярославская область', +'Данков', +'Липецкая область', +'Дегтярск', +'Свердловская область', +'Дедовск', +'Московская область', +'Демидов', +'Смоленская область', +'Дербент', +'Дагестан', +'Десногорск', +'Смоленская область', +'Джанкой', +'не призн.', +'Крым', +'Дзержинск', +'Нижегородская область', +'Дзержинский', +'Московская область', +'1380-е', +'Дивногорск', +'Красноярский край', +'Дигора', +'Северная Осетия', +'Димитровград', +'Ульяновская область', +'Дмитриев', +'Курская область', +'Дмитров', +'Московская область', +'Дмитровск', +'Орловская область', +'Дно', +'Псковская область', +'Добрянка', +'Пермский край', +'Долгопрудный', +'Московская область', +'Долинск', +'Сахалинская область', +'Домодедово', +'Московская область', +'Донецк', +'Ростовская область', +'Донской', +'Тульская область', +'Дорогобуж', +'Смоленская область', +'Дрезна', +'Московская область', +'Дубна', +'Московская область', +'Дубовка', +'Волгоградская область', +'Дудинка', +'Красноярский край', +'Духовщина', +'Смоленская область', +'Дюртюли', +'Башкортостан', +'Дятьково', +'Брянская область', +'Евпатория', +'не призн.', +'Крым', +'Егорьевск', +'Московская область', +'Ейск', +'Краснодарский край', +'Екатеринбург', +'Свердловская область', +'Елабуга', +'Татарстан', +'Елец', +'Липецкая область', +'Елизово', +'Камчатский край', +'Ельня', +'Смоленская область', +'Еманжелинск', +'Челябинская область', +'Емва', +'Коми', +'Енисейск', +'Красноярский край', +'Ермолино', +'Калужская область', +'Ершов', +'Саратовская область', +'Ессентуки', +'Ставропольский край', +'Ефремов', +'Тульская область', +'Железноводск', +'Ставропольский край', +'Железногорск', +'Красноярский край', +'Железногорск', +'Курская область', +'Железногорск-Илимский', +'Иркутская область', +'Жердевка', +'Тамбовская область', +'Жигулёвск', +'Самарская область', +'Жиздра', +'Калужская область', +'Жирновск', +'Волгоградская область', +'Жуков', +'Калужская область', +'Жуковка', +'Брянская область', +'Жуковский', +'Московская область', +'Завитинск', +'Амурская область', +'Заводоуковск', +'Тюменская область', +'Заволжск', +'Ивановская область', +'Заволжье', +'Нижегородская область', +'Задонск', +'Липецкая область', +'Заинск', +'Татарстан', +'Закаменск', +'Бурятия', +'Заозёрный', +'Красноярский край', +'Заозёрск', +'Мурманская область', +'Западная Двина', +'Тверская область', +'Заполярный', +'Мурманская область', +'Зарайск', +'Московская область', +'Заречный', +'Пензенская область', +'Заречный', +'Свердловская область', +'Заринск', +'Алтайский край', +'Звенигово', +'Марий Эл', +'Звенигород', +'Московская область', +'Зверево', +'Ростовская область', +'Зеленогорск', +'Красноярский край', +'Зеленоградск', +'Калининградская область', +'Зеленодольск', +'Татарстан', +'Зеленокумск', +'Ставропольский край', +'Зерноград', +'Ростовская область', +'Зея', +'Амурская область', +'Зима', +'Иркутская область', +'Златоуст', +'Челябинская область', +'Злынка', +'Брянская область', +'Змеиногорск', +'Алтайский край', +'Знаменск', +'Астраханская область', +'Зубцов', +'Тверская область', +'Зуевка', +'Кировская область', +'Ивангород', +'Ленинградская область', +'Иваново', +'Ивановская область', +'Ивантеевка', +'Московская область', +'Ивдель', +'Свердловская область', +'Игарка', +'Красноярский край', +'Ижевск', +'Удмуртия', +'Избербаш', +'Дагестан', +'Изобильный', +'Ставропольский край', +'Иланский', +'Красноярский край', +'Инза', +'Ульяновская область', +'Иннополис', +'Татарстан', +'Инсар', +'Мордовия', +'Инта', +'Коми', +'Ипатово', +'Ставропольский край', +'Ирбит', +'Свердловская область', +'Иркутск', +'Иркутская область', +'Исилькуль', +'Омская область', +'Искитим', +'Новосибирская область', +'Истра', +'Московская область', +'Ишим', +'Тюменская область', +'Ишимбай', +'Башкортостан', +'Йошкар-Ола', +'Марий Эл', +'Кадников', +'Вологодская область', +'Казань', +'Татарстан', +'Калач', +'Воронежская область', +'Калач-на-Дону', +'Волгоградская область', +'Калачинск', +'Омская область', +'Калининград', +'Калининградская область', +'Калининск', +'Саратовская область', +'Калтан', +'Кемеровская область', +'Калуга', +'Калужская область', +'Калязин', +'Тверская область', +'Камбарка', +'Удмуртия', +'Каменка', +'Пензенская область', +'Каменногорск', +'Ленинградская область', +'Каменск-Уральский', +'Свердловская область', +'Каменск-Шахтинский', +'Ростовская область', +'Камень-на-Оби', +'Алтайский край', +'Камешково', +'Камызяк', +'Астраханская область', +'Камышин', +'Волгоградская область', +'Камышлов', +'Свердловская область', +'Канаш', +'Чувашия', +'Кандалакша', +'Мурманская область', +'Канск', +'Красноярский край', +'Карабаново', +'Карабаш', +'Челябинская область', +'Карабулак', +'Ингушетия', +'Карасук', +'Новосибирская область', +'Карачаевск', +'Карачаево-Черкесия', +'Карачев', +'Брянская область', +'Каргат', +'Новосибирская область', +'Каргополь', +'Архангельская область', +'Карпинск', +'Свердловская область', +'Карталы', +'Челябинская область', +'Касимов', +'Рязанская область', +'Касли', +'Челябинская область', +'Каспийск', +'Дагестан', +'Катав-Ивановск', +'Челябинская область', +'Катайск', +'Курганская область', +'Качканар', +'Свердловская область', +'Кашин', +'Тверская область', +'Кашира', +'Московская область', +'Кедровый', +'Томская область', +'Кемерово', +'Кемеровская область', +'Кемь', +'Карелия', +'Керчь', +'не призн.', +'Крым', +'Кизел', +'Пермский край', +'Кизилюрт', +'Дагестан', +'Кизляр', +'Дагестан', +'Кимовск', +'Тульская область', +'Кимры', +'Тверская область', +'Кингисепп', +'Ленинградская область', +'Кинель', +'Самарская область', +'Кинешма', +'Ивановская область', +'Киреевск', +'Тульская область', +'Киренск', +'Иркутская область', +'Киржач', +'Кириллов', +'Вологодская область', +'Кириши', +'Ленинградская область', +'Киров', +'Калужская область', +'Киров', +'Кировская область', +'Кировград', +'Свердловская область', +'Кирово-Чепецк', +'Кировская область', +'Кировск', +'Ленинградская область', +'Кировск', +'Мурманская область', +'Кирс', +'Кировская область', +'Кирсанов', +'Тамбовская область', +'Киселёвск', +'Кемеровская область', +'Кисловодск', +'Ставропольский край', +'Клин', +'Московская область', +'Клинцы', +'Брянская область', +'Княгинино', +'Нижегородская область', +'Ковдор', +'Мурманская область', +'Ковров', +'Ковылкино', +'Мордовия', +'Когалым', +'Ханты-Мансийский АО', +'Кодинск', +'Красноярский край', +'Козельск', +'Калужская область', +'Козловка', +'Чувашия', +'Козьмодемьянск', +'Марий Эл', +'Кола', +'Мурманская область', +'Кологрив', +'Костромская область', +'Коломна', +'Московская область', +'Колпашево', +'Томская область', +'Колтуши', +'Ленинградская область', +'Кольчугино', +'Коммунар', +'Ленинградская область', +'Комсомольск', +'Ивановская область', +'Комсомольск-на-Амуре', +'Хабаровский край', +'Конаково', +'Тверская область', +'Кондопога', +'Карелия', +'Кондрово', +'Калужская область', +'Константиновск', +'Ростовская область', +'Копейск', +'Челябинская область', +'Кораблино', +'Рязанская область', +'Кореновск', +'Краснодарский край', +'Коркино', +'Челябинская область', +'Королёв', +'Московская область', +'Короча', +'Белгородская область', +'Корсаков', +'Сахалинская область', +'Коряжма', +'Архангельская область', +'Костерёво', +'Костомукша', +'Карелия', +'Кострома', +'Костромская область', +'Котельники', +'Московская область', +'Котельниково', +'Волгоградская область', +'Котельнич', +'Кировская область', +'Котлас', +'Архангельская область', +'Котово', +'Волгоградская область', +'1710-е', +'Котовск', +'Тамбовская область', +'Кохма', +'Ивановская область', +'Красавино', +'Вологодская область', +'Красноармейск', +'Московская область', +'Красноармейск', +'Саратовская область', +'Красновишерск', +'Пермский край', +'Красногорск', +'Московская область', +'Краснодар', +'Краснодарский край', +'Краснозаводск', +'Московская область', +'Краснознаменск', +'Калининградская область', +'Краснознаменск', +'Московская область', +'Краснокаменск', +'Забайкальский край', +'Краснокамск', +'Пермский край', +'Красноперекопск', +'не призн.', +'Крым', +'Краснослободск', +'Волгоградская область', +'Краснослободск', +'Мордовия', +'Краснотурьинск', +'Свердловская область', +'Красноуральск', +'Свердловская область', +'Красноуфимск', +'Свердловская область', +'Красноярск', +'Красноярский край', +'Красный Кут', +'Саратовская область', +'Красный Сулин', +'Ростовская область', +'Красный Холм', +'Тверская область', +'Кремёнки', +'Калужская область', +'Кропоткин', +'Краснодарский край', +'Крымск', +'Краснодарский край', +'Кстово', +'Нижегородская область', +'Кубинка', +'Московская область', +'Кувандык', +'Оренбургская область', +'Кувшиново', +'Тверская область', +'Кудрово', +'Ленинградская область', +'Кудымкар', +'Пермский край', +'Кузнецк', +'Пензенская область', +'Куйбышев', +'Новосибирская область', +'Кукмор', +'Татарстан', +'Кулебаки', +'Нижегородская область', +'Кумертау', +'Башкортостан', +'Кунгур', +'Пермский край', +'Купино', +'Новосибирская область', +'Курган', +'Курганская область', +'Курганинск', +'Краснодарский край', +'Курильск', +'Сахалинская область', +'Курлово', +'Куровское', +'Московская область', +'Курск', +'Курская область', +'Куртамыш', +'Курганская область', +'Курчалой', +'Чечня', +'Курчатов', +'Курская область', +'Куса', +'Челябинская область', +'Кушва', +'Свердловская область', +'Кызыл', +'Тыва', +'Кыштым', +'Челябинская область', +'Кяхта', +'Бурятия', +'Лабинск', +'Краснодарский край', +'Лабытнанги', +'Ямало-Ненецкий АО', +'Лагань', +'Калмыкия', +'Ладушкин', +'Калининградская область', +'Лаишево', +'Татарстан', +'Лакинск', +'Лангепас', +'Ханты-Мансийский АО', +'Лахденпохья', +'Карелия', +'Лебедянь', +'Липецкая область', +'Лениногорск', +'Татарстан', +'Ленинск', +'Волгоградская область', +'Ленинск-Кузнецкий', +'Кемеровская область', +'Ленск', +'Якутия', +'Лермонтов', +'Ставропольский край', +'Лесной', +'Свердловская область', +'Лесозаводск', +'Приморский край', +'Лесосибирск', +'Красноярский край', +'Ливны', +'Орловская область', +'Ликино-Дулёво', +'Московская область', +'Липецк', +'Липецкая область', +'Липки', +'Тульская область', +'Лиски', +'Воронежская область', +'Лихославль', +'Тверская область', +'Лобня', +'Московская область', +'Лодейное Поле', +'Ленинградская область', +'Лосино-Петровский', +'Московская область', +'Луга', +'Ленинградская область', +'Луза', +'Кировская область', +'Лукоянов', +'Нижегородская область', +'Луховицы', +'Московская область', +'Лысково', +'Нижегородская область', +'Лысьва', +'Пермский край', +'Лыткарино', +'Московская область', +'Льгов', +'Курская область', +'Любань', +'Ленинградская область', +'Люберцы', +'Московская область', +'Любим', +'Ярославская область', +'Людиново', +'Калужская область', +'Лянтор', +'Ханты-Мансийский АО', +'Магадан', +'Магаданская область', +'Магас', +'Ингушетия', +'Магнитогорск', +'Челябинская область', +'Майкоп', +'Майский', +'Кабардино-Балкария', +'Макаров', +'Сахалинская область', +'Макарьев', +'Костромская область', +'Макушино', +'Курганская область', +'Малая Вишера', +'Новгородская область', +'Малгобек', +'Ингушетия', +'Малмыж', +'Кировская область', +'Малоархангельск', +'Орловская область', +'Малоярославец', +'Калужская область', +'Мамадыш', +'Татарстан', +'Мамоново', +'Калининградская область', +'Мантурово', +'Костромская область', +'Мариинск', +'Кемеровская область', +'Мариинский Посад', +'Чувашия', +'Маркс', +'Саратовская область', +'Махачкала', +'Дагестан', +'Мглин', +'Брянская область', +'Мегион', +'Ханты-Мансийский АО', +'Медвежьегорск', +'Карелия', +'Медногорск', +'Оренбургская область', +'Медынь', +'Калужская область', +'Межгорье', +'Башкортостан', +'Междуреченск', +'Кемеровская область', +'Мезень', +'Архангельская область', +'Меленки', +'Мелеуз', +'Башкортостан', +'Менделеевск', +'Татарстан', +'Мензелинск', +'Татарстан', +'Мещовск', +'Калужская область', +'Миасс', +'Челябинская область', +'Микунь', +'Коми', +'Миллерово', +'Ростовская область', +'Минеральные Воды', +'Ставропольский край', +'Минусинск', +'Красноярский край', +'Миньяр', +'Челябинская область', +'Мирный', +'Якутия', +'Мирный', +'Архангельская область', +'Михайлов', +'Рязанская область', +'Михайловка', +'Волгоградская область', +'Михайловск', +'Свердловская область', +'Михайловск', +'Ставропольский край', +'Мичуринск', +'Тамбовская область', +'Могоча', +'Забайкальский край', +'Можайск', +'Московская область', +'Можга', +'Удмуртия', +'Моздок', +'Северная Осетия', +'Мончегорск', +'Мурманская область', +'Морозовск', +'Ростовская область', +'Моршанск', +'Тамбовская область', +'Мосальск', +'Калужская область', +'Москва', +'Москва', +'Муравленко', +'Ямало-Ненецкий АО', +'Мураши', +'Кировская область', +'Мурино', +'Ленинградская область', +'Мурманск', +'Мурманская область', +'Муром', +'Мценск', +'Орловская область', +'Мыски', +'Кемеровская область', +'Мытищи', +'Московская область', +'Мышкин', +'Ярославская область', +'Набережные Челны', +'Татарстан', +'Навашино', +'Нижегородская область', +'Наволоки', +'Ивановская область', +'Надым', +'Ямало-Ненецкий АО', +'Назарово', +'Красноярский край', +'Назрань', +'Ингушетия', +'Называевск', +'Омская область', +'Нальчик', +'Кабардино-Балкария', +'Нариманов', +'Астраханская область', +'Наро-Фоминск', +'Московская область', +'Нарткала', +'Кабардино-Балкария', +'Нарьян-Мар', +'Ненецкий АО', +'Находка', +'Приморский край', +'Невель', +'Псковская область', +'Невельск', +'Сахалинская область', +'Невинномысск', +'Ставропольский край', +'Невьянск', +'Свердловская область', +'Нелидово', +'Тверская область', +'Неман', +'Калининградская область', +'Нерехта', +'Костромская область', +'Нерчинск', +'Забайкальский край', +'Нерюнгри', +'Якутия', +'Нестеров', +'Калининградская область', +'Нефтегорск', +'Самарская область', +'Нефтекамск', +'Башкортостан', +'Нефтекумск', +'Ставропольский край', +'Нефтеюганск', +'Ханты-Мансийский АО', +'Нея', +'Костромская область', +'Нижневартовск', +'Ханты-Мансийский АО', +'Нижнекамск', +'Татарстан', +'Нижнеудинск', +'Иркутская область', +'Нижние Серги', +'Свердловская область', +'Нижний Ломов', +'Пензенская область', +'Нижний Новгород', +'Нижегородская область', +'Нижний Тагил', +'Свердловская область', +'Нижняя Салда', +'Свердловская область', +'Нижняя Тура', +'Свердловская область', +'Николаевск', +'Волгоградская область', +'Николаевск-на-Амуре', +'Хабаровский край', +'Никольск', +'Вологодская область', +'Никольск', +'Пензенская область', +'Никольское', +'Ленинградская область', +'Новая Ладога', +'Ленинградская область', +'Новая Ляля', +'Свердловская область', +'Новоалександровск', +'Ставропольский край', +'Новоалтайск', +'Алтайский край', +'Новоаннинский', +'Волгоградская область', +'Нововоронеж', +'Воронежская область', +'Новодвинск', +'Архангельская область', +'Новозыбков', +'Брянская область', +'Новокубанск', +'Краснодарский край', +'Новокузнецк', +'Кемеровская область', +'Новокуйбышевск', +'Самарская область', +'Новомичуринск', +'Рязанская область', +'Новомосковск', +'Тульская область', +'Новопавловск', +'Ставропольский край', +'Новоржев', +'Псковская область', +'Новороссийск', +'Краснодарский край', +'Новосибирск', +'Новосибирская область', +'Новосиль', +'Орловская область', +'Новосокольники', +'Псковская область', +'Новотроицк', +'Оренбургская область', +'Новоузенск', +'Саратовская область', +'Новоульяновск', +'Ульяновская область', +'Новоуральск', +'Свердловская область', +'Новохопёрск', +'Воронежская область', +'Новочебоксарск', +'Чувашия', +'Новочеркасск', +'Ростовская область', +'Новошахтинск', +'Ростовская область', +'Новый Оскол', +'Белгородская область', +'Новый Уренгой', +'Ямало-Ненецкий АО', +'Ногинск', +'Московская область', +'Нолинск', +'Кировская область', +'Норильск', +'Красноярский край', +'Ноябрьск', +'Ямало-Ненецкий АО', +'Нурлат', +'Татарстан', +'Нытва', +'Пермский край', +'Нюрба', +'Якутия', +'Нягань', +'Ханты-Мансийский АО', +'Нязепетровск', +'Челябинская область', +'Няндома', +'Архангельская область', +'Облучье', +'Еврейская АО', +'Обнинск', +'Калужская область', +'Обоянь', +'Курская область', +'Обь', +'Новосибирская область', +'Одинцово', +'Московская область', +'Озёрск', +'Калининградская область', +'Озёрск', +'Челябинская область', +'Озёры', +'Московская область', +'Октябрьск', +'Самарская область', +'Октябрьский', +'Башкортостан', +'Окуловка', +'Новгородская область', +'Олёкминск', +'Якутия', +'Оленегорск', +'Мурманская область', +'Олонец', +'Карелия', +'Омск', +'Омская область', +'Омутнинск', +'Кировская область', +'Онега', +'Архангельская область', +'Опочка', +'Псковская область', +'Орёл', +'Орловская область', +'Оренбург', +'Оренбургская область', +'Орехово-Зуево', +'Московская область', +'Орлов', +'Кировская область', +'Орск', +'Оренбургская область', +'Оса', +'Пермский край', +'Осинники', +'Кемеровская область', +'Осташков', +'Тверская область', +'Остров', +'Псковская область', +'Островной', +'Мурманская область', +'Острогожск', +'Воронежская область', +'Отрадное', +'Ленинградская область', +'Отрадный', +'Самарская область', +'1920-е', +'Оха', +'Сахалинская область', +'Оханск', +'Пермский край', +'Очёр', +'Пермский край', +'Павлово', +'Нижегородская область', +'Павловск', +'Воронежская область', +'Павловский Посад', +'Московская область', +'Палласовка', +'Волгоградская область', +'Партизанск', +'Приморский край', +'Певек', +'Чукотский АО', +'Пенза', +'Пензенская область', +'Первомайск', +'Нижегородская область', +'Первоуральск', +'Свердловская область', +'Перевоз', +'Нижегородская область', +'Пересвет', +'Московская область', +'Переславль-Залесский', +'Ярославская область', +'Пермь', +'Пермский край', +'Пестово', +'Новгородская область', +'Петров Вал', +'Волгоградская область', +'Петровск', +'Саратовская область', +'Петровск-Забайкальский', +'Забайкальский край', +'Петрозаводск', +'Карелия', +'Петропавловск-Камчатский', +'Камчатский край', +'Петухово', +'Курганская область', +'Петушки', +'Печора', +'Коми', +'Печоры', +'Псковская область', +'Пикалёво', +'Ленинградская область', +'Пионерский', +'Калининградская область', +'Питкяранта', +'Карелия', +'Плавск', +'Тульская область', +'Пласт', +'Челябинская область', +'Плёс', +'Ивановская область', +'Поворино', +'Воронежская область', +'Подольск', +'Московская область', +'Подпорожье', +'Ленинградская область', +'Покачи', +'Ханты-Мансийский АО', +'Покров', +'Покровск', +'Якутия', +'Полевской', +'Свердловская область', +'Полесск', +'Калининградская область', +'Полысаево', +'Кемеровская область', +'Полярные Зори', +'Мурманская область', +'Полярный', +'Мурманская область', +'Поронайск', +'Сахалинская область', +'Порхов', +'Псковская область', +'Похвистнево', +'Самарская область', +'Почеп', +'Брянская область', +'Починок', +'Смоленская область', +'Пошехонье', +'Ярославская область', +'Правдинск', +'Калининградская область', +'Приволжск', +'Ивановская область', +'Приморск', +'Калининградская область', +'Приморск', +'Ленинградская область', +'Приморско-Ахтарск', +'Краснодарский край', +'Приозерск', +'Ленинградская область', +'Прокопьевск', +'Кемеровская область', +'Пролетарск', +'Ростовская область', +'Протвино', +'Московская область', +'Прохладный', +'Кабардино-Балкария', +'Псков', +'Псковская область', +'Пугачёв', +'Саратовская область', +'Пудож', +'Карелия', +'Пустошка', +'Псковская область', +'Пучеж', +'Ивановская область', +'Пушкино', +'Московская область', +'Пущино', +'Московская область', +'Пыталово', +'Псковская область', +'Пыть-Ях', +'Ханты-Мансийский АО', +'Пятигорск', +'Ставропольский край', +'Радужный', +'Радужный', +'Ханты-Мансийский АО', +'Райчихинск', +'Амурская область', +'Раменское', +'Московская область', +'Рассказово', +'Тамбовская область', +'Ревда', +'Свердловская область', +'Реж', +'Свердловская область', +'Реутов', +'Московская область', +'Ржев', +'Тверская область', +'Родники', +'Ивановская область', +'Рославль', +'Смоленская область', +'Россошь', +'Воронежская область', +'Ростов-на-Дону', +'Ростов-На-Дону', +'Ростовская область', +'Ростов', +'Ярославская область', +'Рошаль', +'Московская область', +'Ртищево', +'Саратовская область', +'Рубцовск', +'Алтайский край', +'Рудня', +'Смоленская область', +'Руза', +'Московская область', +'Рузаевка', +'Мордовия', +'Рыбинск', +'Ярославская область', +'Рыбное', +'Рязанская область', +'Рыльск', +'Курская область', +'Ряжск', +'Рязанская область', +'Рязань', +'Рязанская область', +'Саки', +'не призн.', +'Крым', +'Салават', +'Башкортостан', +'Салаир', +'Кемеровская область', +'Салехард', +'Ямало-Ненецкий АО', +'Сальск', +'Ростовская область', +'Самара', +'Самарская область', +'Санкт-Петербург', +'Саранск', +'Мордовия', +'Сарапул', +'Удмуртия', +'Саратов', +'Саратовская область', +'Саров', +'Нижегородская область', +'Сасово', +'Рязанская область', +'Сатка', +'Челябинская область', +'Сафоново', +'Смоленская область', +'Саяногорск', +'Хакасия', +'Саянск', +'Иркутская область', +'Светлогорск', +'Калининградская область', +'Светлоград', +'Ставропольский край', +'Светлый', +'Калининградская область', +'Светогорск', +'Ленинградская область', +'Свирск', +'Иркутская область', +'Свободный', +'Амурская область', +'Себеж', +'Псковская область', +'Севастополь', +'не призн.', +'Северо-Курильск', +'Сахалинская область', +'Северобайкальск', +'Бурятия', +'Северодвинск', +'Архангельская область', +'Североморск', +'Мурманская область', +'Североуральск', +'Свердловская область', +'Северск', +'Томская область', +'Севск', +'Брянская область', +'Сегежа', +'Карелия', +'Сельцо', +'Брянская область', +'1870-е', +'Семёнов', +'Нижегородская область', +'Семикаракорск', +'Ростовская область', +'Семилуки', +'Воронежская область', +'Сенгилей', +'Ульяновская область', +'Серафимович', +'Волгоградская область', +'Сергач', +'Нижегородская область', +'Сергиев Посад', +'Московская область', +'1337', +'Сердобск', +'Пензенская область', +'Серов', +'Свердловская область', +'Серпухов', +'Московская область', +'Сертолово', +'Ленинградская область', +'Сибай', +'Башкортостан', +'Сим', +'Челябинская область', +'Симферополь', +'не призн.', +'Крым', +'Сковородино', +'Амурская область', +'Скопин', +'Рязанская область', +'Славгород', +'Алтайский край', +'Славск', +'Калининградская область', +'Славянск-на-Кубани', +'Краснодарский край', +'Сланцы', +'Ленинградская область', +'Слободской', +'Кировская область', +'Слюдянка', +'Иркутская область', +'Смоленск', +'Смоленская область', +'Снежинск', +'Челябинская область', +'Снежногорск', +'Мурманская область', +'Собинка', +'Советск', +'Калининградская область', +'Советск', +'Кировская область', +'Советск', +'Тульская область', +'Советская Гавань', +'Хабаровский край', +'Советский', +'Ханты-Мансийский АО', +'Сокол', +'Вологодская область', +'Солигалич', +'Костромская область', +'Соликамск', +'Пермский край', +'Солнечногорск', +'Московская область', +'Соль-Илецк', +'Оренбургская область', +'Сольвычегодск', +'Архангельская область', +'Сольцы', +'Новгородская область', +'Сорочинск', +'Оренбургская область', +'Сорск', +'Хакасия', +'Сортавала', +'Карелия', +'Сосенский', +'Калужская область', +'Сосновка', +'Кировская область', +'Сосновоборск', +'Красноярский край', +'Сосновый Бор', +'Ленинградская область', +'Сосногорск', +'Коми', +'Сочи', +'Краснодарский край', +'Спас-Деменск', +'Калужская область', +'Спас-Клепики', +'Рязанская область', +'Спасск', +'Пензенская область', +'Спасск-Дальний', +'Приморский край', +'Спасск-Рязанский', +'Рязанская область', +'Среднеколымск', +'Якутия', +'Среднеуральск', +'Свердловская область', +'Сретенск', +'Забайкальский край', +'Ставрополь', +'Ставропольский край', +'Старая Купавна', +'Московская область', +'Старая Русса', +'Новгородская область', +'Старица', +'Тверская область', +'Стародуб', +'Брянская область', +'Старый Крым', +'не призн.', +'Крым', +'Старый Оскол', +'Белгородская область', +'Стерлитамак', +'Башкортостан', +'Стрежевой', +'Томская область', +'Строитель', +'Белгородская область', +'Струнино', +'Ступино', +'Московская область', +'Суворов', +'Тульская область', +'Судак', +'не призн.', +'Крым', +'Суджа', +'Курская область', +'Судогда', +'Суздаль', +'Сунжа', +'Ингушетия', +'Суоярви', +'Карелия', +'Сураж', +'Брянская область', +'Сургут', +'Ханты-Мансийский АО', +'Суровикино', +'Волгоградская область', +'Сурск', +'Пензенская область', +'Сусуман', +'Магаданская область', +'Сухиничи', +'Калужская область', +'Сухой Лог', +'Свердловская область', +'Сызрань', +'Самарская область', +'Сыктывкар', +'Коми', +'Сысерть', +'Свердловская область', +'Сычёвка', +'Смоленская область', +'Сясьстрой', +'Ленинградская область', +'Тавда', +'Свердловская область', +'Таганрог', +'Ростовская область', +'Тайга', +'Кемеровская область', +'Тайшет', +'Иркутская область', +'Талдом', +'Московская область', +'Талица', +'Свердловская область', +'Тамбов', +'Тамбовская область', +'Тара', +'Омская область', +'Тарко-Сале', +'Ямало-Ненецкий АО', +'Таруса', +'Калужская область', +'Татарск', +'Новосибирская область', +'Таштагол', +'Кемеровская область', +'Тверь', +'Тверская область', +'Теберда', +'Карачаево-Черкесия', +'Тейково', +'Ивановская область', +'Темников', +'Мордовия', +'Темрюк', +'Краснодарский край', +'Терек', +'Кабардино-Балкария', +'Тетюши', +'Татарстан', +'Тимашёвск', +'Краснодарский край', +'Тихвин', +'Ленинградская область', +'Тихорецк', +'Краснодарский край', +'Тобольск', +'Тюменская область', +'Тогучин', +'Новосибирская область', +'Тольятти', +'Самарская область', +'Томари', +'Сахалинская область', +'Томмот', +'Якутия', +'Томск', +'Томская область', +'Топки', +'Кемеровская область', +'Торжок', +'Тверская область', +'Торопец', +'Тверская область', +'Тосно', +'Ленинградская область', +'Тотьма', +'Вологодская область', +'Трёхгорный', +'Челябинская область', +'Троицк', +'Челябинская область', +'Трубчевск', +'Брянская область', +'Туапсе', +'Краснодарский край', +'Туймазы', +'Башкортостан', +'Тула', +'Тульская область', +'Тулун', +'Иркутская область', +'Туран', +'Тыва', +'Туринск', +'Свердловская область', +'Тутаев', +'Ярославская область', +'Тында', +'Амурская область', +'Тырныауз', +'Кабардино-Балкария', +'Тюкалинск', +'Омская область', +'Тюмень', +'Тюменская область', +'Уварово', +'Тамбовская область', +'Углегорск', +'Сахалинская область', +'Углич', +'Ярославская область', +'Удачный', +'Якутия', +'Удомля', +'Тверская область', +'Ужур', +'Красноярский край', +'Узловая', +'Тульская область', +'Улан-Удэ', +'Бурятия', +'Ульяновск', +'Ульяновская область', +'Унеча', +'Брянская область', +'Урай', +'Ханты-Мансийский АО', +'Урень', +'Нижегородская область', +'Уржум', +'Кировская область', +'Урус-Мартан', +'Чечня', +'Урюпинск', +'Волгоградская область', +'Усинск', +'Коми', +'Усмань', +'Липецкая область', +'Усолье-Сибирское', +'Иркутская область', +'Усолье', +'Пермский край', +'Уссурийск', +'Приморский край', +'Усть-Джегута', +'Карачаево-Черкесия', +'Усть-Илимск', +'Иркутская область', +'Усть-Катав', +'Челябинская область', +'Усть-Кут', +'Иркутская область', +'Усть-Лабинск', +'Краснодарский край', +'Устюжна', +'Вологодская область', +'Уфа', +'Башкортостан', +'Ухта', +'Коми', +'Учалы', +'Башкортостан', +'Уяр', +'Красноярский край', +'Фатеж', +'Курская область', +'Феодосия', +'не призн.', +'Крым', +'Фокино', +'Брянская область', +'Фокино', +'Приморский край', +'Фролово', +'Волгоградская область', +'Фрязино', +'Московская область', +'Фурманов', +'Ивановская область', +'Хабаровск', +'Хабаровский край', +'Хадыженск', +'Краснодарский край', +'Ханты-Мансийск', +'Ханты-Мансийский АО', +'Харабали', +'Астраханская область', +'Харовск', +'Вологодская область', +'Хасавюрт', +'Дагестан', +'Хвалынск', +'Саратовская область', +'Хилок', +'Забайкальский край', +'Химки', +'Московская область', +'Холм', +'Новгородская область', +'Холмск', +'Сахалинская область', +'Хотьково', +'Московская область', +'Цивильск', +'Чувашия', +'Цимлянск', +'Ростовская область', +'Циолковский', +'Амурская область', +'Чадан', +'Тыва', +'Чайковский', +'Пермский край', +'Чапаевск', +'Самарская область', +'Чаплыгин', +'Липецкая область', +'Чебаркуль', +'Челябинская область', +'Чебоксары', +'Чувашия', +'Чегем', +'Кабардино-Балкария', +'Чекалин', +'Тульская область', +'Челябинск', +'Челябинская область', +'Чердынь', +'Пермский край', +'Черемхово', +'Иркутская область', +'Черепаново', +'Новосибирская область', +'Череповец', +'Вологодская область', +'Черкесск', +'Карачаево-Черкесия', +'Чёрмоз', +'Пермский край', +'Черноголовка', +'Московская область', +'Черногорск', +'Хакасия', +'Чернушка', +'Пермский край', +'Черняховск', +'Калининградская область', +'Чехов', +'Московская область', +'Чистополь', +'Татарстан', +'Чита', +'Забайкальский край', +'Чкаловск', +'Нижегородская область', +'Чудово', +'Новгородская область', +'Чулым', +'Новосибирская область', +'Чусовой', +'Пермский край', +'Чухлома', +'Костромская область', +'Шагонар', +'Тыва', +'Шадринск', +'Курганская область', +'Шали', +'Чечня', +'Шарыпово', +'Красноярский край', +'Шарья', +'Костромская область', +'Шатура', +'Московская область', +'Шахты', +'Ростовская область', +'Шахунья', +'Нижегородская область', +'Шацк', +'Рязанская область', +'Шебекино', +'Белгородская область', +'Шелехов', +'Иркутская область', +'Шенкурск', +'Архангельская область', +'Шилка', +'Забайкальский край', +'Шимановск', +'Амурская область', +'Шиханы', +'Саратовская область', +'Шлиссельбург', +'Ленинградская область', +'Шумерля', +'Чувашия', +'Шумиха', +'Курганская область', +'Шуя', +'Ивановская область', +'Щёкино', +'Тульская область', +'Щёлкино', +'не призн.', +'Крым', +'Щёлково', +'Московская область', +'Щигры', +'Курская область', +'Щучье', +'Курганская область', +'Электрогорск', +'Московская область', +'Электросталь', +'Московская область', +'Электроугли', +'Московская область', +'Элиста', +'Калмыкия', +'Энгельс', +'Саратовская область', +'Эртиль', +'Воронежская область', +'Югорск', +'Ханты-Мансийский АО', +'Южа', +'Ивановская область', +'Южно-Сахалинск', +'Сахалинская область', +'Южно-Сухокумск', +'Дагестан', +'Южноуральск', +'Челябинская область', +'Юрга', +'Кемеровская область', +'Юрьев-Польский', +'Юрьевец', +'Ивановская область', +'Юрюзань', +'Челябинская область', +'Юхнов', +'Калужская область', +'Ядрин', +'Чувашия', +'Якутск', +'Якутия', +'Ялта', +'не призн.', +'Крым', +'Ялуторовск', +'Тюменская область', +'Янаул', +'Башкортостан', +'Яранск', +'Кировская область', +'Яровое', +'Алтайский край', +'Ярославль', +'Ярославская область', +'Ярцево', +'Смоленская область', +'Ясногорск', +'Тульская область', +'Ясный', +'Оренбургская область', +'Яхрома', +'Московская область', +'Балаклава', +'не призн.', +'Севастополь', +'Зеленогорск', +'Санкт-Петербург', +'Зеленоград', +'Москва', +'Инкерман', +'не призн.', +'Севастополь', +'Колпино', +'Санкт-Петербург', +'Красное Село', +'Санкт-Петербург', +'Кронштадт', +'Санкт-Петербург', +'Кроншлот', +'Ломоносов', +'Санкт-Петербург', +'Московский', +'Москва', +'Передельцы', +'Павловск', +'Санкт-Петербург', +'Петергоф', +'Санкт-Петербург', +'Пушкин', +'Санкт-Петербург', +'Сестрорецк', +'Санкт-Петербург', +'Троицк', +'Москва', +'Щербинка', +'Москва', +'Адыгея', +'Алтай', +'Башкортостан', +'Бурятия', +'Дагестан', +'Ингушетия', +'Кабардино-Балкария', +'Калмыкия', +'Карачаево-Черкесия', +'Карелия', +'Коми', +'Крым', +'Марий Эл', +'Мордовия', +'Северная Осетия', +'Татарстан', +'Тыва', +'Удмуртия', +'Хакасия', +'Чечня', +'Чувашия', +'Якутия', +'Алтайский', +'Забайкальский', +'Камчатский', +'Краснодарский', +'Красноярский', +'Пермский', +'Приморский', +'Ставропольский', +'Хабаровский', +'Амурская', +'Архангельская', +'Астраханская', +'Белгородская', +'Брянская', +'Владимирская', +'Волгоградская', +'Вологодская', +'Воронежская', +'Ивановская', +'Иркутская', +'Калининградская', +'Калужская', +'Кемеровская', +'Кировская', +'Костромская', +'Курганская', +'Курская', +'Ленинградская', +'Липецкая', +'Магаданская', +'Московская', +'Мурманская', +'Нижегородская', +'Новгородская', +'Новосибирская', +'Омская', +'Оренбургская', +'Орловская', +'Пензенская', +'Псковская', +'Ростовская', +'Рязанская', +'Самарская', +'Саратовская', +'Сахалинская', +'Свердловская', +'Смоленская', +'Тамбовская', +'Тверская', +'Томская', +'Тульская', +'Тюменская', +'Ульяновская', +'Челябинская', +'Ярославская', +'Москва', +'атд', +'Санкт-Петербург', +'атд', +'Севастополь', +'атд', +'Еврейская', +'Ненецкий', +'Ханты-Мансийский — Югра', +'Чукотский', +'Ямало-Ненецкий', +'по населению', +'посёлки городского типа', +'Республика Крым', +'Севастополь', +'на территории', +'аннексия', +'не получила международного признания', +] + +def RusNews(NameCity : str): + name = NameCity.title() + if name not in cities: + return False + else: + return True + \ No newline at end of file diff --git a/inform-template.docx b/inform-template.docx new file mode 100644 index 0000000..825e8d7 Binary files /dev/null and b/inform-template.docx differ diff --git a/main.py b/main.py new file mode 100644 index 0000000..d17e235 --- /dev/null +++ b/main.py @@ -0,0 +1,60 @@ +import mainparser +import timeit +from multiprocessing import Process + +def main(dateArr, url): + + #proxy = '152.26.229.42:9443' + threads = [] + totalGuys, config, filepath, noAI, limit = mainparser.getConf() + st_accept = "text/html" + st_useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0" + headers = { + "Accept": st_accept, + "User-Agent": st_useragent} + + for i in dateArr: + print(f"{url}{i}/", i, totalGuys, config, filepath) + + thread = Process(target=mainparser.process, args=(f"{url}{i}/", i, totalGuys, config, filepath, headers, noAI, limit)) + threads.append(thread) + + # print(1) + # print(len(threads), threads) + + for thread in threads: + thread.start() + + for thread in threads: + thread.join() + # for i in dateArr: + # run(process(f"https://ria.ru/{i}/", i)) + +if __name__ == "__main__": + #dateArr = '20240501,20240502'.split(',') + dateArr = mainparser.preparing() + + '''Эй, сделай вот тут снизу выбор зеркалов''' + + url = 'https://ria.ru/' + ''' + Железо на которых запускалось сие творение: + {'кол-во потоков' : 'время за которое выполняется задача'} + Даты: 20240501,20240502 + ТКУ: + {'1': 88.7175525999628} + {'2': 55.970715400064364} +55% прирост к скорости + 2СР (асинхрон, мобильный инет): + {'2': 15.931628999998793} +251% или 457% (с одним потоком) (на мобильном инете!!) + Старшина (асинхрон, мобильный инет): + {'2': 76.97899259999758} + Старшина (асинхрон, 40 ссылок, мобильный инет, лимит 7): + {'2': 69.63641009999992} + ''' + + '''Что еще можно сделать: + 1. перестать пользоваться БЯМ и/или добавить фильтр по тегам + 2. добавить прогрузку последующих новостей через гет-реквест + + 3. собрать через нуитку +''' + dataTime = {f'Tasks/Time: {len(dateArr)}' : timeit.timeit('main(dateArr, url)', number=1, globals=globals())} + print(dataTime) \ No newline at end of file diff --git a/mainparser.py b/mainparser.py new file mode 100644 index 0000000..3436c3b --- /dev/null +++ b/mainparser.py @@ -0,0 +1,461 @@ +import lxml.etree +import requests + +import aiohttp +import asyncio + +import ListOfSities +import configparser + +from time import sleep +import os +import sys +import getopt +import platform +import tkinter.filedialog +from random import randint + +from lxml import etree +import lxml + +# debugging part +# import ssl +# from aiologger import Logger +# from icecream import ic + +# import llm provider +# from freeGPT import Client +from g4f.client import Client + +from asyncio import run +import time + +from docxtpl import DocxTemplate +from bs4 import BeautifulSoup + +# Logger.basicConfig(level=logger.INFO, filename=f"{time.localtime()}") +# Some debugging options... + + + +class bcolors: + HEADER = '\033[95m' + OKBLUE = '\033[94m' + OKCYAN = '\033[96m' + OKGREEN = '\033[92m' + WARNING = '\033[93m' + FAIL = '\033[91m' + ENDC = '\033[0m' + BOLD = '\033[1m' + UNDERLINE = '\033[4m' + +async def fetch_page(session, url, headers): + # make GET request using session + async with session.get(url, headers=headers) as response: + # return HTML content + return await response.text(), url + +async def get_news_text(urls, headers, limit : int) -> dict: + newslist = {} + # intCountIter = len(urls) // 5 + # if len(urls) / 5 != intCountIter: + # intCountIter += 1 + # throttle aiohttp bruh + connector = aiohttp.TCPConnector(limit=limit) + async with aiohttp.ClientSession(headers=headers, connector=connector) as session: + + # Initialize tasks list + tasks = [] + # loop through URLs and append tasks + for url in urls: + # await print(f"url: {url}, /n intCountIter: {intCountIter}") + tasks.append(fetch_page(session, url, headers=headers)) + + # group and Execute tasks concurrently + htmls = await asyncio.gather(*tasks) + + for url, html in zip(urls, htmls): + newslist.update({url : html}) + + return newslist + +def chDir() -> str: + sep = '' + if platform.system() != 'Linux': + tempi = '' + for i in time.localtime()[1:5]: + tempi += str(i) + try: + os.makedirs(f"{tempi}-inform-pack") + except: + pass + sep += f'\\{tempi}-inform-pack\\' + else: + sep = "/" + return sep + +def preparing() -> list: + print(f"{bcolors.OKBLUE}{bcolors.BOLD}Валек который делает информирование вовремя \n Билд: 2.0.6 от 06.07.24(дембельский){bcolors.ENDC}") + print(f"{bcolors.OKCYAN}{bcolors.BOLD}govnocoded by valo\n Discord: valo#1234 | @valoker\n Telegram: @valoka{bcolors.ENDC}") + + # dateArr = '' + # Remove 1st argument from the + # list of command line arguments + try: + argumentList = sys.argv[1:] + if len(argumentList) == 0: + raise getopt.error("Аргументов нет") + + # Options + options = "hmo:" + + # Long options + long_options = ["Help", "Input="] + + # Parsing argument + arguments, values = getopt.getopt(argumentList, options, long_options) + + # checking each argument + for currentArgument, currentValue in arguments: + + if currentArgument in ("-h", "--help"): + print("Nothing Helpful") + + elif currentArgument in ("-i", "--Input"): + print(("В качестве аргумента было полученно: (% s)") % (currentValue)) + dateArr = str(currentValue) + # ???? + # print(dateArr) + # time.sleep(10) + return dateArr.split(',') + + except getopt.error as err: + # output error, and return with an error code + print(str(err)) + + # ссылки типа: https://ria.ru/20240214/ + # применять только архивы + dateArr = input(f"{bcolors.BOLD}Введите дату (ГГГГММДД): {bcolors.ENDC}").split(',') + return dateArr + +def getConf() -> list: + config = configparser.ConfigParser() + + try: + config.read("Config.ini", encoding='utf-8-sig') + totalGuys = int(config["Main"]["totalGuys"]) + filepath = config["Path"]["PathToFile"] + noAI = config["Main"]["noAI"] + limit = int(config["Main"]["limit"]) + if config["Path"]["PathToFile"] == "None": + filepath = tkinter.filedialog.askopenfilename() + except Exception as e: + print("err:", e) + print(f"""{bcolors.FAIL}Отсутствует фаил конфигурации. \n + Укажите путь до файла шаблона вручную..{bcolors.ENDC}""") + filepath = tkinter.filedialog.askopenfilename() + return totalGuys, config, filepath, noAI, limit + +# def askai(question): +# g4f.debug.logging = False +# g4f.check_version = False +# return Client.create_completion("gpt3", question) + +def askai(question) -> str: + #client.debug.logging = False + #client.check_version = False + client = Client() + response = client.chat.completions.create( + model="gpt-3.5-turbo", + messages=[{"role": "user", "content": f"{question}"}], + ) + + return str(response.choices[0].message.content) + +st_accept = "text/html" +st_useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0" +headers = { + "Accept": st_accept, + "User-Agent": st_useragent} + +def getUpdateLink(url : str): + '''Returns updated link of main page. Gets: latest link ''' + # gets: https://crimea.ria.ru/20240501/rossiyskie-voyska...-1136972211.html + # returns: https://ria.ru/services/20240501/more.html?id=1943375808&date=20240501T223909 + + dataId = '' + dataPublished = '' + # linkdata = [] + # tags = [] + + page = requests.get(url=url, timeout=10) + soup = BeautifulSoup(page.text, "lxml") + + # Bruh moment #1 + tempDataId = url.split('-') + dataId = tempDataId[len(dataId) - 1].split('.')[0] + del tempDataId # cpp moment + + # Bruh moment #2 + dataPublished = soup.find('div', itemprop='datePublished').get_text() + dataPublished = dataPublished.replace('-', '').replace(':', '') + + # Construct final url + temporalUrl = url.split('/') + finalUrl = '/'.join(temporalUrl[0:3]) + finalUrl = f"{finalUrl}/services/{temporalUrl[3]}/more.html?id={dataId}&date={dataPublished}'" + + return finalUrl + +def getUpdateUrls(url : str) -> dict: + '''Get some news (links and newsheaders)''' + + updatedUrl = getUpdateLink(url) + mainPage = requests.get(updatedUrl, timeout=10) + # links = [] + # newsheaders = [] + NLDict = {} + + soup = BeautifulSoup(mainPage.text, "lxml") + allNews = soup.findAll("a", class_="list-item__title color-font-hover-only") + soupedAllNews = BeautifulSoup(str(allNews), "lxml") + + for data in soupedAllNews.findAll(href=True): + # links.append(data['href']) + # newsheaders.append(data.get_text()) + NLDict.update({data['href'] : data.get_text()}) + + return NLDict + +# default values +noAI = True +limit = 7 + +def process(url, date, totalGuys, config, filepath, headers=headers, noAI=noAI, limit=limit): + try: + try: + print(f"{bcolors.OKCYAN}Стучусь до РИА...{bcolors.ENDC}") + mainPage = requests.get(url, timeout=10) + print(f"{bcolors.OKGREEN}Страница получена{bcolors.ENDC}") + except requests.exceptions.Timeout: + print(f"{bcolors.FAIL}Превышено время ожидания{bcolors.ENDC}") + exit(1) + allNews = [] + + soup = BeautifulSoup(mainPage.text, "lxml") + allNews = soup.findAll("a", itemprop='url') + soupedAllNews = BeautifulSoup(str(allNews), features="lxml") + + links = [] + #get links + for data in soupedAllNews.findAll(href=True): + string = data['href'] + + # remove url[:-1] + links.append(string) + links = links[4:] + + #get news headers + newsheaders = [] + for data in soup.findAll("a", class_="list-item__title color-font-hover-only"): + newsheaders.append(data.get_text()) + + # ithink 40 is enough + updatedNews = getUpdateUrls(links[len(links) - 1]) + + # get more news + links = links + list(updatedNews.keys()) + newsheaders = newsheaders + list(updatedNews.values()) + + # asking ai for cool news + for guyNum in range(0, totalGuys): + + newsheadersstring = "$".join(newsheaders) + print(f"{bcolors.OKCYAN}Сборка конспекта для: {bcolors.OKGREEN}{config[f"Utverzhdau_{guyNum}"]["subdivision"]}{bcolors.ENDC}") + # думаю тут нужно использовать tuple + if len(newsheaders) != len(links): + + asd = '' + zxc = [str(i) for i in range(1, len(links) + 1)] + for i in zxc: + if i is not zxc[len(zxc) - 1]: + asd = asd + i + ', ' + else: + asd = asd + i + + print(f"{bcolors.OKCYAN}Количество заголовков/ссылок:", f'{bcolors.OKGREEN}{len(newsheaders)} {bcolors.FAIL + f"\nПохоже, что ссылок больше... Cкорее всего разметка сайта снова сменилась. \nЯзыковая модель не будет помогать в этом запуске. " if len(newsheaders) != len(links) else bcolors.OKGREEN}Количество ссылок: {len(links)}{bcolors.ENDC}') + else: + count = 0 + while True: + try: + if noAI == False: + asd = askai(f"""Есть несколько новостных заголовков, но нужно самые интересные из + них разместить в начале, ответ представь только в виде чисел через запятую и пробелом + после запятой, ответ не должен содержать буквы, только запятые и цифры. После каждой цифры + должен применяться символ ','. Каждый заголовок отделен $, также помести в конец + новости которые содержат какие-либо упомнинания о войнах или содержат слова по типу: + СВО, ВСУ, спецоперация, ДНР, ЛНР, Украинские военные, Украинские боевики, Украинские + и им подобные, После двоеточия перечисленны новостные заголовки, вот они: {newsheadersstring}""").strip() + else: + asd = '' + zxc = [str(i) for i in range(1, len(links) + 1)] + for i in zxc: + if i is not zxc[len(zxc) - 1]: + asd = asd + i + ', ' + else: + asd = asd + i + #asd = "1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19" + print(f"{bcolors.OKCYAN}{'Вывод языковой модели:' if noAI == False else 'Получены новости:'} {bcolors.OKGREEN}{asd}{bcolors.ENDC}") + if int(asd[0]) % 1 == 0 and int(asd[len(asd)-1]) % 1 == 0: + break + except ValueError: + count += 1 + print(f"{bcolors.FAIL}Неинтерпритируеымй ответ от железяки, пробую еще раз...{bcolors.ENDC}") + if count > 3: + print(f"Слишком много вызовов к модели, повторю попытку через 15 сек...") + sleep(5) + if count > 5: + # можешь ты хоть раз себя не повторять? + asd = '' + zxc = [str(i) for i in range(1, len(links))] + for i in zxc: + if i is not zxc[len(zxc) - 1]: + asd = asd + i + ', ' + else: + asd = asd + i + break + + tempNewsLinks = links + links = [] + goodNews = asd.split(", ") #WTF? but its ok + + for i in range(0, len(goodNews)): + if int(goodNews[i]) < len(tempNewsLinks): + links.append(tempNewsLinks[int(goodNews[i]) - 1]) + else: + print("Модель вернула больше новостей, чем есть") + + # for i in goodNews: + # links.append(int(i) - 1) + + # for i in links: + # temptempnews.append(tempNewsLinks[i]) + # links = temptempnews + + print(f"{bcolors.OKCYAN}Получено новостей: {bcolors.OKGREEN}{len(links)}{bcolors.ENDC}") + + newsCity = [] + textNews = '' + foreignNews = '' + countWords = 0 + tempNews = [] + + #get news + newsAbroad = False + anotherStupidFlag = False + + newslist = [] + + newslist = (asyncio.run(get_news_text(links, headers=headers, limit=limit))) + sortedNews = [] + + ''' написать сортировщик, который берет юрл из links и ставит такой же порядок + ссылок как и в newslist''' + + # stupid way + # лишняя переменная + for link in links: + sortedNews.append(newslist.get(link)) + + #debug + # with open('wet.txt', 'w') as f: + # for i, o in sortedNews: + # try: + # print(i, o, file=f) + # except UnicodeEncodeError: + # pass + + for page, url in sortedNews: + soup = BeautifulSoup(str(page), "html.parser") + try: + text = soup.find('div', itemprop='articleBody').get_text() + #print(link, text) + except: + continue + newsCity.append(ListOfSities.RusNews(text.split(",", 1)[0])) + + if ListOfSities.RusNews(text.split(",", 1)[0]) == False: + tempNews.append(text + '') + if newsAbroad == True: + foreignNews += text + '' + anotherStupidFlag = True + countWords += len(textNews.split(" ")) + if countWords > 890: + newsAbroad = False + break + else: + if countWords <= 790 and newsAbroad == False: + textNews += text + '' + countWords += len(textNews.split(" ")) + else: + if newsAbroad == False: + newsAbroad = True + + if (foreignNews == '' and newsAbroad == True) or countWords < 750: + print(f'{bcolors.WARNING}В конечный фаил будет добавлена дополнительная новость, поскольку УВ2 пуст (количество слов, наличие УВ2){bcolors.ENDC}', countWords, anotherStupidFlag) + for news in tempNews: + if countWords < 890 or anotherStupidFlag == False: + anotherStupidFlag = True + foreignNews += news + '' + + #count lines + totalLines = int(len(textNews) // 30) + manyIndent = '' * totalLines + + #debug + #print(newsCity) + #print(foreignNews) + #print(textNews) + #print(totalLines) + #print(countWords) + + #docx processing + try: + doc = DocxTemplate(filepath) + except Exception as e: + print("err", e) + exit(1) + + + context = { 'news_text' : f"{textNews}", + 'empty_line' : f"{manyIndent}", + 'service_position' : f'{config[f"Utverzhdau_{guyNum}"]["commander"]}', + 'rank' : f'{config[f"Utverzhdau_{guyNum}"]["rank"]}', + 'rank' : f'{config[f"Utverzhdau_{guyNum}"]["rank"]}', + # valek is sus + 'full_name' : f'{config[f"Utverzhdau_{guyNum}"]["name"].replace('"', '') if randint(83, 100) > 83 else 'В.А. Дорофеев'}', + + 'day' : f'{date[6:8]}', + 'month' : f'{date[4:6]}', + 'year' : f'{date[:4]}', + #some hardcode + 'subdivision' : f'{config[f"Utverzhdau_{guyNum}"] + ["subdivision"].replace(' ', ' ' * int(config[f"Utverzhdau_{guyNum}"]["spaces"]))}', + 'plan_subdivision' : f'{config[f"Utverzhdau_{guyNum}"]['subdivision']}', + 'plan_squad' : f'{config["Plan"]["squad"] if config[f"Utverzhdau_{guyNum}"]['subdivision'] + != "телекоммуникационного узла" else " "}', + 'foreign_text' : f"{foreignNews}"} + doc.render(context) + + sep = chDir() + + fullPath = f"{os.getcwd()}{sep}gen-{config[f"Utverzhdau_{guyNum}"]['subdivision']}-{date}.docx" + print(fullPath) + + doc.save(fullPath) + os.system('"' + fullPath + '"') + + except BaseException as err: + print(err) + input("enter any key to exit") + exit(1) \ No newline at end of file