2019-04-17: Russell Westbrook, Shane Keisel, Fake Twitter Accounts, and Web Archives
On March 11, 2019 in the NBA, the Utah Jazz hosted their Northwest Division rivals, the Oklahoma City Thunder. During the game, a Utah fan (Shane Keisel) and a Oklahoma City player (Russell Westbrook) engaged in a verbal exchange, with the player stating the fan was directing racist comments to him and the fan admitting to heckling but denying that his comments were racist. The event was well documented (see, for example, this Bleacher Report article), and the following day the fan received a lifetime ban from all events at the Vivint Smart Home Arena and the player received a $25k fine from the NBA.
Disclaimer: I have no knowledge of what the fan said during the game, nor do I have an opinion regarding the appropriateness of the respective penalties. My interest is that after the game, the fan gave at least one interview with a TV station reporter in which he exposed his identity. That set off a rapidly evolving series of events with both real and fake Twitter accounts, which we unravel with the aid of multiple web archives. The initial analysis was performed by Justin Whitlock as a project in my CS 895 "Web Archiving Forensics" class; prior to Justin proposing it as a project topic, my only knowledge of this event was via the Daily Show.
Shane Keisel, the Jazz fan who was involved in a verbal altercation with Russell Westbrook during the Jazz loss to the Thunder, explains his side of what happened. @KSL5TV @kslsports #nba pic.twitter.com/ScCSRttTCg— Jeremiah Jensen (@JJSportsBeat) March 12, 2019
First, let's establish a timeline of events. The timeline is made a little bit complicated because of although the game was played in the Mountain time zone, most media reports are relative to Eastern time, and the web crawlers report their time in UTC (or GMT). Furthermore, daylight savings time began on Sunday, March 10, and the game was played on Monday, March 11. This means there is a four hour differential between UTC and EDT, and a six hour differential between UTC and MDT. Although most events occur after daylight savings, some events will occur before (where there would be a five hour differential between UTC and EST).
- 2019-03-12T01:00:00Z -- the game is scheduled to begin at March 11, 9pm EDT (March 12, 1am UTC). An NBA game will typically last 2--2.5 hours, and at least one tweet shows Westbrook talking to someone in the bleachers midway through second quarter (there may be other videos in circulation as well).
- 2019-03-12T03:58:00Z -- based on the empty seats and the timestamp on the tweet (11:58pm EDT), the post-game interview with a KSL reporter embedded above reveals the fan's name and face. The uncommon surname of "Keisel" combined with a closeup of his face enables people to find quickly find his Twitter account: "@skeisel391".
- 2019-03-12T04:57:34Z -- Within an hour of the KSL interview being posted, Keisel's Twitter account is "protected". This means we can see his banner and avatar photos and his account metadata, but not his tweets.
- 2019-03-12T12:23:42Z -- Less than 9 hours after the KSL interview, his Twitter account is "deleted". No information is available from his account at this time.
- 2019-03-12T15:29:47Z -- Although his Twitter account is deleted, the first page (i.e., first 20 tweets) is still in Google's cache and someone has pushed Google's cached version of the page into a web archive. The banner of the web archive (archive.is) obscures the banner inserted by Google's cache, but a search of the source code of http://archive.is/K6gP4 reveals:
"It is a snapshot of the page as it appeared on Mar 6, 2019 11:29:08 GMT."
Although Keisel quickly protected and then ultimately deleted his account, until it was deleted his photos and account metadata were available and allowed a number of fake accounts to proliferate. The most successful fake is "@skeiseI391", which is also now deleted but stayed online until at least 2019-03-17T04:18:48Z. "@skeiseI391" replaces the lowercase L ("l") with an uppercase I ("I"). Depending on the font of your browser, the two characters can be all but indistinguishable (here they are side-by-side: lI). I'm not sure who created this account, but we discovered it in this tweet, where the user provides not only screen shots but also a video of scrolling and clicking through the @skeiseI391 account before it was deleted.
Yooo this dude WYLINNN pic.twitter.com/Ec1sRiFRAF— Blank (@Crumbzler) March 12, 2019
Just some extra deleted tweets pic.twitter.com/t579c9huyw— Blank (@Crumbzler) March 12, 2019
The video has significant engagement: originally posted at 2019-03-12T10:55:00Z, it now has greater than 1k RTs, 3k likes, and 381k views. There are many other accounts circulating these screen shots: some of which are provably true, some of which are provably false, and some of which cannot be verified using public web archives. The screen shots have had an impact in the news as well, showing up in among others: The Root, News One, and BET. BET even quoted a provably fake tweet in the headline of their article:
This article's headline references a fake tweet. |
real account, 2019-03-06T11:29:08Z (Google cache) |
real account, 2019-03-12T04:57:34Z |
fake account; note the difference in the account metadata |
Twitter allows users to change their username (or "handle") without losing followers, old tweets, etc. Since the handle is reflected in the URL and web archives only index by URL, we cannot know what the original handle of the fake @skeiseI391 account, but at some point after the game the owner changed from the original handle to "skeiseI391". Since the account is no longer live, we cannot use the Twitter API to extract more information about the account (e.g., followers and following, tweets prior to the game), but given the link to a parked/spam web page and the high level of engagement in a short amount of time, this was likely a burner bot account designed amplify legitimate accounts (cf. "The Follower Factory"), and then was adapted for this purpose.
We can pinpoint when the fake @skeiseI391 account was changed. By examining the HTML source from the IA mementos of the fake and real accounts, we can determine the URLs of the profile images:
Real: https://pbs.twimg.com/profile_images/872289541541044225/X6vI_-xq_400x400.jpg
Fake: https://pbs.twimg.com/profile_images/1105325330347249665/YHcWGvYD_400x400.jpg
Both images are 404 now, but they are archived at those URLs in the Internet Archive:
Archived real image, uploaded 2017-06-07T03:08:07Z |
Archived fake image, uploaded 2019-03-12T04:29:09Z |
For those familiar with curl, I include just a portion of the command line interface that shows the original "Last-Modified" HTTP response header from twitter.com. It is those dates that record when the image changed at Twitter; these are separate from the dates from when the image was archived at the Internet Archive. The relevant response headers are shown below:
Real image:
$ curl -I http://web.archive.org/web/20190312045057/https://pbs.twimg.com/profile_images/872289541541044225/X6vI_-xq_400x400.jpg
HTTP/1.1 200 OK
Server: nginx/1.15.8
Date: Wed, 17 Apr 2019 15:12:02 GMT
Content-Type: image/jpeg
...
X-Archive-Orig-last-modified: Wed, 07 Jun 2017 03:08:07 GMT
...
Memento-Datetime: Tue, 12 Mar 2019 04:50:57 GMT
...
Fake image:
$ curl -I http://web.archive.org/web/20190312061306/https://pbs.twimg.com/profile_images/1105325330347249665/YHcWGvYD_400x400.jpg
HTTP/1.1 200 OK
Server: nginx/1.15.8
Date: Wed, 17 Apr 2019 15:13:21 GMT
Content-Type: image/jpeg
...
X-Archive-Orig-last-modified: Tue, 12 Mar 2019 04:29:09 GMT
...
Memento-Datetime: Tue, 12 Mar 2019 06:13:06 GMT
...
The "Memento-Datetime" response header is when the Internet Archived crawled/created the memento (real = 2019-03-12T04:50:57Z; fake = 2019-03-12T06:13:06Z), and the "X-Archive-Orig-last-modified" response header is the Internet Archive echoing the "Last-Modified" response header it received from twitter.com at crawl time. From this we can establish that the image was uploaded to the fake account at 2019-03-12T04:29:09Z, not quite 30 minutes before we can establish that the real account was set to "protected" (2019-03-12T04:57:34Z).
We've presented a preponderance of evidence of that the account the account @skeiseI391 is fake and that fake account is responsible for the "come at me _____ boy" tweet referenced in multiple news outlets. But what about some of the other screen shots referenced in social media and the news? Are they real? Are they photoshopped? Are they from other, yet-to-be-uncovered fake accounts?
First, any tweet that is a reply to another tweet will be difficult to verify with web archives unless we know the direct URL of the original tweet or the reply itself (e.g., twitter.com/[handle]/status/[many numbers]). Unfortunately, the deep links for individual tweets are rarely crawled and archived for less popular accounts. While the top level page will be crawled and the most recent 20 tweets included, one has to be logged in to Twitter to see the tweets included in the "Tweets & replies" tab, and public web archives are not logged in when they crawl so those contents are typically not available. As such, it is hard to establish via web archives if the screen shot of the reply below is real of fake. The original thread is still on the live web, but of the 45 replies, two of them are marked "This Tweet is unavailable". One of those could be a reply from the real @skeisel391, but we don't have enough information to definitively rule if that is true. The particular tweet shown below ("#poorloser") is of issue because even though it was from nearly a year ago, it would contradict the "we were having fun" attitude from the KSL interview. Other screen shots that appear as replies will be similarly difficult to uncover using web archives.
This could be a real reply, but with web archives it is difficult to establish provenance of reply tweets. |
title="8:11 AM - 6 Oct 2018"
Which would suggest that the screen shot happened after the 19th tweet, but without time zone information we can't reliably sequence the tweets. Depending on the GeoIP of Google's crawler, Twitter would set the "8:11 AM" value relative to that timezone. It's tempting to think it's in California and thus PST, but we can't be certain. Regardless, there's no way to know the default time zone of the presumed client in the screen shot.
We cannot definitely establish the provenance of this tweet. |
This leaves three scenarios to account for the above "#MAGA" tweet and why we don't have a cached copy of it:
- Keisel deleted this tweet on or before March 6, 2019 in anticipation of the game on March 11, 2019. While not impossible, it does not seem probable because it would require someone taking a screen shot of the tweet prior to the KSL interview. Since the real @skeisel391 account was not popular (~200 tweets, < 50 followers), this seems like an unlikely scenario.
- Someone photoshopped or otherwise created a fake tweet. Given the existence of the fake @skeiseI391 account (and other fake accounts), this cannot be ruled out. If it is a fake, it does not appear to have the same origin as the fake @skeiseI391 account.
- The screen shot is legitimate and we are simply unlucky that the tweet in question fell in the coverage gap between the Google cache and the Bing cache, just missing appearing on the page in Google's cache.
Update: a credible tweeter (@Clintonite33, check my mentions) reached out and is confident the 10/6/18 tweet above is legit, came from the real skeisel391 account, was not photoshopped, and was not from a fake account.— Jon Hamm (@JonMHamm) March 12, 2019
In summary, of the three primary tweets offered as evidence, we can reach the following conclusions:
- "come at me _____ boy" -- this tweet is definitively fake.
- "#poorloser" -- this tweet is a reply, and in general reply tweets will not appear in public web archives, so web archives cannot help us evaluate this tweet.
- "#MAGA" -- this tweet is either faked, or it falls in the gap between what appears in the Google cache and what appears in the Bing cache; using web archives we cannot definitively determine explanation is more likely.
Finally, in the future please don't just take a screen shot, push it to multiple web archives.
--Michael
Note: There are other fake Twitter accounts, for example: @skeisell391 (two lowercase L's), @skeisel_ (trailing underscore), but they are not well-executed and I have omitted them from the discussion above.
Comments
Post a Comment