Consigue seguidores en Twitter usando tweepy y múltiples claves API

Tengo varias claves de desarrollo de Twitter que estoy usando para obtener seguidores de una lista de identificadores. Hay dos formas en que puedo hacer esto, pero tengo un problema con ambos. El primero:

try: .... for user in tweepy.Cursor(api.followers, screen_name=screenName).items(): .... except tweepy.TweepError as e: errorCode = e.message[0]['code'] if errorCode == 88: print "Rate limit exceeded." rotateKeys() 

El problema aquí es que cada vez que giro las teclas, el bucle for comienza desde cero y comienza a obtener los seguidores nuevamente. Traté de evitar esto, pero dividiendo el bucle for:

 try: items = tweepy.Cursor(api.followers, screen_name=s).items() 

Luego los recorro manualmente usando los next(items)

Sin embargo, la rotación de las teclas api no funciona, ya que la llamada inicial se realizó con el primer código API y siempre intentará usar ese.

Necesito una forma de rotar las teclas y continuar desde la izquierda anterior.

Puede obtener el cursor que se usó cuando ocurrió el límite de velocidad a través de la variable next_cursor en el iterador que se está utilizando. Cuando creas un nuevo Cursor usando la nueva instancia de API, puedes pasar el cursor anterior como un parámetro:

 current_cursor = cursor.iterator.next_cursor # re-create the cursor using the new api instance cursor = tweepy.Cursor(api.followers, screen_name=s, cursor=current_cursor) 

De hecho, tuve que terminar abandonando el método en cursiva para configurar manualmente el siguiente cursor. Lo bueno de esto es que el método “sin cursores” devuelve el cursor anterior y siguiente como parte de su función.

Así es como logré lo que buscaba (nota: agregar un try / catch probablemente esté en orden):

 users = ['user_one', 'user_two', 'user_three'] current_profile = 9 # I HAVE TEN IN AN ARRAY tweepy_api = get_api(auth_profiles[current_profile]) #A FUNCTION I CREATED TO REINITIALIZE API'S for user in users: next_cursor = -1 # START EVERY NEW USER RETRIEVAL WITH -1 print 'CURRENT USER:', user, 'STARTING CURSOR:', next_cursor while next_cursor: # THAT IS, WHILE CURSOR IS NOT ZERO print 'AUTH PROFILE', current_profile, 'CURRENT CURSOR:', next_cursor # RETURNS A TUPLE WITH ELEMENT[0] A LIST OF IDS, ELEMENT [1][0] PREVIOUS CURSOR, AND ELEMENT[1][1] NEXT CURSOR ids, cursors = tweepy_api.followers_ids(screen_name=user, count=5000, cursor=next_cursor) next_cursor = cursors[1] # STORE NEXT CURSOR # FUNCTION I CREATED TO GET STATUS FROM API.rate_limit_status() status = get_rate_limit_status(tweepy_api, '/followers/ids') print 'ID\'S RETRIEVED:', len(ids), 'NEXT CURSOR:', cursors[1], 'REMAINING:', status['remaining'] if not status['remaining']: # IF STATUS IS REMAINING IS ZERO print '' print 'RATE LIMIT REACHED' if current_profile < len(auth_profiles) - 1: # IF THE CURRENT PROFILE IS LESS THAN NINE (IN MY CASE) print 'INCREMENTING CURRENT PROFILE:', current_profile, '<', len(auth_profiles) - 1 current_profile += 1 # INCREMENT THE PROFILE print 'CURRENT PROFILE:', current_profile else: # ELSE, IT MUST EQUAL NINE (COULD BE NEG I SUPPOSE BUT...) print 'RESETTING CURRENT PROFILE TO ZERO:', current_profile, '=', len(auth_profiles) - 1 current_profile = 0 # RESET CURRENT PROFILE TO THE BEGINNING print 'CURRENT PROFILE:', current_profile tweepy_api = get_api(auth_profiles[current_profile]) # GET NEW TWEEPY API WITH NEW AUTH print '' 

La salida debería ser algo como esto (he eliminado algunas de las declaraciones de impresión para simplificar):

 CURRENT USER: user_one STARTING CURSOR: -1 AUTH PROFILE 9 CURRENT CURSOR: -1 ID'S RETRIEVED: 5000 NEXT CURSOR: 1594511885763407081 REMAINING: 14 … ID'S RETRIEVED: 5000 NEXT CURSOR: 1582249691352919104 REMAINING: 0 RATE LIMIT REACHED RESETTING CURRENT PROFILE TO ZERO: 9 = 9 CURRENT PROFILE: 0 ID'S RETRIEVED: 5000 NEXT CURSOR: 1580277475971792716 REMAINING: 14 … ID'S RETRIEVED: 4903 NEXT CURSOR: 0 REMAINING: 7 CURRENT USER: user_two STARTING CURSOR: -1 AUTH PROFILE 0 CURRENT CURSOR: -1 ID'S RETRIEVED: 5000 NEXT CURSOR: 1592820762836029887 REMAINING: 6 … ID'S RETRIEVED: 5000 NEXT CURSOR: 1592737463603654258 REMAINING: 0 RATE LIMIT REACHED INCREMENTING CURRENT PROFILE: 0 < 9 CURRENT PROFILE: 1 

Como nota al margen, si va a utilizar una versión en cursiva, al menos en Tweepy 3.5.0, el prev_cursor y next_cursor se almacenan en cursor.iterator.next_cursor, cursor.iterator.prev_cursor. Creo que este también es el caso para 3.6.0 (vea Cursor y CursorIterator en cursor.py )

Para mí, cursor.page_iterator.next_cursor devuelve:

 AttributeError: 'Cursor' object has no attribute 'page_iterator'