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

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
949
Реакции
734
Баллы
93
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

 
Номер конкурса статей
  1. Двадцатый конкурс статей
Тема статьи
  1. Нестандартные хаки

Вложения

Последнее редактирование модератором:
Хочется получить фидбек. Стоит продолжать писать подобные статьи или комьюнити ZP такое не очень интересно?:ah:
 
  • Спасибо
Реакции: Pava
Глянул код, стратегия курильщика получилась) Для начинающего нормас
 
  • Спасибо
Реакции: SHILY
не надо снимать галочки с пересоздания потока, лучше использовать контекст проекта в коде
 
Всем привет! Что нужно сделать c smsactive что бы с Яндекса можно было получать код если активация идет по звонку (последние 6 цифр)?
 
Всем привет! Что нужно сделать c smsactive что бы с Яндекса можно было получать код если активация идет по звонку (последние 6 цифр)?
На сколько я знаю у smsactive активации по звонку нет (но это не точно, может обновились), нужно в яндексе дождаться кнопку получить смс и активировать по смс.
 

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