Абстракция для работы с SMS сервисами

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
545
Благодарностей
300
Баллы
63
115199


Вступление
Привет, друзья программисты. Поздравляю Всех с Юбилейным 20 конкурсом статей! А я продолжаю углубляться в изучении программирования. Недавно я начал разбираться в работе с абстракциями и не могу не поделиться с вами своими открытиями. Одним из которых является написание более гибкого кода, который легко использовать и расширять в дальнейшем.

Когда нам требуется добавить новый сервис по работе с SMS, обычно приходится сталкиваться с необходимостью переписывать большую часть кода, чтобы адаптировать его под новый функционал. Однако, работая с абстракциями, нам не придется тратить много усилий и времени, чтобы расширить наш функционал. Достаточно написать реализацию нового сервиса и инициализировать его, и весь наш код, использующий абстракции, автоматически начнет взаимодействовать с новым сервисом.

Абстракция, как я ее понимаю – это сущность, которая знает, что она умеет делать, но не знает, как конкретно это делает. Для примера рассмотрим метод получения баланса, который знает о своей функции, что он будет получать баланс, но не знает, каким образом конкретно он будет это делать.

К данной статье я прикрепляю библиотеку, где реализована абстракция, исходники VS и шаблон для примера. В статье я опишу, как работать с библиотекой, а в видео расскажу про саму абстракцию и как добавлять новые сервисы в библиотеку.

Библиотека написана в виде примера, что бы показать, как круто можно работать с абстракциями. В ней не реализованы проверки! И вообще это моя первая работа с абстракциями, скорей всего она реализована не совсем правильно!

Приступаем к работе.
ВАЖНО! Чтобы у вас все работало в ProjectMaker, нужно УБРАТЬ галочку в настройках.

Данная галочка нужна, чтобы мы могли получать данные в одном кубике и работать с ними в других кубиках, если поставить галочку, то будем получать ошибку, "ссылка на объект не найдена". Для самого ZennoPoster дополнительного делать ничего не нужно, все будет работать.
115201

В данной библиотеке реализованы методы для работы смс сервисов:
  • SmsHub
  • SmsActivate
  • SmsActivate Rent
Для начала работы нам нужно инициализировать смс сервис.
Пример:
C#:
var service = new SmsInit();
service.SmsHub(token, proxy);
//service.SmsActivate(token);
//service.SmsActivateRent(token, rentTime);
Чтобы удобно обращаться к свойствам и методам есть поле [ThreadStatic] public static ISmsService Service, которое для каждого потока свое (то есть можно работать в многопотоке) и является статичным, то есть к нему мы можем обращаться из любого кубика
Пример:

C#:
var sms = SmsInit.Service;
project.SendInfoToLog("Инициализировали: " + sms.Name, true);
var balance = sms.GetBalance();
Инициализация смс сервисов:
  • ISmsService SmsHub (string token, string proxy) - работаем с SmsHub. Передаем токен и прокси (RU ip заблокированы РКН)
  • ISmsService SmsActivate (string token) - работаем с SmsActivate. Передаем Токен.
  • ISmsService SmsActivateRent (string token, Rent rentTime) - работаем с SmsActivate Rent. Передаем Токен и срок аренды, на сколько арендуем номер.

Абстрактные Свойства:
  • Id (string) - id который выдается вместе с номером телефона, получаем его из метода GetNumber().
  • Name (string) - Хранит в себе имя смс сервиса, что бы мы могли понимать с каким сервисом мы работаем.
  • Code (string) - смс код, который мы получили от смс сервиса, получаем его из метода GetCode().
  • Number (string) - Номер телефона который выдал нам смс сервис, получаем его из метода GetNumber().
  • Responce (string) - Http ответ от Смс сервиса, что бы можно было быстро посмотреть что идет не так и что именно отвечает сервер.

Абстрактные Методы:
  • void SmsOk() - метод подтверждения номер телефона.
  • void SmsCancel() - метод отмены номер телефона.
  • void SetProxy (string proxy) - метод установки прокси для работы смс сервисов. Передаем прокси в параметрах и запросы к смс сервисам идут через прокси. Например SmsHub не работает с RU IP, поэтому устанавливаем например немецкий прокси и все работает.
  • bool GetNumber(string service, string country, string smsOperator = "") - метод запроса номер телефона, в параметры передаем: service - сервис для кого мы запрашиваем смс (Яндекс, ВК и т.п.); country - страна для смс; smsOperator - необязательный параметр, если нужен конкретный оператор, то передаем его данные. Возвращается bool, если номер получили - true иначе false.
  • bool GetCode (int attempts = 3, int pause_Sec = 30) - метод получения кода от смс сервиса. attempts - количество попыток запроса статуса у смс сервиса; pause_Sec - пауза в секундах между запросами статуса к смс сервису.
  • decimal GetBalance() - метод получения баланса.

Пример Входных настроек:
115202

Примеры кода для работы в шаблонах.
Подключаем библиотеку к шаблону, в using прописываем: using SmsService;

Инициализация смс сервиса:
C#:
var smsService = project.Variables["smsService"].Value;
string token;

var service = new SmsInit();
switch (smsService)
{
    case "SmsHub":
        {
            token = project.Variables["tokenSmsHub"].Value;
            var proxy = project.Variables["smsProxy"].Value;

            service.SmsHub(token, proxy);
            break;
        }
    case "SmsActivate":
        {
            token = project.Variables["tokenSmsActivate"].Value;

            service.SmsActivate(token);
            break;
        }
    case "SmsActivateRent":
        {
            token = project.Variables["tokenSmsActivate"].Value;
            var time = int.Parse(project.Variables["rentTime"].Value);
            var rentTime = (Rent)Enum.ToObject(typeof(Rent), time);

            service.SmsActivateRent(token, rentTime);
            break;
        }
    default:
        throw new Exception("Неизвестный Смс Сервис!");
}
var sms = SmsInit.Service;
project.SendInfoToLog("Инициализировали: " + sms.Name, true);
После того, как мы инициализировали смс сервис, теперь в любом кубике можем обращаться к SmsInit.Service и иметь доступ к свойствам и методам для работы с смс сервисом.

Запрос баланса:
C#:
var sms = SmsInit.Service;

try
{
    var balance = sms.GetBalance();

    var log = $"{sms.Name} | Баланас: {balance}";
    project.SendInfoToLog(log, true);
}
catch
{
    throw new Exception(sms.Responce);
}
Используя свойство Responce сразу выведем информацию в лог, если что-то пойдет не так.

Получить номер:
C#:
var service = project.Variables["service"].Value;
var country = project.Variables["country"].Value;
  
var sms = SmsInit.Service;
string number, id;

if (sms.GetNumber(service, country))
{
    number = sms.Number;
    id = sms.Id;
}
else throw new Exception("Не смогли получить номер!");

var log = $"{sms.Name} | Номер: {number} | ID: {id}";
project.SendInfoToLog(log, true);

Получить код:
C#:
var sms = SmsInit.Service;
var isGetCode = sms.GetCode(2, 10);

if (isGetCode)
{
    project.SendInfoToLog("Cмс код: " + sms.Code, true);
}
else
{
    sms.SmsCancel();
    throw new Exception($"Отмена номера: {sms.Number}, смс код не приходит!");
}

Подтвердить или отменить номер:
C#:
var sms = SmsInit.Service;

//Отменить
sms.SmsCancel();
project.SendInfoToLog("Отмена номера:" + sms.Number, true);
project.SendInfoToLog(sms.Responce);

//Подтвердить
sms.SmsOk();
project.SendInfoToLog("Работа выполнена:" + sms.Number, true);
Для тех кто будет заупскать решение VS, не забудьте прописать правильные пути в Отладке:
115217

 
Тема статьи
Нестандартные хаки

Вложения

Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

Последнее редактирование модератором:

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
545
Благодарностей
300
Баллы
63
Хочется получить фидбек. Стоит продолжать писать подобные статьи или комьюнити ZP такое не очень интересно?:ah:
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 007
Благодарностей
538
Баллы
113
Глянул код, стратегия курильщика получилась) Для начинающего нормас
 
  • Спасибо
Реакции: SHILY

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
545
Благодарностей
300
Баллы
63
Добавили видео, забыли в начале и я проглядел:-)
 
  • Спасибо
Реакции: SHILY и ZennoLab Team

SHILY

Client
Регистрация
05.06.2016
Сообщения
258
Благодарностей
304
Баллы
63
Есть до чего докопаться, но в целом неплохо, молодчина, растешь8-)
 
  • Спасибо
Реакции: Dmitriy Ka

rolik

Новичок
Регистрация
02.01.2024
Сообщения
2
Благодарностей
0
Баллы
1

demiddima

Client
Регистрация
06.06.2023
Сообщения
7
Благодарностей
0
Баллы
1
Круто
 

elPresidente

Client
Регистрация
28.05.2016
Сообщения
29
Благодарностей
11
Баллы
3
не надо снимать галочки с пересоздания потока, лучше использовать контекст проекта в коде
 

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