docs: def get_followers(id_=None, screen_name=None, limit=1e10):
      """ Either id_ or screen_name must not be None. """
      # FIXME: DRY from _tweets_for_user
      if not (id_ or screen_name):
          raise Exception("either id_ or screen_name must not be None")
      if id_:
          key = 'user_id'
          val = id_
      else:
          key = 'screen_name'
          val = screen_name
      cursor = -1
      followers = []
      while len(followers) < limit:
          try:
              response = twapi.request('followers/ids', {key: val, 'count': 5000,
                                                         'cursor': cursor, 'stringify_ids': True})
              if response.status_code in [88, 130, 420, 429]:  # rate limit
                  sys.stderr.write('Error for %s: %s\nSleeping for 5 minutes...\n' % (val, response.text))
                  time.sleep(300)
              elif response.status_code != 200:
                  sys.stderr.write('Skipping bad user: %s\n' % response.text)
                  return followers
              else:
                  result = json.loads(response.text)
                  items = [r for r in response]
                  if len(items) == 0:
                      return followers
                  else:
                      sys.stderr.write('fetched %d more followers for %s\n' % (len(items), val))
                      time.sleep(1)
                      followers.extend(items)
                      if len(followers) >= limit:
                          return followers[:limit]
                  cursor = result['next_cursor']
          except Exception as e:
              sys.stderr.write('Error: %s\nskipping...\n' % e)
              sys.stderr.write(traceback.format_exc())
              return followers
      return followers