Suchendpunkte von Twitter v2 enthalten jetzt einen „Zählungs“-Endpunkt, der Zeitreihen-Gesamtsummen übereinstimmender Tweets zurückgibt.
Dieses Projekt dient als Wrapper für die Twitter-Premium- und Enterprise-Such-APIs und stellt ein Befehlszeilendienstprogramm und eine Python-Bibliothek bereit. Hübsche Dokumente gibt es hier zu sehen.
jq
) weitergeleitet werden. Die searchtweets
-Bibliothek ist auf Pypi:
pip install searchtweets
Oder Sie können die Entwicklungsversion lokal über installieren
git clone https://github.com/twitterdev/search-tweets-python
cd search-tweets-python
pip install -e .
Die Premium- und Enterprise-Such-APIs verwenden unterschiedliche Authentifizierungsmethoden und wir versuchen, eine nahtlose Möglichkeit zur Authentifizierung für alle Kunden bereitzustellen. Wir wissen, dass Anmeldeinformationen schwierig oder lästig sein können – bitte lesen Sie dies vollständig durch.
Premium-Clients benötigen die Felder bearer_token
und endpoint
; Unternehmensclients erfordern username
, password
und endpoint
. Wenn Sie den account_type
nicht angeben, versuchen wir, den Kontotyp zu ermitteln und geben eine Warnung zu diesem Verhalten aus.
Für Premium-Suchprodukte verwenden wir eine reine App-Authentifizierung und die Inhabertokens werden nicht mit einer Ablaufzeit geliefert. Sie können Folgendes bereitstellen: - Ihren Anwendungsschlüssel und Ihr Geheimnis (die Bibliothek übernimmt die Bearer-Token-Authentifizierung) - ein Bearer-Token, das Sie selbst erhalten
Für viele Entwickler ist es möglicherweise einfacher, Ihren Anwendungsschlüssel und Ihr Geheimnis bereitzustellen und diese Bibliothek die Generierung Ihres Inhabertokens für Sie verwalten zu lassen. Eine Übersicht über die Premium-Authentifizierungsmethode finden Sie hier.
Wir unterstützen sowohl YAML-Datei-basierte Methoden als auch Umgebungsvariablen zum Speichern von Anmeldeinformationen und sorgen für eine flexible Handhabung mit sinnvollen Standardeinstellungen.
Für Premium-Kunden sollte die einfachste Anmeldeinformationsdatei so aussehen:
search_tweets_api :
account_type : premium
endpoint : <FULL_URL_OF_ENDPOINT>
consumer_key : <CONSUMER_KEY>
consumer_secret : <CONSUMER_SECRET>
Für Unternehmenskunden sollte die einfachste Anmeldeinformationsdatei so aussehen:
search_tweets_api :
account_type : enterprise
endpoint : <FULL_URL_OF_ENDPOINT>
username : <USERNAME>
password : <PW>
Standardmäßig erwartet diese Bibliothek diese Datei unter "~/.twitter_keys.yaml"
, aber Sie können den relevanten Speicherort nach Bedarf übergeben, entweder mit dem Flag --credential-file
für die Befehlszeilen-App oder wie unten in einem Python gezeigt Programm.
Für beide obigen Beispiele sind keine speziellen Befehlszeilenargumente oder programminternen Argumente erforderlich. Sofern nicht anders angegeben, suchen die Methoden zum Parsen von Anmeldeinformationen nach einem YAML-Schlüssel namens search_tweets_api
.
Für Entwickler, die über mehrere Endpunkte und/oder Suchprodukte verfügen, können Sie alle Anmeldeinformationen in derselben Datei speichern und bestimmte zu verwendende Schlüssel angeben. --credential-file-key
gibt dieses Verhalten in der Befehlszeilen-App an. Ein Beispiel:
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>
Wenn Sie Anmeldeinformationen über Umgebungsvariablen übergeben möchten oder müssen, können Sie die folgenden Variablen für Ihr Produkt festlegen:
export SEARCHTWEETS_ENDPOINT= export SEARCHTWEETS_USERNAME= export SEARCHTWEETS_PASSWORD= export SEARCHTWEETS_BEARER_TOKEN= export SEARCHTWEETS_ACCOUNT_TYPE= exportieren Sie SEARCHTWEETS_CONSUMER_KEY= export SEARCHTWEETS_CONSUMER_SECRET=
Die Funktion load_credentials
versucht, diese Variablen zu finden, wenn sie keine Felder aus der YAML-Datei laden kann, und überschreibt alle Anmeldeinformationen aus der YAML-Datei, die als Umgebungsvariablen vorhanden sind, wenn sie analysiert wurden. Dieses Verhalten kann geändert werden, indem der load_credentials
-Parameter env_overwrite
auf False
gesetzt wird.
Die folgenden Zellen veranschaulichen die Handhabung von Anmeldeinformationen in der Python-Bibliothek.
from searchtweets import load_credentials
load_credentials ( filename = "./search_tweets_creds_example.yaml" ,
yaml_key = "search_tweets_ent_example" ,
env_overwrite = False )
{'Benutzername': '<MEIN_BENUTZERNAME>', 'password': '<MY_PASSWORD>', 'endpoint': '<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>', 'Endpunkt': 'https://api.twitter.com/1.1/tweets/search/30day/dev.json', 'extra_headers_dict': Keine}
Wenn wir unsere Umgebungsvariablen festlegen, sucht das Programm nach ihnen, unabhängig von der Gültigkeit oder Existenz einer YAML-Datei.
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" )
Die Datei Nothing_here.yaml kann nicht gelesen werden Fehler beim Parsen der YAML-Datei; Suche nach gültigen Umgebungsvariablen
{'Benutzername': '<ENV_USERNAME>', 'Passwort': '<ENV_PW>', 'endpoint': '<https://endpoint>'}
die Fahnen:
--credential-file <FILENAME>
--credential-file-key <KEY>
--env-overwrite
werden verwendet, um das Anmeldeinformationsverhalten über die Befehlszeilen-App zu steuern.
Die Bibliothek umfasst eine Anwendung, search_tweets.py
, die einen schnellen Zugriff auf Tweets ermöglicht. Wenn Sie dieses Paket mit pip
installieren, wird search_tweets.py
global installiert. Die Datei befindet sich im Verzeichnis tools/
für diejenigen, die sie lokal ausführen möchten.
Beachten Sie, dass das Flag --results-per-call
ein Argument für die API angibt ( maxResults
, pro CALL zurückgegebene Ergebnisse) und nicht als festes Maximum für die Anzahl der von diesem Programm zurückgegebenen Ergebnisse. Das Argument --max-results
definiert die maximale Anzahl von Ergebnissen, die von einem bestimmten Aufruf zurückgegeben werden sollen. Bei allen Beispielen wird davon ausgegangen, dass Ihre Anmeldeinformationen am Standardspeicherort – .twitter_keys.yaml
– oder in Umgebungsvariablen korrekt eingerichtet sind.
Streamen Sie JSON-Ergebnisse ohne Speichern nach stdout
search_tweets.py
--max-results 1000
--results-per-call 100
--filter-rule " beyonce has:hashtags "
--print-stream
Streamen Sie JSON-Ergebnisse nach stdout und speichern Sie sie in einer Datei
search_tweets.py
--max-results 1000
--results-per-call 100
--filter-rule " beyonce has:hashtags "
--filename-prefix beyonce_geo
--print-stream
Ohne Ausgabe in Datei speichern
search_tweets.py
--max-results 100
--results-per-call 100
--filter-rule " beyonce has:hashtags "
--filename-prefix beyonce_geo
--no-print-stream
Ein oder mehrere benutzerdefinierte Header können über die Befehlszeile angegeben werden, indem das Argument --extra-headers
und eine JSON-formatierte Zeichenfolge verwendet werden, die ein Wörterbuch mit zusätzlichen Headern darstellt:
search_tweets.py
--filter-rule " beyonce has:hashtags "
--extra-headers ' {"<MY_HEADER_KEY>":"<MY_HEADER_VALUE>"} '
Optionen können über eine Konfigurationsdatei (entweder ini oder YAML) übergeben werden. Beispieldateien finden Sie in den Dateien tools/api_config_example.config
oder ./tools/api_yaml_example.yaml
, die möglicherweise so aussehen:
[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
Oder das hier:
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
Benutzerdefinierte Header können in einer Konfigurationsdatei unter einem bestimmten Anmeldeinformationsschlüssel angegeben werden:
search_tweets_api :
account_type : premium
endpoint : <FULL_URL_OF_ENDPOINT>
username : <USERNAME>
password : <PW>
extra_headers :
<MY_HEADER_KEY> : <MY_HEADER_VALUE>
Wenn Sie eine Konfigurationsdatei in Verbindung mit dem Befehlszeilendienstprogramm verwenden, müssen Sie Ihre Konfigurationsdatei über den Parameter --config-file
angeben. Zusätzliche Befehlszeilenargumente werden entweder zu den Argumenten der Konfigurationsdatei hinzugefügt oder überschreiben die Argumente der Konfigurationsdatei, wenn beide angegeben und vorhanden sind.
Beispiel:
search_tweets.py --config-file myapiconfig.config --no-print-stream
Die vollständigen Optionen sind unten aufgeführt:
$ search_tweets.py -h Verwendung: 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,enterprise}] [--count-bucket COUNT_BUCKET] [--start-datetime FROM_DATE] [--end-datetime TO_DATE] [--filter-rule PT_RULE] [--results-per-call 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] optionale Argumente: -h, --help zeigt diese Hilfemeldung an und beendet den Vorgang --credential-file CREDENTIAL_FILE Speicherort der Yaml-Datei, in der Ihre Datei gespeichert ist Anmeldeinformationen. --credential-file-key CREDENTIAL_YAML_KEY Der Schlüssel in der Anmeldeinformationsdatei, die für diese Sitzung verwendet wird Anmeldeinformationen. Standardmäßig ist search_tweets_api --env-overwrite ENV_OVERWRITE Überschreiben Sie von YAML geparste Anmeldeinformationen mit einem beliebigen Satz Umgebungsvariablen. Siehe API-Dokumente oder Readme für Details. --config-file CONFIG_FILENAME Konfigurationsdatei mit allen Parametern. Viel einfacher Verwenden Sie als die Version der Befehlszeilenargumente. Wenn eine gültige Wenn die Datei gefunden wird, werden von dort aus alle Argumente ausgefüllt. Die verbleibenden Befehlszeilenargumente haben Vorrang vor den gefundenen Argumenten in der Konfigurationsdatei. --account-type {premium,enterprise} Der Kontotyp, den Sie verwenden --count-bucket COUNT_BUCKET Legen Sie dies fest, um eine „Zählungs“-Anfrage zu stellen. Bucket-Größe für Counts-Endpunkt. Optionen:, Tag, Stunde, Minute. --start-datetime FROM_DATE Beginn des Datum-Uhrzeit-Fensters, Format „JJJJ-mm-TTTHH:MM“ (Standard: -30 Tage) --end-datetime TO_DATE Ende des Datum-Uhrzeit-Fensters, Format „JJJJ-mm-TTTHH:MM“ (Standard: aktuellstes Datum) --filter-rule PT_RULE PowerTrack-Filterregel (siehe: http://support.gnip.com/c (ustomer/portal/articles/901152-powertrack-operators) --results-per-call RESULTS_PER_CALL Anzahl der pro Aufruf zurückzugebenden Ergebnisse (Standard 100; max 500) – entspricht „maxResults“ in der API. Wenn Sie eine „counts“-Anfrage mit „--count-bucket“ stellen, wird dieser Parameter ignoriert. --max-results MAX_RESULTS Maximale Anzahl an Tweets oder Counts, die hierfür zurückgegeben werden sollen Sitzung (Standard: 500) --max-pages MAX_PAGES Maximale Anzahl der hierfür zu verwendenden Seiten/API-Aufrufe Sitzung. --results-per-file RESULTS_PER_FILE Maximal zu speichernde Tweets pro Datei. --filename-prefix FILENAME_PREFIX Präfix für den Dateinamen, in dem sich die Tweet-JSON-Daten befinden gelagert. --no-print-stream Druck-Streaming deaktivieren --print-stream Tweet-Stream auf stdout drucken --extra-headers EXTRA_HEADERS JSON-formatierte Zeichenfolge, die ein zusätzliches Diktat darstellt Anforderungsheader --debug gibt alle Informationen und Warnmeldungen aus
Die Arbeit mit der API innerhalb eines Python-Programms ist sowohl für Premium- als auch für Enterprise-Kunden unkompliziert.
Wir gehen davon aus, dass sich die Anmeldeinformationen am Standardspeicherort ~/.twitter_keys.yaml
befinden.
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 )
Es gibt eine Funktion namens gen_rule_payload
, die Such-API-Regeln in gültige JSON-Abfragen formatiert. Es verfügt über sinnvolle Standardeinstellungen, z. B. das Abrufen von mehr Tweets pro Anruf als standardmäßig 100 (beachten Sie jedoch, dass eine Sandbox-Umgebung hier nur maximal 100 haben kann. Wenn Sie also Fehler erhalten, überprüfen Sie dies bitte), ohne Datumsangaben. Die Erörterung der Feinheiten der Generierung von Suchregeln würde in diesen Beispielen den Rahmen sprengen; Ich ermutige Sie, sich die Dokumente anzusehen, um die darin enthaltenen Nuancen kennenzulernen, aber zunächst wollen wir sehen, wie eine Regel aussieht.
rule = gen_rule_payload ( "beyonce" , results_per_call = 100 ) # testing with a sandbox account
print ( rule )
{"query": "beyonce", "maxResults": 100}
Mit dieser Regel werden Tweets abgeglichen, die den Text beyonce
enthalten.
Von diesem Punkt an gibt es zwei Möglichkeiten, mit der API zu interagieren. Es gibt eine schnelle Methode, um kleinere Mengen an Tweets im Speicher zu sammeln, die weniger Nachdenken und Wissen sowie eine Interaktion mit dem ResultStream
Objekt erfordert, die später vorgestellt wird.
Wir verwenden die Variable search_args
, um den Konfigurationspunkt für die API bereitzustellen. Das Objekt verwendet außerdem eine gültige PowerTrack-Regel und verfügt über Optionen zum Unterbrechen der Suche, wenn Grenzwerte sowohl für die Anzahl der Tweets als auch für API-Aufrufe erreicht werden.
Wir verwenden die Funktion collect_results
, die über drei Parameter verfügt.
Für die übrigen Beispiele ändern Sie bitte die Argumente je nach Ihrer Nutzung entweder in „Premium“ oder „Enterprise“.
Mal sehen, wie es weitergeht:
from searchtweets import collect_results
tweets = collect_results ( rule ,
max_results = 100 ,
result_stream_args = enterprise_search_args ) # change this if you need to
Standardmäßig werden Tweet-Nutzdaten träge in ein Tweet
Objekt geparst. Eine überwältigende Anzahl von Tweet-Attributen wird direkt verfügbar gemacht, z. B.:
[ print ( tweet . all_text , end = ' n n ' ) for tweet in tweets [ 0 : 10 ]];
Jay-Z & Beyoncé saß uns heute Abend beim Abendessen gegenüber und irgendwann hatte ich Augenkontakt mit Beyoncé. Meine Glieder verwandelten sich in Wackelpudding und ich kann keinen zusammenhängenden Satz mehr bilden. Ich habe die Augen des Herrn gesehen. Beyoncé und es ist nicht nah dran. https://t.co/UdOU9oUtuW Wie Sie sich vorstellen können... Zeichen von Beyoncé werden immer mein Ding sein. Wenn Beyoncé einen Hund adoptiert? https://t.co/U571HyLG4F Moment, das kann man Beyoncé nicht einfach antun https://t.co/3p14DocGqA Warum benutzt ihr weiterhin Rihanna- und Beyoncé-Gifs, um für die Show zu werben, wenn ihr Bey dreimal die gleiche Auszeichnung verlieren lässt, die sie verdient hat, und Rihanna mit nichts als den Klamotten auf dem Rücken gehen lässt? https://t.co/w38QpH0wma 30) Jemand sagt dir, dass du wie Beyoncé aussiehst https://t.co/Vo4Z7bfSCi Mein Favorit von Beyoncé https://t.co/f9Jp600l2B Beyoncé brauchte das. Que diosa @TiniStoessel https://t.co/gadVJbehQZ Joanne Pearce spielt jetzt IF I WAS A BOY - BEYONCE.mp3 von ! Ich versuche, Beyoncés Finsta zu sehen, bevor ich sterbe
[ print ( tweet . created_at_datetime ) for tweet in tweets [ 0 : 10 ]];
17.01.2018 00:08:50 17.01.2018 00:08:49 17.01.2018 00:08:44 17.01.2018 00:08:42 17.01.2018 00:08:42 17.01.2018 00:08:42 17.01.2018 00:08:40 17.01.2018 00:08:38 17.01.2018 00:08:37 17.01.2018 00:08:37
[ print ( tweet . generator . get ( "name" )) for tweet in tweets [ 0 : 10 ]];
Twitter für iPhone Twitter für iPhone Twitter für iPhone Twitter für iPhone Twitter für iPhone Twitter für iPhone Twitter für Android Twitter für iPhone Airtime Pro Twitter für iPhone
Voila, wir haben ein paar Tweets. Für interaktive Umgebungen und andere Fälle, in denen es Ihnen egal ist, Ihre Daten in einem einzigen Ladevorgang zu sammeln oder Sie nicht direkt auf den Stream von Tweets oder Zählungen eingehen müssen, empfehle ich die Verwendung dieser praktischen Funktion.
Das ResultStream-Objekt wird von search_args
unterstützt und übernimmt die Regeln und andere Konfigurationsparameter, einschließlich eines harten Stopps für die Anzahl der Seiten, um die Nutzung Ihres API-Aufrufs zu begrenzen.
rs = ResultStream ( rule_payload = rule ,
max_results = 500 ,
max_pages = 1 ,
** premium_search_args )
print ( rs )
ResultStream: { "Benutzername":null, „endpoint“: „https://api.twitter.com/1.1/tweets/search/30day/dev.json“, „rule_payload“:{ „query“: „beyonce“, „maxResults“:100 }, „tweetify“:true, „max_results“:500 }
Es gibt eine Funktion, .stream
, die Anfragen und Paginierung für eine bestimmte Abfrage nahtlos verarbeitet. Es gibt einen Generator zurück, und um unsere 500 Tweets zu holen, in denen beyonce
erwähnt wird, können wir Folgendes tun:
tweets = list ( rs . stream ())
Tweets werden mit unserem Tweet-Parser träge analysiert, sodass Tweet-Daten sehr einfach extrahiert werden können.
# 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é saß uns heute Abend beim Abendessen gegenüber und irgendwann hatte ich Augenkontakt mit Beyoncé. Meine Glieder verwandelten sich in Wackelpudding und ich kann keinen zusammenhängenden Satz mehr bilden. Ich habe die Augen des Herrn gesehen. Beyoncé und es ist nicht nah dran. https://t.co/UdOU9oUtuW Wie Sie sich vorstellen können... Zeichen von Beyoncé werden immer mein Ding sein. Wenn Beyoncé einen Hund adoptiert? https://t.co/U571HyLG4F Warte, das kannst du Beyoncé nicht einfach antun https://t.co/3p14DocGqA Warum benutzt ihr weiterhin Rihanna- und Beyoncé-Gifs, um für die Show zu werben, wenn ihr Bey dreimal die gleiche Auszeichnung verlieren lässt, die sie verdient hat, und Rihanna mit nichts als den Klamotten auf dem Rücken gehen lässt? https://t.co/w38QpH0wma 30) Jemand sagt dir, dass du wie Beyoncé aussiehst https://t.co/Vo4Z7bfSCi Mein Favorit von Beyoncé https://t.co/f9Jp600l2B Beyoncé brauchte das. Que diosa @TiniStoessel https://t.co/gadVJbehQZ Joanne Pearce spielt jetzt IF I WAS A BOY - BEYONCE.mp3 von !
Wir können auch den Search API Counts-Endpunkt verwenden, um die Anzahl der Tweets abzurufen, die unserer Regel entsprechen. Bei jeder Anfrage werden Ergebnisse von bis zu 30 Tagen zurückgegeben, und jede Zählungsanfrage kann auf Minuten-, Stunden- oder Tagesbasis erfolgen. Das zugrunde liegende ResultStream
Objekt übernimmt die Konvertierung Ihres Endpunkts in den Zählendpunkt, und Sie müssen das Argument count_bucket
angeben, wenn Sie eine Regel erstellen, um es zu verwenden.
Der Vorgang ist dem Erfassen von Tweets sehr ähnlich, weist jedoch einige geringfügige Unterschiede auf.
Vorsichtsmaßnahme: Premium-Sandbox-Umgebungen haben KEINEN Zugriff auf den Zählendpunkt der Such-API.
count_rule = gen_rule_payload ( "beyonce" , count_bucket = "day" )
counts = collect_results ( count_rule , result_stream_args = enterprise_search_args )
Unsere Ergebnisse sind ziemlich einfach und können schnell verwendet werden.
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'}]
Beachten Sie, dass dies nur mit der vollständigen Archivsuchoption funktioniert , die für mein Konto nur über die Unternehmensoptionen verfügbar ist. Eine vollständige Archivsuche erfordert wahrscheinlich einen anderen Endpunkt oder eine andere Zugriffsmethode. Weitere Informationen finden Sie in Ihrer Entwicklerkonsole.
Lassen Sie uns eine neue Regel erstellen und dieses Mal Datumsangaben verabschieden.
gen_rule_payload
nimmt Zeitstempel der folgenden Formen an:
YYYYmmDDHHMM
YYYY-mm-DD
(wird in Mitternacht UTC (00:00) umgewandelt)YYYY-mm-DD HH:MM
YYYY-mm-DDTHH:MM
Hinweis: Alle Tweets werden in UTC-Zeit gespeichert.
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": "von: 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 ]];
Mehr Klarheit über unsere Datenschutzrichtlinie und deren Durchsetzung. Wir arbeiten daran, möglichst viel direkten Kontext in das Produkt einzubauen https://t.co/IrwBexPrBA Um mehr Klarheit über unsere Datenschutzrichtlinie zu schaffen, haben wir konkrete Beispiele dafür hinzugefügt, was einen Verstoß darstellt bzw. nicht darstellt, und einen Einblick in die Maßnahmen gegeben, die wir benötigen, um diese Art von Inhalten aus dem Dienst zu entfernen. https://t.co/NGx5hh2tTQ Einführung einer Richtlinie zu gewalttätigen Gruppen und hasserfüllten Bildern/Symbolen am 22. November https://t.co/NaWuBPxyO5 Wir werden unsere Richtlinien zu gewalttätigen Gruppen sowie hasserfüllten Bildern und Hasssymbolen nun am 22. November veröffentlichen. Während des Entwicklungsprozesses haben wir wertvolles Feedback erhalten, das wir umsetzen, bevor diese veröffentlicht und durchgesetzt werden. Sehen Sie hier mehr über unseren Richtlinienentwicklungsprozess? https://t.co/wx3EeH39BI @WillStick @lizkelley Alles Gute zum Geburtstag, Liz! Offboarding-Werbung von allen Konten von Russia Today (RT) und Sputnik. Wir spenden alle geplanten Einnahmen (1,9 Millionen US-Dollar) zur Unterstützung externer Untersuchungen zur Nutzung von Twitter bei Wahlen, einschließlich der Nutzung böswilliger Automatisierung und Fehlinformationen. https://t.co/zIxfqqXCZr @TMFJMo @anthonynoto Danke @gasca @stratechery @Lefsetz Brief @gasca @stratechery Bridgewaters tägliche Beobachtungen Jawohl!!!! ❤️❤️❤️❤️ #davechappelle https://t.co/ybSGNrQpYF @ndimichino Manchmal Einrichtung bei @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": "von: jack", "toDate": "201710300000", "fromDate": "201709200000", "bucket": "Tag"}
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}
Alle Beiträge sollten dem folgenden Muster folgen:
git checkout -b my_new_feature
searchtweets/_version.py
erhöhen, um Ihre Änderungen widerzuspiegeln. Wir verwenden semantische Versionierung, daher sollten geschützte Verbesserungen die Nebenversion erhöhen, z. B. 1.5.0 -> 1.6.0
, und Bugfixes erhöhen die letzte Version, 1.6.0 -> 1.6.1
.Nachdem der Pull-Request-Prozess akzeptiert wurde, kümmern sich die Paketbetreuer um die Erstellungsdokumentation und die Verteilung an Pypi.
Zur Referenz: Die Verteilung an Pypi erfolgt durch die folgenden Befehle, die vom Stammverzeichnis im Repo ausgeführt werden:
python setup.py bdist_wheel
python setup.py sdist
twine upload dist/ *
So erstellen Sie die Dokumentation:
Für die Erstellung der Dokumentation sind einige Sphinx-Pakete erforderlich, um die Webseiten zu erstellen:
pip install sphinx
pip install sphinx_bootstrap_theme
pip install sphinxcontrib-napoleon
Dann (sobald Ihre Änderungen an den Master übergeben wurden) sollten Sie in der Lage sein, das dokumentationsgenerierende Bash-Skript auszuführen und den Anweisungen zu folgen:
bash build_sphinx_docs.sh master searchtweets
Beachten Sie, dass diese README-Datei ebenfalls generiert wird. Daher müssen Sie nach etwaigen README-Änderungen die README-Datei neu erstellen (dafür benötigen Sie Pandoc-Version 2.1+) und das Ergebnis festschreiben:
bash make_readme.sh