You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
4.0 KiB
Python
127 lines
4.0 KiB
Python
#!/usr/bin/python
|
|
|
|
import webshotslib, argparse
|
|
|
|
parser = argparse.ArgumentParser(description='Finds usernames for Webshots')
|
|
|
|
parser.add_argument('--resume', dest='resume', action='store', default='%',
|
|
help='position to resume from')
|
|
|
|
args = parser.parse_args()
|
|
options = vars(args)
|
|
|
|
users = []
|
|
|
|
alphabet = "-0123456789abcdefghijklmnopqrstuvwxyz!"
|
|
alphabet_length = len(alphabet)
|
|
|
|
current_index = 0
|
|
current_character_index = []
|
|
|
|
current_character_index.insert(0, 0)
|
|
|
|
done = False
|
|
users_count = 0
|
|
users_last_save = 0
|
|
thousands_last_save = 0
|
|
request_count = 0
|
|
|
|
if options['resume'] != "%":
|
|
# Resuming is requested, let's load the old user list first.
|
|
user_list = open("users4.txt", "r")
|
|
users = user_list.readlines()
|
|
user_list.close()
|
|
|
|
users_count = len(users)
|
|
users_last_save = users_count
|
|
thousands_last_save = users_count / 1000
|
|
|
|
# Set the current state to the requested resume point
|
|
if options['resume'].endswith("%"):
|
|
options['resume'] = options['resume'][:-1]
|
|
|
|
current_index = len(options['resume']) - 1
|
|
|
|
current_character_index = []
|
|
|
|
for character in options['resume']:
|
|
current_character_index.append(alphabet.index(character))
|
|
|
|
print "Resuming from %s%% - loaded %d users ..." % ("".join([alphabet[value] for value in current_character_index]), users_count)
|
|
else:
|
|
# Do an initial query for all the special character stuff
|
|
results, count = webshotslib.search_query("%")
|
|
|
|
# Append all users to the user list
|
|
for user in results:
|
|
if user not in users:
|
|
users.append(user)
|
|
users_count += 1
|
|
|
|
while done == False:
|
|
query = "".join([alphabet[value] for value in current_character_index])
|
|
request_count += 1
|
|
results, count = webshotslib.search_query(query)
|
|
|
|
# Append all new users to the user list
|
|
for user in results:
|
|
if user not in users:
|
|
users.append(user)
|
|
users_count += 1
|
|
|
|
# Save the users to a file if we've had another 1000 (approximately)
|
|
if users_count % 1000 < 100 and users_last_save != users_count and thousands_last_save != users_count / 1000:
|
|
print "\nSaving %d users to file..." % users_count
|
|
userfile = open("users4.txt", "w")
|
|
userfile.write("\n".join(users))
|
|
userfile.close()
|
|
users_last_save = users_count
|
|
thousands_last_save = users_count / 1000
|
|
elif request_count % 100 == 0:
|
|
print "Users found so far: %s" % users_count
|
|
|
|
# Decide what to do now
|
|
if count < 100:
|
|
# End of this query reached
|
|
while True:
|
|
if current_index >= 0:
|
|
if current_character_index[current_index] < alphabet_length - 1:
|
|
# More characters available, move on to the next character
|
|
current_character_index[current_index] += 1
|
|
print "\rMoving to next character, searching at %s%% ..." % "".join([alphabet[value] for value in current_character_index]),
|
|
break
|
|
else:
|
|
# Ran out of characters, move up a level
|
|
current_character_index.pop()
|
|
current_index -= 1
|
|
print "\nMoved up a level, searching at %s%% ..." % "".join([alphabet[value] for value in current_character_index])
|
|
else:
|
|
done = True
|
|
print "\nDone!"
|
|
exit(0)
|
|
|
|
elif results[-1].lower().startswith(query):
|
|
# Not specific enough, we need to go a level deeper
|
|
current_index += 1
|
|
current_character_index.insert(current_index, 0)
|
|
print "\nIncreasing depth, searching at %s%% ..." % "".join([alphabet[value] for value in current_character_index])
|
|
else:
|
|
# Re-search with the current depth, with the start of the last result
|
|
next_character = results[-1][current_index:current_index + 1].lower()
|
|
|
|
try:
|
|
current_character_index[current_index] = alphabet.index(next_character)
|
|
except ValueError, e:
|
|
# The next character is not in our list of characters, so we will append it to the alphabet.
|
|
alphabet.append(next_character)
|
|
alphabet_length = len(alphabet)
|
|
print "\nAdded character %s to alphabet ..." % next_character
|
|
|
|
print "\rContinuing search at %s%% ..." % "".join([alphabet[value] for value in current_character_index]),
|
|
|
|
# Final save
|
|
print "\nFinal save to file: %d users" % users_count
|
|
userfile = open("users4.txt", "w")
|
|
userfile.write("\n".join(users))
|
|
userfile.close()
|