2012-08-08 134 views
2

我在Python中相当新,所以这可能是一些问题。我DEVing在Python 3.0用VirusTotal API扫描文件

我不断遇到错误:

File "scan.py", line 7, in module 
    json = postfile.post_multipart(host,selector,fields,files) 
File "C:\Python32\lib\postfile.py", line 10, in post_multipart 
    content_type, body = encode_multipart_formdata(fields,files) 
File "C:\Python32\lib\postfile.py", line 42, encode_multipart_fordata 
    body = CRLF.join(L) 
TypeError: sequence item 8: expected str instance, bytes found 

当我尝试运行此代码连接和扫描与VirusTotal API的文件。此代码与网站中的示例类似。

import postfile 
host = "www.virustotal.com" 
selector = "https://www.virustotal.com/vtapi/v2/file/scan" 
fields = [("apikey", "123123123123123123123123123")] 
file_to_send = open("android-icq.apk", "rb").read() 
files = [("file", "android-icq.apk", file_to_send)] 
json = postfile.post_multipart(host, selector, fields, files) 
print (json) 

的postfile.py内容如下:这里的问题

import http.client, mimetypes 

def post_multipart(host, selector, fields, files): 
    """ 
    Post fields and files to an http host as multipart/form-data. 
    fields is a sequence of (name, value) elements for regular form fields. 
    files is a sequence of (name, filename, value) elements for data to be uploaded as files 
    Return the server's response page. 
    """ 
    content_type, body = encode_multipart_formdata(fields, files) 
    h = http.client.HTTP(host) 
    h.putrequest('POST', selector) 
    h.putheader('content-type', content_type) 
    h.putheader('content-length', str(len(body))) 
    h.endheaders() 
    h.send(body) 
    errcode, errmsg, headers = h.getreply() 
    return h.file.read() 

def encode_multipart_formdata(fields, files): 
    """ 
    fields is a sequence of (name, value) elements for regular form fields. 
    files is a sequence of (name, filename, value) elements for data to be uploaded as files 
    Return (content_type, body) ready for httplib.HTTP instance 
    """ 
    BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$' 
    CRLF = '\r\n' 
    L = [] 
    for (key, value) in fields: 
     L.append('--' + BOUNDARY) 
     L.append('Content-Disposition: form-data; name="%s"' % key) 
     L.append('') 
     L.append(value) 
    for (key, filename, value) in files: 
     L.append('--' + BOUNDARY) 
     L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, filename)) 
     L.append('Content-Type: %s' % get_content_type(filename)) 
     L.append('') 
     L.append(value) 
    L.append('--' + BOUNDARY + '--') 
    L.append('') 
    body = CRLF.join(L) 
    content_type = 'multipart/form-data; boundary=%s' % BOUNDARY 
    return content_type, body 

def get_content_type(filename): 
    return mimetypes.guess_type(filename)[0] or 'application/octet-stream' 

任何想法?

回答

2

它看起来像这些例子用Python编写2.您正在使用Python 3

背后的Python 3一部分理由就是消除“克鲁夫特”,这已建立了多年来Python的发展,所以它被允许在某些地方打破向后兼容性。

在这里看到:http://wiki.python.org/moin/Python2orPython3

+0

感谢你为这个。但是,我能够使他们的其他样品工作。只是这个具体的例子,我无法运行。 我用2to3工具将2.x代码转换为3. 如果我仍然不会得到这个工作,那么我会考虑去2.x python。 非常感谢! – gwafito 2012-08-09 11:18:40

+0

我切换到2.7 python和代码工作正常。这不是一个解决方案,但至少它工作! :) 谢谢! – gwafito 2012-08-09 12:11:58

0

http://docs.python-requests.org/提供简洁的界面,使HTTP 1.1的查询:

import time 
import requests 
import json 

md5url = "https://www.virustotal.com/vtapi/v2/file/report" 
r = requests.post(requrl, data = {"apikey": apikey, "resource": md5}) 
print(json.loads(r.text)) 
print(json.loads(r.text)["positives"]) 
time.sleep(15) 

scanurl = "https://www.virustotal.com/vtapi/v2/file/scan" 
r = requests.post(scanurl, data = {"apikey": apikey}, files = {"file": (name, open(name, "rb"))}) 
print(json.loads(r.text)) 
print(json.loads(r.text)["permalink"]) 
time.sleep(15)