Les points de terminaison de recherche Twitter v2 incluent désormais un point de terminaison « comptes » qui renvoie les totaux de séries chronologiques des Tweets correspondants.
Ce projet sert de wrapper pour les API de recherche Twitter premium et d'entreprise, fournissant un utilitaire de ligne de commande et une bibliothèque Python. De jolis documents peuvent être vus ici.
jq
). La bibliothèque searchtweets
est sur Pypi :
pip install searchtweets
Ou vous pouvez installer la version de développement localement via
git clone https://github.com/twitterdev/search-tweets-python
cd search-tweets-python
pip install -e .
Les API de recherche premium et entreprise utilisent différentes méthodes d'authentification et nous essayons de fournir un moyen transparent de gérer l'authentification pour tous les clients. Nous savons que les informations d'identification peuvent être délicates ou ennuyeuses - veuillez lire ceci dans son intégralité.
Les clients Premium auront besoin des champs bearer_token
et endpoint
; Les clients d'entreprise nécessitent username
, password
et endpoint
. Si vous ne spécifiez pas le account_type
, nous essayons de discerner le type de compte et déclarons un avertissement concernant ce comportement.
Pour les produits de recherche premium, nous utilisons l'authentification par application uniquement et les jetons du porteur ne sont pas livrés avec un délai d'expiration. Vous pouvez fournir soit : - votre clé d'application et votre secret (la bibliothèque se chargera de l'authentification par jeton du porteur) - un jeton du porteur que vous vous procurerez vous-même
De nombreux développeurs pourraient trouver plus simple de fournir la clé et le secret de votre application et de laisser cette bibliothèque gérer la génération de vos jetons de porteur pour vous. Veuillez consulter ici pour un aperçu de la méthode d'authentification premium.
Nous prenons en charge à la fois les méthodes basées sur les fichiers YAML et les variables d'environnement pour stocker les informations d'identification, et proposons une gestion flexible avec des valeurs par défaut raisonnables.
Pour les clients premium, le fichier d’informations d’identification le plus simple devrait ressembler à ceci :
search_tweets_api :
account_type : premium
endpoint : <FULL_URL_OF_ENDPOINT>
consumer_key : <CONSUMER_KEY>
consumer_secret : <CONSUMER_SECRET>
Pour les entreprises clientes, le fichier d’informations d’identification le plus simple devrait ressembler à ceci :
search_tweets_api :
account_type : enterprise
endpoint : <FULL_URL_OF_ENDPOINT>
username : <USERNAME>
password : <PW>
Par défaut, cette bibliothèque attend ce fichier dans "~/.twitter_keys.yaml"
, mais vous pouvez transmettre l'emplacement approprié si nécessaire, soit avec l'indicateur --credential-file
pour l'application en ligne de commande, soit comme démontré ci-dessous dans un fichier Python. programme.
Les deux exemples ci-dessus ne nécessitent aucun argument de ligne de commande spécial ni aucun argument dans le programme. Les méthodes d'analyse des informations d'identification, sauf indication contraire, rechercheront une clé YAML appelée search_tweets_api
.
Pour les développeurs disposant de plusieurs points de terminaison et/ou produits de recherche, vous pouvez conserver toutes les informations d'identification dans le même fichier et spécifier des clés spécifiques à utiliser. --credential-file-key
spécifie ce comportement dans l'application de ligne de commande. Un exemple :
search_tweets_30_day_dev :
account_type : premium
endpoint : <FULL_URL_OF_ENDPOINT>
consumer_key : <KEY>
consumer_secret : <SECRET>
(optional) bearer_token : <TOKEN>
search_tweets_30_day_prod :
account_type : premium
endpoint : <FULL_URL_OF_ENDPOINT>
bearer_token : <TOKEN>
search_tweets_fullarchive_dev :
account_type : premium
endpoint : <FULL_URL_OF_ENDPOINT>
bearer_token : <TOKEN>
search_tweets_fullarchive_prod :
account_type : premium
endpoint : <FULL_URL_OF_ENDPOINT>
bearer_token : <TOKEN>
Si vous souhaitez ou devez transmettre des informations d'identification via des variables d'environnement, vous pouvez définir les variables appropriées pour votre produit parmi les suivantes :
exporter SEARCHTWEETS_ENDPOINT= exporter SEARCHTWEETS_USERNAME= exporter SEARCHTWEETS_PASSWORD= exporter SEARCHTWEETS_BEARER_TOKEN= exporter SEARCHTWEETS_ACCOUNT_TYPE= exporter SEARCHTWEETS_CONSUMER_KEY= exporter SEARCHTWEETS_CONSUMER_SECRET=
La fonction load_credentials
tentera de trouver ces variables si elle ne peut pas charger les champs du fichier YAML, et elle écrasera toutes les informations d'identification du fichier YAML qui sont présentes en tant que variables d'environnement si elles ont été analysées. Ce comportement peut être modifié en définissant le paramètre load_credentials
env_overwrite
sur False
.
Les cellules suivantes illustrent la gestion des informations d'identification dans la bibliothèque Python.
from searchtweets import load_credentials
load_credentials ( filename = "./search_tweets_creds_example.yaml" ,
yaml_key = "search_tweets_ent_example" ,
env_overwrite = False )
{'nom d'utilisateur' : '<MY_USERNAME>', 'mot de passe' : '<MY_PASSWORD>', 'point de terminaison' : '<MY_ENDPOINT>'}
load_credentials ( filename = "./search_tweets_creds_example.yaml" ,
yaml_key = "search_tweets_premium_example" ,
env_overwrite = False )
{'bearer_token' : '<A_VERY_LONG_MAGIC_STRING>', 'point de terminaison' : 'https://api.twitter.com/1.1/tweets/search/30day/dev.json', 'extra_headers_dict' : Aucun}
Si nous définissons nos variables d'environnement, le programme les recherchera quelle que soit la validité ou l'existence d'un fichier YAML.
import os
os . environ [ "SEARCHTWEETS_USERNAME" ] = "<ENV_USERNAME>"
os . environ [ "SEARCHTWEETS_PASSWORD" ] = "<ENV_PW>"
os . environ [ "SEARCHTWEETS_ENDPOINT" ] = "<https://endpoint>"
load_credentials ( filename = "nothing_here.yaml" , yaml_key = "no_key_here" )
impossible de lire le fichier Nothing_here.yaml Erreur lors de l'analyse du fichier YAML ; recherche de variables d'environnement valides
{'nom d'utilisateur' : '<ENV_USERNAME>', 'mot de passe' : '<ENV_PW>', 'point de terminaison' : '<https://point de terminaison>'}
les drapeaux :
--credential-file <FILENAME>
--credential-file-key <KEY>
--env-overwrite
sont utilisés pour contrôler le comportement des informations d’identification à partir de l’application de ligne de commande.
La bibliothèque comprend une application, search_tweets.py
, qui permet un accès rapide aux Tweets. Lorsque vous utilisez pip
pour installer ce package, search_tweets.py
est installé globalement. Le fichier se trouve dans le répertoire tools/
pour ceux qui souhaitent l’exécuter localement.
Notez que l'indicateur --results-per-call
spécifie un argument à l'API ( maxResults
, résultats renvoyés par CALL), et non comme un nombre maximum de résultats renvoyés par ce programme. L'argument --max-results
définit le nombre maximum de résultats à renvoyer pour un appel donné. Tous les exemples supposent que vos informations d'identification sont correctement configurées à l'emplacement par défaut - .twitter_keys.yaml
ou dans des variables d'environnement.
Diffusez les résultats JSON sur la sortie standard sans enregistrer
search_tweets.py
--max-results 1000
--results-per-call 100
--filter-rule " beyonce has:hashtags "
--print-stream
Diffusez les résultats JSON sur la sortie standard et enregistrez-les dans un fichier
search_tweets.py
--max-results 1000
--results-per-call 100
--filter-rule " beyonce has:hashtags "
--filename-prefix beyonce_geo
--print-stream
Enregistrer dans un fichier sans sortie
search_tweets.py
--max-results 100
--results-per-call 100
--filter-rule " beyonce has:hashtags "
--filename-prefix beyonce_geo
--no-print-stream
Un ou plusieurs en-têtes personnalisés peuvent être spécifiés à partir de la ligne de commande, à l'aide de l'argument --extra-headers
et d'une chaîne au format JSON représentant un dictionnaire d'en-têtes supplémentaires :
search_tweets.py
--filter-rule " beyonce has:hashtags "
--extra-headers ' {"<MY_HEADER_KEY>":"<MY_HEADER_VALUE>"} '
Les options peuvent être transmises via un fichier de configuration (ini ou YAML). Des exemples de fichiers peuvent être trouvés dans les fichiers tools/api_config_example.config
ou ./tools/api_yaml_example.yaml
, qui peuvent ressembler à ceci :
[search_rules]
from_date = 2017-06-01
to_date = 2017-09-01
pt_rule = beyonce has:geo
[search_params]
results_per_call = 500
max_results = 500
[output_params]
save_file = True
filename_prefix = beyonce
results_per_file = 10000000
Ou ceci :
search_rules :
from-date : 2017-06-01
to-date : 2017-09-01 01:01
pt-rule : kanye
search_params :
results-per-call : 500
max-results : 500
output_params :
save_file : True
filename_prefix : kanye
results_per_file : 10000000
Les en-têtes personnalisés peuvent être spécifiés dans un fichier de configuration, sous une clé d'informations d'identification spécifique :
search_tweets_api :
account_type : premium
endpoint : <FULL_URL_OF_ENDPOINT>
username : <USERNAME>
password : <PW>
extra_headers :
<MY_HEADER_KEY> : <MY_HEADER_VALUE>
Lorsque vous utilisez un fichier de configuration conjointement avec l'utilitaire de ligne de commande, vous devez spécifier votre fichier de configuration via le paramètre --config-file
. Des arguments de ligne de commande supplémentaires seront soit ajoutés aux arguments du fichier de configuration, soit écraseront les arguments du fichier de configuration si les deux sont spécifiés et présents.
Exemple:
search_tweets.py --config-file monapiconfig.config --no-print-stream
Les options complètes sont répertoriées ci-dessous :
$ search_tweets.py -h utilisation : search_tweets.py [-h] [--credential-file CREDENTIAL_FILE] [--credential-file-key CREDENTIAL_YAML_KEY] [--env-overwrite ENV_OVERWRITE] [--config-file CONFIG_FILENAME] [--account-type {premium, entreprise}] [--count-bucket COUNT_BUCKET] [--start-datetime FROM_DATE] [--end-datetime TO_DATE] [--filter-rule PT_RULE] [--résultats par appel RESULTS_PER_CALL] [--max-results MAX_RESULTS] [--max-pages MAX_PAGES] [--results-per-file RESULTS_PER_FILE] [--filename-prefix FILENAME_PREFIX] [--no-print-stream] [--print-stream] [--extra-headers EXTRA_HEADERS] [--debug] arguments facultatifs : -h, --help afficher ce message d'aide et quitter --credential-file CREDENTIAL_FILE Emplacement du fichier yaml utilisé pour contenir votre informations d'identification. --credential-file-key CREDENTIAL_YAML_KEY la clé dans le fichier d'informations d'identification utilisé pour cette session informations d'identification. La valeur par défaut est search_tweets_api --env-overwrite ENV_OVERWRITE Remplacer les informations d'identification analysées par YAML par n'importe quel ensemble variables d'environnement. Consultez la documentation de l'API ou lisez-moi pour détails. --config-file CONFIG_FILENAME fichier de configuration avec tous les paramètres. De loin, plus facile à utiliser que la version des arguments de ligne de commande., Si un valide le fichier est trouvé, tous les arguments seront renseignés, à partir de là. Les arguments de ligne de commande restants annuleront les arguments trouvés dans la configuration, fichier. --account-type {premium, entreprise} Le type de compte que vous utilisez --count-bucket COUNT_BUCKET Définissez ceci pour faire une demande de « compte ». Taille du compartiment pour le point de terminaison du décompte. Options :, jour, heure, minute. --start-datetime FROM_DATE Début de la fenêtre date/heure, format 'AAAA-mm-JJTHH:MM' (par défaut : -30 jours) --end-datetime TO_DATE Fin de la fenêtre date/heure, format 'AAAA-mm-JJTHH:MM' (par défaut : date la plus récente) --filter-rule PT_RULE Règle de filtre PowerTrack (voir : http://support.gnip.com/c client/portail/articles/901152-powertrack-operators) --résultats par appel RESULTS_PER_CALL Nombre de résultats à renvoyer par appel (par défaut 100 ; max 500) - correspond à 'maxResults' dans l'API. Si vous effectuez une requête « counts » avec « --count-bucket », ce paramètre est ignoré. --max-results MAX_RESULTS Nombre maximum de tweets ou de comptes à renvoyer pour cela session (500 par défaut) --max-pages MAX_PAGES Nombre maximum de pages/appels API à utiliser pour cela session. --results-per-file RESULTS_PER_FILE Nombre maximum de tweets à enregistrer par fichier. --filename-prefix FILENAME_PREFIX préfixe du nom de fichier où seront les données tweet json stockés. --no-print-stream désactiver le streaming d'impression --print-stream Imprimer le flux de tweet sur la sortie standard --extra-headers EXTRA_HEADERS Str au format JSON représentant un dictionnaire de données supplémentaires en-têtes de requête --debug affiche toutes les informations et messages d'avertissement
Travailler avec l'API dans un programme Python est simple pour les clients Premium et Enterprise.
Nous supposerons que les informations d'identification se trouvent à l'emplacement par défaut, ~/.twitter_keys.yaml
.
from searchtweets import ResultStream , gen_rule_payload , load_credentials
enterprise_search_args = load_credentials ( "~/.twitter_keys.yaml" ,
yaml_key = "search_tweets_enterprise" ,
env_overwrite = False )
premium_search_args = load_credentials ( "~/.twitter_keys.yaml" ,
yaml_key = "search_tweets_premium" ,
env_overwrite = False )
Il existe une fonction qui formate les règles de l'API de recherche en requêtes json valides appelées gen_rule_payload
. Il a des valeurs par défaut raisonnables, telles que l'extraction de plus de Tweets par appel que les 100 par défaut (mais notez qu'un environnement sandbox ne peut en avoir qu'un maximum de 100 ici, donc si vous obtenez des erreurs, veuillez vérifier ceci), sans compter les dates. Discuter des subtilités de la génération de règles de recherche sort du cadre de ces exemples ; Je vous encourage à consulter la documentation pour en connaître les nuances, mais pour l'instant, voyons à quoi ressemble une règle.
rule = gen_rule_payload ( "beyonce" , results_per_call = 100 ) # testing with a sandbox account
print ( rule )
{"query": "beyoncé", "maxResults": 100}
Cette règle correspondra aux tweets contenant le texte beyonce
.
À partir de là, il existe deux manières d’interagir avec l’API. Il existe une méthode rapide pour collecter de plus petites quantités de Tweets en mémoire qui nécessite moins de réflexion et de connaissances, ainsi qu'une interaction avec l'objet ResultStream
qui sera présenté plus tard.
Nous utiliserons la variable search_args
pour alimenter le point de configuration de l'API. L'objet prend également une règle PowerTrack valide et propose des options pour interrompre la recherche lorsque les limites du nombre de Tweets et d'appels API sont atteintes.
Nous utiliserons la fonction collect_results
, qui a trois paramètres.
Pour les exemples restants, veuillez modifier les arguments en premium ou entreprise en fonction de votre utilisation.
Voyons comment ça se passe :
from searchtweets import collect_results
tweets = collect_results ( rule ,
max_results = 100 ,
result_stream_args = enterprise_search_args ) # change this if you need to
Par défaut, les charges utiles Tweet sont analysées paresseusement dans un objet Tweet
. Un très grand nombre d'attributs de Tweet sont mis à disposition directement, notamment :
[ print ( tweet . all_text , end = ' n n ' ) for tweet in tweets [ 0 : 10 ]];
Jay-Z & Beyoncé s'est assise en face de nous au dîner ce soir et, à un moment donné, j'ai établi un contact visuel avec Beyoncé. Mes membres se sont transformés en gelée et je n'arrive plus à former une phrase cohérente. J'ai vu les yeux du seigneur. Beyoncé et ce n'est pas proche. https://t.co/UdOU9oUtuW Comme vous pouvez le deviner… Les signes de Beyoncé seront toujours ma merde. Quand Beyoncé adopte un chien ?? https://t.co/U571HyLG4F Attends, tu ne peux pas faire ça à Beyoncé https://t.co/3p14DocGqA Pourquoi continuez-vous à utiliser les gifs de Rihanna et Beyoncé pour promouvoir la série alors que vous avez tous laissé Bey perdre le même prix qu'elle méritait 3 fois et laisser Rihanna repartir avec rien d'autre que les vêtements sur son dos ? https://t.co/w38QpH0wma 30) personne ne te dit que tu ressembles à Beyoncé https://t.co/Vo4Z7bfSCi Ma préférée de Beyoncé https://t.co/f9Jp600l2B Beyoncé a besoin de cela. Que diosa @TiniStoessel https://t.co/gadVJbehQZ Joanne Pearce joue actuellement IF I WAS A BOY - BEYONCE.mp3 par ! J'essaye de voir la finsta de Beyoncé avant de mourir
[ print ( tweet . created_at_datetime ) for tweet in tweets [ 0 : 10 ]];
2018-01-17 00:08:50 2018-01-17 00:08:49 2018-01-17 00:08:44 2018-01-17 00:08:42 2018-01-17 00:08:42 2018-01-17 00:08:42 2018-01-17 00:08:40 2018-01-17 00:08:38 2018-01-17 00:08:37 2018-01-17 00:08:37
[ print ( tweet . generator . get ( "name" )) for tweet in tweets [ 0 : 10 ]];
Twitter pour iPhone Twitter pour iPhone Twitter pour iPhone Twitter pour iPhone Twitter pour iPhone Twitter pour iPhone Twitter pour Android Twitter pour iPhone Temps d'antenne Pro Twitter pour iPhone
Voila, nous avons quelques Tweets. Pour les environnements interactifs et d'autres cas où vous ne vous souciez pas de collecter vos données en un seul chargement ou n'avez pas besoin d'opérer directement sur le flux de Tweets ou de décomptes, je vous recommande d'utiliser cette fonction pratique.
L'objet ResultStream sera alimenté par search_args
et prendra les règles et autres paramètres de configuration, y compris un arrêt brutal sur le nombre de pages pour limiter l'utilisation de vos appels API.
rs = ResultStream ( rule_payload = rule ,
max_results = 500 ,
max_pages = 1 ,
** premium_search_args )
print ( rs )
Flux de résultats : { "nom d'utilisateur": nul, "endpoint": "https://api.twitter.com/1.1/tweets/search/30day/dev.json", "rule_payload":{ "requête": "beyoncé", "maxRésultats": 100 }, "tweetify": vrai, "max_results": 500 }
Il existe une fonction, .stream
, qui gère de manière transparente les requêtes et la pagination pour une requête donnée. Il renvoie un générateur, et pour récupérer nos 500 Tweets qui mentionnent beyonce
, nous pouvons faire ceci :
tweets = list ( rs . stream ())
Les tweets sont analysés paresseusement à l'aide de notre Tweet Parser, de sorte que les données des tweets sont très facilement extractibles.
# using unidecode to prevent emoji/accents printing
[ print ( tweet . all_text ) for tweet in tweets [ 0 : 10 ]];
gente socorro kkkkkkkkkk BEYONCE https://t.co/kJ9zubvKuf Jay-Z & Beyoncé s'est assise en face de nous au dîner ce soir et, à un moment donné, j'ai établi un contact visuel avec Beyoncé. Mes membres se sont transformés en gelée et je n'arrive plus à former une phrase cohérente. J'ai vu les yeux du seigneur. Beyoncé et ce n'est pas proche. https://t.co/UdOU9oUtuW Comme vous pouvez le deviner… Les signes de Beyoncé seront toujours ma merde. Quand Beyoncé adopte un chien ?? https://t.co/U571HyLG4F Attends, tu ne peux pas faire ça à Beyoncé https://t.co/3p14DocGqA Pourquoi continuez-vous à utiliser les gifs de Rihanna et Beyoncé pour promouvoir la série alors que vous avez tous laissé Bey perdre le même prix qu'elle méritait 3 fois et laisser Rihanna repartir avec rien d'autre que les vêtements sur son dos ? https://t.co/w38QpH0wma 30) personne ne te dit que tu ressembles à Beyoncé https://t.co/Vo4Z7bfSCi Ma préférée de Beyoncé https://t.co/f9Jp600l2B Beyoncé a besoin de cela. Que diosa @TiniStoessel https://t.co/gadVJbehQZ Joanne Pearce joue actuellement IF I WAS A BOY - BEYONCE.mp3 par !
Nous pouvons également utiliser le point de terminaison Search API Counts pour obtenir le nombre de Tweets qui correspondent à notre règle. Chaque demande renverra jusqu'à 30 jours de résultats, et chaque demande de comptage peut être effectuée sur une base minute, horaire ou quotidienne. L'objet ResultStream
sous-jacent gérera la conversion de votre point de terminaison en point de terminaison de comptage, et vous devrez spécifier l'argument count_bucket
lors de l'élaboration d'une règle pour l'utiliser.
Le processus est très similaire à la récupération de Tweets, mais présente quelques différences mineures.
Attention : les environnements sandbox premium n'ont PAS accès au point de terminaison du décompte de l'API de recherche.
count_rule = gen_rule_payload ( "beyonce" , count_bucket = "day" )
counts = collect_results ( count_rule , result_stream_args = enterprise_search_args )
Nos résultats sont assez simples et peuvent être rapidement utilisés.
counts
[{'count' : 366, 'timePeriod' : '201801170000'}, {'count' : 44580, 'timePeriod' : '201801160000'}, {'count' : 61932, 'timePeriod' : '201801150000'}, {'count' : 59678, 'timePeriod' : '201801140000'}, {'count' : 44014, 'timePeriod' : '201801130000'}, {'count' : 46607, 'timePeriod' : '201801120000'}, {'count' : 41523, 'timePeriod' : '201801110000'}, {'count' : 47056, 'timePeriod' : '201801100000'}, {'count' : 65506, 'timePeriod' : '201801090000'}, {'count' : 95251, 'timePeriod' : '201801080000'}, {'count' : 162883, 'timePeriod' : '201801070000'}, {'count' : 106344, 'timePeriod' : '201801060000'}, {'count' : 93542, 'timePeriod' : '201801050000'}, {'count' : 110415, 'timePeriod' : '201801040000'}, {'count' : 127523, 'timePeriod' : '201801030000'}, {'count' : 131952, 'timePeriod' : '201801020000'}, {'count' : 176157, 'timePeriod' : '201801010000'}, {'count' : 57229, 'timePeriod' : '201712310000'}, {'count' : 72277, 'timePeriod' : '201712300000'}, {'count' : 72051, 'timePeriod' : '201712290000'}, {'count' : 76371, 'timePeriod' : '201712280000'}, {'count' : 61578, 'timePeriod' : '201712270000'}, {'count' : 55118, 'timePeriod' : '201712260000'}, {'count' : 59115, 'timePeriod' : '201712250000'}, {'count' : 106219, 'timePeriod' : '201712240000'}, {'count' : 114732, 'timePeriod' : '201712230000'}, {'count' : 73327, 'timePeriod' : '201712220000'}, {'count' : 89171, 'timePeriod' : '201712210000'}, {'count' : 192381, 'timePeriod' : '201712200000'}, {'count' : 85554, 'timePeriod' : '201712190000'}, {'count' : 57829, 'timePeriod' : '201712180000'}]
Notez que cela ne fonctionnera qu'avec l'option de recherche complète dans les archives , qui est disponible sur mon compte uniquement via les options d'entreprise. La recherche complète dans les archives nécessitera probablement un point de terminaison ou une méthode d'accès différente ; veuillez consulter votre console de développeur pour plus de détails.
Établissons une nouvelle règle et transmettons les dates cette fois.
gen_rule_payload
prend les horodatages des formes suivantes :
YYYYmmDDHHMM
YYYY-mm-DD
(qui sera converti en minuit UTC (00:00)YYYY-mm-DD HH:MM
YYYY-mm-DDTHH:MM
Remarque : tous les tweets sont stockés à l'heure UTC.
rule = gen_rule_payload ( "from:jack" ,
from_date = "2017-09-01" , #UTC 2017-09-01 00:00
to_date = "2017-10-30" , #UTC 2017-10-30 00:00
results_per_call = 500 )
print ( rule )
{"query": "from:jack", "maxResults": 500, "toDate": "201710300000", "fromDate": "201709010000"}
tweets = collect_results ( rule , max_results = 500 , result_stream_args = enterprise_search_args )
[ print ( tweet . all_text ) for tweet in tweets [ 0 : 10 ]];
Plus de clarté sur notre politique en matière d'informations privées et son application. Travailler pour créer autant de contexte direct dans le produit également https://t.co/IrwBexPrBA Pour fournir plus de clarté sur notre politique en matière d'informations privées, nous avons ajouté des exemples spécifiques de ce qui constitue/n'est pas une violation et un aperçu de ce dont nous avons besoin pour supprimer ce type de contenu du service. https://t.co/NGx5hh2tTQ Lancement d'une politique sur les groupes violents et les images/symboles haineux le 22 novembre https://t.co/NaWuBPxyO5 Nous allons désormais lancer nos politiques concernant les groupes violents, les images et les symboles haineux le 22 novembre. Au cours du processus de développement, nous avons reçu de précieux commentaires que nous mettons en œuvre avant qu'ils ne soient publiés et appliqués. En savoir plus sur notre processus d’élaboration de politiques ici ? https://t.co/wx3EeH39BI @WillStick @lizkelley Joyeux anniversaire Liz ! Publicité de départ de tous les comptes détenus par Russia Today (RT) et Spoutnik. Nous reversons tous les revenus projetés (1,9 million de dollars) pour soutenir des recherches externes sur l'utilisation de Twitter lors des élections, y compris l'utilisation d'automatisations malveillantes et de désinformation. https://t.co/zIxfqqXCZr @TMFJMo @anthonynoto Merci @gasca @stratechery @Lefsetz lettre Observations quotidiennes de @gasca @stratechery Bridgewater Ouais!!!! ❤️❤️❤️❤️ #davecchappelle https://t.co/ybSGNrQpYF @ndimichino Parfois Installation à @CampFlogGnaw https://t.co/nVq8QjkKsf
rule = gen_rule_payload ( "from:jack" ,
from_date = "2017-09-20" ,
to_date = "2017-10-30" ,
count_bucket = "day" ,
results_per_call = 500 )
print ( rule )
{"query": "from:jack", "toDate": "201710300000", "fromDate": "201709200000", "bucket": "jour"}
counts = collect_results ( rule , max_results = 500 , result_stream_args = enterprise_search_args )
[ print ( c ) for c in counts ];
{'timePeriod' : '201710290000', 'count' : 0} {'timePeriod' : '201710280000', 'count' : 0} {'timePeriod' : '201710270000', 'count' : 3} {'timePeriod' : '201710260000', 'count' : 6} {'timePeriod' : '201710250000', 'count' : 4} {'timePeriod' : '201710240000', 'count' : 4} {'timePeriod' : '201710230000', 'count' : 0} {'timePeriod' : '201710220000', 'count' : 0} {'timePeriod' : '201710210000', 'count' : 3} {'timePeriod' : '201710200000', 'count' : 2} {'timePeriod' : '201710190000', 'count' : 1} {'timePeriod' : '201710180000', 'count' : 6} {'timePeriod' : '201710170000', 'count' : 2} {'timePeriod' : '201710160000', 'count' : 2} {'timePeriod' : '201710150000', 'count' : 1} {'timePeriod' : '201710140000', 'count' : 64} {'timePeriod' : '201710130000', 'count' : 3} {'timePeriod' : '201710120000', 'count' : 4} {'timePeriod' : '201710110000', 'count' : 8} {'timePeriod' : '201710100000', 'count' : 4} {'timePeriod' : '201710090000', 'count' : 1} {'timePeriod' : '201710080000', 'count' : 0} {'timePeriod' : '201710070000', 'count' : 0} {'timePeriod' : '201710060000', 'count' : 1} {'timePeriod' : '201710050000', 'count' : 3} {'timePeriod' : '201710040000', 'count' : 5} {'timePeriod' : '201710030000', 'count' : 8} {'timePeriod' : '201710020000', 'count' : 5} {'timePeriod' : '201710010000', 'count' : 0} {'timePeriod' : '201709300000', 'count' : 0} {'timePeriod' : '201709290000', 'count' : 0} {'timePeriod' : '201709280000', 'count' : 9} {'timePeriod' : '201709270000', 'count' : 41} {'timePeriod' : '201709260000', 'count' : 13} {'timePeriod' : '201709250000', 'count' : 6} {'timePeriod' : '201709240000', 'count' : 7} {'timePeriod' : '201709230000', 'count' : 3} {'timePeriod' : '201709220000', 'count' : 0} {'timePeriod' : '201709210000', 'count' : 1} {'timePeriod' : '201709200000', 'count' : 7}
Toute contribution doit suivre le modèle suivant :
git checkout -b my_new_feature
searchtweets/_version.py
pour refléter vos modifications. Nous utilisons le gestion des versions sémantiques, donc les améliorations ininterrompues devraient incrémenter la version mineure, par exemple 1.5.0 -> 1.6.0
, et les corrections de bogues incrémenteront la dernière version, 1.6.0 -> 1.6.1
.Une fois le processus de demande d'extraction accepté, les responsables du package géreront la documentation de construction et la distribution à Pypi.
Pour référence, la distribution vers Pypi s'effectue à l'aide des commandes suivantes, exécutées à partir du répertoire racine du dépôt :
python setup.py bdist_wheel
python setup.py sdist
twine upload dist/ *
Comment construire la documentation :
La création de la documentation nécessite quelques packages Sphinx pour créer les pages Web :
pip install sphinx
pip install sphinx_bootstrap_theme
pip install sphinxcontrib-napoleon
Ensuite (une fois vos modifications validées dans master), vous devriez pouvoir exécuter le script bash générateur de documentation et suivre les instructions :
bash build_sphinx_docs.sh master searchtweets
Notez que ce README est également généré, et donc après toute modification du README, vous devrez reconstruire le README (vous avez besoin de pandoc version 2.1+ pour cela) et valider le résultat :
bash make_readme.sh