diff --git a/search.py b/search.py new file mode 100644 index 0000000..ecc0bff --- /dev/null +++ b/search.py @@ -0,0 +1,126 @@ +#!/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()