@Enders, sé que esta es una vieja pregunta, pero me gustaría explicar algunas cosas más para alguien que está luchando con este problema.
Es específicamente con esta línea de código aquí:
data = urllib.parse.urlencode(values)
que usted está teniendo problemas, ya que usted está tratando de codificar los datos: los valores (urlencode).
Si se refiere a la documentación de desplazamiento urllib.parse a la parte inferior para encontrar lo que hace urlencode: https://docs.python.org/3/library/urllib.parse.html < ~ verá que usted está tratando de codificar el usuario/contraseña en una cadena de datos:
Convert a mapping object or a sequence of two-element tuples, which may contain str or bytes objects, to a percent-encoded ASCII text string. If the resultant string is to be used as a data for POST operation with the urlopen() function, then it should be encoded to bytes, otherwise it would result in a TypeError.
Quizás lo que estás tratando de hacer aquí es hacer algún tipo de encriptación de tu usuario/contraseña, pero realmente no creo que este sea el camino correcto. Si es así, entonces probablemente deba asegurarse de que el extremo receptor (el destino de su url) sepa que está codificando su usuario/pase con esto.
Un enfoque más actualizado es utilizar la potente biblioteca de solicitudes. Ellos tienen compatibilidad con los protocolos de autenticación muy comunes: http://docs.python-requests.org/en/master/user/authentication/
En este caso, me gustaría hacer algo como esto:
requests.get(url, auth=('user', 'pass'))
Esta es una buena respuesta, pero creo que podría mejorarse, incluyendo el corregida código. No está exactamente claro de dónde provienen los datos y dónde suministrar los datos binarios. –
@rodarmor: 'data' es la variable' data' en el ejemplo anterior. 'binary_data' se proporciona donde necesita los datos convertidos. –
Agregué la línea que haría que el ejemplo de OP funcionara, ¿puede verificarlo para asegurarse de que lo hice bien? –