def howToConnectFtp(self, emailFrom): answer = "" cpanelUsersAccounts = getAccountsList() # Получаем список всех хостинг услуг по адресу контактной почты ListOfHostingServices = DomainbyApi.getListofHostingServices(emailFrom) if not len(ListOfHostingServices): return "Подробная информация по настройке FTP: https://domain.by/info-help/cpanel/#question_10" for hosting in ListOfHostingServices: domainName = hosting["DomainName"] if (cpanelUsersAccounts[domainName].email not in hosting["AllEmails"] or cpanelUsersAccounts[domainName].email != emailFrom): self.changeContactEmailInCpanel(emailFrom, domainName, cpanelUsersAccounts) else: self.botLog.debug( 'Контактная почта в панели хостинга совпадает с панелью доменов.' ) answer += self.accessToFtp(domainName, cpanelUsersAccounts[domainName].server, hosting["ServiceStatus"]) return answer
def blockByEmail(self, message): cpanelUsersAccounts = getAccountsList() if (len(message.split(' ')) < 2): self.botLog.critical("[/blockmail] Email не указан.") self.sendMessageGroup("[/blockmail] Email не указан.") return _email = message.split(' ')[1] if (_email == "" or '@' not in _email): self.botLog.critical( "[/blockmail] Email не указан или указан неверно.") self.sendMessageGroup( "[/blockmail] Email не указан или указан неверно.") return _domain = _email.split('@')[1] _hosting = self.getServerbyEmail(_domain) if (_hosting is None): self.botLog.info("[/blockmail] Аккаунт хостинга не найден : %s" % _email) self.sendMessageGroup( "[/blockmail] Аккаунт хостинга не найден : %s" % _email) return _username = cpanelApiClient[_hosting].call_v1( 'domainuserdata', domain=_domain)['data']['userdata']['user'] self.botLog.debug("[/blockmail] Имя пользователя: %s" % _username) _answer = (cpanelApiClient[_hosting].uapi('Email', 'suspend_login', user=_username, email=_email)) _status = int(_answer['result']['status']) _message = _answer['result']['messages'] if (_status == 1): self.botLog.info( "Возможность входа для почтового аккаунта: %s заблокирована. Аккаунт хостинга: %s. Сервер: %s" % (_email, _username, _hosting)) self.sendMessageGroup( "Возможность входа для почтового аккаунта: %s заблокирована. Аккаунт хостинга: %s. Сервер: %s" % (_email, _username, _hosting)) return self.botLog.critical("[/blockmail] Ошибка блокировки: %s %s" % (_answer, _message)) self.sendMessageGroup("[/blockmail] Ошибка блокировки: %s %s" ( _answer, _message))
def unSuspendOutgoingEmail(self, message): cpanelUsersAccounts = getAccountsList() if (len(message.split(' ')) < 2): self.botLog.critical("[/unSuspendOutgoingEmail] Email не указан.") self.sendMessageGroup("[/unSuspendOutgoingEmail] Email не указан.") return _email = message.split(' ')[1] if (_email == "" or '@' not in _email): self.botLog.critical( "[/unSuspendOutgoingEmail] Email указан неверно.") self.sendMessageGroup( "[/unSuspendOutgoingEmail] Email указан неверно.") return _domain = _email.split('@')[1] _hosting = self.getServerbyEmail(_domain) if (_hosting is None): self.botLog.info( "[/unSuspendOutgoingEmail] Аккаунт хостинга не найден : %s" % _email) self.sendMessageGroup( "[/unSuspendOutgoingEmail] Аккаунт хостинга не найден : %s" % _email) return _username = cpanelApiClient[_hosting].call_v1( 'domainuserdata', domain=_domain)['data']['userdata']['user'] self.botLog.debug("[/unSuspendOutgoingEmail] Имя пользователя: %s" % _username) _answer = cpanelApiClient[_hosting].call_v1('unsuspend_outgoing_email', user=_username) _status = int(_answer['metadata']['result']) if (_status == 1): self.botLog.info( "Возможность отправки почты для: %s разблокирована. Сервер: %s" % (_username, _hosting)) self.sendMessageGroup( "Возможность отправки почты для: %s разблокирована. Сервер: %s" % (_username, _hosting)) return self.botLog.critical( "[/unSuspendOutgoingEmail] Ошибка разблокировки: %s" % (_message)) self.sendMessageGroup( "[/unSuspendOutgoingEmail] Ошибка разблокировки: %s" % (_message))
def grantAccessToSsh(self, emailFrom): answer = "" cpanelUsersAccounts = getAccountsList() # Получаем список всех хостинг услуг по адресу контактной почты ListOfHostingServices = DomainbyApi.getListofHostingServices(emailFrom) if not len(ListOfHostingServices): return "На данный контактный адрес почты не найдено зарегистрированных услуг.\n Заявка должна быть оформлена с контактного адреса почты хостинга." for hostingService in ListOfHostingServices: try: domainName = hostingService["DomainName"] server = cpanelUsersAccounts[domainName].server username = cpanelUsersAccounts[domainName].username package = cpanelUsersAccounts[domainName].package if ("xS" in package): answer = "Для аккаунта хостинга %s отсутствует возможность доступа по SSH:\n https://domain.by/info-help/hosting/#question_12 \n\n" % ( domainName) continue # TODO CHECK IT if (cpanelUsersAccounts[domainName].email not in hostingService["AllEmails"] or cpanelUsersAccounts[domainName].email != emailFrom): self.changeContactEmailInCpanel(emailFrom, domainName, cpanelUsersAccounts) else: self.botLog.debug( 'Контактная почта в панели хостинга совпадает с панелью доменов.' ) output = cpanelApiClient[server].call_v1('modifyacct', user=username, HASSHELL=1) answer += "Произведена активация ssh доступа для %s:\n" % ( domainName) self.botLog.debug(output) answer += self.accessToSsh(domainName, server, username, hostingService["ServiceStatus"]) except KeyError: self.botLog.error( "Аккаунт хостинга не обнаружен на серверах: %s" % domainName) self.sendMessageGroup( "Аккаунт хостинга не обнаружен на серверах: %s" % domainName) return answer
def getServerbyEmail(self, _domain): cpanelUsersAccounts = getAccountsList() self.botLog.info( "[getServerbyEmail] Производится поиск домена %s на хостинге..." % _domain) for key, capi in cpanelApiClient.items(): _local = capi.call('domainuserdata', domain=_domain) _status = int(_local['result'][0]['status']) if (_status == 1): return key return None
def managerParse(self, ticket): if (re.match(u'Смена\s{1,}(ТП)?(тарифного)?', ticket.subject)): try: _domain = (re.search( '\s[a-zA-Z]{1,15}((-|\.)[a-zA-Z]{1,10})?((-|\.)[a-zA-Z]{1,10})?\.([a-zA-Z]{1,6})(\.|\s)', ticket.message).group(0) ).strip().lower().encode('idna').decode('utf-8') _package = re.search('на (xS|S|M|L|XXL|MAX)', ticket.message).group(0).split()[1] cpanelUsersAccounts = getAccountsList() hosting = cpanelUsersAccounts[_domain].server username = cpanelUsersAccounts[_domain].username answer = cpanelApiClient[hosting].call( 'changepackage', user=username, pkg=_package)['result'][0] status = int(answer['status']) message = answer['statusmsg'] if (status == 1): self.CheckHandlerLog.info( "[managerParse][%s][%s] смена тарифного плана. " % (ticket.ticket_id, _domain)) self.openbot.sendMessageMe( "[managerParse][%s][%s] смена тарифного плана. " % (ticket.ticket_id, _domain)) hdapi.postQuickReply( ticket.ticket_id, "[OpenContactBot] Тарифный план изменен на %s для домена: %s " % (_package, _domain), HdTicketStatus.CLOSED, self.openbot) return True else: self.CheckHandlerLog.critical( "[managerParse][%s][%s] %s." % (ticket.ticket_id, _domain, ticket.message)) self.openbot.sendMessageMe( "[managerParse][%s][%s] %s. " % (ticket.ticket_id, _domain, ticket.message)) except Exception as inst: self.CheckHandlerLog.critical("[managerParse] %s" % type(inst)) self.CheckHandlerLog.critical("[managerParse] %s" % inst.args) return False
def restoreCpanelPassword(self, emailFrom): answer = "" cpanelUsersAccounts = getAccountsList() ListOfHostingServices = DomainbyApi.getListofHostingServices(emailFrom) if not len(ListOfHostingServices): return "На данный контактный адрес почты не найдено зарегистрированных услуг. Заявка на восстановление доступа должна быть отправлена с контактного адреса хостинга." suspended = False for hosting in ListOfHostingServices: domainName = hosting["DomainName"] if (cpanelUsersAccounts[domainName].email not in hosting["AllEmails"] or cpanelUsersAccounts[domainName].email != emailFrom): self.changeContactEmailInCpanel(emailFrom, domainName, cpanelUsersAccounts) else: self.botLog.debug( 'Контактная почта в панели хостинга совпадает с панелью доменов.' ) if (hosting["ServiceStatus"] == ServiceStatusTypes.OK.name): answer += self.resetCpanelPasswordText( domainName, cpanelUsersAccounts[domainName].server, cpanelUsersAccounts[domainName].username, cpanelUsersAccounts[domainName].email, hosting["ServiceStatus"]) else: suspended = True answer += self.HostingAccountSuspended(domainName) if (len(ListOfHostingServices) == 1 and not suspended) or len(ListOfHostingServices) > 1: answer += self.additionalFtpInfo() return answer
def parseDomainbyTask(self, ticket): if re.match(u'Ошибки при автоматическом запуске хостинга', ticket.subject): try: if ('Время ожидания операции истекло' in ticket.message): self.CheckHandlerLog.info("[Таймаут][{0}] Закрыт".format( ticket.ticket_id)) self.openbot.sendMessageMe("[Таймаут][{0}] Закрыт".format( ticket.ticket_id)) elif ('Данного хостинга нету на сервере' in ticket.message): self.CheckHandlerLog.info( "[Таймаут][{0}] Хостинг отсутствует на сервере.". format(ticket.ticket_id)) self.openbot.sendMessageMe( "[Таймаут][{0}] Хостинг отсутствует на сервере.". format(ticket.ticket_id)) Datebase().setTicketClose(ticket.ticket_id) return True except Exception as inst: self.CheckHandlerLog.critical( "[parseDomainbyTask][запуск хостинга] %s" % (inst)) self.CheckHandlerLog.critical(sys.exc_info()[0]) return False if re.match( u'Изменение тарифного плана виртуального хостинга для домена', ticket.subject ) or (re.search( u'\<td\>В ДМС изменен тарифный план виртуального хостинга для домена', ticket.message) is not None): try: domain = re.search( u'Изменение тарифного плана виртуального хостинга для домена (.+?)</td>', ticket.message).group(1).strip().lower().encode( 'idna').decode('utf-8') #prevPackage = re.search(u'с плана \"(.+?)" на план',ticket.message).group(1) afterPackage = re.search(u'на план \"(.+?)"\.<br', ticket.message).group(1) cpanelUsersAccounts = getAccountsList() hosting = cpanelUsersAccounts[domain].server username = cpanelUsersAccounts[domain].username answer = cpanelApiClient[hosting].call( 'changepackage', user=username, pkg=afterPackage)['result'][0] status = int(answer['status']) message = answer['statusmsg'] #self.CheckHandlerLog.info("[Package][%s] Сообщение: %s" %(domain , message)) if (status == 1): self.CheckHandlerLog.info( "[Package][%s][%s] смена тарифного плана. " % (ticket.ticket_id, domain.encode('idna').decode('idna'))) self.openbot.sendMessageMe( "[Package][%s][%s] смена тарифного плана. " % (ticket.ticket_id, domain.encode('idna').decode('idna'))) Datebase().setTicketClose(ticket.ticket_id) else: self.CheckHandlerLog.critical( "[Package][%s][%s] %s." % (ticket.ticket_id, domain.encode('idna').decode('idna'), ticket.message)) self.openbot.sendMessageMe( "[Package][%s][%s] %s. " % (ticket.ticket_id, domain.encode('idna').decode('idna'), ticket.message)) return True except Exception as inst: self.CheckHandlerLog.critical("[Package] %s" % (inst)) self.CheckHandlerLog.critical(sys.exc_info()[0]) return False else: self.CheckHandlerLog.critical( "[parseDomainbyTask][%s] Заявка не классифицирована." % (ticket.ticket_id)) self.openbot.sendMessageMe( "[parseDomainbyTask][%s] Заявка не классифицирована. " % (ticket.ticket_id)) return False
def handle(self, msg): self.botLog.debug(msg) content_type, chat_type, chat_id = telepot.glance(msg) id, username = msg['from']['id'], msg['from']['username'] #combine = dict(list(activeTickets.items()) + list(activeRepTickets.items())) if (content_type, chat_type, chat_id, id, username) is None: self.botLog.critical("Сообщение не обработано.") return if (content_type != 'text'): self.send(username, chat_id, '', '[NOT IMPLEMENTED] Данный контент не поддерживается.') return message = msg['text'] if (self.checkAuth(id, username)): if (chat_type == 'private'): main_keyboard = [['Домены', 'Хостинг'], ['Другое', 'Выход']] sub_keyboard = [['Sub option #1_1', 'Sub option #1_2'], ['Sub option #1_3', 'Sub option #1_4'], ['Back to Main menu']] if message == '/start': self.sendMessage(chat_id, '.', reply_markup={ 'keyboard': main_keyboard, 'resize_keyboard': True }) elif message in [j for i in main_keyboard for j in i]: if message == 'Домены': sub_buttons = {'keyboard': sub_keyboard} self.sendMessage(chat_id, '.', reply_markup=sub_buttons) elif message == 'Выход': self.sendMessage( chat_id, ".", reply_markup={'remove_keyboard': True}) elif message in [j for i in sub_keyboard for j in i]: # an option from Sub keyboard is chosen: if message == 'Sub option #1_1': self.sendMessage(chat_id, 'Sub selected %s' % message) if message == 'Back to Main menu': self.sendMessage( chat_id, 'Main options', reply_markup={'keyboard': main_keyboard}) else: self.sendMessage( chat_id, 'Invalid Message. please select an option from keyboard' ) elif (chat_type == 'group'): # Replace double spaces and cleanup message = ' '.join(message.strip().split()) if (message[0] == '/'): if (len(message.split(' ')) > 1): checkCmd = message.split(' ')[0] else: checkCmd = message self.botLog.warning("Получена комманда: %s" % checkCmd) if (checkCmd == '/help'): self.sendMessageGroup(""" /help - Данное меню. /update - Проверка наличия обновлений. /fupdate - Принудительное обновление. /version - Отображает версию ядра. /uptime - Отображает время с момента запуска. /exclude - Добавляет или удаляет доменное имя в список исключений. (/exclude domain.by) /cpreload - Принудительно загружает список аккаунтов из cpanel. /bemail - Блокировка авторизации для почтового аккаунта (/blockemail) /unemail - Разблокировка авторизации для почтового аккаунта (/unblockemail) /restore - Функция для тестирования ответа сервера (/restore email) /smail - Блокировка возможности отправки исходящей почты для аккаунта (/suspendemail email) /unsmail - Разблокировка возможности отправки исходящей почты для аккаунта (/unsuspendemail email) /session - Генерирует одноразовую ссылку для авторизации в cpanel пользователя (/session domain.by) Следующие команды используются , как ответ(reply) на сообщение: .move - Перемещает заявку на менеджеров. .restore - Генерирует ссылку для сброса пароля. .spam - Перемещает заявку в спам с блокировкой отправителя в hd. .close - Перемещает заявку в закрытые. .exclude - Добавляет или удаляет доменное имя в список исключений. Пример: .exclude domain.by .ssh - Добавляет пользователю возможность подключения по ssh. .ftp - Предоставляет информацию по подключению к FTP. """) return if (checkCmd == '/restore'): subcommand = message.split()[1] self.sendMessageGroup( '[/restore]%s' % (self.restoreCpanelPassword(subcommand))) return if (checkCmd == '/ssh'): subcommand = message.split()[1] self.sendMessageGroup( '[/ssh]%s' % (self.grantAccessToSsh(subcommand))) return if (checkCmd == '/update'): self.sendMessageGroup( "Проводим проверку наличия обновлений...") Util.checkUpdate(self.botLog, self) return if (checkCmd == '/fupdate'): self.sendMessageGroup( "Производим принудительное обновление...") Util.checkUpdate(self.botLog, self, True) return if (checkCmd == '/version'): self.sendMessageGroup( 'Текущая версия: %s \nВерсия на сервере: %s' % (Util.getCurrentVersion(), Util.getVersionAtServer())) return if (checkCmd == '/uptime'): self.sendMessageGroup('Время работы: %s' % (Util.getUpime())) return if (checkCmd == '/cpreload'): self.sendMessageGroup( 'Принудительная загрузка хостинг аккаунтов.') loadDataFromServers(True) self.sendMessageGroup( "...Завершено.Найдено %s аккаунтов." % (len(getAccountsList()))) self.botLog.info("...Загружено %s аккаунтов." % (len(getAccountsList()))) return if (checkCmd == '/exclude'): if (len(message.split(' ')) > 1): subcommand = message.split(' ')[1] else: self.botLog.critical( "[/exclude] Имя домена не указано.") self.sendMessageGroup( "Имя домена не указано. Cписок исключений: %s" % (",".join(Config.getExcludeDomainList()))) return tempExcludeList = Config.getExcludeDomainList() if (subcommand in tempExcludeList): tempExcludeList.remove(subcommand) else: tempExcludeList.append(subcommand) Config.setConfigValue('exclude', 'create', ",".join(tempExcludeList)) Config.saveConfig() self.sendMessageGroup( "[.exclude] Сохранен список исключений: %s" % (",".join(tempExcludeList))) return if (checkCmd in ['/bemail', '/blockemail']): self.blockByEmail(message) return if (checkCmd in ['/unemail', '/unblockemail']): self.unBlockEmail(message) return if (checkCmd in ['/smail', '/suspendemail']): self.suspendOutgoingEmail(message) return if (checkCmd in ['/unsmail', 'unsuspendemail']): self.unSuspendOutgoingEmail(message) return if (checkCmd == '/session'): if (len(message.split(' ')) > 1): subcommand = message.split(' ')[1] else: self.botLog.critical( "[/session] Имя домена не указано.") self.sendMessageGroup("Имя домена не указано.") return try: answer = getDataFromApi( '/api/session/{0}'.format(subcommand)) _str = "" for server in answer: _str += "".join( "[{0}] \n Cсылка: {1} \n\n".format( server, answer[server]['url'])) self.sendMessageGroup(_str) except Exception as exc: self.botLog.critical( "[/session] Во время выполнения возникло исключение: %s" % repr(exc)) self.sendMessageGroup( "[/session] Во время выполнения возникло исключение: %s" % repr(exc)) return self.botLog.critical( "[command] Команда не обработана: %s" % checkCmd) self.sendMessageGroup( "[command] Команда не обработана: %s" % checkCmd) return try: #Implement accept reply to ticket message if msg['reply_to_message'] is not None: #The don`t ticket`s reply if (re.search('\[(Ticket|Reply)]\[(.+?)]', msg['reply_to_message']['text']) is None): self.botLog.error( "[handle][NOT_ERROR] Не удалось извлечь идентификатор заявки.\n" ) return ticket_id = re.search( '\[(Ticket|Reply)]\[(.+?)]', msg['reply_to_message']['text']).group(2) original_message_id = ( GroupId, msg['reply_to_message']['message_id']) ticket_email = Datebase().getEmailByTicketId(ticket_id) if (message[0] == '.'): command = message.split(' ')[0] self.botLog.warning("Получена комманда: %s" % command) if (command == '.restore'): try: reset_answer = self.restoreCpanelPassword( ticket_email) trueAnswer = [ 'не найдено зарегистрированных услуг', 'Сбросить пароль вы можете по ссылке' ] self.botLog.warning(reset_answer) if any(x in reset_answer for x in trueAnswer): hdapi.postQuickReply( ticket_id, reset_answer, HdTicketStatus.CLOSED, self) else: self.sendMessageGroup(reset_answer) except Exception as exc: self.botLog.critical( "[.restore] Во время выполнения возникло исключение: %s" % repr(exc)) self.sendMessageGroup( "[.restore] Во время выполнения возникло исключение: %s" % repr(exc)) return if (command == '.move'): try: dept_id = dept.DOMAIN Datebase().moveTicketTo( dept_id.value, ticket_id) self.deleteMessage(original_message_id) self.botLog.critical( "[.move] Заявка %s перемещена в отдел: %s" % (ticket_id, dept_id.name)) self.sendMessageGroup( "[.move] Заявка %s перемещена в отдел: %s" % (ticket_id, dept_id.name)) except Exception as exc: self.botLog.critical( "[.move] Во время выполнения возникло исключение: %s" % repr(exc)) return if (command == '.spam'): spam_email = ticket_email Datebase().setSpamEmail(spam_email) Datebase().setTicketSpam(ticket_id) self.deleteMessage(original_message_id) return if (command == '.ssh'): try: reset_answer = self.grantAccessToSsh( ticket_email) trueAnswer = [ 'не найдено зарегистрированных услуг', 'как в панели управления хостингом', 'отсутствует возможность доступа', ] self.botLog.warning(reset_answer) if any(x in reset_answer for x in trueAnswer): hdapi.postQuickReply( ticket_id, reset_answer, HdTicketStatus.CLOSED, self) else: self.sendMessageGroup(reset_answer) except Exception as exc: self.botLog.critical( "[.ssh] Во время выполнения возникло исключение: %s" % repr(exc)) self.sendMessageGroup( "[.ssh] Во время выполнения возникло исключение: %s" % repr(exc)) return if (command == '.ftp'): try: reset_answer = self.howToConnectFtp( ticket_email) trueAnswer = [ 'Подробная информация по настройке FTP', 'как и для доступа в cPanel' ] self.botLog.warning(reset_answer) if any(x in reset_answer for x in trueAnswer): hdapi.postQuickReply( ticket_id, reset_answer, HdTicketStatus.CLOSED, self) else: self.sendMessageGroup(reset_answer) except Exception as exc: self.botLog.critical( "[.ftp] Во время выполнения возникло исключение: %s" % repr(exc)) self.sendMessageGroup( "[.ftp] Во время выполнения возникло исключение: %s" % repr(exc)) return if (command == '.close'): Datebase().setTicketClose(ticket_id) self.deleteMessage(original_message_id) return if (command == '.exclude'): subcommand = message.split(' ')[1] if (subcommand is None or subcommand == ""): self.botLog.critical( "[.exclude] Имя домена не указано.") return tempExcludeList = Config.getExcludeDomainList() if (subcommand in tempExcludeList): self.deleteMessage(original_message_id) tempExcludeList.remove(subcommand) else: tempExcludeList.append(subcommand) Config.setConfigValue( 'exclude', 'create', ",".join(tempExcludeList)) Config.saveConfig() Datebase().setTicketClose(ticket_id) self.deleteMessage(original_message_id) self.sendMessageGroup( "[.exclude] Сохранен список исключений: %s" % (",".join(tempExcludeList))) return self.botLog.critical( "[command] Команда не обработана: %s" % command) self.sendMessageGroup( "[command] Команда не обработана: %s" % command) return hdapi.postQuickReply(ticket_id, msg['text'], HdTicketStatus.OPEN, self) except Exception as exc: self.botLog.debug("[Exception][handle] %s" % repr(exc)) self.sendMessageMe("[Exception][handle] %s" % repr(exc)) pass else: self.send(username, chat_id, message, 'Вы не авторизованы ¯\_(ツ)_/¯')
def checkBlockError(self, browser): exclude_list = cfg.getExcludeDomainList() soup = BeautifulSoup(browser.response.text, "html.parser") haveValue = True i = 1 temp = [] while (haveValue): try: domain = soup.find( id= "ctl00_contentHolder_TaskList_ucStop_rptServiceList_ctl0%s_lblDomain" % i).text.replace('www.', '') status = soup.find( id= "ctl00_contentHolder_TaskList_ucStop_rptServiceList_ctl0%s_lblCpanelError" % i).text url_block = "https://domain.by/BackEnd/Support/" + soup.find( id= "ctl00_contentHolder_TaskList_ucStop_rptServiceList_ctl0%s_hlAction" % i).get('href') if (status != "Ошибка"): i += 1 continue if (re.search('[а-яА-Я]', domain)): domain = domain.encode("idna").decode("utf-8") if (domain not in listBlockHosting): self.dLog.info( "[Domain.by] Обнаружена ошибка блокировки: %s" % domain.encode("utf-8").decode("idna")) self.openbot.sendMessageGroup( "[Domain.by] Обнаружена ошибка блокировки: %s" % domain.encode("utf-8").decode("idna")) listBlockHosting.append(domain) if (len(listBlockHosting) > 0): save_obj(listBlockHosting, 'listBlockHosting') if (domain in exclude_list): self.dLog.info( "[Domain.by] [Ошибка блокировки] %s в списке исключений." % domain.encode("utf-8").decode("idna")) self.openbot.sendMessageGroup( "[Domain.by] [Ошибка блокировки] %s в списке исключений." % domain.encode("utf-8").decode("idna")) i += 1 continue browser.open(url_block) hosting = getAccountsList()[domain].server self.dLog.info( "[Domain.by] [Ошибка блокировки] Расположен на сервере: %s" % hosting) dataToPost = self._get_form_post_data(browser) dataToPost[ "ctl00$contentHolder$HostingServersList$HostingServers"] = hostingServerDmsList[ hosting] dataToPost["ctl00$contentHolder$cbCpanelSynchro"] = "on" dataToPost["ctl00$contentHolder$btnStop"] = "Блокировать" browser.open(url_block, method='post', data=dataToPost) self.dLog.info( 'Для доменного имени %s необходимо произвести смену хостинг сервера на %s' % (domain.encode("utf-8").decode("idna"), hosting)) self.openbot.sendMessageMe( "[Domain.by] [Ошибка блокировки] Для доменного имени %s необходимо произвести смену хостинг сервера на %s." % domain.encode("utf-8").decode("idna"), hosting) i += 1 except KeyError as inst: i += 1 self.dLog.critical( "[checkBlockError] %s не найден на хостинге." % domain) self.openbot.sendMessageGroup( "[checkBlockError] %s не найден на хостинге." % domain) pass except RuntimeError as inst: self.dLog.critical("[checkBlockError] %s" % inst) self.openbot.sendMessageGroup( "[Domain.by][checkBlockError][RuntimeError]: %s" % (inst)) except Exception as inst: haveValue = False