Как грамотно организовать продажу своего шаблона

Регистрация
28.11.2020
Сообщения
58
Благодарностей
6
Баллы
8
Уважаемые коллеги, помогите пожалуйста.
Как грамотно организовать продажу своего шаблона:
1. Для тех у кого есть zennoposter
2. Для тех у кого его нет
 
Регистрация
28.11.2020
Сообщения
58
Благодарностей
6
Баллы
8
1. Для тех у кого есть zennoposter:
1.1. как шаблон дать в аренду на время? (при этом закрытым кодом конечно),
что прописать в кубике с sharp и как потом этим временем управлять?

2. Для тех у кого его нет:
куда посмотреть, чтобы точно понимать как это делается, чтоб закрытый шаблон дать на время в zennobox?
 

alex1988

Client
Регистрация
13.07.2014
Сообщения
381
Благодарностей
158
Баллы
43
1. Для тех у кого есть zennoposter:
1.1. как шаблон дать в аренду на время? (при этом закрытым кодом конечно),
что прописать в кубике с sharp и как потом этим временем управлять?
-> как самый простой проверка по дате - не больше ли твоей - больше - вывод в лог сообщение тест окончен
2. Для тех у кого его нет:
куда посмотреть, чтобы точно понимать как это делается, чтоб закрытый шаблон дать на время в zennobox?
помоему в течение 2х недель отмена проодажи с возвращением денег на баланс + возможность указать до какого числ будет работать шаб - ппри продаже пункт подписка
 
  • Спасибо
Реакции: Биржевик
Регистрация
28.11.2020
Сообщения
58
Благодарностей
6
Баллы
8
-> как самый простой проверка по дате - не больше ли твоей - больше - вывод в лог сообщение тест окончен

помоему в течение 2х недель отмена проодажи с возвращением денег на баланс + возможность указать до какого числ будет работать шаб - ппри продаже пункт подписка
интересно, можно массово так делать. 100 zb заказывать потом отменять, и заказывать и отменять. наверное попросят не баловаться))
наверное способ попроще есть
 

alex1988

Client
Регистрация
13.07.2014
Сообщения
381
Благодарностей
158
Баллы
43
интересно, можно массово так делать. 100 zb заказывать потом отменять, и заказывать и отменять. наверное попросят не баловаться))
наверное способ попроще есть
Думаю что если надо 100 zb (и систему для них) - то тема того стоит и игратся с выпиской и отменой никто не будет - бо лень будет))
 
Регистрация
24.09.2014
Сообщения
436
Благодарностей
209
Баллы
43
Грамотно - это c использованием базы данных. Это в двух словах не опишешь...

Но можно как-нибудь так:

Код Demo:
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");

}

Далее добавляем в проект BadEnd и обрабатываем все ошибки (которые нужно обработать)

Код BadEnd:
string tmp = string.Empty;

LastError error = project.GetLastError();
if(error != null)
tmp = $@"Ошибка: {error.Exception.Message}";

if (tmp.Contains("No Subsribe"))
{
    project.SendErrorToLog($@"Шаблон заблокирован!", true);
}
121439



Минус данного кода в том, что вы не сможете изменить дату подписки, если уже отдали файл шаблона клиенту. Чтобы что-то изменить, клиенту нужно будет перекачать (если не будете сами косячить с данными, то это не проблема). Ну а также не очень удобно добавлять клиентов вручную в коллекцию (но это лучше, чем ничего).

Если бы была база данных, то данные брались бы из неё и добавление клиентов выглядело иначе. Но для новичка это самое-то!
 
Последнее редактирование:
  • Спасибо
Реакции: Dr.Pipetka

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 315
Благодарностей
869
Баллы
113
Выглядит совсем ненадежно:-) Поднимаем локально сервер и правим хост - вечная лицензия готова.

Такой вариант будет немного сложнее обойти, но тоже обходится поднятием сервера.
C#:
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();
}
 
  • Спасибо
Реакции: Рогожкин

Ахилес

Client
Read only
Регистрация
11.11.2020
Сообщения
956
Благодарностей
393
Баллы
63
Нафига опрашивать сторонний сайт на время, если можно локальное компа получить в одну строку кода ?
а локальное время не подменишь, зенка имеет защиту от этого, путем постоянного обращения к своим серверам. (надеюсь шифрованными запросами :bn: )

ну тут наверно не стоит беспокоится, если уж зенку взломают, то свои шаблоны точно не защитишь :bk:
 
  • Спасибо
Реакции: Рогожкин

zarufakis

Client
Регистрация
22.03.2019
Сообщения
1 747
Благодарностей
1 142
Баллы
113
Минус данного кода в том, что вы не сможете изменить дату подписки, если уже отдали файл шаблона клиенту.
Можно данную строку "[email protected]:25.04.2026:Михаил" зашифровать с помощью закрытого ключа и выдать ее клиенту, а в шаблоне расшифровать. Вот вам и готовые параметры для работы шаблона.
В строку можно так же зашифровать любые данные - количество потоков, привязку к железу и т.д.
 
Последнее редактирование:
  • Спасибо
Реакции: Рогожкин

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 315
Благодарностей
869
Баллы
113
В любом случае, все эти обсуждения локальны. Это очень неудобно.
1. Если позволяют знания и время - пишем админку и клиентскую часть, все запросы шифруем. Если время не позволяет, присматриваемся к этим вариантам:
2. https://zenno.club/discussion/threads/zp-license-sistema-licenzirovanija-shablonov-zennoposter-zennodroid-avtovydacha-shablonov-na-test-sdacha-v-arendu-prodazhi.52843/
3. https://zenno.club/discussion/threads/license-snippet-dlja-zaschity-svoix-shablonov-pri-sdachi-v-arendu-na-test-prodazhi-rsa-shifrovanija.46585/
4. https://zenno.club/discussion/threads/svoja-sistema-licenzirovanija-shablonov-v-svjazke-s-gas-google-apps-script.44525/
5. Набираемся терпения и ждем зенку 8, там что то такое вроде собирались сделать. Но тут уже сам вопрос о ее выходе...
 
Последнее редактирование:

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 315
Благодарностей
869
Баллы
113
Нафига опрашивать сторонний сайт на время, если можно локальное компа получить в одну строку кода ?
а локальное время не подменишь, зенка имеет защиту от этого, путем постоянного обращения к своим серверам. (надеюсь шифрованными запросами :bn: )

ну тут наверно не стоит беспокоится, если уж зенку взломают, то свои шаблоны точно не защитишь :bk:
Так зенка его проверяет не на постоянке.
Накидываем шаблон, который будет менять время и запускать защищенный шаблон. После запуска будет ставить время обратно в нормальное.
 

Ахилес

Client
Read only
Регистрация
11.11.2020
Сообщения
956
Благодарностей
393
Баллы
63
Так зенка его проверяет не на постоянке.
Накидываем шаблон, который будет менять время и запускать защищенный шаблон. После запуска будет ставить время обратно в нормальное.
ну тоесть шаблон может и будет работать... иногда и урывками... но это нормальной работой не назовешь. еще вопрос, что будет с лицензией на зенку, когда сервак задетектит постоянные скачки времени в системе... :bk:
а если автор в шаблоне додумается мониторить системное время на по стоянку, а не только в начале старта проекта и задетектит аномальные скачки времени... ууу... там полет фантазии ;-)
 

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 315
Благодарностей
869
Баллы
113
ну тоесть шаблон может и будет работать... иногда и урывками... но это нормальной работой не назовешь. еще вопрос, что будет с лицензией на зенку, когда сервак задетектит постоянные скачки времени в системе... :bk:
а если автор в шаблоне додумается мониторить системное время на по стоянку, а не только в начале старта проекта и задетектит аномальные скачки времени... ууу... там полет фантазии ;-)
Ну я думаю зенке пофигу на скачки, просто закроется. Да и работу при таком раскладе можно обеспечить довольно стабильную. А что касается постоянного мониторинга, это уже лучше один раз написать\купить полноценную систему управления лицензиями. В любом случае, если злоумышленники не знают что под капотом, не легко им будет обмануть почти любую систему. За исключение не шифрованных запросов, тут все просто.
 
  • Спасибо
Реакции: zarufakis

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)