[PYTHON] Obtenez des tweets populaires de la chronologie Twitter, listez-les et diplômé de Tsui Abolition

Contexte

Je suis probablement aboli, et quand je regarde le temps d'écran, je passe en moyenne environ 3 heures par jour sur Twitter. Je fais presque un huitième de jour sur Twitter ... Eh bien, il y a des gens qui sont encore pires que moi ... Aussi, si vous en avez envie, suivez-moi → @y_a_m_a_y_a (J'ai changé le compte avec lequel Qiita travaille)

La plupart de ce que je fais consiste simplement à organiser des tweets sur la chronologie où je vois les tweets des gens et vérifie les tendances (parce que je suis sensible aux tendances), alors je voulais créer un programme pour réduire ce temps. ..

Voici la [Démo (publiée sur Twitter sous forme de vidéo)] créée (https://twitter.com/y_a_m_a_y_a/status/1261218576918130688?s=20).

Que veux-tu faire

  1. Obtenez votre propre chronologie
  2. Trier par ordre décroissant de favo et RT
  3. Exportez les principaux tweets au format HTML

environnement

Google Colab (la construction de l'environnement était problématique) Le code se trouve sur GitHub et google drive.

1. Obtenez votre propre chronologie

En gros, il existe de nombreuses explications pour cette partie.

Inscription développeur

Pour utiliser l'API Twitter, vous devez vous inscrire en tant que développeur. Cette partie a été écrite par différentes personnes, veuillez donc vous y référer. Résumé des procédures depuis l'enregistrement de l'API Twitter (méthode de demande de compte) jusqu'à l'approbation * Informations en août 2019 Comme c'était un but académique pour les étudiants d'étudier, j'ai été certifié immédiatement en environ une journée.

Obtenir la chronologie

Avec la bibliothèque Twitter, vous pouvez facilement tweeter, suivre, etc. sur Twitter. (Veuillez installer lors de l'utilisation avec Colab)

Tout d'abord, une authentification est requise. Authentifiez Twitter avec le code suivant.

AOuth.py


import twitter
#Définir la clé et le jeton d'accès obtenus(Entrez votre propre clé)
auth = twitter.OAuth(consumer_key="-------------------",
                     consumer_secret="-------------------",
                     token="-------------------",
                     token_secret="-------------------")

t = twitter.Twitter(auth=auth)

Recevez des tweets

Vient ensuite l'acquisition de tweets. Vous pouvez recevoir des tweets avec le code suivant.

python


t.statuses.home_timeline(count =Nombre de tweets acquis)

Vous pouvez le faire avec. Il reviendra avec un fichier json. Cette page est très facile à comprendre comme exemple de réponse. Si vous importez la bibliothèque json, vous pouvez utiliser json comme une liste

Exemple


import json
last_id = get_data[len(get_data)-1]["id"]

Le code ci-dessus obtient l'ID du tweet.

En raison des restrictions strictes sur l'API de Twitter, le nombre de tweets pouvant être acquis en même temps est fixé à environ 200. Référence officielle Par conséquent, vous pouvez l'obtenir en lisant à plusieurs reprises ce code avec l'instruction while.

Revenir en arrière sur les tweets avec max_id

En utilisant max_id, vous pouvez obtenir des tweets avant l'ID de tweet spécifié.

python


t.statuses.home_timeline(count =Nombre de tweets acquis,max_id =Identifiant du Tweet)

Le point à noter ici est que les tweets avec l'identifiant spécifié seront inclus plus d'une fois. Exclure avec l'instruction if.

Maintenant, vous pouvez obtenir les tweets !!!

Cependant, selon les spécifications de l'API, il semble que le nombre de tweets pouvant être retracés soit d'environ 800 tweets ... (Quel enfer ...) [Articles pouvant recevoir 3200 tweets avec Tweepy](https://www.pytry3g.com/entry/python-twitter-timeline#Cursor%E3%82%92%E4%BD%BF%E3%81%A3% E3% 81% A6% E5% A4% A7% E9% 87% 8F% E3% 81% AE% E3% 83% 84% E3% 82% A4% E3% 83% BC% E3% 83% 88% E3% 82% 92% E5% 8F% 96% E5% BE% 97% E3% 81% 99% E3% 82% 8B), mais je n'ai pas pu l'utiliser car j'ai été pris dans la limite de l'API Twitter de 15 minutes immédiatement après l'avoir essayé. J'ai abandonné après 800 tweets ...

Obtenir du temps

L'idée originale était que je voulais revenir à un tweet de 24 heures, donc j'utiliserai la bibliothèque datetime pour connaître l'heure. Étant donné que l'heure du tweet n'est pas au format datetime, elle est convertie de force par une opération de chaîne de caractères. C'est la partie suivante.

python


import datetime

date_create = get_data[int(len(get_data)-1)]["created_at"] #Obtenez la date et l'heure de création du tweet
date_create_at = datetime.datetime(year=int(date_create[26:30]), month=int(date.month), 
          day=int(date_create[8:10]), hour=int(date_create[11:13]),minute=int(date_create[14:16]))#Convertir l'heure de publication du tweet

Je voulais comparer l'heure (se terminer quand elle remonte à plus de 24 heures), donc je la soustrais et la convertis en secondes pour qu'il soit facile de comparer les valeurs. Je ne l'ai pas utilisé ...

python


diff = date - date_create_at
...
if diff.seconds >= 86400 or count >15: #24 heures ou lorsque vous êtes coincé dans une limite de boucle
    break

Si vous combinez ces domaines, vous pouvez obtenir 800 tweets à partir de l'heure actuelle! (Ouais)

Trier par ordre décroissant de favo et RT

Puis triez. Vous pouvez utiliser le tri de bibliothèque pour trier sans tenir compte de l'efficacité de l'algorithme. Puisqu'il s'agit d'un tri de liste multidimensionnel, utilisez lamda pour le trier.

python


data.sort(key=lambda data: data[5]) #Trier à l'aide d'une expression lambda(Fabo)

De plus, cette fois, nous allons trier par le nombre de favos et le nombre de RT, donc copiez le tableau de données. (Parce que cela semble être plus facile lors de l'exportation) Copy utilise la bibliothèque de copie.

python


import copy
data_RT = copy.copy(data)

Exporter les principaux tweets au format HTML

Enfin, exportez. Créez-le en vous référant au générateur HTML officiellement publié par Twitter. J'ai trouvé que si je spécifie correctement l'url, elle s'affichera correctement, donc tout ce que j'ai à faire est de remplacer la valeur. Défini dans une fonction.

python


#Créer du HTML à partir de tweets (fonction)
def create_html(text ,username ,userid, tweetid):
  html =  '<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">' + text + '</p>&mdash;' + username +'(@' + userid  +') <a href="https://twitter.com/' + userid + '/status/' +tweetid + '?ref_src=twsrc%5Etfw"></a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>'
  return html

Écrivez les 10 derniers dans l'instruction For et vous avez terminé! !!

Impressions

C'est dommage que l'API Twitter soit si restrictive que nous ne pouvions revenir en arrière qu'environ 3 heures au lieu de remonter les 24 premières heures. (Je pense que les résultats vont changer ici en fonction du nombre de followers) De plus, je ne peux pas le faire dans chaque environnement personnel sans m'inscrire en tant que développeur, et comme je le fais avec colab, j'ai le sentiment que la génération de fichiers ne se passe pas bien par rapport au local, et il y a beaucoup d'améliorations ...

Il semble qu'il faudra un peu plus de temps pour obtenir son diplôme de Tsui. .. .. · Résultat d'exécution

スクリーンショット 2020-05-16 15.13.34.png

Enfin le code

Sentiment de code hérité ...

python


import twitter
import json
import datetime
import copy

#Créer du HTML à partir de tweets (fonction)
def create_html(text ,username ,userid, tweetid):
  html =  '<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">' + text + '</p>&mdash;' + username +'(@' + userid  +') <a href="https://twitter.com/' + userid + '/status/' +tweetid + '?ref_src=twsrc%5Etfw"></a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>'
  return html

#Définir la clé et le jeton d'accès obtenus(Entrez votre propre clé)
auth = twitter.OAuth(consumer_key="-------------------",
                     consumer_secret="-------------------",
                     token="-------------------",
                     token_secret="-------------------")

t = twitter.Twitter(auth=auth)

#Obtenir la chronologie(Revenez aussi loin que possible avec l'instruction while)
date = datetime.datetime.now() #Obtenez le temps maintenant
date = datetime.datetime(year=date.year, month=date.month, day=date.day, hour=date.hour,minute=date.minute)
count = 0 #Pour compter les tweets récupérés
data =[] #Sauvegardez les données acquises
#data_swap =[]
diff = date - date
print("Heure de début",date)

while(1): #Démarrer l'acquisition de données
  if diff.seconds >= 86400 or count >15: #24 heures ou lorsque vous êtes coincé dans une limite de boucle
    print("Fin de la recherche")
    print(count)
    break
  elif count ==0: #La première fois
    get_data = t.statuses.home_timeline(count = 200)
    for i in range(len(get_data)):
      # create,"id",name,userid,text,"favorite_count","retweet_count"
      data_swap = [str(get_data[i]["created_at"]),str(get_data[i]["id"]),str(get_data[i]["user"]["name"]),str(get_data[i]["user"]["screen_name"]),str(get_data[i]["text"]),int(get_data[i]["favorite_count"]),int(get_data[i]["retweet_count"])]
      data.append(data_swap)
    last_id = get_data[len(get_data)-3]["id"] #Récupérer les tweets précédents à partir de l'identifiant du dernier tweet
    date_create = get_data[int(len(get_data)-1)]["created_at"]
    date_create_at = datetime.datetime(year=int(date_create[26:30]), month=int(date.month), day=int(date_create[8:10]), hour=int(date_create[11:13]),minute=int(date_create[14:16]))#Prenez le temps de publier des tweets
    count = count +1
  else: #D'autres fois
    get_data = t.statuses.home_timeline(count = 800, max_id = last_id)
    if len(get_data) == 0: #Lorsque le nombre de tweets acquis devient 0 en raison de la limite
      print("Fin de la recherche")
      break
    for i in range(len(get_data)):
      if i >0: # max_Récupérer après le tweet spécifié par id
        data_swap = [str(get_data[i]["created_at"]),str(get_data[i]["id"]),str(get_data[i]["user"]["name"]),str(get_data[i]["user"]["screen_name"]),str(get_data[i]["text"]),int(get_data[i]["favorite_count"]),int(get_data[i]["retweet_count"])]
        data.append(data_swap)
    last_id = get_data[len(get_data)-1]["id"] #Récupérer les tweets précédents à partir de l'identifiant du dernier tweet
    date_create = get_data[int(len(get_data)-1)]["created_at"]
    date_create_at = datetime.datetime(year=int(date_create[26:30]), month=int(date.month), day=int(date_create[8:10]), hour=int(date_create[11:13]),minute=int(date_create[14:16]))#Prenez le temps de publier des tweets
    diff = date -date_create_at
    count = count +1

print("Heure de fin",date_create_at)
print("Nombre total de données:",len(data))

#Trier
size = len(data)
data.sort(key=lambda data: data[5]) #Trier à l'aide d'une expression lambda(Fabo)
data_RT = copy.copy(data)
data_RT.sort(key=lambda data: data[6]) #Trier à l'aide d'une expression lambda(RT)

#Voir les résultats(HTML)
path = '/content/drive/My Drive/Colab Notebooks/TwitterAPI/' + 'data/TimeLine' +str(date.month) +'Mois' +str(date.day) + 'journée' +'.html'
with open(path, mode='w') as f:
    f.write("<H1>Les 10 meilleurs tweets avec le plus de favos!<H1>")
    f.write("<H1>"+str(date + datetime.timedelta(hours =9)) + "~" +str(date_create_at + datetime.timedelta(hours =9)) +"<H1>")
    for i in range(10):
        f.write("<H2>Non."+str(i+1)+"Rang!! "+ str(data[size-1-i][5]) + "Fabo<H2>")
        f.write(create_html(data[size-1-i][4],data[size-1-i][2],data[size-1-i][3],data[size-1-i][1]))
        
    #Chez RT
    f.write("<H1>Les 10 meilleurs tweets avec le plus de RT!<H1>")
    for i in range(10):
        f.write("<H2>Non."+str(i+1)+"Rang!! "+ str(data[size-1-i][6]) + "RT <H2>")
        f.write(create_html(data_RT[size-1-i][4],data_RT[size-1-i][2],data_RT[size-1-i][3],data_RT[size-1-i][1]))
print("Fin d'écriture")

Recommended Posts

Obtenez des tweets populaires de la chronologie Twitter, listez-les et diplômé de Tsui Abolition
Obtenez l'adresse à partir de la latitude et de la longitude
Obtenez des tweets Twitter, des followers, des followers, des likes, avec urllib et beautifulSoup