2017-12-16 14 views
0

これは私の2番目のPythonプロジェクトです(経験はありません)。エンコーディングに関する問題に苦しんでいるようです。私は問題が配列内に存在すると信じています。私は入力と同じような解像度を使用して取得した '297aae72'と同様にプリエンコードを試みましたhere.encode('utf-8')しかし、私は同じエラーが発生します。Unicode-Object Array Python 3.7

これは、構成中の配列内のエンコーディングの競合が原因で、ハッシュの問題であると私は考えています。

このファイルはspeed test.pyです。私はこのエラーが見つかると信じています。

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) 

このファイルには、これは、アプリケーションが実行されたとき、私は受信エラーです

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'] 

funcitons.pyです。

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 

ここに何か不足していますか?変数をエンコードした後、私のインスタンスのエラーは変更されません。

ご協力いただきありがとうございます。

答えて

3

これは「配列」とは関係ありません。 get_dataを定義するときに、すべてのインライン処理を実行しようとしているという事実が混乱しています。実際には、問題はmd5()への呼び出しです。エラーが示すように、ユニコード文字列を渡すことはできません。バイトを渡す必要があります。文字列をエンコードするだけです。

hash = md5(('%s-%s-%s-%s' % (ping, up, down, '297aae72')).encode('utf-8')).hexdigest() 
関連する問題