matbarofex/pyRofex

Problema con el websocket

Closed this issue · 25 comments

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

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

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!

Version 0.4.1 subida.

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'

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.

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

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?

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

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

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

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}

adjunto la imagen de mi comentario anterior.

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.

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 hay que importar el paquete ssl al inicio

import ssl

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.