feat: получение списка доменов

This commit is contained in:
2025-07-18 01:48:18 +03:00
parent 6770c4e7fe
commit eb3c7b8899
4 changed files with 954 additions and 3 deletions

View File

@@ -28,7 +28,9 @@ ext {
dependencies {
implementation("org.apache.httpcomponents.client5:httpclient5:5.5")
implementation("org.apache.commons:commons-lang3:3.18.0")
implementation("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion")
implementation("org.jsoup:jsoup:1.21.1")
testImplementation(platform("org.junit:junit-bom:$junitVersion"))
testImplementation("org.junit.jupiter:junit-jupiter")

View File

@@ -1,14 +1,23 @@
package ru.di9.ihc;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.entity.UrlEncodedFormEntity;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
import org.apache.hc.core5.http.message.BasicNameValuePair;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class IhcClient {
@@ -16,6 +25,8 @@ public class IhcClient {
private final CloseableHttpClient httpClient;
private final ObjectMapper mapper;
private boolean isAuth = false;
public IhcClient(String baseUrl) {
this.baseUrl = baseUrl;
this.httpClient = HttpClientBuilder.create().build();
@@ -34,9 +45,8 @@ public class IhcClient {
new BasicNameValuePair("ihccaptcha", "")
)));
boolean authResult;
try {
authResult = httpClient.execute(httpPost, resp -> {
isAuth = httpClient.execute(httpPost, resp -> {
if (resp.getCode() != 200) {
return false;
}
@@ -48,6 +58,36 @@ public class IhcClient {
throw new RuntimeException(e);
}
return authResult;
return isAuth;
}
public List<Pair<Integer, String>> getDomains() {
if (!isAuth) {
throw new RuntimeException("IS NOT AUTH");
}
HttpGet httpGet = new HttpGet(URI.create("%s/dnsZone/list".formatted(baseUrl)));
httpGet.setHeader("Accept", "text/html");
try {
return httpClient.execute(httpGet, resp -> {
if (resp.getCode() != 200) {
return Collections.emptyList();
}
List<Pair<Integer, String>> list = new ArrayList<>();
Document document = Jsoup.parse(resp.getEntity().getContent(), StandardCharsets.UTF_8.name(), baseUrl);
Elements elements = document.select("li[class='zoneList__zone'] a");
for (Element element : elements) {
Integer id = Integer.valueOf(element.attr("href").substring(1).split("/")[2]);
String domain = element.text();
list.add(Pair.of(id, domain));
}
return list;
});
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

View File

@@ -0,0 +1,59 @@
package ru.di9.ihc;
import com.github.tomakehurst.wiremock.WireMockServer;
import com.github.tomakehurst.wiremock.client.WireMock;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;
import static com.github.tomakehurst.wiremock.client.WireMock.get;
import static com.github.tomakehurst.wiremock.client.WireMock.post;
import static org.junit.jupiter.api.Assertions.assertEquals;
class GetDomainsTest {
static int port;
static WireMockServer wireMockServer;
@BeforeAll
static void beforeAll() {
port = RandomUtils.nextInt(9000, 9999);
wireMockServer = new WireMockServer(port);
wireMockServer.start();
}
@AfterAll
static void afterAll() {
wireMockServer.stop();
}
@AfterEach
void after() {
wireMockServer.resetAll();
}
@Test
void test() throws IOException {
wireMockServer.stubFor(post("/j_spring_security_check?ajax=true")
.willReturn(WireMock.okJson("""
{"redirect":{"url":"/"},"alert":{"type":"none","message":""}}""")));
wireMockServer.stubFor(get("/dnsZone/list")
.willReturn(WireMock.ok(IOUtils.resourceToString("/ihc-dns.html", StandardCharsets.UTF_8))
.withHeader("Content-Type", "text/html")));
var ihc = new IhcClient("http://localhost:%d".formatted(port));
ihc.auth("user1", "passwd1");
List<Pair<Integer, String>> domains = ihc.getDomains();
assertEquals(2, domains.size());
assertEquals(Pair.of(111111, "example-1.ru"), domains.get(0));
assertEquals(Pair.of(222222, "example-2.ru"), domains.get(1));
}
}

View File

@@ -0,0 +1,850 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<link href="/favicon.ico" rel="shortcut icon" type="image/x-icon" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="IHC.RU">
<meta http-equiv="X-UA-Compatible" content="IE=EDGE"/>
<title data-title-content="Интернет Хостинг Центр | Список DNS зон">
Интернет Хостинг Центр | Список DNS зон
</title>
<script type="text/javascript">
window.onerror = function (m, u, l) {
console.log("Error");
console.log(" | " + m);
console.log(" | " + u + " : line " + l);
jQuery.post("/jsError/jsError", { msg: m, url: u, line: l, window: window.location.href });
return true;
};
function loadError(u){
console.log("Load error");
console.log(" | " + u);
jQuery.post("/jsError/loadError", { url: u, window: window.location.href });
return true;
}
window.logAjaxServerError = function () {
jQuery.post("/serverError/logAjaxServerError", { url: location.href });
return true;
};
</script>
<link rel="stylesheet" href="/css/ihc.css?XXXXXXXXXXXX" type="text/css" media="all"/>
<link rel="stylesheet" href="/css/bootstrap-editable.css?XXXXXXXXXXXX" type="text/css" media="all"/>
<link rel="stylesheet" href="/css/font-awesome.css?XXXXXXXXXXXX" type="text/css" media="all"/>
<link rel="stylesheet" href="/css/font-awesome-5.css?XXXXXXXXXXXX" type="text/css"
media="all"/>
<link rel="stylesheet" href="/css/font-mfizz.css?XXXXXXXXXXXX" type="text/css" media="all"/>
<script onerror="loadError('layout/jquery-1.11.1.min.js')" src="/js/layout/jquery-1.11.1.min.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/jquery.metadata.js')" src="/js/layout/jquery.metadata.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/jquery-ui.custom.js')" src="/js/layout/jquery-ui.custom.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/jquery.ui.datepicker-ru.min.js')" src="/js/layout/jquery.ui.datepicker-ru.min.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/jquery-ui.datepicker-settings.js')" src="/js/layout/jquery-ui.datepicker-settings.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/jquery.tablesorter.js')" src="/js/layout/jquery.tablesorter.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/jquery.fileDownload.js')" src="/js/layout/jquery.fileDownload.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/jquery.redirect.min.js')" src="/js/layout/jquery.redirect.min.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/bootstrap.js')" src="/js/layout/bootstrap.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/bootstrap-editable.js')" src="/js/layout/bootstrap-editable.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/bootbox.js')" src="/js/layout/bootbox.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/modernizr.js')" src="/js/layout/modernizr.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/utilsCommon.js')" src="/js/layout/utilsCommon.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/utilsClient.js')" src="/js/layout/utilsClient.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/sprintf.js')" src="/js/layout/sprintf.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/ajax.js')" src="/js/layout/ajax.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/spin.min.js')" src="/js/layout/spin.min.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('clipboard/clipboard.min.js')" src="/js/clipboard/clipboard.min.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('pwdgenerator.js')" src="/js/pwdgenerator.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/dialogs.js')" src="/js/layout/dialogs.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/main.js')" src="/js/layout/main.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/jivo.js')" src="/js/layout/jivo.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('order/transfer.js')" src="/js/order/transfer.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('order/replenishment.js')" src="/js/order/replenishment.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('order/resendToApproverEmail.js')" src="/js/order/resendToApproverEmail.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('product/chooseSslDcv.js')" src="/js/product/chooseSslDcv.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('layout/bootstrap-slider.js')" src="/js/layout/bootstrap-slider.js?XXXXXXXXXXXX" type="text/javascript"></script>
<link rel="stylesheet" href="/css/bootstrap-slider.css?XXXXXXXXXXXX" type="text/css" media="all"/>
<script onerror="loadError('layout/bootstrap-select.min.js')" src="/js/layout/bootstrap-select.min.js?XXXXXXXXXXXX" type="text/javascript"></script>
<link rel="stylesheet" href="/css/bootstrap-select.min.css?XXXXXXXXXXXX" type="text/css" media="all"/>
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<script type="text/javascript" src="/provider/links?ver=XXXXXXXXXXXX" onerror="loadError('links')"></script>
<script type="text/javascript" src="/provider/messages?ver=XXXXXXXXXXXX" onerror="loadError('messages')"></script>
<script>
// refresh header
setInterval(function () {
IHC.trigger("statusInfo.update");
}, 1000 * 60);
</script>
<meta name="layout" content="main"/>
<script onerror="loadError('dnsZone/dnsZoneFilter.js')" src="/js/dnsZone/dnsZoneFilter.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('dnsZone/dnsZoneDelete.js')" src="/js/dnsZone/dnsZoneDelete.js?XXXXXXXXXXXX" type="text/javascript"></script>
<script onerror="loadError('dnsZone/dnsZoneChangeIP.js')" src="/js/dnsZone/dnsZoneChangeIP.js?XXXXXXXXXXXX" type="text/javascript"></script>
<style type="text/css">
#dns-zones .col {
width: 47%;
float: left;
position: relative;
margin-right: 3%;
}
#dns-zones .col ul {
margin-top: 0;
margin-bottom: 0;
}
#dns-zones .col li {
list-style: none;
}
#dns-zones .selectAll {
margin-top: 10px;
margin-bottom: 10px;
margin-left: 20px;
}
#dns-zones .withSelected__delete {
cursor: pointer;
}
#dns-zones .filter__submit {
cursor: pointer;
}
.filter input {
vertical-align: top;
}
input[type=checkbox].mixed {
opacity: 0.5;
}
</style>
<!-- Global site tag (gtag.js) - Google Analytics -->
<!--script async src="https://www.googletagmanager.com/gtag/js?id=UA-115532343-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-115532343-1');
</script-->
</head>
<body>
<script onerror="loadError('layout/analytics.js')" src="/js/layout/analytics.js?XXXXXXXXXXXX" type="text/javascript"></script>
<!-- Yandex.Metrika counter -->
<script type="text/javascript" >
(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
m[i].l=1*new Date();
for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}
k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
(window, document, "script", "https://cdn.jsdelivr.net/npm/yandex-metrica-watch/tag.js", "ym");
ym(506605, "init", {
clickmap:true,
trackLinks:true,
accurateTrackBounce:true,
webvisor:true,
ecommerce:"dataLayer"
});
</script>
<noscript><div><img src="https://mc.yandex.ru/watch/506605" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter -->
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=XXXXXXXXXXXX"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'XXXXXXXXXXXX', {
'user_id': 'XXXXXXXXXXXX'
});
</script>
<script>
(function () {
IHC.event("ecommerce.datalayer.push", function (e, data) {
gtag.apply(this, data.args);
});
})();
</script>
<script>
(function () {
IHC.conversion.yandexId = XXXXXXXXXXXX;
var conversions = {orders: [], replenishment: null, registration: false};
var orders = conversions.orders;
var replenishment = conversions.replenishment;
if (orders && orders.length > 0) {
$.each(orders, sendOrderConversion);
notifyOfOrders(orders);
}
if (replenishment && replenishment.sum) {
IHC.conversion.replenishment(replenishment);
notifyOfReplenishment();
}
if (conversions.registration) {
IHC.conversion.registration();
}
function sendOrderConversion(i, order) {
IHC.conversion.order(order);
}
function notifyOfOrders(orders) {
var params = $.map(orders, function (el) {
return "ids=" + el.id;
}).join("&")
$.ajax(IHC.Provider.Links.conversion.orders + "?" + params);
}
function notifyOfReplenishment() {
$.ajax(IHC.Provider.Links.conversion.replenishment);
}
})();
</script>
<div class="ihc-header container">
<div class="row ihc-header-row">
<div class="col-lg-3 col-md-3 col-sm-12 col-xs-12 ihc-header-col-logo">
<a href="/" style="display: table-cell; vertical-align: middle">
<img src="/images/panel/logo-ihc-2019-h.png" alt="IHC.RU" class="vcenter" style="max-width: 250px;max-height: 80px;"/>
</a>
</div>
<div class="visible-sm" style="clear: both; height: 15px">&nbsp;</div>
<div class="col-lg-2 col-md-2 col-sm-4 col-xs-12 header-col-bonuses ihc-header-col-section">
<div class="nowrap ihc-header-small">Бонусы&nbsp;&nbsp;&nbsp;
<span class="question"
data-container="body"
data-toggle="tooltip"
data-placement="bottom"
title=""
data-original-title="Бонусы начисляются за участие в партнёрской программе"></span>
</div>
<div class="nowrap ihc-header-bold statusInfo__bonuses " data-effective-bonus-balance="0.0">
0 <span class="rur">р<span>уб</span></span>
</div>
<div class="ihc-header-link">
<a href="/partner/index">Партнёрская<br/>программа</a>
</div>
</div>
<div class="col-lg-2 col-md-2 col-sm-4 col-xs-12 header-col-bonuses ihc-header-col-section">
<div class="nowrap ihc-header-small">Баланс</div>
<div class="nowrap ihc-header-bold statusInfo__balance " data-balance="0.0">
0 <span class="rur">р<span>уб</span></span>
</div>
<table>
<tr class="ihc-header-link nowrap">
<td colspan="3" style="padding-bottom: 3px">
<div class="ihc-header-link nowrap">
<div class="customerMainMenu__replenishment-container"><span
class="pseudo-link customerMainMenu__replenishment">Пополнить баланс</span></div>
</div>
</td>
</tr>
<tr class="ihc-header-link nowrap">
<td><a href="/tx/list" class="customerMainMenu__txList">Платежи</a></td>
<td style="width:16px"></td>
<td><a href="/forecast/index" class="customerMainMenu__forecast">Прогноз</a></td>
</tr>
</table>
</div>
<div class="col-lg-2 col-md-2 col-sm-4 hidden-xs header-col-credit ihc-header-col-section"
style="border-left: none;">
&nbsp;
</div>
<div class="visible-sm" style="clear: both; height: 15px">&nbsp;</div>
<div class="col-lg-3 col-md-3 col-sm-12 col-xs-12 ihc-header-col-user">
<div class="ihc-header-userinfo"
style="position:absolute;left: 15px;top: 0;right: 15px;height: auto;z-index: 999">
<div class="nowrap">
<div class="statusInfo__username ihc-header-userbold pull-left">
XXXXXXXXXXXX&nbsp;&nbsp;&nbsp;
</div>
<a href="/mail/index" class="ellipsis ihc-header-userbold statusInfo__email" style="display:block;text-decoration: underline" title="XXXXXXXXXXXX">XXXXXXXXXXXX</a>
</div>
<div class="" style="margin-top: 16px">
<div class="ihc-header-menu-button customerMainMenu__link" style="display: inline-block; height: 22px;cursor: pointer">
Настройки <span class="hidden-md">аккаунта</span>&nbsp;
<span class="usermenu-triangle-icon glyphicon glyphicon-triangle-bottom" aria-hidden="true" style="top:3px"></span>
<span class="usermenu-triangle-icon glyphicon glyphicon-triangle-top hidden" aria-hidden="true" style="top:3px"></span>
</div>
<a href="/logout/index" class="customerLogout btn btn-gray btn-xs pull-right">
&nbsp;Выйти&nbsp;
<span class="glyphicon glyphicon-off" aria-hidden="true"></span>
&nbsp;
</a>
</div>
<script>
$(".ihc-header-menu-button").mousedown(function (e) {
$(".usermenu-triangle-icon").toggleClass("hidden");
$('.ihc-header-usermenu').slideToggle(100, 'linear');
e.stopPropagation();
});
$(".ihc-header-userinfo").mousedown(function(e) {
e.stopPropagation();
});
$(".ihc-header-usermenu").mousedown(function(e) {
e.stopPropagation();
});
$("body").mousedown(function (e) {
var menu = $('.ihc-header-usermenu:visible');
if (menu.size() > 0) {
$(".usermenu-triangle-icon").toggleClass("hidden");
menu.slideUp(100, 'linear');
}
});
</script>
<div class="ihc-header-usermenu" style="display: none; padding-top: 30px">
<p role="presentation" class="ihc-header-small">
<a href="/reg/index" class="customerMainMenu__regInfo">
Регистрационная информация</a></p>
<p role="presentation" class="ihc-header-small">
<a href="/mail/index" class="customerMainMenu__mailLog">
Сообщения</a></p>
<p role="presentation" class="ihc-header-small">
<a href="/event/list" class="customerMainMenu__eventLog">
События</a></p>
<p role="presentation" class="divider"></p>
<p role="presentation" class="ihc-header-menu-header">Анкеты для регистрации доменов</p>
<p role="presentation" class="ihc-header-small">
<a href="/domainRegInfo/chooseType">
Добавить</a></p>
<p role="presentation" class="ihc-header-small">
<a href="/domainRegInfo/show/XXXXXXXXXXXX">
XXXXXXXXXXXX</a></p>
<p role="presentation" class="divider"></p>
<p role="presentation" class="ihc-header-menu-header">Настройки</p>
<p role="presentation" class="ihc-header-small">
<a href="/customerSecurity/index" role="menuitem" tabindex="-1" class="customerMainMenu__security">
Безопасность</a>
</p>
<p role="presentation" class="ihc-header-small">
<a href="/sshKeys/index">
SSH ключи</a></p>
<p role="presentation" class="ihc-header-small">
<a href="/customer/accountInfoEdit" class="customerMainMenu__settings">
Учетная запись</a></p>
<p role="presentation" class="ihc-header-small">
<a href="/notification/index" class="customerMainMenu__notification">
Уведомления</a></p>
<p role="presentation" class="ihc-header-small">
<a href="/autoReplenishment/index" class="customerMainMenu__autoReplenishment">
Автопополнение</a></p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container site-warning" style="display: none; background-color: #ffbe88; color: #7a3f0e">
<h4>
Из-за блокировщика рекламы личный кабинет может работать некорректно! Пожалуйста, отключите его на этом сайте.
</h4>
</div>
<div class="container customerPage">
<div class="row">
<div class="col-md-9">
<div class="spacer body__holder">
<div class="alertsHolder__container"></div>
<a href="/support/list" class="ticket__link hide" title="Ответы администратора на запросы">
<button class="btn btn-default btn-md">
Запросы
<span class="red-badge">0</span>
</button>
</a>
<ol class="breadcrumb">
<li><a href="/">Главная</a></li>
<li class="active">Список DNS зон</li>
</ol>
<div id='advert' class="well advert">
<div class="advert__hide-button" title="Скрыть на 24 часа">
<span class="fa fa-close"></span>
</div>
<div class="advert__content">Хотите <b>не платить</b> за хостинг, а <b>получать деньги</b> от хостера? Участвуйте в нашей <a href="/partner/index">партнёрской программе</a>.<br/>Начисляем до 50% с заказа и выплачиваем ежемесячно на <!--карту или--> <img src="https://scr.pics/usdt-logo.svg" style="height: 1em; ""/></div>
</div>
<div id="dns-zones" class="zoneList">
<h2>Список DNS зон
<div class="knowbase-video-link" style=" margin-top: 2px; margin-right: 4px;">
<a href="https://support.ihc.ru/index.php?_m=knowledgebase&amp;_a=viewarticle&amp;kbarticleid=303&amp;nav=0,14" target="_blank" title="Видеоинструкция">
<span class="glyphicon glyphicon-play-circle"></span>
</a>
</div>
</h2>
<div class="nsInfo">
Данный раздел предназначен для управления DNS записями доменов на NS: <strong>ns1.ihc.ru, ns2.ihc.ru</strong>
</div>
<a href="/dnsZone/add">Добавить</a> |
<a href="/whois/index">Whois</a>
<form class="zoneList__form" method="post" action="deleteZones">
<div >
<p class="filter">
<input type="text" name="filter" class="filter__string form-control" value=""/>
</p>
</div>
<div class="withSelected">
С выбранными: <a href="#" class="btn btn-primary withSelected__delete">Удалить</a> <a href="#" class="btn btn-primary zoneList__changeIp">Смена IP</a>
</div>
<div class="selectAll">
<label for="selectAll" class="checkbox"><input type="checkbox" style="margin-top: 1px" id="selectAll" name="selectAll" class="checkbox selectAll__checkbox"/>Выбрать все</label>
</div>
<div>
<div class="col zoneList__column"><ul></ul></div>
<div class="col zoneList__column"><ul></ul></div>
</div>
<li class="zoneList__zone ">
<label for="zoneId111111" class="checkbox zoneList__zoneName">
<input type="checkbox" name="ids" id="zoneId111111" value="111111" style="margin-top: 1px"
class="checkbox zoneList__checkBox" />
<a href="/dnsZone/index/111111">example-1.ru</a>
</label>
</li>
<li class="zoneList__zone ">
<label for="zoneId222222" class="checkbox zoneList__zoneName">
<input type="checkbox" name="ids" id="zoneId222222" value="222222" style="margin-top: 1px"
class="checkbox zoneList__checkBox" />
<a href="/dnsZone/index/222222">example-2.ru</a>
</label>
</li>
</form>
</div>
<span class="clearfix"></span>
</div>
</div>
<div class="col-md-3">
<div class="sidePanel__container customerMainMenu">
<div class="flow-progress-container" style="display: none">
<h3>
Ваши заявки
</h3>
<div class="flow-progress">
<div class="flow-progress-template flow-progress-item" data-flow-id="0">
<div class="flow-progress-title">
<div class="flow-progress-spinner"></div>
<div class="flow-progress-data">
<span class="flow-progress-op">XXXXXXXXXXXX</span>
<span class="flow-progress-description">заявка</span></div>
</div>
</div>
</div>
</div>
<h3>Ваши заказы</h3><ul class="nav nav-pills nav-stacked"><li class='sideNav__orders' data-id='XXXXXXXXXXXX'><a href="https://my.ihc.ru/dedicatedOrder/index/XXXXXXXXXXXX" class="ellipsis sidelink" title="XXXXXXXXXXXX"><img style="margin-left: -10px;vertical-align: middle;margin-right: 5px;" src="/i/products/sidebar/dedicated.png" alt="Аренда сервера" title="Аренда сервера"> <span class='sideNav__opDisplayName'>XXXXXXXXXXXX</span></a></li><li class='sideNav__orders' data-id='XXXXXXXXXXXX'><a href="https://my.ihc.ru/dnsOrder/index/XXXXXXXXXXXX" class="ellipsis sidelink" title="XXXXXXXXXXXX"><img style="margin-left: -10px;vertical-align: middle;margin-right: 5px;" src="/i/products/sidebar/dns.png" alt="Регистрация домена" title="Регистрация домена"> <span class='sideNav__opDisplayName'>XXXXXXXXXXXX</span></a></li></ul>
<h3>
Наши услуги
</h3>
<ul class="nav nav-pills nav-stacked">
<li><a href="/hostingProduct/index" class="sidelink customerMainMenu__hosting">Надёжный хостинг сайтов</a></li><li><a href="/vpsProduct/index" class="sidelink customerMainMenu__vps">Виртуальный сервер (VPS/VDS)</a></li><li><a href="/dedicatedProduct/index" class="sidelink customerMainMenu__dedicated">Аренда выделенного сервера</a></li><li><hr style="
margin: 0.5em 0 0.5em 1em;
border-top: 1px solid #337ab7;
"/></li><li><a href="/dnsProduct/index" class="sidelink customerMainMenu__dns">Регистрация домена</a></li><li><a href="/backupProduct/index" class="sidelink customerMainMenu__backup">Место под бэкап</a></li><li><a href="/sslProduct/index" class="sidelink customerMainMenu__ssl">SSL Сертификаты</a></li><li><a href="/ispmanagerLicenseProduct/index" class="sidelink customerMainMenu__ispmanagerLicense">Лицензия на ISPmanager</a></li><li><hr style="
margin: 0.5em 0 0.5em 1em;
border-top: 1px solid #337ab7;
"/></li><li><a href="/dnsZone/list" class="sidelink customerMainMenu__zones">Управление зонами DNS</a></li><li><a href="/commodityProduct/index" class="sidelink customerMainMenu__extras">Дополнительные услуги</a></li>
</ul>
<a href="https://support.ihc.ru/index.php?_m=knowledgebase&amp;_a=view" target="_blank" class="btn btn-lg btn-success btn-block spacer" style="text-align: left;">
<span class="glyphicon glyphicon-info-sign pull-left sidebar-icon"></span>
Ответы на вопросы
</a>
<a href="/support/ticket" class="btn btn-lg btn-link spacer" style="margin:0">
<span class="glyphicon glyphicon-question-sign pull-left sidebar-icon"></span>
Задать вопрос
</a>
<a href="/support/list" class="btn btn-lg btn-link spacer" style="margin:0">
<span class="glyphicon glyphicon-question-sign pull-left sidebar-icon"></span>
Запросы
<span class="red-badge sidePanel__unreadTicketsCount hide"
title="Ответы администратора на запросы">0</span>
</a>
<hr>
<script>
$('.sideNav__orders').filter(function () {
var id = $(this).data('id');
return id && id === $('.order__container').data('id');
}).css("background-color", "#d3d3d3").css("border-radius", "5px");
</script>
</div>
</div>
</div>
</div>
<div class="ihc-bottom container spacer">
<div class="row">
<div class="col-md-3">
<p class="ihc-header-small">Контакты для связи с нами:</p>
<p class="ihc-header-small-thin"><a class="footer-tel" href="tel:+74956486033"><span class="earphone"></span> +7 (495) 648-60-33</a></p>
</div>
<div class="col-md3 col-md-3" style="display: block;">
<p class="ihc-header-small">
<a href="https://www.ihc.ru">Сайт ihc.ru</a>
</p>
<p class="ihc-header-small-thin">
<a href="/whois/index">Whois</a>
</p>
<p class="ihc-header-small-thin">
<a href="https://my-ip.help/" target="_blank"><span>Узнать свой IP</span></a>
</p>
<p class="ihc-header-small-thin">
<a href="https://www.ihc.ru/docs/PersData2019.pdf" target="_blank"><span>Политика работы с персональными данными</span></a>
</p>
</div>
<div class="col-md3 col-md-2" style="display: block;">
<p class="ihc-header-small">
<a href="/news/index"><span>Новости</span></a>
</p>
</div>
<a href="/replenishment/index?value=0.0">
<div class="footer-paymethods col-md6 col-md-4" style="display: block;">
<p class="ihc-header-small">Принимаем к оплате:</p>
<img src="/images/panel/webmoney.gif" alt="WebMoney"/>
<img src="/images/panel/yoomoney.gif" alt="ЮMoney"/>
<img src="/images/panel/visamastercard.gif" alt="VISA MasterCard"/>
<img src="/images/panel/mir.png" alt="Национальная платёжная карта Мир"/>
</div>
</a>
</div>
</div>
<div class="on-top progress-before-1s modal-backdrop in transparent-modal-backdrop hidden" style="opacity: 0.01;"></div>
<div class="on-top progress-after-1s modal modal-progress fade"><div class="well"><img src="/images/ajax-loader.gif"/></div></div>
<div class="on-top hang-after-30s modal modal-hang"><div class="well"><img src="/i/warning.png"><div>Кажется, что-то пошло не так. Попробуйте перезагрузить страницу или обратитесь в техподдержку.</div></div></div>
<script type="text/javascript">
(function() {
var widget_id = 'XXXXXXXXXXXX';
var s = document.createElement('script');
s.type = 'text/javascript';
s.async = true;
s.src = '//code.jivosite.com/script/widget/' + widget_id;
var ss = document.getElementsByTagName('script')[0];
ss.parentNode.insertBefore(s, ss);
})();
function jivo_onLoadCallback(){
jivo_api.setUserToken("XXXXXXXXXXXX");
jivo_api.setContactInfo(
{
name : '[XXXXXXXXXXXX]',
email : '[XXXXXXXXXXXX]',
phone : '[unknown]'
}
);
}
</script>
<div class="ads-wrapper" style="position: absolute;">
<div class="ads">
<img src="/ads.png?XXXXXXXXXXXX" height="250" width="300" alt="">
<img src="/ads.gif?XXXXXXXXXXXX" height="250" width="300" alt="">
<img src="/ads.jpg?XXXXXXXXXXXX" height="250" width="300" alt="">
</div>
</div>
<script>
$(document).ready(function() {
setTimeout(function () {
var img = $(".ads-wrapper img");
if (img.filter(function () {
return $(this).css('display') != 'none';
}).size() < 3) {
$(".site-warning").show();
}
img.hide();
}, 500);
var opts = {
lines: 8 // The number of lines to draw
, length: 4 // The length of each line
, width: 3 // The line thickness
, radius: 2 // The radius of the inner circle
, scale: 0.5 // Scales overall size of the spinner
, corners: 1 // Corner roundness (0..1)
, color: '#000' // #rgb or #rrggbb or array of colors
, opacity: 0.1 // Opacity of the lines
, rotate: 0 // The rotation offset
, direction: 1 // 1: clockwise, -1: counterclockwise
, speed: 0.9 // Rounds per second
, trail: 100 // Afterglow percentage
, fps: 10 // Frames per second when using setTimeout() as a fallback for CSS
, zIndex: 0 // The z-index (defaults to 2000000000)
, className: 'spinner' // The CSS class to assign to the spinner
, top: '0%' // Top position relative to parent
, left: '0%' // Left position relative to parent
, shadow: false // Whether to render a shadow
, hwaccel: false // Whether to use hardware acceleration
, position: 'relative' // Element positioning
};
var target = $(".flow-progress-spinner");
if(target.size() > 0) {
var spinner = new Spinner(opts).spin().el;
target.append($(spinner))
}
});
</script>
<script>
(function() { window.satismeter = window.satismeter || function() {(window.satismeter.q = window.satismeter.q || []).push(arguments);};window.satismeter.l = 1 * new Date();var script = document.createElement("script");var parent = document.getElementsByTagName("script")[0].parentNode;script.async = 1;script.src = "https://app.satismeter.com/satismeter.js";parent.appendChild(script);})();
satismeter({
writeKey: "XXXXXXXXXXXX",
userId: "XXXXXXXXXXXX",
traits: {
email: "XXXXXXXXXXXX",
createdAt: "XXXXXXXXXXXX"
}
});
</script>
<script type="text/javascript">
maxmind_user_id = "XXXXXXXXXXXX";
(function() {
var loadDeviceJs = function() {
var element = document.createElement('script');
element.src = 'https://device.maxmind.com/js/device.js';
document.body.appendChild(element);
};
if (window.addEventListener) {
window.addEventListener('load', loadDeviceJs, false);
} else if (window.attachEvent) {
window.attachEvent('onload', loadDeviceJs);
}
})();
</script>
</body>
</html>