-
Notifications
You must be signed in to change notification settings - Fork 9
Description
Hola a todos,
Respecto a la issue #5, ya lo mencionó @Kyngo en su día, pero existen servicios de pago como 2Captcha que permiten resolver este tipo de Captchas automáticos. Entiendo que no es la solución ideal que todos queremos, pero lo que también queremos es poder ver nuestro consumo de agua de manera automatizada, y si hay que poner el access token de manera manual cada vez para actualizarlo pierde un poco el sentido.
Yo me lo miré y lo he estado probando y funciona bastante bien, he tenido algún problema con los flows de la integración porque aún no me he hecho un deep dive en ellas, pero he conseguido que me funcionase durante varios días (salvo algún edge case del flow que me fallaba). No hago PR porque el código estaba bastante sucio, pero veréis que es bastante sencillo de añadir.
El captcha que utiliza Aigües de Barcelona es el ReCaptcha V2 de Google, en la web de 2Captcha y a día de hoy, el precio por cada 1000 peticiones para resolver el challenge del captcha está entre 0.99€ y 2.80€. Significa que si resolviéramos el challenge del captcha cada 1h (lo que tarda en expirar), serian 24 veces * 30 días al mes (aprox) = 720 llamadas al mes. Es decir, entre 0.71€ y 2.00€ al mes. Como los tokens duran 1h, podríamos incluso hacer peticiones para ver los consumos cada x minutos si quisiéramos, porque seguiríamos pagando lo mismo.
En todo caso, puedes pagar añadiendo fondos a tu cuenta, así que podéis limitar la cantidad de dinero que pongáis.
A continuación, os enseño básicamente como funciona, es muy simple:
from typing import TypedDict
from twocaptcha import TwoCaptcha
# Constantes que tenéis que añadir a const.py
# El page url es básicamente la página dónde se va a generar el challenge del captcha
# El sitekey lo podéis encontrar en el html del page url, tenéis más documentación en la página de 2Captcha
RECAPTCHA_V2_PAGEURL = "https://www.aiguesdebarcelona.cat/ca/area-clientes#/login"
RECAPTCHA_V2_SITEKEY = "6LfPoasUAAAAAL5M1txzF5PJ91udHgE5PMm0JWWS"
# Para ponerle un tipo a la respuesta de su API
class ChallengeResponse(TypedDict):
captchaId: str
code: str
# Cambiad la api key por la vuestra
two_captcha_api_key = "00000000000000000000000000000000"
client = TwoCaptcha(two_captcha_api_key)
# Esta API call a veces tarda mucho: puede llegar a hacer timeout (en un par de minutos)
# Lo normal es que tarde menos de 60s
response: ChallengeResponse = client.recaptcha(
sitekey=RECAPTCHA_V2_SITEKEY,
url=RECAPTCHA_V2_PAGEURL,
)
recaptcha_client_response = response["code"]Este recaptcha_client_response es lo que le pasáis a AiguesApiClient.login como parámetro recaptcha
Cosas que tenéis que tener en cuenta:
- Hay que pedir el API Key de 2Captcha en el config flow
- Hay que quitar los checks que vuelven a pedir el valor de la cookie al usuario
- Hay que gestionar los retries de la función recaptcha y controlar sus errores (uno de ellos por ejemplo es saldo 0€)
- Si queremos mantener que se pueda introducir el valor de la cookie manualmente, hay que gestionar eso
- Se podría usar la API de Home Assistant de Repairs para cuando se agote el saldo de 2Captcha, para avisar automáticamente
Si queréis probar el flow sin añadir dinero a 2Captcha, creo que ofrece un Sandbox Mode con un software donde vosotros mismos podéis resolver el captcha. También quiero añadir que 2Captcha tiene un programa de referidos, yo no voy a poner ninguno, pero si alguien de los principales desarrolladores pone el suyo estaré encantado de unirme para contribuir al desarrollo de la integración, aunque sea indirectamente.
Finalmente, quiero añadir que esto es una solución que no es óptima pero al fin y al cabo es una solución. Me parece mucho más triste que no podamos usar esta integración que tanto os habéis currado porque Aigües de Barcelona no nos da soporte...
Espero que mi contribución os haya ayudado, he visto cierta frustración por los problemas del captcha (yo mismo incluido) y no quería quedarme de brazos cruzados: lo que queramos hacer ahora ya queda a criterio de @duhow, el resto de contributors y de la gente que usamos la integración.
Si tenéis alguna duda preguntadme, intentaré ayudaros en la medida de lo posible.
Un saludo,
Teynar