2017-12-16 4 views
0

Dies ist mein zweites Python-Projekt (ich bin nicht erfahren) und ich habe Probleme mit der Codierung. Ich glaube, dass das Problem innerhalb eines Arrays existiert. Ich habe versucht, die Eingänge sowie die "297aae72" vorcodieren, die ich mit einer ähnlichen Auflösung, die ich gefunden habe, aber ich erlebe den gleichen Fehler.Unicode-Objekte Array Python 3.7

Ich glaube, dies ist ein Hash-Problem aufgrund eines Codierungskonflikt innerhalb des Array, das erstellt wird.

Diese Datei ist Geschwindigkeit test.py, wo ich glaube, dass der Fehler gefunden wird.

import hashlib 
from hashlib import md5 
import urllib.request, urllib.error, urllib.parse 
import sys 
from urllib.parse import parse_qs 
import functions 


ping = 16 
accuracy = 8 
server = functions.setup() 


def speed_test(up, down): 
    get_data = [ 
     'download=%s' % down, 
     'ping=%s' % ping, 
     'upload=%s' % up, 
     'promo=', 
     'startmode=%s' % 'pingselect', 
     'recommendedserverid=%s' % server, 
     'accuracy=%s' % 8, 
     'serverid=%s' % server, 
     'hash=%s' % md5('%s-%s-%s-%s' % 
         (ping, up, down, '297aae72') 
         ).hexdigest()] 
    request = urllib.request.Request('http://www.speedtest.net/api/api.php', 
           data='&'.join(get_data)) 
    request.add_header('Referer', 'http://c.speedtest.net/flash/speedtest.swf') 
    connection = urllib.request.urlopen(request) 
    response = connection.read() 
    response_code = connection.code 
    connection.close() 

    if int(response_code) != 200: 
     print('There was an issue submitting data') 
     sys.exit(1) 

    qs_args = parse_qs(response) 
    result_id = qs_args.get('resultid') 
    if not result_id or len(result_id) != 1: 
     print('No speedtest image found?') 
     sys.exit(1) 

    print(('Speedtest Results: http://www.speedtest.net/result/%s.png' % result_id[0])) 


down_input = input("Please enter your download speed (EX: 375.520): ") 
down_input = down_input.replace(".", "") 

up_input = input("Please enter your upload speed (EX: 375.520): ") 
up_input = up_input.replace(".", "") 

speed_test(up_input, down_input) 

Diese Datei ist funcitons.py

import math 
import urllib.request, urllib.error, urllib.parse 
import os 
import time 
from xml.dom import minidom as DOM 


def calculate_distance(origin, destination): 
    lat1, lon1 = origin 
    lat2, lon2 = destination 
    radius = 6371 # km 

    latitude = math.radians(lat2 - lat1) 
    longitude = math.radians(lon2 - lon1) 
    a = (math.sin(latitude/2) * math.sin(latitude/2) + math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) * math.sin(longitude/2) 
     * math.sin(longitude/2)) 
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) 
    destination = radius * c 

    return destination 


def get_closest_servers(client, complete=False): 
    connection = urllib.request.urlopen('http://speedtest.net/speedtest-servers.php') 
    server_xml = connection.read() 
    if int(connection.code) != 200: 
     return None 
    connection.close() 
    root = DOM.parseString(server_xml) 
    servers = {} 
    for server in root.getElementsByTagName('server'): 
     attrib = dict(list(server.attributes.items())) 
     d = calculate_distance([float(client['lat']), float(client['lon'])], 
           [float(attrib.get('lat')), float(attrib.get('lon'))]) 
     attrib['d'] = d 
     if d not in servers: 
      servers[d] = [attrib] 
     else: 
      servers[d].append(attrib) 

    closest = [] 
    for d in sorted(servers.keys()): 
     for s in servers[d]: 
      closest.append(s) 
      if len(closest) == 5 and not complete: 
       break 
     else: 
      continue 
     break 

    del servers 
    del root 
    return closest 


def get_best_server(servers): 
    results = {} 
    for server in servers: 
     cum = 0 
     url = os.path.dirname(server['url']) 
     for i in range(0, 3): 
      uh = urllib.request.urlopen('%s/latency.txt' % url) 
      start = time.time() 
      text = uh.read().strip() 
      total = time.time() - start 
      if int(uh.code) == 200 and text == 'test=test': 
       cum += total 
      else: 
       cum += 3600 
      uh.close() 
     avg = round((cum/3) * 1000000, 3) 
     results[avg] = server 

    fastest = sorted(results.keys())[0] 
    best = results[fastest] 
    best['latency'] = fastest 

    return best 


def get_config(): 
    uh = urllib.request.urlopen('http://www.speedtest.net/speedtest-config.php') 
    config_xml = uh.read() 
    if int(uh.code) != 200: 
     return None 
    uh.close() 
    root = DOM.parseString(config_xml) 
    config = { 
     'client': extract_tag_name(root, 'client'), 
     'times': extract_tag_name(root, 'times'), 
     'download': extract_tag_name(root, 'download'), 
     'upload': extract_tag_name(root, 'upload')} 

    del root 
    return config 


def extract_tag_name(dom, tag_name): 
    elem = dom.getElementsByTagName(tag_name)[0] 
    return dict(list(elem.attributes.items())) 


def setup(): 
    print('Configuring server, one moment.') 
    configs = get_config() 
    closest_server = get_closest_servers(configs['client']) 
    best = get_best_server(closest_server) 
    return best['id'] 

Dies ist der Fehler ich erhalten, wenn die Anwendung ausgeführt wird.

Traceback (most recent call last): 
    File "speedtest.py", line 54, in <module> 
    speed_test(up_input, down_input) 
    File "speedtest.py", line 25, in speed_test 
    (ping, up, down, '297aae72') 
TypeError: Unicode-objects must be encoded before hashing 

Fehle ich hier etwas? Nach der Codierung der Variablen ändert sich der Fehler in meiner Instanz nicht.

Danke für jede Hilfe, die zur Verfügung gestellt werden kann.

Antwort

3

Dies hat nichts mit "Arrays" zu tun; Sie sind verwirrt durch die Tatsache, dass Sie versuchen, alles inline zu tun, wenn Sie get_data definieren. Eigentlich ist das Problem Ihr Anruf zu md5(); Wie der Fehler sagt, können Sie keine Unicode-Zeichenfolge an diese übergeben, müssen Sie Bytes übergeben. Also kodiere einfach die Zeichenkette:

hash = md5(('%s-%s-%s-%s' % (ping, up, down, '297aae72')).encode('utf-8')).hexdigest() 
Verwandte Themen