matbarofex / pyRofex

Python library to connect with Matba Rofex's Rest and Websocket APIs. Market Data and Order Routing are supported.
MIT License
78 stars 54 forks source link

Problema con el websocket #21

Closed jcosentino1 closed 2 years ago

jcosentino1 commented 2 years ago

Recibo el error ‘NoneType’ object has no attributte ‘connected’ al intentar suscribirme al websocket hasta el 29/09 anda perfectamente.

fplanas27 commented 2 years ago

Yo estoy teniendo el mismo problema cuando envio el web socket: websocket ERROR error from callback <bound method WebSocketClient.on_error of <lib.marketdata.brokers.Primary.pyRofex.clients.websocket_rfx_class.WebSocketClient object at 0x0000026D49DCAB80>>: 'NoneType' object is not callable File "C:\Users\fplan\Anaconda3\envs\ArgyBondsBAF\lib\site-packages\websocket_app.py", line 344, in _callback callback(*args) File "C:/Users/fplan/OneDrive/Documentos/Python Scripts/Proyectos/ArgyBondsBAF\lib\marketdata\brokers\Primary\pyRofex\clients\websocket_rfx_class.py", line 183, in on_error self.on_exception(exception) File "C:/Users/fplan/OneDrive/Documentos/Python Scripts/Proyectos/ArgyBondsBAF\lib\marketdata\brokers\Primary\pyRofex\clients\websocket_rfx_class.py", line 191, in on_exception self.exception_handler(exception) MarketDataPrimary.MarketData ERROR Error 'NoneType' object has no attribute 'connected' ocurred when trying to initiate a websocket connection

fzanuso commented 2 years ago

Hola, gracias por la info recien hoy me pude poner a ver este tema.

Por lo que estuve viendo el error ocurre en una de las validaciones que estoy haciendo al iniciar la conexion websocket en el metodo connect del client WebSocketClient. Al parecer si al iniciar la conexion ws por alguna razon falla el Thread que inicia la funcion run_forever o se demora mas de un segundo entonces tira la excepcion "Error 'NoneType' object has no attribute 'connected' " cuando quiero validar si el socket se conecto al server.

Entiendo que este error no les pasa siempre, porque no logre reproducirlo localmente, solo cuando hice que fallara el metodo run_forever fue cuando obtuve el mismo error. Si les ocurre permanentemente por favor diganme y lo vemos.

Por lo pronto, voy a actualizar esta validacion para que no ocurra de vuelta.

En cuanto este listo el fix, lo subo y genero la version 0.4.1.

Gracias!

fzanuso commented 2 years ago

Version 0.4.1 subida.

jcosentino1 commented 2 years ago

Hola, inicialmente me daba ese error y ahora el error que recibo es:

Enviado desde un dispositivo móvil

El 8 oct 2021, a la(s) 19:09, Franco Zanuso @.***> escribió:

 Hola, gracias por la info recien hoy me pude poner a ver este tema.

Por lo que estuve viendo el error ocurre en una de las validaciones que estoy haciendo al iniciar la conexion websocket en el metodo connect del client WebSocketClient. Al parecer si al iniciar la conexion ws por alguna razon falla el Thread que inicia la funcion run_forever o se demora mas de un segundo entonces tira la excepcion "Error 'NoneType' object has no attribute 'connected' " cuando quiero validar si el socket se conecto al server.

Entiendo que este error no les pasa siempre, porque no logre reproducirlo localmente, solo cuando hice que fallara el metodo run_forever fue cuando obtuve el mismo error. Si les ocurre permanentemente por favor diganme y lo vemos.

Por lo pronto, voy a actualizar esta validacion para que no ocurra de vuelta.

En cuanto este listo el fix, lo subo y genero la version 0.4.1.

Gracias!

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.

fplanas27 commented 2 years ago

a mi me da siempre:

import time

import pyRofex

1-Initialize the environment

pyRofex.initialize(user="fplanas5506", password="nralwT8&", account="REM5506", environment=pyRofex.Environment.REMARKET)

2-Defines the handlers that will process the messages and exceptions.

def order_report_handler(message): print("Order Report Message Received: {0}".format(message))

def error_handler(message): print("Error Message Received: {0}".format(message))

def exception_handler(e): print("Exception Occurred: {0}".format(e.message))

pyRofex.init_websocket_connection(order_report_handler=order_report_handler, error_handler=error_handler, exception_handler=exception_handler) Traceback (most recent call last):

File "", line 1, in pyRofex.init_websocket_connection(order_report_handler=order_report_handler,

File "C:\Users\fplan\Anaconda3\envs\ArgyBondsBAF\lib\site-packages\pyRofex\service.py", line 443, in init_websocket_connection client.connect()

File "C:\Users\fplan\Anaconda3\envs\ArgyBondsBAF\lib\site-packages\pyRofex\clients\websocket_rfx.py", line 134, in connect while not self.ws_connection.sock.connected and conn_timeout:

AttributeError: 'NoneType' object has no attribute 'connected'

fplanas27 commented 2 years ago

Al querer hacer la conexion por websocket no arroja el error pero al sbscribir al order_report dice que la conexion ya esta cerrada.

import time

import pyRofex

1-Initialize the environment

pyRofex.initialize(user="xxxxxxx", password="xxxxxxx", account="xxxxxxxx", environment=pyRofex.Environment.REMARKET)

2-Defines the handlers that will process the messages and exceptions.

def order_report_handler(message): print("Order Report Message Received: {0}".format(message))

def error_handler(message): print("Error Message Received: {0}".format(message))

""" def exception_handler(e): print("Exception Occurred: {0}".format(e.message)) """

3-Initialize Websocket Connection with the handlers

pyRofex.init_websocket_connection(order_report_handler=order_report_handler, error_handler=error_handler)

pyRofex.order_report_subscription() Traceback (most recent call last):

File "", line 1, in pyRofex.order_report_subscription()

File "C:\Users\fplan\Anaconda3\envs\ArgyBondsBAF\lib\site-packages\pyRofex\service.py", line 574, in order_report_subscription client.order_report_subscription(account, snapshot)

File "C:\Users\fplan\Anaconda3\envs\ArgyBondsBAF\lib\site-packages\pyRofex\clients\websocket_rfx.py", line 262, in order_report_subscription self.ws_connection.send(message)

File "C:\Users\fplan\Anaconda3\envs\ArgyBondsBAF\lib\site-packages\websocket_app.py", line 155, in send raise WebSocketConnectionClosedException(

WebSocketConnectionClosedException: Connection is already closed.

fzanuso commented 2 years ago

Hola fplanas27 ,

No estoy pudiendo reproducir el issue de mi lado. Entiendo por lo que decis que no te tira mas el error: "AttributeError: 'NoneType' object has no attribute 'connected'" pero ahora te esta tirando "WebSocketConnectionClosedException: Connection is already closed."

Ese error lo esta tirando porque esta intentando enviar un msj por la conexion websocket pero esta cerrada.

Que version de la libreria estas utilizando? podrias hacer: pip show pyRofex

fplanas27 commented 2 years ago

La versión es: pyRofex 0.4.1

Federico Planas @.***

El sáb, 9 oct 2021 a las 17:06, Franco Zanuso @.***>) escribió:

Hola fplanas27 ,

No estoy pudiendo reproducir el issue de mi lado. Entiendo por lo que decis que no te tira mas el error: "AttributeError: 'NoneType' object has no attribute 'connected'" pero ahora te esta tirando "WebSocketConnectionClosedException: Connection is already closed."

Ese error lo esta tirando porque esta intentando enviar un msj por la conexion websocket pero esta cerrada.

Que version de la libreria estas utilizando? podrias hacer: pip show pyRofex

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/matbarofex/pyRofex/issues/21#issuecomment-939355074, or unsubscribe https://github.com/notifications/unsubscribe-auth/ANMKY6QN7DJ4YV26OLB757TUGCOETANCNFSM5FEWMXXA . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

Aonik10 commented 2 years ago

Buenas, dos cosas que me pasaron a ver si ayuda para el fix.

Primero que nada, al exception_handler(e), le tuve que sacar el ".message" porque el error que recibo no tiene un atributo "message".

Hecho esto, el error que recibo tiene que ver con un problema de certificados:

Exception Occurred: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1129) Exception Occurred: Connection could not be established. Exception Occurred: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1129) Exception Occurred: Connection could not be established.

Esto seguramente tiene que ver con el vencimiento global de certificados que hubo el 30/09/2021.

Esto lo podes corregir desde la librería o es un tema de cada uno?

fplanas27 commented 2 years ago

Si correcto yo lo tenia como e.message y luego comente eso para concentrarme en el problema pero no funciona como antes.

Aonik10 commented 2 years ago

Puede ser que sea un problema solo de remarkets. Pude conectar configurando el metodo run_forever() del websocket configurando el parametro sslopt=None como:

sslopt={"cert_reqs": ssl.CERT_NONE}

previamente hay que hacer import ssl

jcosentino1 commented 2 years ago

Hola, me podras dar una mano, donde se pone esa configuración?

Enviado desde un dispositivo móvil

El 13 oct 2021, a la(s) 17:28, Aonik10 @.***> escribió:

 Puede ser que sea un problema solo de remarkets. Pude conectar configurando el metodo run_forever() del websocket configurando el parametro sslopt=None como:

sslopt={"cert_reqs": ssl.CERT_NONE}

previamente hay que hacer import ssl

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.

Aonik10 commented 2 years ago

Busca dentro de la libreria pyRofex el archivo _app.py tiene una clase creada que se llama WebSocketApp(object). Ahi adentro tiene definido el metodo run_forever(), lo deje configurado asi:

def run_forever(self, sockopt=None, sslopt={"cert_reqs": ssl.CERT_NONE}, ping_interval=0, ping_timeout=None, http_proxy_host=None, http_proxy_port=None, http_no_proxy=None, http_proxy_auth=None, skip_utf8_validation=False, host=None, origin=None, dispatcher=None, suppress_origin=False, proxy_type=None)

Supongo que también podes buscar en donde es invocado el método y aclarar que corra con ese parámetro especifico, pero a mi me resulto mas rápido asi.

Abrz

fzanuso commented 2 years ago

Buenas,

Voy comentando algunas cosas:

1- Aonik10, fplanas27: por el problema del exception_handler(e), es correcto el objeto e no tiene un atributo message, eso esta mal en uno de los ejemplos pero ya lo arregle. La forma correcta de la funcion seria:

def exception_handler(e):
    print("Exception Occurred: {0}".format(e.msg))

2- Por el tema del error SSL: CERTIFICATE_VERIFY_FAILED, esto se debe a que al intentar establecer la conexion websocket el cliente entiende que el certificado del servidor esta vencido y falla. Me fije y el certificado de ese server es valido, lo que si vi es que lo renovaron el 28/09 por lo que por algun motivo desde donde estan ejecutando el codigo entiende que el certificado es el viejo y ya expiro. La verdad que no estoy seguro porque pasa esto pero entiendo que esa es la razon por la que desde mi computadora si me funciona y no me tira ese error.

Puedo pedirles que entren desde su navegador a: https://api.remarkets.primary.com.ar/ y me digan si les aparece como que el certificado del sitio esta vencido. Si les aparece como que el certificado esta vencido entonces hay que ver porque esta tomando el certificado viejo en sus computadoras. Por otro lado, lo que yo puedo hacer mientras es agregar una opcion en pyRofex para que te permita indicar si queres que valide el certificado o no al establecer la conexion websocket. Utilizando lo que comento Aonik10 sslopt={"cert_reqs": ssl.CERT_NONE}

fplanas27 commented 2 years ago

Ahi probe y el certificado es valido: [image: image.png]

Federico Planas @.***

El mié, 20 oct 2021 a las 20:18, Franco Zanuso @.***>) escribió:

Buenas,

Voy comentando algunas cosas:

1- Aonik10, fplanas27: por el problema del exception_handler(e), es correcto el objeto e no tiene un atributo message, eso esta mal en uno de los ejemplos pero ya lo arregle. La forma correcta de la funcion seria:

def exception_handler(e): print("Exception Occurred: {0}".format(e.msg))

2- Por el tema del error SSL: CERTIFICATE_VERIFY_FAILED, esto se debe a que al intentar establecer la conexion websocket el cliente entiende que el certificado del servidor esta vencido y falla. Me fije y el certificado de ese server es valido, lo que si vi es que lo renovaron el 28/09 por lo que por algun motivo desde donde estan ejecutando el codigo entiende que el certificado es el viejo y ya expiro. La verdad que no estoy seguro porque pasa esto pero entiendo que esa es la razon por la que desde mi computadora si me funciona y no me tira ese error.

Puedo pedirles que entren desde su navegador a: https://api.remarkets.primary.com.ar/ y me digan si les aparece como que el certificado del sitio esta vencido. Si les aparece como que el certificado esta vencido entonces hay que ver porque esta tomando el certificado viejo en sus computadoras. Por otro lado, lo que yo puedo hacer mientras es agregar una opcion en pyRofex para que te permita indicar si queres que valide el certificado o no al establecer la conexion websocket. Utilizando lo que comento Aonik10 sslopt={"cert_reqs": ssl.CERT_NONE}

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/matbarofex/pyRofex/issues/21#issuecomment-948106891, or unsubscribe https://github.com/notifications/unsubscribe-auth/ANMKY6QVCB53HMEHES3CVSLUH5E6FANCNFSM5FEWMXXA . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

fplanas27 commented 2 years ago

Captura

fplanas27 commented 2 years ago

adjunto la imagen de mi comentario anterior.

fzanuso commented 2 years ago

En el codigo que estas ejecutando donde te tira el error. Podrias agregar al comienzo:

import ssl
import os
print(os.environ.get('WEBSOCKET_CLIENT_CA_BUNDLE'))
print(ssl.get_default_verify_paths())

Y me decis que te muestra.

fzanuso commented 2 years ago

fplanas27, ahi subi una version nueva para que pruebes con el cambio que te comente para poder indicar que no valide el certificado.

Tendrias que hacer:

pip install -U pyRofex==0.4.2rc1

y luego en el codigo:

pyRofex.initialize(user="fplanas5506",
                   password="XXXXXXX",
                   account="XXXXXXX",
                   environment=pyRofex.Environment.REMARKET,
                   ssl_opt={"cert_reqs": ssl.CERT_NONE})

Cuando puedas probalo y si te funciona, subo la version 0.4.2.

Abz

fplanas27 commented 2 years ago

Ahi lo probe y me arroja el siguiente error:

import time

import pyRofex

1-Initialize the environment

pyRofex.initialize(user="fplanas5506", password="nralwT8&", account="REM5506", environment=pyRofex.Environment.REMARKET, ssl_opt={"cert_reqs": ssl.CERT_NONE})

2-Defines the handlers that will process the messages and exceptions.

def order_report_handler(message): print("Order Report Message Received: {0}".format(message))

def error_handler(message): print("Error Message Received: {0}".format(message))

""" def exception_handler(e): print("Exception Occurred: {0}".format(e.message)) """

3-Initialize Websocket Connection with the handlers

pyRofex.init_websocket_connection(order_report_handler=order_report_handler, error_handler=error_handler) """ , exception_handler=exception_handler) """

4-Subscribes to receive order report for the default account

pyRofex.order_report_subscription() Traceback (most recent call last):

File "", line 11, in ssl_opt={"cert_reqs": ssl.CERT_NONE})

NameError: name 'ssl' is not defined

Federico Planas @.***

El mié, 20 oct 2021 a las 21:17, Franco Zanuso @.***>) escribió:

fplanas27, ahi subi una version nueva para que pruebes con el cambio que te comente para poder indicar que no valide el certificado.

Tendrias que hacer:

pip install -U pyRofex==0.4.2rc1

y luego en el codigo:

pyRofex.initialize(user="fplanas5506", password="XXXXXXX", account="XXXXXXX", environment=pyRofex.Environment.REMARKET, ssl_opt={"cert_reqs": ssl.CERT_NONE})

Cuando puedas probalo y si te funciona, subo la version 0.4.2.

Abz

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/matbarofex/pyRofex/issues/21#issuecomment-948129477, or unsubscribe https://github.com/notifications/unsubscribe-auth/ANMKY6SAM2YNWVW4WFNEKDLUH5LYJANCNFSM5FEWMXXA . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

fzanuso commented 2 years ago

fplanas27 hay que importar el paquete ssl al inicio

import ssl

fplanas27 commented 2 years ago

Ahi anduvo perfecto.

Te agradezco.

Federico Planas @.***

El mié, 20 oct 2021 a las 22:53, Franco Zanuso @.***>) escribió:

fplanas27 hay que importar el paquete ssl al inicio

import ssl

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/matbarofex/pyRofex/issues/21#issuecomment-948184580, or unsubscribe https://github.com/notifications/unsubscribe-auth/ANMKY6RT5KT3XW3XPX5FJR3UH5XARANCNFSM5FEWMXXA . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

jcosentino1 commented 2 years ago

Hola, ahi probe con la version nueva incluyendo el parametro para evitar la validación, pero en el entorno LIVE no me toma ese parametro. Esto solo es para REMARKET?

Enviado desde un dispositivo móvil

El 20 oct 2021, a la(s) 21:17, Franco Zanuso @.***> escribió:

 fplanas27, ahi subi una version nueva para que pruebes con el cambio que te comente para poder indicar que no valide el certificado.

Tendrias que hacer:

pip install -U pyRofex==0.4.2rc1

y luego en el codigo:

pyRofex.initialize(user="fplanas5506", password="XXXXXXX", account="XXXXXXX", environment=pyRofex.Environment.REMARKET, ssl_opt={"cert_reqs": ssl.CERT_NONE}) Cuando puedas probalo y si te funciona, subo la version 0.4.2.

Abz

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.

jcosentino1 commented 2 years ago

Me faltaba actualizar el kernel, pero sigo recibiendo el error de certificado vencido...

Enviado desde un dispositivo móvil

El 20 oct 2021, a la(s) 23:27, fplanas27 @.***> escribió:

 Ahi anduvo perfecto.

Te agradezco.

Federico Planas @.***

El mié, 20 oct 2021 a las 22:53, Franco Zanuso @.***>) escribió:

fplanas27 hay que importar el paquete ssl al inicio

import ssl

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/matbarofex/pyRofex/issues/21#issuecomment-948184580, or unsubscribe https://github.com/notifications/unsubscribe-auth/ANMKY6RT5KT3XW3XPX5FJR3UH5XARANCNFSM5FEWMXXA . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.

fplanas27 commented 2 years ago

Hola fzanuso, como estas? estoy volviendo a tener el mismo problema desde varias maquinas:

DefaultVerifyPaths(cafile=None, capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='C:\Program Files\Common Files\SSL/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='C:\Program Files\Common Files\SSL/certs') Traceback (most recent call last):

File "C:\Users\fplan\OneDrive\Documentos\Python Scripts\APIRofex\pyRofexWebsocketOrderReport.py", line 60, in pyRofex.order_report_subscription()

File "C:\Users\fplan\Anaconda3\envs\ISM\lib\site-packages\pyRofex\service.py", line 579, in order_report_subscription client.order_report_subscription(account, snapshot)

File "C:\Users\fplan\Anaconda3\envs\ISM\lib\site-packages\pyRofex\clients\websocket_rfx.py", line 264, in order_report_subscription self.ws_connection.send(message)

File "C:\Users\fplan\Anaconda3\envs\ISM\lib\site-packages\websocket_app.py", line 155, in send raise WebSocketConnectionClosedException(

WebSocketConnectionClosedException: Connection is already closed.

pip show pyRofex Name: pyRofex Version: 0.4.2rc1 Summary: Python connector for ROFEX's Rest and Websocket APIs. Home-page: https://github.com/gruporofex/pyRofex Author: Franco Zanuso Author-email: francozanuso89@gmail.com License: UNKNOWN Location: c:\users\fplan\anaconda3\envs\ism\lib\site-packages Requires: enum34, requests, simplejson, websocket-client Required-by: Note: you may need to restart the kernel to use updated packages.