Ereignisse
Umschlag
Jedes Ereignis hat denselben Umschlag; d trägt die unten beschriebene typspezifische Nutzlast.
| Feld | Typ | Bedeutung |
|---|---|---|
v | int | Umschlagversion. Heute 1 |
t | string | Ereignistyp, aus der Tabelle unten |
op | create | update | delete | create, update (Anreicherung derselben ID) oder delete |
id | string | Stabile Identität. Hierauf deduplizieren |
ts | int (ms) | Wann es auf X geschah, ms seit der Epoche. X nennt keinen Zeitpunkt für Profiländerungen, Folgen und Entfolgen, neue verifizierte Follower und gelöschte Beiträge: Bei diesen Ereignissen ist es der Zeitpunkt unserer Erkennung |
sid | string | Stream-Position für das Replay; vorhanden auf dem Stream und in der Historie |
target.id | string | Numerische X-ID des überwachten Kontos (bei search.match: des Beitragsautors) |
target.screen_name | string | Handle des überwachten Kontos |
target.name | string | Der Anzeigename des Kontos |
d | object | Typspezifische Nutzlast |
Ereignistypen
| Typ | Kategorie | Bedeutung |
|---|---|---|
tweet.create | Beiträge | Das Konto hat etwas Neues gepostet |
tweet.reply | Beiträge | Es hat jemandem geantwortet; reply_to trägt den beantworteten Beitrag mit Text und Medien |
tweet.retweet | Beiträge | Es hat jemanden repostet; retweet_of trägt den Originalbeitrag vollständig |
tweet.quote | Beiträge | Es hat jemanden zitiert; quoted trägt den zitierten Beitrag vollständig |
tweet.edit | Beiträge | Es hat einen Beitrag bearbeitet; das Ereignis trägt die neue Fassung, edit_of die Fassung, die sie ersetzt |
tweet.delete | Beiträge | Ein Beitrag, den das Konto veröffentlicht hatte, ist verschwunden |
profile.name | Profil | Anzeigename geändert |
profile.screen_name | Profil | Handle geändert |
profile.bio | Profil | Bio geändert |
profile.location | Profil | Standort geändert |
profile.url | Profil | Profil-Link geändert |
profile.avatar | Profil | Avatar geändert; old und new sind Bild-URLs |
profile.banner | Profil | Banner geändert; old und new sind Bild-URLs |
profile.pinned | Profil | Angepinnter Beitrag geändert; tweet und old_tweet tragen die Beiträge selbst |
profile.verified | Profil | Verifizierungsabzeichen erschienen oder verschwunden |
follow.add | Folgt-Graph | Das Konto folgt jetzt jemandem; user ist das vollständige Profil dieses Kontos |
follow.remove | Folgt-Graph | Das Konto folgt jemandem nicht mehr |
followers.verified.add | Folgt-Graph | Ein verifiziertes Konto folgt ihm jetzt; user trägt Bio, Zähler, Standort, Beitrittsdatum |
account.status | Konto | Das Konto wurde geschützt, gesperrt oder nicht mehr sichtbar, oder ist wieder aktiv |
search.match | Suche | Jemand hat etwas gepostet, das zu einem Ihrer Stichwörter passt; keyword sagt, zu welchem, author ist das vollständige Profil |
X liefert keinen Zeitstempel für „folgt jetzt“ oder „hat einen Follower gewonnen“; bei diesen Ereignissen ist ts daher der Moment, in dem wir die Änderung bemerkt haben.
Nutzlasten
Fünf Nutzlastformen decken alle achtzehn Typen ab.
Tweet-Nutzlast
Das d von tweet.create, tweet.reply, tweet.retweet und tweet.quote sowie die Basis von search.match.
| Feld | Typ | Bedeutung |
|---|---|---|
tweet_id | string | Die ID des Beitrags, als Zeichenkette |
kind | tweet | reply | retweet | quote | Welche Art von Beitrag es ist |
text | string | Volltext (auch bei langen Beiträgen) |
lang | string | null | Von X erkannte Sprache |
author | User | Das Konto, das es veröffentlicht hat, als vollständiger User – dasselbe Objekt wie der Autor eines search.match: Handle, Name, Bio, Avatar, Banner, Zähler, Verifizierung, Ort, Link und Beitrittsdatum. Auf einem schlanken ersten Frame das Konto wie zuletzt gelesen; das update trägt es so, wie es mit dem Beitrag gelesen wurde |
reply_to | Brief+ | null | Bei Antworten: der beantwortete Beitrag – ein Brief plus screen_name, tweet_id und user_id seines Autors |
retweet_of | Brief | null | Bei Reposts: der Originalbeitrag |
quoted | Brief | null | Bei Zitaten: der zitierte Beitrag |
media | string[] | Einfache Bild-URLs, eine je Medienelement |
media_items | Media[] | Jedes Medienelement mit Typ, Videovarianten und Abmessungen |
urls | string[] | Aufgelöste Links im Beitrag |
article | Article | null | Bei Beiträgen, die auf einen X-Artikel verlinken: der Artikel |
counts | {reply, rt, like, quote, bookmark} | Antwort-, Repost-, Like-, Zitat- und Lesezeichen-Zähler zum Zeitpunkt unseres Lesens |
views | int | null | Aufrufzähler, wenn X ihn preisgibt |
url | string | Kanonischer Link zum Beitrag |
full | bool | false bei einem ersten, schlanken create-Frame; true, sobald das Ereignis den ganzen Beitrag trägt |
kind_final | bool | true, wenn kind feststeht. false nur auf einem schlanken ersten Frame, dessen kind tweet ist: Der Beitrag kann sich noch als Zitat herausstellen, das folgende update mit derselben id klärt es |
kind_was | tweet | null (update only) | Nur im update, das die Art eines Beitrags festlegt, und nur, wenn der erste Frame etwas anderes sagte: die Art, die dieser Frame hatte (tweet bei einem Beitrag, der sich als Zitat herausstellte) |
edit_of | Brief | null | Bei tweet.edit: die Fassung, die diese ersetzt (ihre ID, sowie Text und Autor, wenn wir sie hatten) |
{
"v": 1,
"t": "tweet.create",
"op": "create",
"id": "tweet:2097879002992070835",
"ts": 1789012345678,
"sid": "1789012346012-0",
"target": {
"id": "1652541",
"screen_name": "Reuters",
"name": "Reuters"
},
"d": {
"tweet_id": "2097879002992070835",
"kind": "tweet",
"text": "Ash-covered shoes and a president in crisis…",
"lang": "en",
"author": {
"id": "1652541",
"screen_name": "Reuters",
"name": "Reuters",
"bio": "Top and breaking news, pictures and videos from Reuters.",
"avatar": "https://pbs.twimg.com/profile_images/1874154135869616128/nJDmubGJ_normal.jpg",
"banner": "https://pbs.twimg.com/profile_banners/1652541/1573687397",
"followers": 25900000,
"following": 1150,
"tweets": 1080000,
"location": "Around the world",
"url": "https://www.reuters.com",
"verified": true,
"verified_type": "Business",
"protected": false,
"created_at": "2007-03-20T17:46:05Z",
"category": null
},
"reply_to": null,
"retweet_of": null,
"quoted": null,
"media": [
"https://pbs.twimg.com/media/….jpg"
],
"media_items": [
{
"type": "photo",
"url": "https://pbs.twimg.com/media/….jpg",
"expanded_url": "https://x.com/Reuters/status/2097879002992070835/photo/1",
"width": 1200,
"height": 675
}
],
"urls": [
"https://reut.rs/…"
],
"counts": {
"reply": 12,
"rt": 40,
"like": 131,
"quote": 3,
"bookmark": 9
},
"views": 20411,
"url": "https://x.com/Reuters/status/2097879002992070835",
"full": true,
"kind_final": true
}
}Ein erster create-Frame ist bewusst schlank: Er trägt die ID, den Autor (author, das Konto wie zuletzt gelesen) und den Text, der gekürzt sein kann, damit er in dem Moment abgehen kann, in dem der Beitrag gesehen wird; url zeigt bereits auf den Beitrag. In diesem Moment lässt sich ein Zitat nicht immer von einem Originalbeitrag unterscheiden, daher sagt ein solcher Frame tweet.create mit kind_final: false. Das folgende update mit derselben id trägt die vollständige Nutzlast oben und den festgelegten Typ: tweet.quote mit kind_was: "tweet", wenn es ein Zitat war.
{
"v": 1,
"t": "tweet.create",
"op": "create",
"id": "tweet:2097879002992070835",
"ts": 1789012345678,
"sid": "1789012346012-0",
"target": {
"id": "1652541",
"screen_name": "Reuters",
"name": "Reuters"
},
"d": {
"tweet_id": "2097879002992070835",
"kind": "tweet",
"text": "Ash-covered shoes and a president in crisis…",
"author": {
"id": "1652541",
"screen_name": "Reuters",
"name": "Reuters",
"bio": "Top and breaking news, pictures and videos from Reuters.",
"avatar": "https://pbs.twimg.com/profile_images/1874154135869616128/nJDmubGJ_normal.jpg",
"banner": "https://pbs.twimg.com/profile_banners/1652541/1573687397",
"followers": 25900000,
"following": 1150,
"tweets": 1080000,
"location": "Around the world",
"url": "https://www.reuters.com",
"verified": true,
"verified_type": "Business",
"protected": false,
"created_at": "2007-03-20T17:46:05Z",
"category": null
},
"url": "https://x.com/Reuters/status/2097879002992070835",
"full": false,
"kind_final": false
}
}Lösch-Nutzlast
Das d von tweet.delete. Wird nur für einen Beitrag gesendet, den wir gesehen hatten und der jetzt weg ist. Sein ts ist der Zeitpunkt, zu dem die Löschung erkannt wurde; die Zeit des Beitrags selbst steht in seinem früheren create-Frame.
| Feld | Typ | Bedeutung |
|---|---|---|
tweet_id | string | Die ID des gelöschten Beitrags |
url | string | Wo er früher war |
{
"v": 1,
"t": "tweet.delete",
"op": "delete",
"id": "tweet:2097879002992070835:delete",
"ts": 1789012345678,
"sid": "…",
"target": {
"id": "1652541",
"screen_name": "Reuters",
"name": "Reuters"
},
"d": {
"tweet_id": "2097879002992070835",
"url": "https://x.com/Reuters/status/2097879002992070835"
}
}Profiländerungs-Nutzlast
Das d jedes profile.*-Ereignisses. op ist hier update.
| Feld | Typ | Bedeutung |
|---|---|---|
field | string | Welches Profilfeld sich geändert hat; dasselbe Wort wie nach profile. im Typ |
old | any | Der vorherige Wert |
new | any | Der neue Wert |
tweet | Brief (pinned only) | Bei profile.pinned: der neu angepinnte Beitrag |
old_tweet | Brief (pinned only) | Bei profile.pinned: der zuvor angepinnte Beitrag, falls wir ihn hatten |
{
"v": 1,
"t": "profile.bio",
"op": "update",
"id": "profile:1652541:bio:9c1d2e3f4a5b",
"ts": 1789012400000,
"sid": "…",
"target": {
"id": "1652541",
"screen_name": "Reuters",
"name": "Reuters"
},
"d": {
"field": "bio",
"old": "Top news and analysis from around the world.",
"new": "Top news, analysis and video from around the world."
}
}Folgt-Nutzlast
Das d von follow.add, follow.remove und followers.verified.add.
| Feld | Typ | Bedeutung |
|---|---|---|
user | User | Das andere Konto, als vollständiger User |
{
"v": 1,
"t": "follow.add",
"op": "create",
"id": "follow:44196397:12:add:496948",
"ts": 1789012400000,
"sid": "…",
"target": {
"id": "44196397",
"screen_name": "elonmusk",
"name": "Elon Musk"
},
"d": {
"user": {
"id": "12",
"screen_name": "jack",
"name": "jack",
"bio": "…",
"avatar": "https://pbs.twimg.com/profile_images/…",
"banner": null,
"followers": 6400000,
"following": 4200,
"tweets": 29000,
"location": "",
"url": null,
"verified": true,
"verified_type": "blue",
"protected": false,
"created_at": "2006-03-21T20:50:14Z",
"category": null
}
}
}Kontostatus-Nutzlast
Das d von account.status. Ein Status ist active, protected (Beiträge nur für bestätigte Follower sichtbar), suspended (von X gesperrt) oder unavailable (deaktiviert, gelöscht oder aus anderem Grund nicht sichtbar). ts ist der Zeitpunkt, zu dem wir die Änderung erkannt haben.
| Feld | Typ | Bedeutung |
|---|---|---|
old | active | protected | suspended | unavailable | Der Status vorher |
new | active | protected | suspended | unavailable | Der Status jetzt |
reason | string | null | Der Wortlaut von X, falls vorhanden (zum Beispiel Suspended) |
{
"v": 1,
"t": "account.status",
"op": "update",
"id": "account:9000002:status:active>suspended:497010",
"ts": 1789236000000,
"sid": "…",
"target": {
"id": "9000002",
"screen_name": "some_account",
"name": "Some Account"
},
"d": {
"old": "active",
"new": "suspended",
"reason": "Suspended"
}
}Suchtreffer-Nutzlast
Das d von search.match: eine Tweet-Nutzlast plus drei Felder zum Treffer. Das target des Umschlags ist der Autor des Beitrags, der keines Ihrer Ziele sein muss.
| Feld | Typ | Bedeutung |
|---|---|---|
keyword.id | int | ID des passenden Stichworts |
keyword.query | string | Seine Suchanfrage |
keyword.label | string | null | Sein Label, falls Sie eines gesetzt haben |
author | User | Das vollständige Profil des Autors |
author_is_target | bool | true, wenn der Autor zugleich ein auf diesem System überwachtes Konto ist |
… | TweetPayload | Jedes Feld der Tweet-Nutzlast |
{
"v": 1,
"t": "search.match",
"op": "create",
"id": "search:12:2097900000000000000",
"ts": 1789012500000,
"sid": "…",
"target": {
"id": "9000001",
"screen_name": "some_trader",
"name": "Some Trader"
},
"d": {
"tweet_id": "2097900000000000000",
"kind": "tweet",
"text": "$SOL breaking out…",
"lang": "en",
"author": {
"id": "9000001",
"screen_name": "some_trader",
"name": "Some Trader",
"bio": "…",
"followers": 1200,
"verified": false,
"…": "…"
},
"keyword": {
"id": 12,
"query": "($SOL OR \"Solana\") -filter:retweets",
"label": "solana"
},
"author_is_target": false,
"media": [],
"media_items": [],
"urls": [],
"url": "https://x.com/some_trader/status/2097900000000000000",
"full": true
}
}