从
http..update.utorrent.com /获取“工具栏要约”说明installoffer.php?offer =管道。解析被编码(请参阅http://en.wikipedia.org/wiki/Bencode)的
响应,然后提取二进制文件的URL及其SHA1哈希。哈希包含在键“ offer_hash”的值中。二进制文件在
键'offer_urls'的列表中-请使用带有前缀
“ http..download.utorrent.com /”的二进制文件。
下载二进制文件并计算其哈希值
验证计算出的SHA1哈希值是否与商品详细信息中提供的哈希值相同。可以将现有的库用于
bencoding,哈希等。
我的代码有什么问题?招聘人员说没有达到他们的要求。
# Script that verifies the correctness of a toolbar offers
import urllib, bencode , hashlib
from hashlib import sha1
url = "http://update.utorrent.com/installoffer.php?offer=conduit"
filename = "content.txt"
f= urllib.urlretrieve(url, filename)
#Bdecoding the response
with open (str(filename), 'rb') as myfile:
data=myfile.read()
decoded = bencode.bdecode(data)
# Returning the list for the key 'offer_urls'
list = decoded['offer_urls']
#print list
# Returning the URL of the binary that is prefixed with "http://download3.utorrent.com/"
length = len (list)
prefix = "http://download3.utorrent.com/"
i= -1
while i < length:
i = i + 1
if list[i].startswith(prefix) :
break
binary= list[i]
print "The URL of the the binary is: " , binary
# Returning the sha1 hash contained in the value of the key 'offer_hash'
encrypted_hash = decoded['offer_hash']
sha1_hash1 = encrypted_hash.encode('hex')
print "The sha1 hash contained in the value of the key 'offer_hash' is: " , sha1_hash1
# Downloading the binary and calculating its hash
urllib.urlretrieve ( binary , "utct2-en-conduit-20130523.exe")
file = "C:\Python27\utct2-en-conduit-20130523.exe"
with open (file, 'rb') as myfile:
downloaded=myfile.read()
k = hashlib.sha1()
k.update(downloaded)
sha1file = k.hexdigest()
print "The sha1 hash of the downloaded binary is: " , sha1file
# Verify that the calculated sha1 hash is identical to the one provided in the offer details
if (sha1file == sha1_hash1) :
print "Test result = Pass"
else :
print "Test result = Fail"
#1 楼
我要告诉您代码中让我感到惊讶的事情。 br /># Script that verifies the correctness of a toolbar offers
import urllib, bencode , hashlib
使用单字母变量表明对纯净代码的关注不足。
再次将其转换为字符串表示对正在发生的事情感到困惑。
from hashlib import sha1
url = "http://update.utorrent.com/installoffer.php?offer=conduit"
filename = "content.txt"
f= urllib.urlretrieve(url, filename)
大量缩进建议不考虑一致的缩进样式。
下载将该文件存入磁盘然后再将其读入内存,这是对可用API的不良使用。您应该将文件直接下载到内存中。
#Bdecoding the response
with open (str(filename), 'rb') as myfile:
多余的空格表示有人很高兴。
data=myfile.read()
decoded = bencode.bdecode(data)
/>“返回”在技术上不正确。您不在函数中,因此不会返回任何内容。使用
bencode
是变量的坏名称,因为它是内置的Python类型。# Returning the list for the key 'offer_urls'
在函数调用后放置空格是奇怪的,而您不这样做它始终如一。也很少有理由存储
filename
的长度。list = decoded['offer_urls']
list
前面没有空格。#print list
# Returning the URL of the binary that is prefixed with "http://download3.utorrent.com/"
length = len (list)
当您应该使用
list
循环时,您正在使用=
循环。如果找不到前缀,它也会导致while
,而不是正常失败。prefix = "http://download3.utorrent.com/"
i= -1
哈希是否真的加密了?
while i < length:
i = i + 1
if list[i].startswith(prefix) :
break
binary= list[i]
硬编码的文件名很容易破解。您甚至不需要这样做。该字符串还包含
for
,应将其转义,否则整个字符串应为原始字符串。例如,print "The URL of the the binary is: " , binary
# Returning the sha1 hash contained in the value of the key 'offer_hash'
encrypted_hash = decoded['offer_hash']
或
sha1_hash1 = encrypted_hash.encode('hex')
print "The sha1 hash contained in the value of the key 'offer_hash' is: " , sha1_hash1
# Downloading the binary and calculating its hash
urllib.urlretrieve ( binary , "utct2-en-conduit-20130523.exe")
file = "C:\Python27\utct2-en-conduit-20130523.exe"
,或者在大多数情况下,即使在Windows上,也可以使用其他斜杠。
"C:\Python27\utct2-en-conduit-20130425.exe"
你摆脱了所做的事情,但这主要是因为你很幸运。 >这最后一段代码与上一段代码具有几乎相同的功能,但是您没有使用函数。
r"C:\Python27\utct2-en-conduit-20130425.exe"
您已经加上了括号,
"C:/Python27/utct2-en-conduit-20130425.exe"
您的基本问题:
您的样式很差且不一致
事情表明您不太了解正在发生的事情
您并没有注意使代码可读性
这是我对问题的看法:
评论
\ $ \ begingroup \ $
严厉...但是做得很好。希望这就是医生的命令。
\ $ \ endgroup \ $
–WernerCD
2013年6月27日13:06
\ $ \ begingroup \ $
我对这个答案感到非常困惑,直到我意识到我不再使用StackOverflow了。
\ $ \ endgroup \ $
–鸭鸭
2013年6月27日23:07
\ $ \ begingroup \ $
我不会在多余的部分上讨他喜欢。当您使用多种语言时,最好使用括号来防御,多余的语言也不会造成伤害。
\ $ \ endgroup \ $
–Loren Pechtel
13年6月28日在0:02
\ $ \ begingroup \ $
无论如何,我认为这并不苛刻。如果您上传代码,那么对此进行的批评应该是非常感激的。做得好!
\ $ \ endgroup \ $
–travisbartley
13年6月28日在1:26
\ $ \ begingroup \ $
@WinstonEwert:非常感谢您抽出宝贵的时间为我提供如此详细的答案!!真的有帮助!
\ $ \ endgroup \ $
–user26614
13年7月1日在17:30
#2 楼
通过pep8以及可能更复杂的静态分析器(如pylint)运行代码。,您会发现这些工具不喜欢某些格式和变量名。他们可能会抱怨变量,分支等太多,因为代码没有分解为模块化函数。
#3 楼
如果我要使用您的代码,然后将其乘以100或一千次到其他文件中(一个常规的商业/企业应用程序的大小,那么这将是狗的早餐,根本无法维护。您需要更加谨慎地使用代码并使其可读性和一致性,将其视为格式化潜在雇主的简历,在字符之间使用一致的空格,在代码上方使用一致的注释(不要在代码之间使用多个换行符),尤其是采用一种通用的语言风格指南,温斯顿(Winston)早些时候就发布了一个很好的例子。人们还必须阅读您编写的代码,并且需要快速理解它。如果他们正在浏览代码,则突然在页面中浮现出随机注释,这真是一种分散注意力的事情。读的好书是Robert Martin的Clean Code。您必须阅读此书,就好像您的生活取决于它。评论
\ $ \ begingroup \ $
xkcd.com/859)
\ $ \ endgroup \ $
– jkd
17年8月21日在3:18
#4 楼
问题:我想说
import
应该是重用库的有效方法。import urllib, bencode , hashlib
from hashlib import sha1
在上面的代码行中,您从第二行的
hashlib
导入了sha1
和hashlib
。这没有什么错,但是当您只想使用sha1
时,则无需导入整个类。 与其他类相同:您的代码中使用了上述库的多少个成员?
所有常量都应该在脚本开头预定义,而不是
如果上述文件无法打开(如果文件不存在)怎么办?如何处理此异常?
with open (str(filename), 'rb') as myfile:
downloaded=myfile.read()
使用try-except捕获异常。 >
无需使用额外的变量来存储列表的长度。在函数
len
和它的arg之间也有一个空格。 >毫无意义的变量名称,例如for
,while
和i
。任务没有很好地划分为不同的子例程。
评论
\ $ \ begingroup \ $
问题8是最大的问题。他的解决方案是事务脚本的典型案例。我讨厌事务脚本,其他人也讨厌。
\ $ \ endgroup \ $
– RokL
2013年12月5日上午11:42
评论
您的代码存在一个非常简单的问题:注释应说明原因,而不是原因。它确实向您表明了一个实用主义者,当您单独工作时,这很好。