web-dev-qa-db-fra.com

TypeError: un objet de type octet est requis, pas 'str' - python 2 à 3

Bonjour, j'ai des problèmes avec ce message d'erreur. Je suis nouveau sur Python et ces Python2 et Python3 sont compliqués. Je ne sais pas quoi faire ici, le message d'erreur est celui présenté ci-dessous.

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'

Le code que j'utilise est indiqué ci-dessous.

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()
14
Lasheen Lartey

Vous devriez encoder str en bytes.

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

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

base64.b64encode(data_bytes)
17
stamaimer