Skip to content
This repository has been archived by the owner on Jul 19, 2024. It is now read-only.

Commit

Permalink
Merge pull request #10 from suitetecsa/develop
Browse files Browse the repository at this point in the history
  • Loading branch information
lesclaz authored May 30, 2023
2 parents 6b3ee75 + 4a36eb8 commit aca6d0c
Show file tree
Hide file tree
Showing 48 changed files with 1,620 additions and 2,560 deletions.
Empty file modified .github/FUNDING.yml
100644 → 100755
Empty file.
Empty file modified .github/workflows/tests.yml
100644 → 100755
Empty file.
Empty file modified .gitignore
100644 → 100755
Empty file.
62 changes: 35 additions & 27 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

[![](https://jitpack.io/v/suitetecsa/suitetecsa-sdk-kotlin.svg)](https://jitpack.io/#suitetecsa/suitetecsa-sdk-kotlin)

`suitetecs-sdk-kotlin` es una herramienta diseñada para interactuar con los servicios de [ETECSA](https://www.etecsa.cu/). La librería utiliza técnicas de scrapping para acceder a los portales de [acceso a internet ](https://secure.etecsa.net:8443/)y de [usuario](https://www.portal.nauta.cu/) de Nauta. Implementa funciones para todas las operaciones disponibles en ambos portales, y ofrece soporte para Nauta Hogar.
`suitetecs-sdk-kotlin` es una herramienta diseñada para interactuar con los servicios de [ETECSA](https://www.etecsa.cu/). La librería utiliza técnicas de scrapping para acceder a los portales de [acceso a internet ](https://secure.etecsa.net:8443/)y de [usuario](https://www.portal.nauta.cu/) de Nauta. Implementa funciones para todas las operaciones disponibles en ambos portales, y ofrece soporte para Nauta Hogar.

Todas las funcionalidades están disponibles desde una única clase, `NautaClient`, lo que permite interactuar con ambos portales a la vez, permitiendo obtener datos de manera rápida y eficiente, ahorrando tiempo y esfuerzos a la hora de desarrollar aplicaciones que busquen gestionar los servicios de [ETECSA](https://www.etecsa.cu/). Además, incluye funcionalidades útiles como la generación de contraseñas y la compartición de sesión.
Todas las funcionalidades están disponibles desde una única clase, `NautaApi`, lo que permite interactuar con ambos portales a la vez, permitiendo obtener datos de manera rápida y eficiente, ahorrando tiempo y esfuerzos a la hora de desarrollar aplicaciones que busquen gestionar los servicios de [ETECSA](https://www.etecsa.cu/). Además, incluye funcionalidades útiles como la generación de contraseñas y la compartición de sesión.

Se han seguido los principios SOLID en su desarrollo, lo que garantiza que es fácil de entender, modificar y mantener. La mayoría de la información devuelta por las funciones son objetos, lo que simplifica el trabajo de las aplicaciones que lo utilizan.

Expand Down Expand Up @@ -48,67 +48,75 @@ Al ser un proyecto open-source, se valoran y se reciben contribuciones de la com
Importa `suitetecsa-sdk-kotlin` en tu proyecto

```groovy
implementation("com.github.suitetecsa:suitetecsa-sdk-kotlin:0.1.8")
implementation("com.github.suitetecsa:suitetecsa-sdk-kotlin:0.2-alpha01")
```

Importal `NautaSession`, `JsoupNautaProvider` y `NautaClient`
Importal `NautaSession`, `JsoupConnectPortalCommunicator`, `JsoupConnectPortalScraper`, `JsoupUserPortalCommunicator`, `JsoupUserPortalScrapper` y `NautaApi`

```kotlin
import cu.suitetecsa.sdk.nauta.data.repository.JSoupNautaSrapper
import cu.suitetecsa.sdk.nauta.data.repository.DefaultNautaSession
import cu.suitetecsa.sdk.nauta.domain.service.NautaClient
import cu.suitetecsa.sdk.nauta.framework.network.JsoupConnectPortalCommunicator
import cu.suitetecsa.sdk.nauta.framework.network.JsoupUserPortalCommunicator
import cu.suitetecsa.sdk.nauta.framework.network.DefaultNautaSession
import cu.suitetecsa.sdk.nauta.framekork.JsoupConnectPortalScraper
import cu.suitetecsa.sdk.nauta.framekork.JsoupUserPortalScrapper
import cu.suitetecsa.sdk.nauta.framekork.NautaApi
```

Crea las instancias necesarias o inyectalas

```kotlin
    val session = DefaultNautaSession()
val scrapper = JSoupNautaSrapper(session)
val client = NautaClient(scrapper)
val userSession = DefaultNautaSession()
val connectSession = DefaultNautaSession()
val api = NautaApi(
JsoupConnectPortalCommunicator(connectSession),
JsoupConnectPortalScraper(),
JsoupUserPortalCommunicator(userSession),
JsoupUserPortalScrapper()
)
```

Establece las credenciales que usaras para iniciar sesion

```kotlin
    client.setCredentials("user.name@nauta.com.cu", "somePassword")
api.credentials = Pair("user.name@nauta.com.cu", "somePassword")
```

Conectate a internet desde la wifi o Nauta Hogar

```kotlin
    // Para hacer login en el portal cautivo
client.connect()
// Para hacer login en el portal cautivo
api.connect()
// Obtener el tiempo restante
val remainingTime = client.remainingTime
val remainingTime = api.remainingTime
```

Interactua con el portal de usuario

```kotlin
    // Para hacer login en el portal de usuario
downloadCaptcha("captchaImage.png", client.captchaImage)
// Para hacer login en el portal de usuario
downloadCaptcha("captchaImage.png", api.captchaImage)
print("Introduzca el código de la imagen captcha: ")
val keyMap = Scanner(System.`in`)
val captchaCode = keyMap.nextLine()
val user: NautaUser = client.login(captchaCode)
val user: NautaUser = api.login(captchaCode)
```

Otras funciones

```kotlin
// Funciones del portal cautivo
client.connectInformation
client.disconnect()
api.connectInformation // Obtiene la información de la cuenta que provee el portal cautivo
api.disconnect() // Desconecta la cuenta activa

// Funciones del portal de usuario
client.userInformation
client.toUpBalance("rechargeCode")
client.transferBalance(25f, "destinationAccount")
client.payNautaHome(300f)
client.getConnections(2023, 3)
client.getRecharges(2023, 3)
client.getTransfers(2023, 3)
client.getQuotesPaid(2023, 3)
api.userInformation // Obtiene la información de la cuenta que provee el portal de usuario
api.toUpBalance("rechargeCode") // Recarga el saldo de la cuenta
api.transferBalance(25f, "destinationAccount") // Para transferir saldo a otra cuenta nauta
api.transferBalance(25f) // Para pagar cuota de nauta hogar
api.getConnections(api.getConnectionsSummary(2023, 3)) // Obtiene las conexiones realizadas en el mes y año especificados
api.getRecharges(api.getRechargesSummary(2023, 3)) // Obtiene las recargas realizadas en el mes y año especificados
api.getTransfers(api.getTransfersSummary(2023, 3)) // Obtiene las transferencias realizadas en el mes y año especificados
api.getQuotesPaid(api.getQuotesPaidSummary(2023, 3)) // Obtiene las cuotas pagadas en el mes y año especificados
```

# Contribución
Expand Down
4 changes: 2 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ plugins {
}

group = "cu.suitetecsa"
version = "0.1.8"
version = "0.2-alpha01"

publishing {
publications { // Configure el paquete de salida publicado, un proyecto puede tener múltiples salidas, pero solo una es
Expand Down Expand Up @@ -42,4 +42,4 @@ tasks.test {

tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "1.8"
}
}
12 changes: 7 additions & 5 deletions src/main/kotlin/cu/suitetecsa/sdk/nauta/core/Constants.kt
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
package cu.suitetecsa.sdk.nauta.core

val userAgent: String
internal val userPortal = Portal.USER
internal val connectPortal = Portal.CONNECT
internal val userAgent: String
get() = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:97.0) Gecko/20100101 Firefox/97.0"
val headers: MutableMap<String, String>
internal val headers: MutableMap<String, String>
get() = mutableMapOf(
"Accept" to "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Encoding" to "gzip, deflate, br",
"Accept-Language" to "es-MX,es;q=0.8,en-US;q=0.5,en;q=0.3"
)
val connectDomain: String
internal val connectDomain: String
get() = "secure.etecsa.net"
val urlBase: Map<Portal, String>
internal val urlBase: Map<Portal, String>
get() = mapOf(
Portal.CONNECT to "https://$connectDomain:8443/",
Portal.USER to "https://www.portal.nauta.cu/"
)
val portalsUrls: Map<Portal, Map<Action, Any>>
internal val portalsUrls: Map<Portal, Map<Action, Any>>
get() = mapOf(
Portal.CONNECT to mapOf(
Action.LOGOUT to "LogoutServlet",
Expand Down
11 changes: 7 additions & 4 deletions src/main/kotlin/cu/suitetecsa/sdk/nauta/core/ExtendsFuns.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import org.jsoup.select.Elements

fun Connection.Response.throwExceptionOnFailure(exc: Class<out Exception>, msg: String) {
internal fun Connection.Response.throwExceptionOnFailure(exc: Class<out Exception>, msg: String) {
val exceptionConstructor = exc.getDeclaredConstructor(String::class.java)
if (this.statusCode() != 200 && this.statusCode() != 302) {
throw exceptionConstructor.newInstance(
Expand All @@ -15,7 +15,7 @@ fun Connection.Response.throwExceptionOnFailure(exc: Class<out Exception>, msg:
}
}

fun Document.throwExceptionOnFailure(exc: Class<out Exception>, msg: String, portalManager: Portal) {
internal fun Document.throwExceptionOnFailure(exc: Class<out Exception>, msg: String, portalManager: Portal) {
val exceptionConstructor = exc.getDeclaredConstructor(String::class.java)
val errors = mutableListOf<String>()
val lastScript = this.select("script[type='text/javascript']").last()
Expand Down Expand Up @@ -51,6 +51,9 @@ fun Document.throwExceptionOnFailure(exc: Class<out Exception>, msg: String, por
}
}

operator fun Elements.component6(): Element {
internal operator fun Elements.component6(): Element {
return this[5]
}
}

fun String.toSeconds() =
this.split(":").map { it.toInt() }.fold(0) { acc, value -> acc * 60 + value }.toLong()
6 changes: 0 additions & 6 deletions src/main/kotlin/cu/suitetecsa/sdk/nauta/core/Method.kt

This file was deleted.

37 changes: 37 additions & 0 deletions src/main/kotlin/cu/suitetecsa/sdk/nauta/core/Util.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package cu.suitetecsa.sdk.nauta.core

internal fun makeUrl(
action: Action,
portalManager: Portal,
getAction: Boolean = false,
subAction: String? = null,
yearMonthSelected: String? = null,
count: Int? = null,
page: Int? = null
): String {
if (action == Action.CHECK_CONNECTION) {
return portalsUrls[portalManager]!![action] as String
} else if (!getAction) {
return "${urlBase[portalManager]}${portalsUrls[portalManager]!![action]}"
} else {
val url = "${urlBase[portalManager]}${(portalsUrls[portalManager]!![action]!! as Map<*, *>)[subAction]}"
when (subAction) {
"base", "summary" -> {
return url
}

"list" -> {
if (yearMonthSelected.isNullOrEmpty()) {
throw Exception("yearMonthSelected is required")
}
if (count == null) {
throw Exception("count is required")
}
return if (page == null) {
"${url}${yearMonthSelected}/${count}"
} else "${url}${yearMonthSelected}/${count}/${page}"
}
}
}
return ""
}

This file was deleted.

This file was deleted.

This file was deleted.

Loading

0 comments on commit aca6d0c

Please sign in to comment.