2021年4月30日星期五

getting credentials entered as invalid even after entering valid credentials in xts-pythonclient-api-sdk

I am working on algorithmic trading using python with the IIFL securities account for which we are using the xts-pythonclient-api-sdk I am running the Example.py file

#Marketdata API Credentials   API_KEY = "YOUR_API_KEY_HERE"   API_SECRET = "YOUR_API_SECRET_HERE"   XTS_API_BASE_URL = "https://developers.symphonyfintech.in"   source = "WEBAPI"    """Make the XTSConnect Object with Marketdata API appKey, secretKey and source"""  xt = XTSConnect(API_KEY, API_SECRET, source)    """Using the object we call the login function Request"""  response = xt.marketdata_login()  print("MarketData Login: ", response)  

Below I have attached the connect.py file

from six.moves.urllib.parse import urljoin  import json  import logging  import requests  import Exception as ex  from requests.adapters import HTTPAdapter  import configparser    log = logging.getLogger(__name__)    class XTSCommon:      """      Base variables class      """        def __init__(self, token=None, userID=None, isInvestorClient=None):          """Initialize the common variables."""          self.token = token          self.userID = userID          self.isInvestorClient = isInvestorClient      class XTSConnect(XTSCommon):      """      The XTS Connect API wrapper class.      In production, you may initialise a single instance of this class per `api_key`.      """      """Get the configurations from config.ini"""      cfg = configparser.ConfigParser()      cfg.read('config.ini')        # Default root API endpoint. It's possible to      # override this by passing the `root` parameter during initialisation.      _default_root_uri = cfg.get('root_url', 'root')      _default_login_uri = _default_root_uri + "/user/session"      _default_timeout = 7  # In seconds        # SSL Flag      _ssl_flag = cfg.get('SSL', 'disable_ssl')        # Constants      # Products      PRODUCT_MIS = "MIS"      PRODUCT_NRML = "NRML"        # Order types      ORDER_TYPE_MARKET = "MARKET"      ORDER_TYPE_LIMIT = "LIMIT"        # Transaction type      TRANSACTION_TYPE_BUY = "BUY"      TRANSACTION_TYPE_SELL = "SELL"        # Squareoff mode      SQUAREOFF_DAYWISE = "DayWise"      SQUAREOFF_NETWISE = "Netwise"        # Squareoff position quantity types      SQUAREOFFQUANTITY_EXACTQUANTITY = "ExactQty"      SQUAREOFFQUANTITY_PERCENTAGE = "Percentage"        # Validity      VALIDITY_DAY = "DAY"        # Exchange Segments      EXCHANGE_NSECM = "NSECM"      EXCHANGE_NSEFO = "NSEFO"      EXCHANGE_NSECD = "NSECD"      EXCHANGE_MCXFO = "MCXFO"      EXCHANGE_BSECM = "BSECM"        # URIs to various calls      _routes = {          # Market API endpoints          "marketdata.prefix": "marketdata",          "market.login": "/marketdata/auth/login",          "market.logout": "/marketdata/auth/logout",            "market.config": "/marketdata/config/clientConfig",            "market.instruments.master": "/marketdata/instruments/master",          "market.instruments.subscription": "/marketdata/instruments/subscription",          "market.instruments.unsubscription": "/marketdata/instruments/subscription",          "market.instruments.ohlc": "/marketdata/instruments/ohlc",          "market.instruments.indexlist": "/marketdata/instruments/indexlist",          "market.instruments.quotes": "/marketdata/instruments/quotes",            "market.search.instrumentsbyid": '/marketdata/search/instrumentsbyid',          "market.search.instrumentsbystring": '/marketdata/search/instruments',            "market.instruments.instrument.series": "/marketdata/instruments/instrument/series",          "market.instruments.instrument.equitysymbol": "/marketdata/instruments/instrument/symbol",          "market.instruments.instrument.futuresymbol": "/marketdata/instruments/instrument/futureSymbol",          "market.instruments.instrument.optionsymbol": "/marketdata/instruments/instrument/optionsymbol",          "market.instruments.instrument.optiontype": "/marketdata/instruments/instrument/optionType",          "market.instruments.instrument.expirydate": "/marketdata/instruments/instrument/expiryDate"      }        def __init__(self,                   apiKey,                   secretKey,                   source,                   root=None,                   debug=False,                   timeout=None,                   pool=None,                   disable_ssl=_ssl_flag):          """          Initialise a new XTS Connect client instance.          - `api_key` is the key issued to you          - `token` is the token obtained after the login flow. Pre-login, this will default to None,          but once you have obtained it, you should persist it in a database or session to pass          to the XTS Connect class initialisation for subsequent requests.          - `root` is the API end point root. Unless you explicitly          want to send API requests to a non-default endpoint, this          can be ignored.          - `debug`, if set to True, will serialise and print requests          and responses to stdout.          - `timeout` is the time (seconds) for which the API client will wait for          a request to complete before it fails. Defaults to 7 seconds          - `pool` is manages request pools. It takes a dict of params accepted by HTTPAdapter          - `disable_ssl` disables the SSL verification while making a request.          If set requests won't throw SSLError if its set to custom `root` url without SSL.          """          self.debug = debug          self.apiKey = apiKey          self.secretKey = secretKey          self.source = source          self.disable_ssl = disable_ssl          self.root = root or self._default_root_uri          self.timeout = timeout or self._default_timeout            super().__init__()            # Create requests session only if pool exists. Reuse session          # for every request. Otherwise create session for each request          if pool:              self.reqsession = requests.Session()              reqadapter = requests.adapters.HTTPAdapter(**pool)              self.reqsession.mount("https://", reqadapter)          else:              self.reqsession = requests            # disable requests SSL warning          requests.packages.urllib3.disable_warnings()        def _set_common_variables(self, access_token, userID, isInvestorClient=None):          """Set the `access_token` received after a successful authentication."""          super().__init__(access_token, userID, isInvestorClient)        def _login_url(self):          """Get the remote login url to which a user should be redirected to initiate the login flow."""          return self._default_login_uri        ########################################################################################################      # Market data API      ########################################################################################################        def marketdata_login(self):          try:              params = {                  "appKey": self.apiKey,                  "secretKey": self.secretKey,                  "source": self.source              }              response = self._post("market.login", params)                if "token" in response['result']:                  self._set_common_variables(response['result']['token'], response['result']['userID'])              return response          except Exception as e:              return response['description']          ########################################################################################################      # Common Methods      ########################################################################################################        def _get(self, route, params=None):          """Alias for sending a GET request."""          return self._request(route, "GET", params)        def _post(self, route, params=None):          """Alias for sending a POST request."""          return self._request(route, "POST", params)        def _put(self, route, params=None):          """Alias for sending a PUT request."""          return self._request(route, "PUT", params)        def _delete(self, route, params=None):          """Alias for sending a DELETE request."""          return self._request(route, "DELETE", params)        def _request(self, route, method, parameters=None):          """Make an HTTP request."""          params = parameters if parameters else {}            # Form a restful URL          uri = self._routes[route].format(params)          url = urljoin(self.root, uri)          headers = {}            if self.token:              # set authorization header              headers.update({'Content-Type': 'application/json', 'Authorization': self.token})            try:              r = self.reqsession.request(method,                                          url,                                          data=params if method in ["POST", "PUT"] else None,                                          params=params if method in ["GET", "DELETE"] else None,                                          headers=headers,                                          verify=not self.disable_ssl)            except Exception as e:              raise e            if self.debug:              log.debug("Response: {code} {content}".format(code=r.status_code, content=r.content))            # Validate the content type.          if "json" in r.headers["content-type"]:              try:                  data = json.loads(r.content.decode("utf8"))              except ValueError:                  raise ex.XTSDataException("Couldn't parse the JSON response received from the server: {content}".format(                      content=r.content))                # api error              if data.get("type"):                    if r.status_code == 400 and data["type"] == "error" and data["description"] == "Invalid Token":                      raise ex.XTSTokenException(data["description"])                    if r.status_code == 400 and data["type"] == "error" and data["description"] == "Bad Request":                      message = "Description: " + data["description"] + " errors: " + data['result']["errors"]                      raise ex.XTSInputException(str(message))                return data          else:              raise ex.XTSDataException("Unknown Content-Type ({content_type}) with response: ({content})".format(                  content_type=r.headers["content-type"],                  content=r.content))    

The error that I am getting :

{'type': 'error', 'code': 'e-response-0005', 'description': 'Your credentials are invalid'}  MarketData Login:  Your credentials are invalid  Config : {'type': 'error', 'code': 'e-token-0006', 'description': 'Please Provide token to Authenticate'}  Quote : {'type': 'error', 'code': 'e-token-0006', 'description': 'Please Provide token to Authenticate'}  Subscribe : {'type': 'error', 'code': 'e-token-0006', 'description': 'Please Provide token to Authenticate'}  Unsubscribe : {'type': 'error', 'code': 'e-token-0006', 'description': 'Please Provide token to Authenticate'}  Traceback (most recent call last):    File "Connect.py", line 526, in get_master      response = self._post('market.instruments.master', json.dumps(params))    File "Connect.py", line 636, in _post      return self._request(route, "POST", params)    File "Connect.py", line 688, in _request      message = "Description: " + data["description"] + " errors: " + data['result']["errors"]  TypeError: must be str, not list    During handling of the above exception, another exception occurred:    Traceback (most recent call last):    File "Example.py", line 199, in <module>      response = xt.get_master(exchangeSegmentList=exchangesegments)  et_master      return response['description']  UnboundLocalError: local variable 'response' referenced before assignment  

For further reference please refer the link below for the github code: https://github.com/symphonyfintech/xts-pythonclient-api-sdk

https://stackoverflow.com/questions/67342799/getting-credentials-entered-as-invalid-even-after-entering-valid-credentials-in May 01, 2021 at 12:10PM

没有评论:

发表评论