[PYTHON] Obtenir les données utilisateur Twitter

Comme il n'y a que screen_name dans la liste des abonnés de Twitter, j'ai décidé d'ajouter les informations de l'identifiant d'utilisateur à la liste des abonnés de Twitter.

Twitter API GET users/show https://dev.twitter.com/rest/reference/get/users/show

Données de la liste des abonnés Twitter (csv)

name account followdate
Kuwa kazhu 2015/12/26
Giri noko123 2015/12/26
Taro taro123 2017/09/21

Limiter les utilisateurs de l'API / afficher jusqu'à 900/15 minutes

Les restrictions de l'API sont gênantes pour Twitter, mais le moyen de l'éviter est par la méthode de l'administrateur de Code 7 Ward. Je suis toujours reconnaissant de votre aide. Recevez beaucoup de tweets avec TwitterAPI. Tenez compte des erreurs côté serveur (en python)

twitter_user_get.py



# coding=utf-8

import sys
import tweetkey
import os
from requests_oauthlib import OAuth1Session
import csv
import time
import json
import datetime


def init():

    #Définissez diverses clés à partir du fichier externe habituel
    CONSUMER_KEY = tweetkey.twkey['CONSUMER_KEY']
    CONSUMER_SECRET = tweetkey.twkey['CONSUMER_SECRET']
    ACCESS_TOKEN = tweetkey.twkey['ACCESS_TOKEN']
    ACCESS_SECRET = tweetkey.twkey['ACCESS_SECRET']

    twitter = OAuth1Session(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_SECRET)

    return(twitter)

def twittergetter(input_name,output_name,api):

    TweetIDList = []
    with open(input_name, 'r') as f:
        reader = csv.reader(f)
        header = next(reader)  #Lorsque vous souhaitez ignorer l'en-tête

        #Ajout de la colonne ID à HEAD pour la sortie
        header.append("id")

        fout = open(output_name, 'wt')
        writer = csv.writer(fout)
        writer.writerow(header)

        for row in reader:
            #Obtenez un compte du tableau 2 de csv et lancez
            screen_name = row[2]
            print(screen_name)
            url = "https://api.twitter.com/1.1/users/show.json?screen_name=" + screen_name
            # params = {'count': 100}
            # get_les utilisateurs n'ont pas de paramètres
            req = api.get(url)

            if req.status_code == 200:
                users = json.loads(req.text)
                print(users)
                #l'ID utilisateur est dans l'ID
                id = users["id"]
                print(id)
                #Ajoutez l'id retourné au tableau et écrivez
                row.append(id)
                writer.writerow(row)

            else:
          #À 404, écran_Puisque le nom a déjà changé ou retiré, écrivez tel quel
                if req.status_code == 404:
                    writer.writerow(row)
                else:
                    print ("Error: %d" % req.status_code)
                    time.sleep(240)

            #Confirmation d'en-tête (nombre de fois limité)
            # X-Rate-Limit-Vérifiez car il est rare que Restant ne soit pas inclus
            if ('X-Rate-Limit-Remaining' in req.headers and 'X-Rate-Limit-Reset' in req.headers):
                if (int(req.headers['X-Rate-Limit-Remaining']) == 0):
                    waitUntilReset(int(req.headers['X-Rate-Limit-Reset']))
                    checkLimit()
            else:
                print('not found  -  X-Rate-Limit-Remaining or X-Rate-Limit-Reset')
                checkLimit()

        fout.close()
    return()


def checkLimit():
    '''
Interrogez la limite et attendez qu'elle devienne accessible
    '''
    unavailableCnt = 0
    while True:
        url = "https://api.twitter.com/1.1/application/rate_limit_status.json"
        res = api.get(url)
        print(res.text)

        if res.status_code == 503:
            # 503 : Service Unavailable
            if unavailableCnt > 10:
                raise Exception('Twitter API error %d' % res.status_code)

            unavailableCnt += 1
            print('Service Unavailable 503')
            waitUntilReset(time.mktime(datetime.datetime.now().timetuple()) + 30)
            continue

        unavailableCnt = 0

        if res.status_code != 200:
            raise Exception('Twitter API error %d' % res.status_code)

        remaining, reset = getLimitContext(json.loads(res.text))
        if (remaining == 0):
            waitUntilReset(reset)
        else:
            break

def getLimitContext(res_text):
    '''
Obtenir des informations sur le nombre de fois limite (au démarrage)
    '''
    remaining = res_text['resources']['users']['/users/show/:id']['remaining']
    reset = res_text['resources']['users']['/users/show/:id']['reset']
    print(reset)
    return int(remaining), int(reset)

def waitUntilReset(reset):
    '''
dormir jusqu'à l'heure de réinitialisation
    '''
    seconds = reset - time.mktime(datetime.datetime.now().timetuple())
    seconds = max(seconds, 0)
    print('\n     =====================')
    print('     == waiting %d sec ==' % seconds)
    print('     =====================')
    sys.stdout.flush()
    time.sleep(seconds + 10)  #Au cas où+10 secondes

if __name__ == '__main__':
    api = init()
    input_name = os.getcwd() + "/twitterList.csv"
    output_name = os.getcwd() + "/twitterList_add_id.csv"
    twittergetter(input_name,output_name, api)

Cependant, lorsque j'essaye de convertir screen_name pour 120 000 personnes, cela ne s'arrête pas même après 2 jours. .. ..

Recommended Posts

Obtenir les données utilisateur Twitter
Obtenez la chronologie Twitter avec Python
Obtenez l'historique des tweets de célébrités sur Twitter
Obtenez des données de Twitter avec Tweepy
Obtenez des informations sur les retards sur Twitter et tweet
Obtenez des images par recherche par mot-clé sur Twitter
Obtenez des signets Twitter sur CentOS en utilisant Selenium
[python] Obtenir la chronologie Twitter pour plusieurs utilisateurs
Programme pour obtenir les images préférées de Twitter
Recevez de nombreux tweets Twitter à la fois