UnboundLocalError: локальная переменная 'fuzzables', на которую ссылаются до назначения
У меня проблема со скриптом Python. Когда я пытаюсь запустить его с некоторыми параметрами, я получаю следующую ошибку:
print json.dumps(filter(lambda x: x.get('url'), [x.as_dict() for x in fuzzables]), indent=4)
UnboundLocalError: local variable 'fuzzables' referenced before assignment
Я не парень с питоном; Кто-нибудь может мне помочь?
Код:
def main():
form_stack = []
parser = argparse.ArgumentParser('crawl')
parser.add_argument('url', type=str, help='Target URL')
parser.add_argument('-s', '--strict', action='store_true', help='Strict Mode')
args = parser.parse_args()
target = get_final_url(args.url)
ltarget = [target]
if args.strict:
br = Browser(qapp=qapp, scope=ltarget, strict_match=target)
else:
br = Browser(qapp=qapp, scope=ltarget)
br.load(target)
dom_urls = br.get_history(clear=True, verify=True)
static_urls = br.urls(verify=True)
static_urls.extend(dom_urls)
static_urls = list(set(static_urls))
already = 0
for url in static_urls:
already += 1
if len(static_urls) >= 128:
break
try:
br.load(url, retries=2)
except BrowserTimeout, e:
continue
form_stack.extend(br.forms())
temporaries = br.urls(verify=True)
map(lambda x: static_urls.append(x), temporaries)
dom_urls = br.get_history(clear=True, verify=True)
s_urls = br.urls(verify=True)
s_urls.extend(dom_urls)
s_urls = list(set(s_urls))
static_urls.extend(s_urls)
static_urls = list(set(static_urls))
static_urls = map(make_dummy_url, static_urls)
fuzzables, hashsums = [], []
for form in form_stack:
if form['hashsum'] in hashsums:
continue
else:
hashsums.append(form['hashsum'])
method = form.get('method', 'POST')
action = form.get('action', '')
headers = form.get('headers')
cookies = form.get('cookies')
data = unquote(urlencode(form.get('fields', {})))
action = action.toString() if type(action) != str else action
if type(data) == str and "__PAYLOAD__" not in data:
data = parse_qsl(data)
[data.update(set_payload(x)) for x in data.keys()]
data = unquote(urlencode(data))
method = method.upper()
vhost = urlparse(action).hostname
fuzzable = Fuzzable(method, action, data, cookies, headers, vhost)
fuzzables.append(fuzzable)
for url in static_urls:
url = url.toString() if type(url) != str else url
uu = urlparse(url)
qsl = urlparse(url)
qsl = parse_qsl(uu.query)
[qsl.update(set_payload(x)) for x in qsl.keys()]
qsl = urlencode(qsl)
qq = "?%s" %qsl
qq = "" if qq == "?" else qq
url = "%s://%s%s%s" %(uu.scheme, uu.netloc, uu.path, qq)
if "__PAYLOAD__" not in url:
continue
cookies = br.get_plain_cookies()
vhost = urlparse(url).hostname
fields = ""
headers = {}
fuzzable = Fuzzable("GET", url, fields, cookies, headers, vhost)
fuzzables.append(fuzzable)
"""
fu = urlparse(target)
path = fu.path
query = parse_qsl(fu.query)
[query.update(set_payload(x)) for x in query.keys()]
query = unquote(urlencode(query))
rqury = "?%s" %query
rqury = "" if rqury == "?" else rqury
temporary_url = "%s://%s%s%s" %(fu.scheme, fu.netloc, path, rqury)
fields = ""
cookies = br.get_plain_cookies()
vhost = urlparse(target).hostname
headers = {'host': fu.hostname}
fuzzable = Fuzzable("GET", temporary_url, fields, cookies, headers, vhost)
fuzzables.append(fuzzable)
"""
br.close()
del br
print json.dumps(filter(lambda x: x.get('url'), [x.as_dict() for x in fuzzables]), indent=4)
3 ответа
Учитывая сценарий, связанный в комментариях, если static_urls
является пустым списком, то назначение fuzzables
, поэтому переменная не определена при обращении.
Вы могли бы переместить fuzzables = []
назначение за пределами static_urls
петля.
fuzzables
присваивается только в цикле:
for url in static_urls:
# ...
if len(static_urls) >= 128:
break
# ...
fuzzables, hashsums = [], []
Если static_urls
пуст или содержит более 128 элементов, строка назначения никогда не достигается, и fuzzables
остается свободным
Назначьте что-то fuzzables
вне этого цикла, если вы хотите гарантировать, что он связан.
Взглянув на этот код, вы, вероятно, не хотите создавать новый, пустой fuzzables
для каждого static_urls
запись либо.
Кажется, сообщение об ошибке указывает на проблему. Вам нужно назначить что-то fuzzables
прежде чем использовать его.
Например:
fuzzables = #something