-> как самый простой проверка по дате - не больше ли твоей - больше - вывод в лог сообщение тест окончен1. Для тех у кого есть zennoposter:
1.1. как шаблон дать в аренду на время? (при этом закрытым кодом конечно),
что прописать в кубике с sharp и как потом этим временем управлять?
помоему в течение 2х недель отмена проодажи с возвращением денег на баланс + возможность указать до какого числ будет работать шаб - ппри продаже пункт подписка2. Для тех у кого его нет:
куда посмотреть, чтобы точно понимать как это делается, чтоб закрытый шаблон дать на время в zennobox?
интересно, можно массово так делать. 100 zb заказывать потом отменять, и заказывать и отменять. наверное попросят не баловаться))-> как самый простой проверка по дате - не больше ли твоей - больше - вывод в лог сообщение тест окончен
помоему в течение 2х недель отмена проодажи с возвращением денег на баланс + возможность указать до какого числ будет работать шаб - ппри продаже пункт подписка
Думаю что если надо 100 zb (и систему для них) - то тема того стоит и игратся с выпиской и отменой никто не будет - бо лень будет))интересно, можно массово так делать. 100 zb заказывать потом отменять, и заказывать и отменять. наверное попросят не баловаться))
наверное способ попроще есть
string idZennoLab = project.ExecuteMacro("{-Environment.CurrentUser-}").Replace("zenno.club","zennolab.com");
string nameUser = string.Empty; // имя пользователя (к примеру ник с телеги).
// id zennolab пользователя, который запускает ваш шаблон.
project.SendInfoToLog($@"Ваш id: {idZennoLab}", true);
// добавляем пользователей в формате idZennolab:дата подписки:nickName (это как пример) в коллекцию.
// для теста можно добавить свой id (который выше выводится в лог).
var listSubscribe = new List<string>();
listSubscribe.Add("[email protected]:25.04.2026:Михаил");
listSubscribe.Add("id1:25.04.2024:nickName1");
listSubscribe.Add("id2:27.05.2024:nickName2");
listSubscribe.Add("id3:27.06.2024:nickName3");
// переменная под дату окончания подписки с дефолтными значением до 01.01.2001
var dateEnd = DateTime.Parse("01.01.2001");
// делаем запрос текущего времени по определенному часовому поясу (в данном случае Europe/Moscow)
string result = ZennoPoster.HttpGet("https://www.timeapi.io/api/Time/current/zone?timeZone=Europe/Moscow");
// кладём результат в переменные JSon
project.Json.FromString(result);
// получаем текущее время
var timeNow = DateTime.Parse(project.Json.dateTime.ToString());
// перебираем нашу коллекцию с клиентами
foreach (var item in listSubscribe)
{
// если коллекция содержит id клиента
if (item.Contains(idZennoLab))
{
// пишем дату окончания подписки в переменную
dateEnd = DateTime.Parse(item.Split(':')[1]);
// пишем имя клиента в переменную
nameUser = item.Split(':')[2];
break;
}
}
// если время подписки еще не истекло, выводим сообщение в лог о оставшихся днях и дальше шаблон работает.
if (timeNow < dateEnd)
{
TimeSpan t = dateEnd - timeNow;
project.SendToLog($@"Уважаемый {nameUser} - ваша подписка активна {t.Days.ToString()} дней", ZennoLab.InterfacesLibrary.Enums.Log.LogType.Info, true, ZennoLab.InterfacesLibrary.Enums.Log.LogColor.Violet);
}
// если клиента нет в нашей базе, выходим по ошибке.
else if (dateEnd == DateTime.Parse("01.01.2001"))
{
project.SendWarningToLog($@"Ваш id не добавлен в базу", true);
throw new Exception("No Subsribe");
}
// если подписка клиента закончилась, то сообщаем об этом в лог и выходим по ошибке.
else
{
project.SendWarningToLog($@"Уважаемый {nameUser} - ваша подписка закончилась! Обратитесь к разработчику.", true);
throw new Exception("No Subsribe");
}
string tmp = string.Empty;
LastError error = project.GetLastError();
if(error != null)
tmp = $@"Ошибка: {error.Exception.Message}";
if (tmp.Contains("No Subsribe"))
{
project.SendErrorToLog($@"Шаблон заблокирован!", true);
}
Выглядит совсем ненадежно Поднимаем локально сервер и правим хост - вечная лицензия готова.string result = ZennoPoster.HttpGet("https://www.timeapi.io/api/Time/current/zone?timeZone=Europe/Moscow");
public static DateTime GetNetworkTime()
{
const string ntpServer = "time.windows.com";
var ntpData = new byte[48];
ntpData[0] = 0x1B;
var addresses = Dns.GetHostEntry(ntpServer).AddressList;
var ipEndPoint = new IPEndPoint(addresses[0], 123);
using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
{
socket.Connect(ipEndPoint);
socket.Send(ntpData);
socket.Receive(ntpData);
socket.Close();
}
var intPart = (ulong)ntpData[40] << 24 | (ulong)ntpData[41] << 16 | (ulong)ntpData[42] << 8 | ntpData[43];
var fractPart = (ulong)ntpData[44] << 24 | (ulong)ntpData[45] << 16 | (ulong)ntpData[46] << 8 | ntpData[47];
var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);
var networkDateTime = (new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds((long)milliseconds);
return networkDateTime.ToLocalTime();
}
Можно данную строку "[email protected]:25.04.2026:Михаил" зашифровать с помощью закрытого ключа и выдать ее клиенту, а в шаблоне расшифровать. Вот вам и готовые параметры для работы шаблона.Минус данного кода в том, что вы не сможете изменить дату подписки, если уже отдали файл шаблона клиенту.
Так зенка его проверяет не на постоянке.Нафига опрашивать сторонний сайт на время, если можно локальное компа получить в одну строку кода ?
а локальное время не подменишь, зенка имеет защиту от этого, путем постоянного обращения к своим серверам. (надеюсь шифрованными запросами )
ну тут наверно не стоит беспокоится, если уж зенку взломают, то свои шаблоны точно не защитишь
ну тоесть шаблон может и будет работать... иногда и урывками... но это нормальной работой не назовешь. еще вопрос, что будет с лицензией на зенку, когда сервак задетектит постоянные скачки времени в системе...Так зенка его проверяет не на постоянке.
Накидываем шаблон, который будет менять время и запускать защищенный шаблон. После запуска будет ставить время обратно в нормальное.
Ну я думаю зенке пофигу на скачки, просто закроется. Да и работу при таком раскладе можно обеспечить довольно стабильную. А что касается постоянного мониторинга, это уже лучше один раз написать\купить полноценную систему управления лицензиями. В любом случае, если злоумышленники не знают что под капотом, не легко им будет обмануть почти любую систему. За исключение не шифрованных запросов, тут все просто.ну тоесть шаблон может и будет работать... иногда и урывками... но это нормальной работой не назовешь. еще вопрос, что будет с лицензией на зенку, когда сервак задетектит постоянные скачки времени в системе...
а если автор в шаблоне додумается мониторить системное время на по стоянку, а не только в начале старта проекта и задетектит аномальные скачки времени... ууу... там полет фантазии