ExolveNet 0.2.1
See the version list below for details.
dotnet add package ExolveNet --version 0.2.1
NuGet\Install-Package ExolveNet -Version 0.2.1
<PackageReference Include="ExolveNet" Version="0.2.1" />
<PackageVersion Include="ExolveNet" Version="0.2.1" />
<PackageReference Include="ExolveNet" />
paket add ExolveNet --version 0.2.1
#r "nuget: ExolveNet, 0.2.1"
#:package ExolveNet@0.2.1
#addin nuget:?package=ExolveNet&version=0.2.1
#tool nuget:?package=ExolveNet&version=0.2.1
<div align="center"> <img src="https://raw.githubusercontent.com/ai-iskuzhin/ExolveNet/main/assets/ExolveNet.png" width="140" alt="Логотип ExolveNet" />
<h1>ExolveNet</h1>
<p> <a href="https://www.nuget.org/packages/ExolveNet"><img src="https://img.shields.io/nuget/v/ExolveNet?logo=nuget&style=flat-square" alt="Версия NuGet" /></a> <a href="https://dotnet.microsoft.com/"><img src="https://img.shields.io/badge/targets-netstandard2.0%20%7C%20net8.0%20%7C%20net10.0-512BD4?logo=dotnet&style=flat-square" alt="Таргеты" /></a> <a href="https://github.com/ai-iskuzhin/ExolveNet/blob/main/LICENSE"><img src="https://img.shields.io/github/license/ai-iskuzhin/ExolveNet?style=flat-square" alt="Лицензия" /></a> <a href="https://github.com/ai-iskuzhin/ExolveNet/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/ai-iskuzhin/ExolveNet/ci.yml?branch=main&style=flat-square" alt="CI" /></a> </p> </div>
Неофициальный .NET SDK для платформы МТС Exolve.
Не аффилирован с МТС Exolve и АО «МТТ».
Установка
dotnet add package ExolveNet
Таргеты: netstandard2.0, net8.0, net10.0.
Поддерживаемые методы
| Метод Exolve | API клиента | HTTP | Только МТС? |
|---|---|---|---|
| Оценка активности | GetActivityScoreAsync |
POST hlr/{v}/GetActivityScore |
нет |
| Статус SIM | GetSimStatusAsync |
POST hlr/v1/GetSimStatus |
да |
| Оператор и регион | GetBaseNumberInfoAsync |
POST hlr/v1/GetBaseNumberInfo |
не указано |
| Давность активности | GetLastDateActivityAsync |
POST hlr/v1/GetLastDateActivity |
не указано |
| Время для звонка | GetBestCallTimeAsync |
POST hlr/v1/GetBestCallTime |
да |
| Время для SMS | GetBestSmsTimeAsync |
POST hlr/v1/GetBestSmsTime |
да |
Пакетные отчёты — до 50 000 номеров за раз
| Метод Exolve | API клиента | HTTP |
|---|---|---|
| Отчёт по активности | GenerateActivityScoreReportAsync |
POST hlr/v1/GenerateActivityScoreReport |
| Отчёт по времени звонка | GenerateBestCallTimeReportAsync |
POST hlr/v1/GenerateBestCallTimeReport |
| Забрать отчёт | GetReportAsync |
POST hlr/v1/GetHLRReport |
| Список отчётов за период | ListReportsAsync |
POST hlr/v1/GetHLRListReport |
Полное описание полей — в docs/api-hlr.md.
Быстрый старт
using ExolveNet;
var client = new ExolveHlrClient(
httpClient, // можно из IHttpClientFactory
new ExolveClientOptions { ApiKey = "<API-ключ приложения>" });
var score = await client.GetActivityScoreAsync("+7 913 999-99-99");
Console.WriteLine(score.Score); // 0.85 — от 0 (нет активности) до 1
Console.WriteLine(score.OwnerId); // оператор
Console.WriteLine(score.Number); // 79139999999
Номер принимается в любом привычном виде — +7…, 8…, с пробелами и дефисами — и приводится к
7XXXXXXXXXX до отправки. Это не косметика: запрос в неверном формате Exolve отклоняет, но
тарифицирует, поэтому единственный бесплатный отказ — локальный.
Какой оператор обслуживает номер
var info = await client.GetBaseNumberInfoAsync("+79139999999");
Console.WriteLine(info.OwnerId); // Tele2
Console.WriteLine(info.Mnc); // 20
Console.WriteLine(info.IsPorted); // true — номер переносили
if (info.Operator == MobileOperator.Mts)
{
// только сюда имеет смысл слать методы, которые работают по номерам МТС
}
По префиксу оператора определить нельзя: номер мог быть перенесён (MNP), и тогда «мтс-овский»
префикс принадлежит другому оператору. GetBaseNumberInfo — единственный надёжный ответ.
Operator считается по коду сети (MNC), а если его нет — по названию из owner_id. Таблица
намеренно короткая: четыре федеральных оператора, всё остальное — Other, потому что назвать
оператора наугад хуже, чем честно сказать «не из этих четырёх».
Методы «только для МТС»
try
{
var sim = await client.GetSimStatusAsync(number);
Console.WriteLine(sim.IsRegistered);
}
catch (ExolveApiException ex) when (ex.IsNonMtsNumber)
{
// 400 enter another number — номер не МТС. Ожидаемый исход, а не сбой.
}
Пакетная проверка
var handle = await client.GenerateActivityScoreReportAsync(new[]
{
"+79139999999",
"89139999998",
});
// Считается асинхронно — Pending/Processing это нормальный ответ, а не ошибка.
var report = await client.GetReportAsync(handle.FileUuid!);
if (report.IsComplete)
{
Console.WriteLine(report.NumberTotal);
Console.WriteLine(report.DecodeResults());
}
Список номеров уходит не массивом JSON, а файлом в base64 — SDK нормализует каждый номер и кодирует список сам. Предел — 50 000 номеров; и пустой список, и превышение предела, и один нерабочий номер отвергаются локально, до платного запроса.
report.RetainedUntil — это срок хранения (30 дней), хотя на проводе поле называется
created_at. После него статус становится Expired, а данные пропадают.
Тарификация — важное
Платный запрос — любой запрос, независимо от ответа. Если по номеру нет данных (обычно не было активности около двух лет), API возвращает ошибку, и деньги всё равно списываются. «Неуспешного» HLR-запроса с точки зрения счёта не существует — перепродавать его «за успех» нельзя.
Обработка ошибок
| Исключение | Когда |
|---|---|
ExolveValidationException |
номер не прошёл локальную проверку — в сеть ничего не ушло |
ExolveApiException |
Exolve ответил вне диапазона 2xx |
ExolveTransportException |
ответа нет: сеть, таймаут, TLS |
ExolveProtocolException |
ответ есть, но не разбирается |
У ExolveApiException есть признаки для частых случаев, чтобы не сравнивать строки в своём коде:
IsNonMtsNumber, IsHlrDisabled, IsUnsignedCustomer (тестовый период — можно проверять только
свой подтверждённый номер; легко спутать с ограничением по оператору).
Персональные данные
Номер телефона — персональные данные, а текст исключения почти наверняка попадёт в лог. Поэтому:
- в
ExolveProtocolException.BodyPreviewномер замаскирован; - сырое тело ответа в
Metadata.RawBodyне сохраняется, пока не включишьCaptureRawResponseBody.
Лицензия
MIT.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- System.Net.Http.Json (>= 8.0.1)
- System.Text.Json (>= 8.0.6)
-
net10.0
- No dependencies.
-
net8.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.