document.write('
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. from Queue import Queue, PriorityQueue
  2. from threading import Thread
  3. from time import time as now
  4. from urllib2 import urlopen
  5. from string import ascii_lowercase, digits
  6. from itertools import chain, product
  7. from functools import partial
  8. import json
  9.  
  10. try:
  11.     cachef = open("cache", "r")
  12.     try:
  13.         _cache = json.load(cachef)
  14.     except ValueError:
  15.         _cache = {}
  16.     finally:
  17.         cachef.close()
  18. except IOError:
  19.     _cache = {}
  20.  
  21. def valid(username, token="...", cache=_cache):
  22.     if cache.has_key(username):
  23.         return cache[username]
  24.     url = "https://twitter.com/users/username_available?username=%(username)s&authenticity_token=%(token)s" % locals()
  25.     retval = json.loads(urlopen(url).read()).get(\'valid\', False)
  26.     cache[username] = retval
  27.     return retval
  28.    
  29. def gen_names(start, end):
  30.     valid_chars = ascii_lowercase + "_" + digits
  31.     return chain(*(map("".join, product(valid_chars, repeat=i)) for i in xrange(start, end + 1)))
  32.    
  33. def check_availability(names_queue, available_names_queue):
  34.     while True:
  35.         username = names_queue.get()
  36.         try:
  37.             if valid(username):
  38.                 available_names_queue.put(username)
  39.         except Exception, e:
  40.             # I didn\'t do my job, so I let someone else do it
  41.             available_names_queue.put("[Exception trying to process \'%s\': %s]" % (username, e.msg))
  42.             names_queue.put(username)
  43.         finally:
  44.             names_queue.task_done()
  45.        
  46. def print_available_names(available_names_queue):
  47.     while True:
  48.         username = available_names_queue.get()
  49.         print username
  50.         available_names_queue.task_done()
  51.  
  52. if __name__ == "__main__":
  53.     t0 = now()
  54.     try:
  55.         names_queue = PriorityQueue()
  56.         available_names_queue = Queue()
  57.         num_worker_threads = 40
  58.         for i in xrange(num_worker_threads):
  59.              t = Thread(target=partial(check_availability, names_queue, available_names_queue))
  60.              t.daemon = True
  61.              t.start()
  62.         t = Thread(target=partial(print_available_names, available_names_queue))
  63.         t.daemon = True
  64.         t.start()
  65.        
  66.         for name in gen_names(2, 3):
  67.             names_queue.put(name)
  68.        
  69.         names_queue.join()
  70.         available_names_queue.join()
  71.     finally:
  72.         print "All done in %.2f seconds." % (now() - t0)
  73.         cachef = open("cache", "w")
  74.         try:
  75.             json.dump(_cache, cachef)
  76.         finally:
  77.             cachef.close()
');