43

Hi I am having trouble with this error message. I am new to Python and this Python2 and Python3 is a hassle. I'm not sure what to do here, the error message is as shown below.

Using Ticker: AAPL
    Traceback (most recent call last):
      File "realtime.py", line 18, in <module>
        r=requests.get(auth_url, headers={"Authorization": "Basic %s" % base64.b64encode(os.environ['INTRINIO_USER'] + ":" + os.environ['INTRINIO_PASSWORD'])})
      File "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\base64.py", line 58, in b64encode
        encoded = binascii.b2a_base64(s, newline=False)
    TypeError: a bytes-like object is required, not 'str'

The code I am using is as shown below.

import websocket
import _thread
import time
import requests
import base64
import json
import sys
import os
from requests.auth import HTTPBasicAuth

try:
    print ("Using Ticker: " + str(sys.argv[1]))
except:
    print ("Please include ticker as first argument")
    sys.exit()

auth_url = "https://realtime.intrinio.com/auth";
r=requests.get(auth_url, headers={"Authorization": "Basic %s" % base64.b64encode(os.environ['INTRINIO_USER'] + ":" + os.environ['INTRINIO_PASSWORD'])})

socket_target = "wss://realtime.intrinio.com/socket/websocket?token=%s" % (r.text)

def on_message(ws, message):
    try:
        result = json.loads(message)
        print (result["payload"])
    except:
        print (message)

def on_error(ws, error):
    print ("###ERROR### " + error)

def on_close(ws):
    print ("###CONNECTION CLOSED###")

def on_open(ws):
    def run(*args):
        security = "iex:securities:" + str(sys.argv[1]).upper()
        message = json.dumps({"topic": security,"event": "phx_join","payload": {},"ref": "1"})
        ws.send(message)
    thread.start_new_thread(run, ())


websocket.enableTrace(True)
ws = websocket.WebSocketApp(socket_target, on_message = on_message, on_error = on_error, on_close = on_close)
ws.on_open = on_open
ws.run_forever()
martineau
  • 119,623
  • 25
  • 170
  • 301
Lasheen Lartey
  • 497
  • 2
  • 5
  • 8
  • related: https://stackoverflow.com/questions/21689365/python-3-typeerror-must-be-str-not-bytes-with-sys-stdout-write – bipson Aug 03 '17 at 11:10
  • You are passing a string ``os.environ['INTRINIO_USER'] + ":" + os.environ['INTRINIO_PASSWORD']`` to ``base64.b64encode()``, right? – bipson Aug 03 '17 at 11:14
  • Yes so r=requests.get(auth_url, headers={"Authorization": "Basic %s" % base64.b64encode(os.environ['INTRINIO_USER'] + ":" + os.environ['INTRINIO_PASSWORD'], 'uft-8')})? – Lasheen Lartey Aug 03 '17 at 11:21

1 Answers1

63

You should encode str into bytes.

data_string = os.environ['INTRINIO_USER'] + ":" + os.environ['INTRINIO_PASSWORD']

data_bytes = data_string.encode("utf-8")

base64.b64encode(data_bytes)
phloem7
  • 220
  • 2
  • 12
stamaimer
  • 6,227
  • 5
  • 34
  • 55
  • 1
    Is this a typo? Where is "data_str" and "data_bytes" used? – Source Matters Jun 03 '18 at 23:10
  • line: r=requests.get(auth_url, headers={"Authorization": "Basic %s" % base64.b64encode(os.environ['INTRINIO_USER'] + ":" + os.environ['INTRINIO_PASSWORD'])}) use r=requests.get(auth_url, headers={"Authorization": "Basic %s" % base64.b64encode((os.environ['INTRINIO_USER'] + ":" + os.environ['INTRINIO_PASSWORD']).encode("utf-8"))}) instead; –  Mar 10 '20 at 04:25