From 12101858c11db41993ee3c618a41b751b4be6014 Mon Sep 17 00:00:00 2001 From: Ed Summers Date: Sun, 20 Nov 2022 13:01:17 -0500 Subject: [PATCH] try to use short/long mapping in tweet.js too --- .gitignore | 4 + test-data/Your archive.html | 11 + test-data/assets/.keep | 0 test-data/data/tweet.js | 5631 ++++++++++++++++++++++++++++++++++ test-data/data/urlmap.json | 52 + test.py | 42 + twitter_archive_unshorten.py | 31 +- 7 files changed, 5767 insertions(+), 4 deletions(-) create mode 100644 .gitignore create mode 100644 test-data/Your archive.html create mode 100644 test-data/assets/.keep create mode 100644 test-data/data/tweet.js create mode 100644 test-data/data/urlmap.json create mode 100644 test.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..763bc0e --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +Pipfile +build/ +dist/ +test-data/data/shorturls.json diff --git a/test-data/Your archive.html b/test-data/Your archive.html new file mode 100644 index 0000000..33bdacd --- /dev/null +++ b/test-data/Your archive.html @@ -0,0 +1,11 @@ +Your Twitter Data

Something went wrong, but don’t fret — let’s give it another shot

You need to unzip your entire archive, not just individual folders, in order to view them here. If you keep experiencing errors, please fill out this form.

Your archive isn’t available here.

You need to view this on a desktop browser in order to see your archive.

\ No newline at end of file diff --git a/test-data/assets/.keep b/test-data/assets/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test-data/data/tweet.js b/test-data/data/tweet.js new file mode 100644 index 0000000..c690d80 --- /dev/null +++ b/test-data/data/tweet.js @@ -0,0 +1,5631 @@ +window.YTD.tweet.part0 = [ + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ ], + "urls" : [ + { + "url" : "http://t.co/25wdpi6qoS", + "expanded_url" : "http://flumes.com/ge2015", + "display_url" : "flumes.com/ge2015", + "indices" : [ + "22", + "44" + ] + } + ] + }, + "display_text_range" : [ + "0", + "131" + ], + "favorite_count" : "0", + "id_str" : "591269415695609856", + "truncated" : false, + "retweet_count" : "2", + "id" : "591269415695609856", + "possibly_sensitive" : false, + "created_at" : "Thu Apr 23 15:56:28 +0000 2015", + "favorited" : false, + "full_text" : "i’m no viz expert but http://t.co/25wdpi6qoS has some very nice illustrations of using Twitter to describe the UK General Election.", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Jeni Tennison", + "screen_name" : "JeniT", + "indices" : [ + "0", + "6" + ], + "id_str" : "14727078", + "id" : "14727078" + }, + { + "name" : "Erik Wilde", + "screen_name" : "dret", + "indices" : [ + "110", + "115" + ], + "id_str" : "13072452", + "id" : "13072452" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "115" + ], + "favorite_count" : "1", + "in_reply_to_status_id_str" : "591187348597166080", + "id_str" : "591189629228965888", + "in_reply_to_user_id" : "14727078", + "truncated" : false, + "retweet_count" : "0", + "id" : "591189629228965888", + "in_reply_to_status_id" : "591187348597166080", + "created_at" : "Thu Apr 23 10:39:26 +0000 2015", + "favorited" : false, + "full_text" : "@JeniT removing any remaining ambiguity about the format of the metadata file would definitely be appreciated @dret", + "lang" : "en", + "in_reply_to_screen_name" : "JeniT", + "in_reply_to_user_id_str" : "14727078" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Jeni Tennison", + "screen_name" : "JeniT", + "indices" : [ + "0", + "6" + ], + "id_str" : "14727078", + "id" : "14727078" + }, + { + "name" : "Erik Wilde", + "screen_name" : "dret", + "indices" : [ + "100", + "105" + ], + "id_str" : "13072452", + "id" : "13072452" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "105" + ], + "favorite_count" : "1", + "in_reply_to_status_id_str" : "591187348597166080", + "id_str" : "591189357823918080", + "in_reply_to_user_id" : "14727078", + "truncated" : false, + "retweet_count" : "0", + "id" : "591189357823918080", + "in_reply_to_status_id" : "591187348597166080", + "created_at" : "Thu Apr 23 10:38:21 +0000 2015", + "favorited" : false, + "full_text" : "@JeniT understood, I think removing that turtle example would help; what if it was the last header? @dret", + "lang" : "en", + "in_reply_to_screen_name" : "JeniT", + "in_reply_to_user_id_str" : "14727078" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Jeni Tennison", + "screen_name" : "JeniT", + "indices" : [ + "0", + "6" + ], + "id_str" : "14727078", + "id" : "14727078" + }, + { + "name" : "Erik Wilde", + "screen_name" : "dret", + "indices" : [ + "124", + "129" + ], + "id_str" : "13072452", + "id" : "13072452" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "129" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591183309889261568", + "id_str" : "591187158028918784", + "in_reply_to_user_id" : "14727078", + "truncated" : false, + "retweet_count" : "0", + "id" : "591187158028918784", + "in_reply_to_status_id" : "591183309889261568", + "created_at" : "Thu Apr 23 10:29:36 +0000 2015", + "favorited" : false, + "full_text" : "@JeniT yes I think it would greatly simplify csvw clients if they don’t need to parse rdf serializations ; I can send email @dret", + "lang" : "en", + "in_reply_to_screen_name" : "JeniT", + "in_reply_to_user_id_str" : "14727078" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Jeni Tennison", + "screen_name" : "JeniT", + "indices" : [ + "0", + "6" + ], + "id_str" : "14727078", + "id" : "14727078" + }, + { + "name" : "Erik Wilde", + "screen_name" : "dret", + "indices" : [ + "123", + "128" + ], + "id_str" : "13072452", + "id" : "13072452" + } + ], + "urls" : [ + { + "url" : "http://t.co/4LUgKWCYPe", + "expanded_url" : "http://w3c.github.io/csvw/metadata/#metadata-format", + "display_url" : "w3c.github.io/csvw/metadata/…", + "indices" : [ + "84", + "106" + ] + } + ] + }, + "display_text_range" : [ + "0", + "128" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591137861023485952", + "id_str" : "591180598145916928", + "in_reply_to_user_id" : "14727078", + "truncated" : false, + "retweet_count" : "0", + "id" : "591180598145916928", + "in_reply_to_status_id" : "591137861023485952", + "possibly_sensitive" : false, + "created_at" : "Thu Apr 23 10:03:32 +0000 2015", + "favorited" : false, + "full_text" : "@JeniT but now I’m noticing for the first time that the metadata file must be JSON? http://t.co/4LUgKWCYPe which is great! @dret", + "lang" : "en", + "in_reply_to_screen_name" : "JeniT", + "in_reply_to_user_id_str" : "14727078" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Jeni Tennison", + "screen_name" : "JeniT", + "indices" : [ + "0", + "6" + ], + "id_str" : "14727078", + "id" : "14727078" + }, + { + "name" : "Erik Wilde", + "screen_name" : "dret", + "indices" : [ + "121", + "126" + ], + "id_str" : "13072452", + "id" : "13072452" + } + ], + "urls" : [ + { + "url" : "http://t.co/vOPm7UmNPn", + "expanded_url" : "http://www.w3.org/TR/2015/WD-tabular-data-model-20150108/#link-header", + "display_url" : "w3.org/TR/2015/WD-tab…", + "indices" : [ + "98", + "120" + ] + } + ] + }, + "display_text_range" : [ + "0", + "126" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591137861023485952", + "id_str" : "591180331950206976", + "in_reply_to_user_id" : "14727078", + "truncated" : false, + "retweet_count" : "0", + "id" : "591180331950206976", + "in_reply_to_status_id" : "591137861023485952", + "possibly_sensitive" : false, + "created_at" : "Thu Apr 23 10:02:29 +0000 2015", + "favorited" : false, + "full_text" : "@JeniT I thought that a publisher could use a link header to point at an application/rdf+xml file http://t.co/vOPm7UmNPn @dret", + "lang" : "en", + "in_reply_to_screen_name" : "JeniT", + "in_reply_to_user_id_str" : "14727078" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Dan Brickley", + "screen_name" : "danbri", + "indices" : [ + "0", + "7" + ], + "id_str" : "1246421", + "id" : "1246421" + }, + { + "name" : "Kerstin Forsberg", + "screen_name" : "kerfors", + "indices" : [ + "8", + "16" + ], + "id_str" : "144624330", + "id" : "144624330" + }, + { + "name" : "HermanIvan", + "screen_name" : "ivan_herman", + "indices" : [ + "63", + "75" + ], + "id_str" : "1084645305595977729", + "id" : "1084645305595977729" + }, + { + "name" : "Gregg Kellogg", + "screen_name" : "Gkellogg", + "indices" : [ + "76", + "85" + ], + "id_str" : "6125262", + "id" : "6125262" + }, + { + "name" : "Dan Bricklin", + "screen_name" : "DanB", + "indices" : [ + "86", + "91" + ], + "id_str" : "7746932", + "id" : "7746932" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "91" + ], + "favorite_count" : "1", + "in_reply_to_status_id_str" : "591140398241882112", + "id_str" : "591180008921632768", + "in_reply_to_user_id" : "1246421", + "truncated" : false, + "retweet_count" : "0", + "id" : "591180008921632768", + "in_reply_to_status_id" : "591140398241882112", + "created_at" : "Thu Apr 23 10:01:12 +0000 2015", + "favorited" : false, + "full_text" : "@danbri @kerfors yes, it was an intentional pun on my part :-) @ivan_herman @Gkellogg @DanB", + "lang" : "en", + "in_reply_to_screen_name" : "danbri", + "in_reply_to_user_id_str" : "1246421" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Jeni Tennison", + "screen_name" : "JeniT", + "indices" : [ + "0", + "6" + ], + "id_str" : "14727078", + "id" : "14727078" + }, + { + "name" : "Erik Wilde", + "screen_name" : "dret", + "indices" : [ + "130", + "135" + ], + "id_str" : "13072452", + "id" : "13072452" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "135" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591005358711246848", + "id_str" : "591017403355635713", + "in_reply_to_user_id" : "14727078", + "truncated" : false, + "retweet_count" : "0", + "id" : "591017403355635713", + "in_reply_to_status_id" : "591005358711246848", + "created_at" : "Wed Apr 22 23:15:04 +0000 2015", + "favorited" : false, + "full_text" : "@JeniT if I’ve read it right the biggest problem I have with csvw is how there’s no avoiding rdf if you are creating a client cc/ @dret", + "lang" : "en", + "in_reply_to_screen_name" : "JeniT", + "in_reply_to_user_id_str" : "14727078" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web App", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Jeni Tennison", + "screen_name" : "JeniT", + "indices" : [ + "0", + "6" + ], + "id_str" : "14727078", + "id" : "14727078" + }, + { + "name" : "Erik Wilde", + "screen_name" : "dret", + "indices" : [ + "7", + "12" + ], + "id_str" : "13072452", + "id" : "13072452" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "48" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591005358711246848", + "id_str" : "591015910099525632", + "in_reply_to_user_id" : "14727078", + "truncated" : false, + "retweet_count" : "0", + "id" : "591015910099525632", + "in_reply_to_status_id" : "591005358711246848", + "created_at" : "Wed Apr 22 23:09:08 +0000 2015", + "favorited" : false, + "full_text" : "@JeniT @dret are there tools for doing that yet?", + "lang" : "en", + "in_reply_to_screen_name" : "JeniT", + "in_reply_to_user_id_str" : "14727078" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Kerstin Forsberg", + "screen_name" : "kerfors", + "indices" : [ + "3", + "11" + ], + "id_str" : "144624330", + "id" : "144624330" + }, + { + "name" : "Dan Brickley", + "screen_name" : "danbri", + "indices" : [ + "19", + "26" + ], + "id_str" : "1246421", + "id" : "1246421" + }, + { + "name" : "HermanIvan", + "screen_name" : "ivan_herman", + "indices" : [ + "27", + "39" + ], + "id_str" : "1084645305595977729", + "id" : "1084645305595977729" + }, + { + "name" : "Gregg Kellogg", + "screen_name" : "Gkellogg", + "indices" : [ + "40", + "49" + ], + "id_str" : "6125262", + "id" : "6125262" + }, + { + "name" : "Ed Summers", + "screen_name" : "edsu", + "indices" : [ + "50", + "55" + ], + "id_str" : "14331818", + "id" : "14331818" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "140" + ], + "favorite_count" : "0", + "id_str" : "590999869789184000", + "truncated" : false, + "retweet_count" : "0", + "id" : "590999869789184000", + "created_at" : "Wed Apr 22 22:05:23 +0000 2015", + "favorited" : false, + "full_text" : "RT @kerfors: Kudos @danbri @ivan_herman @Gkellogg @edsu You triggered a blog: CSVW for Tabular Clinical Trial Data and Metadata http://t.co…", + "lang" : "ro" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Chris McDowall", + "screen_name" : "fogonwater", + "indices" : [ + "0", + "11" + ], + "id_str" : "1075949624626601984", + "id" : "1075949624626601984" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "92" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "590973029217239040", + "id_str" : "590975240068534274", + "in_reply_to_user_id" : "20462308", + "truncated" : false, + "retweet_count" : "0", + "id" : "590975240068534274", + "in_reply_to_status_id" : "590973029217239040", + "created_at" : "Wed Apr 22 20:27:31 +0000 2015", + "favorited" : false, + "full_text" : "@fogonwater I think so, especially since people already have their heads in spreadsheets eh?", + "lang" : "en", + "in_reply_to_user_id_str" : "20462308" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Ryan Baumann", + "screen_name" : "ryanfb", + "indices" : [ + "0", + "7" + ], + "id_str" : "14298448", + "id" : "14298448" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "109" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591662764558577664", + "id_str" : "591669074444292096", + "in_reply_to_user_id" : "14298448", + "truncated" : false, + "retweet_count" : "0", + "id" : "591669074444292096", + "in_reply_to_status_id" : "591662764558577664", + "created_at" : "Fri Apr 24 18:24:34 +0000 2015", + "favorited" : false, + "full_text" : "@ryanfb no need, i was thinking of just splitting them up into subdirs using the vine id before I bag them up", + "lang" : "en", + "in_reply_to_screen_name" : "ryanfb", + "in_reply_to_user_id_str" : "14298448" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Sarah Hovde", + "screen_name" : "sehovde", + "indices" : [ + "0", + "8" + ], + "id_str" : "331318117", + "id" : "331318117" + }, + { + "name" : "UMD_MITH", + "screen_name" : "UMD_MITH", + "indices" : [ + "108", + "117" + ], + "id_str" : "14086852", + "id" : "14086852" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "117" + ], + "favorite_count" : "1", + "in_reply_to_status_id_str" : "591667945941643264", + "id_str" : "591668719551717376", + "in_reply_to_user_id" : "331318117", + "truncated" : false, + "retweet_count" : "0", + "id" : "591668719551717376", + "in_reply_to_status_id" : "591667945941643264", + "created_at" : "Fri Apr 24 18:23:10 +0000 2015", + "favorited" : false, + "full_text" : "@sehovde thanks for letting us know! do you have a specific example that will help us diagnose the problem? @UMD_MITH", + "lang" : "en", + "in_reply_to_screen_name" : "sehovde", + "in_reply_to_user_id_str" : "331318117" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Ryan Baumann", + "screen_name" : "ryanfb", + "indices" : [ + "0", + "7" + ], + "id_str" : "14298448", + "id" : "14298448" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "72" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591654948590477313", + "id_str" : "591662189783691265", + "in_reply_to_user_id" : "14298448", + "truncated" : false, + "retweet_count" : "0", + "id" : "591662189783691265", + "in_reply_to_status_id" : "591654948590477313", + "created_at" : "Fri Apr 24 17:57:13 +0000 2015", + "favorited" : false, + "full_text" : "@ryanfb so that’s how youtube-dl wrote them, all in one directory right?", + "lang" : "en", + "in_reply_to_screen_name" : "ryanfb", + "in_reply_to_user_id_str" : "14298448" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Ryan Baumann", + "screen_name" : "ryanfb", + "indices" : [ + "0", + "7" + ], + "id_str" : "14298448", + "id" : "14298448" + }, + { + "name" : "UMD_MITH", + "screen_name" : "UMD_MITH", + "indices" : [ + "104", + "113" + ], + "id_str" : "14086852", + "id" : "14086852" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "121" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591654948590477313", + "id_str" : "591660637069119489", + "in_reply_to_user_id" : "14298448", + "truncated" : false, + "retweet_count" : "0", + "id" : "591660637069119489", + "in_reply_to_status_id" : "591654948590477313", + "created_at" : "Fri Apr 24 17:51:03 +0000 2015", + "favorited" : false, + "full_text" : "@ryanfb ok, i’ve got it :-) thanks for including the metadata! I’m going to bag these up for our little @umd_mith archive", + "lang" : "en", + "in_reply_to_screen_name" : "ryanfb", + "in_reply_to_user_id_str" : "14298448" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Ryan Baumann", + "screen_name" : "ryanfb", + "indices" : [ + "0", + "7" + ], + "id_str" : "14298448", + "id" : "14298448" + }, + { + "name" : "Internet Archive", + "screen_name" : "internetarchive", + "indices" : [ + "38", + "54" + ], + "id_str" : "18957805", + "id" : "18957805" + }, + { + "name" : "Jason Scott", + "screen_name" : "textfiles", + "indices" : [ + "96", + "106" + ], + "id_str" : "1465481", + "id" : "1465481" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "135" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591634131597004800", + "id_str" : "591655947283656704", + "in_reply_to_user_id" : "14298448", + "truncated" : false, + "retweet_count" : "0", + "id" : "591655947283656704", + "in_reply_to_status_id" : "591634131597004800", + "created_at" : "Fri Apr 24 17:32:24 +0000 2015", + "favorited" : false, + "full_text" : "@ryanfb thank you! I’m not sure about @internetarchive’s interest in the ferguson vines ; maybe @textfiles or @jefferson_bail can help?", + "lang" : "en", + "in_reply_to_screen_name" : "ryanfb", + "in_reply_to_user_id_str" : "14298448" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Alf Eaton", + "screen_name" : "invisiblecomma", + "indices" : [ + "0", + "15" + ], + "id_str" : "695043", + "id" : "695043" + } + ], + "urls" : [ + { + "url" : "http://t.co/TbcdHFlgcD", + "expanded_url" : "http://www.npr.org/2015/03/20/394217017/no-pain-no-scientific-gain-one-mans-quest-to-quantify-bug-stings", + "display_url" : "npr.org/2015/03/20/394…", + "indices" : [ + "115", + "137" + ] + } + ] + }, + "display_text_range" : [ + "0", + "137" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591545461321891840", + "id_str" : "591639249188954112", + "in_reply_to_user_id" : "695043", + "truncated" : false, + "retweet_count" : "0", + "id" : "591639249188954112", + "in_reply_to_status_id" : "591545461321891840", + "possibly_sensitive" : false, + "created_at" : "Fri Apr 24 16:26:03 +0000 2015", + "favorited" : false, + "full_text" : "@invisiblecomma funnily enough I heard an interview with the creator of that Schmidt Sting Pain Index that’s cited http://t.co/TbcdHFlgcD", + "lang" : "en", + "in_reply_to_screen_name" : "invisiblecomma", + "in_reply_to_user_id_str" : "695043" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Alf Eaton", + "screen_name" : "invisiblecomma", + "indices" : [ + "3", + "18" + ], + "id_str" : "695043", + "id" : "695043" + }, + { + "name" : "Hypothesis", + "screen_name" : "hypothes_is", + "indices" : [ + "75", + "87" + ], + "id_str" : "325100970", + "id" : "325100970" + }, + { + "name" : "PeerJ Publishing", + "screen_name" : "thePeerJ", + "indices" : [ + "93", + "102" + ], + "id_str" : "402875257", + "id" : "402875257" + }, + { + "name" : "Internet Archive", + "screen_name" : "internetarchive", + "indices" : [ + "110", + "126" + ], + "id_str" : "18957805", + "id" : "18957805" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "140" + ], + "favorite_count" : "0", + "id_str" : "591638072711913473", + "truncated" : false, + "retweet_count" : "0", + "id" : "591638072711913473", + "created_at" : "Fri Apr 24 16:21:23 +0000 2015", + "favorited" : false, + "full_text" : "RT @invisiblecomma: Annotate a date-stamped snapshot of a journal article (@hypothes_is over @thepeerj inside @internetarchive) https://t.c…", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Mark Sample ✨", + "screen_name" : "samplereality", + "indices" : [ + "0", + "14" + ], + "id_str" : "8497292", + "id" : "8497292" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "25" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591634397054504960", + "id_str" : "591635999836545024", + "in_reply_to_user_id" : "8497292", + "truncated" : false, + "retweet_count" : "0", + "id" : "591635999836545024", + "in_reply_to_status_id" : "591634397054504960", + "created_at" : "Fri Apr 24 16:13:09 +0000 2015", + "favorited" : false, + "full_text" : "@samplereality always eh?", + "lang" : "en", + "in_reply_to_screen_name" : "samplereality", + "in_reply_to_user_id_str" : "8497292" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Ryan Baumann", + "screen_name" : "ryanfb", + "indices" : [ + "0", + "7" + ], + "id_str" : "14298448", + "id" : "14298448" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "89" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591631014335750145", + "id_str" : "591632401115254785", + "in_reply_to_user_id" : "14298448", + "truncated" : false, + "retweet_count" : "0", + "id" : "591632401115254785", + "in_reply_to_status_id" : "591631014335750145", + "created_at" : "Fri Apr 24 15:58:51 +0000 2015", + "favorited" : false, + "full_text" : "@ryanfb understandable yeah ; any chance you would be willing to share that vine dataset?", + "lang" : "en", + "in_reply_to_screen_name" : "ryanfb", + "in_reply_to_user_id_str" : "14298448" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Matthijs R. Koot", + "screen_name" : "mrkoot", + "indices" : [ + "3", + "10" + ], + "id_str" : "237235302", + "id" : "237235302" + }, + { + "name" : "Center for Democracy & Technology", + "screen_name" : "CenDemTech", + "indices" : [ + "77", + "88" + ], + "id_str" : "16228337", + "id" : "16228337" + } + ], + "urls" : [ + { + "url" : "https://t.co/W49jhBps0a", + "expanded_url" : "https://tools.ietf.org/html/draft-hall-censorship-tech-00", + "display_url" : "tools.ietf.org/html/draft-hal…", + "indices" : [ + "90", + "113" + ] + } + ] + }, + "display_text_range" : [ + "0", + "140" + ], + "favorite_count" : "0", + "id_str" : "591628476337283073", + "truncated" : false, + "retweet_count" : "0", + "id" : "591628476337283073", + "possibly_sensitive" : false, + "created_at" : "Fri Apr 24 15:43:15 +0000 2015", + "favorited" : false, + "full_text" : "RT @mrkoot: IETF Info Draft: A Survey of Worldwide Censorship Techniques (by @CenDemTech) https://t.co/W49jhBps0a ; published Oct 2014, exp…", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ + { + "text" : "ferguson", + "indices" : [ + "22", + "31" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Ryan Baumann", + "screen_name" : "ryanfb", + "indices" : [ + "0", + "7" + ], + "id_str" : "14298448", + "id" : "14298448" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "65" + ], + "favorite_count" : "0", + "id_str" : "591628374667370496", + "in_reply_to_user_id" : "14298448", + "truncated" : false, + "retweet_count" : "0", + "id" : "591628374667370496", + "created_at" : "Fri Apr 24 15:42:51 +0000 2015", + "favorited" : false, + "full_text" : "@ryanfb hey, did that #ferguson vine archiving job ever complete?", + "lang" : "en", + "in_reply_to_screen_name" : "ryanfb", + "in_reply_to_user_id_str" : "14298448" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Mark Sample ✨", + "screen_name" : "samplereality", + "indices" : [ + "0", + "14" + ], + "id_str" : "8497292", + "id" : "8497292" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "73" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591622833916096512", + "id_str" : "591626002499002369", + "in_reply_to_user_id" : "8497292", + "truncated" : false, + "retweet_count" : "0", + "id" : "591626002499002369", + "in_reply_to_status_id" : "591622833916096512", + "created_at" : "Fri Apr 24 15:33:25 +0000 2015", + "favorited" : false, + "full_text" : "@samplereality spamming/jamming on Twitter is getting worse too I suspect", + "lang" : "en", + "in_reply_to_screen_name" : "samplereality", + "in_reply_to_user_id_str" : "8497292" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Katrin Weller", + "screen_name" : "kwelle", + "indices" : [ + "3", + "10" + ], + "id_str" : "78688499", + "id" : "78688499" + }, + { + "name" : "UMD_MITH", + "screen_name" : "UMD_MITH", + "indices" : [ + "40", + "49" + ], + "id_str" : "14086852", + "id" : "14086852" + } + ], + "urls" : [ + { + "url" : "http://t.co/q2MJmVzq0V", + "expanded_url" : "http://mith.umd.edu/chances-and-challenges-of-studying-social-media-data/", + "display_url" : "mith.umd.edu/chances-and-ch…", + "indices" : [ + "107", + "129" + ] + } + ] + }, + "display_text_range" : [ + "0", + "129" + ], + "favorite_count" : "0", + "id_str" : "591621453692428288", + "truncated" : false, + "retweet_count" : "0", + "id" : "591621453692428288", + "possibly_sensitive" : false, + "created_at" : "Fri Apr 24 15:15:21 +0000 2015", + "favorited" : false, + "full_text" : "RT @kwelle: looking forward to visiting @UMD_MITH next week (April 30) to talk about social media research http://t.co/q2MJmVzq0V", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Lawrence Daniel Caswell", + "screen_name" : "tinypatron", + "indices" : [ + "3", + "14" + ], + "id_str" : "15404035", + "id" : "15404035" + }, + { + "name" : "Vox", + "screen_name" : "voxdotcom", + "indices" : [ + "128", + "138" + ], + "id_str" : "2347049341", + "id" : "2347049341" + } + ], + "urls" : [ + { + "url" : "http://t.co/IR4ZyD9Kta", + "expanded_url" : "http://www.vox.com/2015/4/23/8484185/freddie-gray-kevin-moore?utm_campaign=vox&utm_content=article%3Atop&utm_medium=social&utm_source=twitter", + "display_url" : "vox.com/2015/4/23/8484…", + "indices" : [ + "101", + "123" + ] + } + ] + }, + "display_text_range" : [ + "0", + "138" + ], + "favorite_count" : "0", + "id_str" : "591621082437812224", + "truncated" : false, + "retweet_count" : "0", + "id" : "591621082437812224", + "possibly_sensitive" : false, + "created_at" : "Fri Apr 24 15:13:52 +0000 2015", + "favorited" : false, + "full_text" : "RT @tinypatron: Man who recorded Freddie Gray’s arrest: \"He was just screaming — screaming for life\" http://t.co/IR4ZyD9Kta via @voxdotcom", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Eric Mill", + "screen_name" : "konklone", + "indices" : [ + "0", + "9" + ], + "id_str" : "5232171", + "id" : "5232171" + } + ], + "urls" : [ + { + "url" : "https://t.co/bs54JmxtWO", + "expanded_url" : "https://indiewebcamp.com/Homebrew_Website_Club", + "display_url" : "indiewebcamp.com/Homebrew_Websi…", + "indices" : [ + "74", + "97" + ] + } + ] + }, + "display_text_range" : [ + "0", + "97" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591311942859546624", + "id_str" : "591619160578379776", + "in_reply_to_user_id" : "5232171", + "truncated" : false, + "retweet_count" : "0", + "id" : "591619160578379776", + "in_reply_to_status_id" : "591311942859546624", + "possibly_sensitive" : false, + "created_at" : "Fri Apr 24 15:06:14 +0000 2015", + "favorited" : false, + "full_text" : "@konklone starting to wonder if a Homebrew Website Club might fit better? https://t.co/bs54JmxtWO", + "lang" : "en", + "in_reply_to_screen_name" : "konklone", + "in_reply_to_user_id_str" : "5232171" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Kin Lane (he/him/it)", + "screen_name" : "kinlane", + "indices" : [ + "0", + "8" + ], + "id_str" : "5954192", + "id" : "5954192" + }, + { + "name" : "Ray Schulz", + "screen_name" : "rascul3", + "indices" : [ + "9", + "17" + ], + "id_str" : "2407626138", + "id" : "2407626138" + }, + { + "name" : "timmmmyboy", + "screen_name" : "timmmmyboy", + "indices" : [ + "18", + "29" + ], + "id_str" : "1025923491495903232", + "id" : "1025923491495903232" + } + ], + "urls" : [ + { + "url" : "https://t.co/Id7D0AaNIj", + "expanded_url" : "https://indiewebcamp.com/2015/DC", + "display_url" : "indiewebcamp.com/2015/DC", + "indices" : [ + "50", + "73" + ] + } + ] + }, + "display_text_range" : [ + "0", + "139" + ], + "favorite_count" : "0", + "id_str" : "591616104520364032", + "in_reply_to_user_id" : "5954192", + "truncated" : false, + "retweet_count" : "0", + "id" : "591616104520364032", + "possibly_sensitive" : false, + "created_at" : "Fri Apr 24 14:54:05 +0000 2015", + "favorited" : false, + "full_text" : "@kinlane @rascul3 @timmmmyboy I saw your names at https://t.co/Id7D0AaNIj do you have any interest in kicking off a DC HomebrewWebsiteClub?", + "lang" : "en", + "in_reply_to_screen_name" : "kinlane", + "in_reply_to_user_id_str" : "5954192" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "user_mentions" : [ + { + "name" : "Cody Buntain", + "screen_name" : "codybuntain", + "indices" : [ + "0", + "12" + ], + "id_str" : "363200844", + "id" : "363200844" + }, + { + "name" : "Bergis Jules 🇱🇨", + "screen_name" : "BergisJules", + "indices" : [ + "60", + "72" + ], + "id_str" : "1012488631", + "id" : "1012488631" + } + ], + "urls" : [ ], + "symbols" : [ ], + "media" : [ + { + "expanded_url" : "https://twitter.com/edsu/status/591361026349760513/photo/1", + "indices" : [ + "73", + "95" + ], + "url" : "http://t.co/YK6vrYwEWt", + "media_url" : "http://pbs.twimg.com/media/CDTvuFbW4AIX7qi.png", + "id_str" : "591361026102321154", + "id" : "591361026102321154", + "media_url_https" : "https://pbs.twimg.com/media/CDTvuFbW4AIX7qi.png", + "sizes" : { + "medium" : { + "w" : "1017", + "h" : "810", + "resize" : "fit" + }, + "large" : { + "w" : "1017", + "h" : "810", + "resize" : "fit" + }, + "small" : { + "w" : "680", + "h" : "542", + "resize" : "fit" + }, + "thumb" : { + "w" : "150", + "h" : "150", + "resize" : "crop" + } + }, + "type" : "photo", + "display_url" : "pic.twitter.com/YK6vrYwEWt" + } + ], + "hashtags" : [ ] + }, + "display_text_range" : [ + "0", + "95" + ], + "favorite_count" : "1", + "in_reply_to_status_id_str" : "591360122078830592", + "id_str" : "591361026349760513", + "in_reply_to_user_id" : "363200844", + "truncated" : false, + "retweet_count" : "0", + "id" : "591361026349760513", + "in_reply_to_status_id" : "591360122078830592", + "possibly_sensitive" : false, + "created_at" : "Thu Apr 23 22:00:30 +0000 2015", + "favorited" : false, + "full_text" : "@codybuntain funny to see this scroll by on the console cc/ @BergisJules http://t.co/YK6vrYwEWt", + "lang" : "en", + "in_reply_to_screen_name" : "codybuntain", + "in_reply_to_user_id_str" : "363200844", + "extended_entities" : { + "media" : [ + { + "expanded_url" : "https://twitter.com/edsu/status/591361026349760513/photo/1", + "indices" : [ + "73", + "95" + ], + "url" : "http://t.co/YK6vrYwEWt", + "media_url" : "http://pbs.twimg.com/media/CDTvuFbW4AIX7qi.png", + "id_str" : "591361026102321154", + "id" : "591361026102321154", + "media_url_https" : "https://pbs.twimg.com/media/CDTvuFbW4AIX7qi.png", + "sizes" : { + "medium" : { + "w" : "1017", + "h" : "810", + "resize" : "fit" + }, + "large" : { + "w" : "1017", + "h" : "810", + "resize" : "fit" + }, + "small" : { + "w" : "680", + "h" : "542", + "resize" : "fit" + }, + "thumb" : { + "w" : "150", + "h" : "150", + "resize" : "crop" + } + }, + "type" : "photo", + "display_url" : "pic.twitter.com/YK6vrYwEWt" + } + ] + } + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ + { + "text" : "FreddieGray", + "indices" : [ + "44", + "56" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Cody Buntain", + "screen_name" : "codybuntain", + "indices" : [ + "0", + "12" + ], + "id_str" : "363200844", + "id" : "363200844" + }, + { + "name" : "Bergis Jules 🇱🇨", + "screen_name" : "BergisJules", + "indices" : [ + "107", + "119" + ], + "id_str" : "1012488631", + "id" : "1012488631" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "119" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591359968571424768", + "id_str" : "591360561201438720", + "in_reply_to_user_id" : "363200844", + "truncated" : false, + "retweet_count" : "0", + "id" : "591360561201438720", + "in_reply_to_status_id" : "591359968571424768", + "created_at" : "Thu Apr 23 21:58:39 +0000 2015", + "favorited" : false, + "full_text" : "@codybuntain ah good to know; btw there’s a #FreddieGray dataset being built now if that’s of interest cc/ @BergisJules", + "lang" : "en", + "in_reply_to_screen_name" : "codybuntain", + "in_reply_to_user_id_str" : "363200844" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ + { + "text" : "cmdline", + "indices" : [ + "129", + "137" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Bergis Jules 🇱🇨", + "screen_name" : "BergisJules", + "indices" : [ + "116", + "128" + ], + "id_str" : "1012488631", + "id" : "1012488631" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "137" + ], + "favorite_count" : "3", + "id_str" : "591355333857124353", + "truncated" : false, + "retweet_count" : "1", + "id" : "591355333857124353", + "created_at" : "Thu Apr 23 21:37:53 +0000 2015", + "favorited" : false, + "full_text" : "fwiw that jq cmd counted how many non-retweets in the 13M Ferguson dataset have embedded media. answer: 285,804 cc/ @BergisJules #cmdline", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ + { + "text" : "HRRlive", + "indices" : [ + "125", + "133" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Dr. Jami Rogers 🇺🇦", + "screen_name" : "publicradionerd", + "indices" : [ + "3", + "19" + ], + "id_str" : "187330176", + "id" : "187330176" + }, + { + "name" : "Mychal Denzel Smith", + "screen_name" : "mychalsmith", + "indices" : [ + "112", + "124" + ], + "id_str" : "136417827", + "id" : "136417827" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "133" + ], + "favorite_count" : "0", + "id_str" : "591984187944599554", + "truncated" : false, + "retweet_count" : "0", + "id" : "591984187944599554", + "created_at" : "Sat Apr 25 15:16:43 +0000 2015", + "favorited" : false, + "full_text" : "RT @publicradionerd: \"The current media landscape\" allows people on the ground to challenge the media narrative @mychalsmith #HRRlive", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ + { + "text" : "HRRlive", + "indices" : [ + "29", + "37" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Smithsonian NMAAHC", + "screen_name" : "NMAAHC", + "indices" : [ + "3", + "10" + ], + "id_str" : "36972997", + "id" : "36972997" + } + ], + "urls" : [ + { + "url" : "http://t.co/elcOf8zNxQ", + "expanded_url" : "http://bit.ly/1rBYgHZ", + "display_url" : "bit.ly/1rBYgHZ", + "indices" : [ + "74", + "96" + ] + } + ] + }, + "display_text_range" : [ + "0", + "96" + ], + "favorite_count" : "0", + "id_str" : "591969880372555776", + "truncated" : false, + "retweet_count" : "0", + "id" : "591969880372555776", + "possibly_sensitive" : false, + "created_at" : "Sat Apr 25 14:19:52 +0000 2015", + "favorited" : false, + "full_text" : "RT @NMAAHC: Can't attend our #HRRlive program in-person? Watch live here: http://t.co/elcOf8zNxQ", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ + { + "text" : "HRRlive", + "indices" : [ + "130", + "138" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Smithsonian NMAAHC", + "screen_name" : "NMAAHC", + "indices" : [ + "3", + "10" + ], + "id_str" : "36972997", + "id" : "36972997" + } + ], + "urls" : [ + { + "url" : "http://t.co/elcOf8RoWq", + "expanded_url" : "http://bit.ly/1rBYgHZ", + "display_url" : "bit.ly/1rBYgHZ", + "indices" : [ + "106", + "128" + ] + } + ] + }, + "display_text_range" : [ + "0", + "138" + ], + "favorite_count" : "0", + "id_str" : "591960493679587328", + "truncated" : false, + "retweet_count" : "0", + "id" : "591960493679587328", + "possibly_sensitive" : false, + "created_at" : "Sat Apr 25 13:42:34 +0000 2015", + "favorited" : false, + "full_text" : "RT @NMAAHC: Our History, Rebellion and Reconciliation Symposium is now sold out! You can watch live here: http://t.co/elcOf8RoWq #HRRlive", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ ], + "urls" : [ + { + "url" : "https://t.co/hD9wLQYwIB", + "expanded_url" : "https://github.com/edsu/freddiegray-tweet-viewer#start-of-content", + "display_url" : "github.com/edsu/freddiegr…", + "indices" : [ + "115", + "138" + ] + } + ] + }, + "display_text_range" : [ + "0", + "138" + ], + "favorite_count" : "2", + "id_str" : "591959188470890496", + "truncated" : false, + "retweet_count" : "0", + "id" : "591959188470890496", + "possibly_sensitive" : false, + "created_at" : "Sat Apr 25 13:37:23 +0000 2015", + "favorited" : false, + "full_text" : "discovering twarc’s —hydrate option is useful when you want to get the latest retweet counts for a twitter dataset https://t.co/hD9wLQYwIB", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "The Independent", + "screen_name" : "Independent", + "indices" : [ + "3", + "15" + ], + "id_str" : "16973333", + "id" : "16973333" + } + ], + "urls" : [ + { + "url" : "http://t.co/luKm7KWugH", + "expanded_url" : "http://ind.pn/1IPIhA5", + "display_url" : "ind.pn/1IPIhA5", + "indices" : [ + "111", + "133" + ] + } + ] + }, + "display_text_range" : [ + "0", + "140" + ], + "favorite_count" : "0", + "id_str" : "591758744276570112", + "truncated" : false, + "retweet_count" : "0", + "id" : "591758744276570112", + "possibly_sensitive" : false, + "created_at" : "Sat Apr 25 00:20:53 +0000 2015", + "favorited" : false, + "full_text" : "RT @Independent: Your Google search history can now be downloaded in its entirety, mass embarrassment expected http://t.co/luKm7KWugH http:…", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Dan Chudnov", + "screen_name" : "dchud", + "indices" : [ + "0", + "6" + ], + "id_str" : "17981917", + "id" : "17981917" + } + ], + "urls" : [ + { + "url" : "https://t.co/hpASPPhEBA", + "expanded_url" : "https://github.com/edsu/freddiegray-tweet-viewer", + "display_url" : "github.com/edsu/freddiegr…", + "indices" : [ + "61", + "84" + ] + } + ] + }, + "display_text_range" : [ + "0", + "124" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591740924599869440", + "id_str" : "591743797517754369", + "in_reply_to_user_id" : "14331818", + "truncated" : false, + "retweet_count" : "0", + "id" : "591743797517754369", + "in_reply_to_status_id" : "591740924599869440", + "possibly_sensitive" : false, + "created_at" : "Fri Apr 24 23:21:30 +0000 2015", + "favorited" : false, + "full_text" : "@dchud btw the viewer (as simple as it is) is here on github https://t.co/hpASPPhEBA ; you can replace js/ids.js with others", + "lang" : "en", + "in_reply_to_screen_name" : "edsu", + "in_reply_to_user_id_str" : "14331818" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ + { + "text" : "FreddieGray", + "indices" : [ + "25", + "37" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ ], + "urls" : [ + { + "url" : "http://t.co/h9HhPsbg6b", + "expanded_url" : "http://edsu.github.io/freddiegray-tweet-viewer/", + "display_url" : "edsu.github.io/freddiegray-tw…", + "indices" : [ + "83", + "105" + ] + } + ] + }, + "display_text_range" : [ + "0", + "105" + ], + "favorite_count" : "0", + "id_str" : "591740924599869440", + "truncated" : false, + "retweet_count" : "1", + "id" : "591740924599869440", + "possibly_sensitive" : false, + "created_at" : "Fri Apr 24 23:10:05 +0000 2015", + "favorited" : false, + "full_text" : "random display of 52,312 #FreddieGray tweets w/ images & more than 10 retweets http://t.co/h9HhPsbg6b", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Dr. Gunn", + "screen_name" : "mrgunn", + "indices" : [ + "0", + "7" + ], + "id_str" : "15237935", + "id" : "15237935" + }, + { + "name" : "Nick Stenning", + "screen_name" : "nickstenning", + "indices" : [ + "8", + "21" + ], + "id_str" : "14128688", + "id" : "14128688" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "49" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591378765604737024", + "id_str" : "591729399927545856", + "in_reply_to_user_id" : "15237935", + "truncated" : false, + "retweet_count" : "0", + "id" : "591729399927545856", + "in_reply_to_status_id" : "591378765604737024", + "created_at" : "Fri Apr 24 22:24:17 +0000 2015", + "favorited" : false, + "full_text" : "@mrgunn @nickstenning is there a backstory there?", + "lang" : "en", + "in_reply_to_screen_name" : "mrgunn", + "in_reply_to_user_id_str" : "15237935" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Dave Rice, 𝛑", + "screen_name" : "dericed", + "indices" : [ + "3", + "11" + ], + "id_str" : "171339373", + "id" : "171339373" + }, + { + "name" : "Democracy Now!", + "screen_name" : "democracynow", + "indices" : [ + "14", + "27" + ], + "id_str" : "16935292", + "id" : "16935292" + } + ], + "urls" : [ + { + "url" : "http://t.co/w1cw83eFUP", + "expanded_url" : "http://ewheel.democracynow.org", + "display_url" : "ewheel.democracynow.org", + "indices" : [ + "115", + "137" + ] + } + ] + }, + "display_text_range" : [ + "0", + "140" + ], + "favorite_count" : "0", + "id_str" : "591692372926439425", + "truncated" : false, + "retweet_count" : "0", + "id" : "591692372926439425", + "possibly_sensitive" : false, + "created_at" : "Fri Apr 24 19:57:09 +0000 2015", + "favorited" : false, + "full_text" : "RT @dericed: .@democracynow has been releasing torrents of their programming on a daily basis for nearly 10 years. http://t.co/w1cw83eFUP #…", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ + { + "text" : "pda2015", + "indices" : [ + "83", + "91" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Hillel Arnold", + "screen_name" : "helrond", + "indices" : [ + "3", + "11" + ], + "id_str" : "109467752", + "id" : "109467752" + }, + { + "name" : "DPLA", + "screen_name" : "dpla", + "indices" : [ + "26", + "31" + ], + "id_str" : "365017572", + "id" : "365017572" + } + ], + "urls" : [ + { + "url" : "http://t.co/Es0ZjTKe7N", + "expanded_url" : "http://1world1family.me/", + "display_url" : "1world1family.me", + "indices" : [ + "60", + "82" + ] + } + ] + }, + "display_text_range" : [ + "0", + "91" + ], + "favorite_count" : "0", + "id_str" : "591687426076241920", + "truncated" : false, + "retweet_count" : "0", + "id" : "591687426076241920", + "possibly_sensitive" : false, + "created_at" : "Fri Apr 24 19:37:30 +0000 2015", + "favorited" : false, + "full_text" : "RT @helrond: Wondering if @dpla would be a good partner for http://t.co/Es0ZjTKe7N #pda2015", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Bergis Jules 🇱🇨", + "screen_name" : "BergisJules", + "indices" : [ + "14", + "26" + ], + "id_str" : "1012488631", + "id" : "1012488631" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "110" + ], + "favorite_count" : "1", + "in_reply_to_status_id_str" : "591675292567117824", + "id_str" : "591686590205927424", + "in_reply_to_user_id" : "242950665", + "truncated" : false, + "retweet_count" : "0", + "id" : "591686590205927424", + "in_reply_to_status_id" : "591675292567117824", + "created_at" : "Fri Apr 24 19:34:10 +0000 2015", + "favorited" : false, + "full_text" : "@nataliembaur @BergisJules one way of going about it might be to provide some examples of unauthentic content?", + "lang" : "en", + "in_reply_to_screen_name" : "nattmarb", + "in_reply_to_user_id_str" : "242950665" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Jason Scott", + "screen_name" : "textfiles", + "indices" : [ + "0", + "10" + ], + "id_str" : "1465481", + "id" : "1465481" + }, + { + "name" : "Ryan Baumann", + "screen_name" : "ryanfb", + "indices" : [ + "26", + "33" + ], + "id_str" : "14298448", + "id" : "14298448" + }, + { + "name" : "Internet Archive", + "screen_name" : "internetarchive", + "indices" : [ + "34", + "50" + ], + "id_str" : "18957805", + "id" : "18957805" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "66" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591685411216457728", + "id_str" : "591685581463265280", + "in_reply_to_user_id" : "1465481", + "truncated" : false, + "retweet_count" : "0", + "id" : "591685581463265280", + "in_reply_to_status_id" : "591685411216457728", + "created_at" : "Fri Apr 24 19:30:10 +0000 2015", + "favorited" : false, + "full_text" : "@textfiles so were we :-) @ryanfb @internetarchive @jefferson_bail", + "lang" : "en", + "in_reply_to_screen_name" : "textfiles", + "in_reply_to_user_id_str" : "1465481" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ + { + "text" : "pda2015", + "indices" : [ + "17", + "25" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ ], + "urls" : [ + { + "url" : "http://t.co/WGevlYJOQV", + "expanded_url" : "http://inkdroid.org/pda2015/", + "display_url" : "inkdroid.org/pda2015/", + "indices" : [ + "43", + "65" + ] + } + ] + }, + "display_text_range" : [ + "0", + "108" + ], + "favorite_count" : "4", + "id_str" : "591681640801374211", + "truncated" : false, + "retweet_count" : "8", + "id" : "591681640801374211", + "possibly_sensitive" : false, + "created_at" : "Fri Apr 24 19:14:30 +0000 2015", + "favorited" : false, + "full_text" : "can’t make it to #pda2015? follow along at http://t.co/WGevlYJOQV to see what URLs people are tweeting about", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Bergis Jules 🇱🇨", + "screen_name" : "BergisJules", + "indices" : [ + "1", + "13" + ], + "id_str" : "1012488631", + "id" : "1012488631" + } + ], + "urls" : [ + { + "url" : "https://t.co/T6syRCUc6v", + "expanded_url" : "https://medium.com/on-archivy/hashtags-of-ferguson-8f52a0aced87", + "display_url" : "medium.com/on-archivy/has…", + "indices" : [ + "114", + "137" + ] + } + ] + }, + "display_text_range" : [ + "0", + "137" + ], + "favorite_count" : "1", + "id_str" : "591676556017303552", + "truncated" : false, + "retweet_count" : "1", + "id" : "591676556017303552", + "possibly_sensitive" : false, + "created_at" : "Fri Apr 24 18:54:18 +0000 2015", + "favorited" : false, + "full_text" : ".@BergisJules is starting to think about ways to identify media files of archival interest in 13M Ferguson tweets https://t.co/T6syRCUc6v", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Yvonne Ng", + "screen_name" : "ng_yvonne", + "indices" : [ + "3", + "13" + ], + "id_str" : "49653585", + "id" : "49653585" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "140" + ], + "favorite_count" : "0", + "id_str" : "591675269733298176", + "truncated" : false, + "retweet_count" : "0", + "id" : "591675269733298176", + "created_at" : "Fri Apr 24 18:49:11 +0000 2015", + "favorited" : false, + "full_text" : "RT @ng_yvonne: .@eiratansey annotated bibliography on online privacy / right to be forgotten / surveillance: http://t.co/hpemVbzaia #PDA2015", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Bergis Jules 🇱🇨", + "screen_name" : "BergisJules", + "indices" : [ + "3", + "15" + ], + "id_str" : "1012488631", + "id" : "1012488631" + } + ], + "urls" : [ + { + "url" : "https://t.co/Pk1PBmZ076", + "expanded_url" : "https://medium.com/on-archivy/hashtags-of-ferguson-8f52a0aced87?source=tw-9effba784a2c-1429900847167", + "display_url" : "medium.com/on-archivy/has…", + "indices" : [ + "57", + "80" + ] + } + ] + }, + "display_text_range" : [ + "0", + "80" + ], + "favorite_count" : "0", + "id_str" : "591673689386680320", + "truncated" : false, + "retweet_count" : "0", + "id" : "591673689386680320", + "possibly_sensitive" : false, + "created_at" : "Fri Apr 24 18:42:54 +0000 2015", + "favorited" : false, + "full_text" : "RT @BergisJules: I just published “Hashtags of Ferguson” https://t.co/Pk1PBmZ076", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Sarah Hovde", + "screen_name" : "sehovde", + "indices" : [ + "0", + "8" + ], + "id_str" : "331318117", + "id" : "331318117" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "126" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591673176427495425", + "id_str" : "591673599842455554", + "in_reply_to_user_id" : "331318117", + "truncated" : false, + "retweet_count" : "0", + "id" : "591673599842455554", + "in_reply_to_status_id" : "591673176427495425", + "created_at" : "Fri Apr 24 18:42:33 +0000 2015", + "favorited" : false, + "full_text" : "@sehovde sure thing ; thanks for asking about it ; caution: don’t just the rest of the digital dialogues based on that one :-)", + "lang" : "en", + "in_reply_to_screen_name" : "sehovde", + "in_reply_to_user_id_str" : "331318117" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Sarah Hovde", + "screen_name" : "sehovde", + "indices" : [ + "0", + "8" + ], + "id_str" : "331318117", + "id" : "331318117" + }, + { + "name" : "UMD_MITH", + "screen_name" : "UMD_MITH", + "indices" : [ + "43", + "52" + ], + "id_str" : "14086852", + "id" : "14086852" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "52" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591670435688914944", + "id_str" : "591672766765608960", + "in_reply_to_user_id" : "331318117", + "truncated" : false, + "retweet_count" : "0", + "id" : "591672766765608960", + "in_reply_to_status_id" : "591670435688914944", + "created_at" : "Fri Apr 24 18:39:15 +0000 2015", + "favorited" : false, + "full_text" : "@sehovde ok, is it working any better now? @UMD_MITH", + "lang" : "en", + "in_reply_to_screen_name" : "sehovde", + "in_reply_to_user_id_str" : "331318117" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Sarah Hovde", + "screen_name" : "sehovde", + "indices" : [ + "0", + "8" + ], + "id_str" : "331318117", + "id" : "331318117" + }, + { + "name" : "UMD_MITH", + "screen_name" : "UMD_MITH", + "indices" : [ + "73", + "82" + ], + "id_str" : "14086852", + "id" : "14086852" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "82" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591670435688914944", + "id_str" : "591671713626193920", + "in_reply_to_user_id" : "331318117", + "truncated" : false, + "retweet_count" : "0", + "id" : "591671713626193920", + "in_reply_to_status_id" : "591670435688914944", + "created_at" : "Fri Apr 24 18:35:03 +0000 2015", + "favorited" : false, + "full_text" : "@sehovde well played :-) I see a 503 too ; hopefully more to report soon @UMD_MITH", + "lang" : "en", + "in_reply_to_screen_name" : "sehovde", + "in_reply_to_user_id_str" : "331318117" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ ], + "urls" : [ + { + "url" : "https://t.co/NxdPF8Pgzp", + "expanded_url" : "https://indiewebcamp.com/IRC-people", + "display_url" : "indiewebcamp.com/IRC-people", + "indices" : [ + "35", + "58" + ] + } + ] + }, + "display_text_range" : [ + "0", + "123" + ], + "favorite_count" : "0", + "id_str" : "591671252793831424", + "in_reply_to_user_id" : "14175981", + "truncated" : false, + "retweet_count" : "0", + "id" : "591671252793831424", + "possibly_sensitive" : false, + "created_at" : "Fri Apr 24 18:33:14 +0000 2015", + "favorited" : false, + "full_text" : "@BryanSchuetz noticed your name at https://t.co/NxdPF8Pgzp do you have any interest in starting a dc homebrew website club?", + "lang" : "en", + "in_reply_to_screen_name" : "EndOfLine_Etc", + "in_reply_to_user_id_str" : "14175981" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ + { + "text" : "microformats2", + "indices" : [ + "87", + "101" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Tantek", + "screen_name" : "t", + "indices" : [ + "3", + "5" + ], + "id_str" : "11628", + "id" : "11628" + }, + { + "name" : "Aaron Parecki", + "screen_name" : "aaronpk", + "indices" : [ + "24", + "32" + ], + "id_str" : "14447132", + "id" : "14447132" + }, + { + "name" : "Hacker News", + "screen_name" : "hackernews", + "indices" : [ + "36", + "47" + ], + "id_str" : "1446511782181232643", + "id" : "1446511782181232643" + } + ], + "urls" : [ + { + "url" : "https://t.co/0cLkxhlOwC", + "expanded_url" : "https://aaronparecki.com/articles/2015/04/26/1/html-is-my-api", + "display_url" : "aaronparecki.com/articles/2015/…", + "indices" : [ + "102", + "125" + ] + } + ] + }, + "display_text_range" : [ + "0", + "140" + ], + "favorite_count" : "0", + "id_str" : "592871869860155392", + "truncated" : false, + "retweet_count" : "0", + "id" : "592871869860155392", + "possibly_sensitive" : false, + "created_at" : "Tue Apr 28 02:04:03 +0000 2015", + "favorited" : false, + "full_text" : "RT @t: “HTML is my API” @aaronpk on @HackerNews’s HTML vs JSON, reliability, and using #microformats2 https://t.co/0cLkxhlOwC (ttk.me t4ah1)", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "No Reply", + "screen_name" : "no_reply", + "indices" : [ + "0", + "9" + ], + "id_str" : "1529927259850784775", + "id" : "1529927259850784775" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "15" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "592793625056116736", + "id_str" : "592795876424298496", + "in_reply_to_user_id" : "14299418", + "truncated" : false, + "retweet_count" : "0", + "id" : "592795876424298496", + "in_reply_to_status_id" : "592793625056116736", + "created_at" : "Mon Apr 27 21:02:05 +0000 2015", + "favorited" : false, + "full_text" : "@no_reply yeah!", + "lang" : "en", + "in_reply_to_user_id_str" : "14299418" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ + { + "text" : "uhhh", + "indices" : [ + "106", + "111" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "111" + ], + "favorite_count" : "5", + "id_str" : "592793001161809921", + "truncated" : false, + "retweet_count" : "1", + "id" : "592793001161809921", + "created_at" : "Mon Apr 27 20:50:39 +0000 2015", + "favorited" : false, + "full_text" : "“Your experience in object oriented programming looks to be a good fit with the work we are engaging in.” #uhhh", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "iOS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Daniel Victor", + "screen_name" : "bydanielvictor", + "indices" : [ + "59", + "74" + ], + "id_str" : "11545652", + "id" : "11545652" + } + ], + "urls" : [ + { + "url" : "https://t.co/Nmr56WXNji", + "expanded_url" : "https://medium.com/p/fadab1bc34e8", + "display_url" : "medium.com/p/fadab1bc34e8", + "indices" : [ + "75", + "98" + ] + } + ] + }, + "display_text_range" : [ + "0", + "98" + ], + "favorite_count" : "1", + "id_str" : "592790655488946176", + "truncated" : false, + "retweet_count" : "0", + "id" : "592790655488946176", + "possibly_sensitive" : false, + "created_at" : "Mon Apr 27 20:41:20 +0000 2015", + "favorited" : false, + "full_text" : "“The one word reporters should add to Twitter searches” by @bydanielvictor https://t.co/Nmr56WXNji", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "user_mentions" : [ + { + "name" : "RT", + "screen_name" : "RT_com", + "indices" : [ + "3", + "10" + ], + "id_str" : "64643056", + "id" : "64643056" + } + ], + "urls" : [ + { + "url" : "http://t.co/YvZCCMrYvp", + "expanded_url" : "http://on.rt.com/ig3bis", + "display_url" : "on.rt.com/ig3bis", + "indices" : [ + "84", + "106" + ] + } + ], + "symbols" : [ ], + "media" : [ + { + "expanded_url" : "https://twitter.com/RT_com/status/592779177855688706/photo/1", + "source_status_id" : "592779177855688706", + "indices" : [ + "107", + "129" + ], + "url" : "http://t.co/UyBt9Fk0Tv", + "media_url" : "http://pbs.twimg.com/media/CDn5hOJXIAEl3YE.png", + "id_str" : "592779175104290817", + "source_user_id" : "64643056", + "id" : "592779175104290817", + "media_url_https" : "https://pbs.twimg.com/media/CDn5hOJXIAEl3YE.png", + "source_user_id_str" : "64643056", + "sizes" : { + "medium" : { + "w" : "913", + "h" : "503", + "resize" : "fit" + }, + "large" : { + "w" : "913", + "h" : "503", + "resize" : "fit" + }, + "thumb" : { + "w" : "150", + "h" : "150", + "resize" : "crop" + }, + "small" : { + "w" : "680", + "h" : "375", + "resize" : "fit" + } + }, + "type" : "photo", + "source_status_id_str" : "592779177855688706", + "display_url" : "pic.twitter.com/UyBt9Fk0Tv" + } + ], + "hashtags" : [ + { + "text" : "FreddieGray", + "indices" : [ + "63", + "75" + ] + } + ] + }, + "display_text_range" : [ + "0", + "129" + ], + "favorite_count" : "0", + "id_str" : "592786923753762816", + "truncated" : false, + "retweet_count" : "0", + "withheld_in_countries" : [ + "AT", + "BE", + "BG", + "CY", + "CZ", + "DE", + "DK", + "EE", + "ES", + "FI", + "FR", + "GB", + "GR", + "HR", + "HU", + "IE", + "IT", + "LT", + "LU", + "LV", + "MT", + "NL", + "PL", + "PT", + "RO", + "SE", + "SI", + "SK" + ], + "id" : "592786923753762816", + "possibly_sensitive" : false, + "created_at" : "Mon Apr 27 20:26:30 +0000 2015", + "favorited" : false, + "full_text" : "RT @RT_com: WATCH LIVE: Violence erupts in Baltimore following #FreddieGray funeral http://t.co/YvZCCMrYvp http://t.co/UyBt9Fk0Tv", + "lang" : "en", + "extended_entities" : { + "media" : [ + { + "expanded_url" : "https://twitter.com/RT_com/status/592779177855688706/photo/1", + "source_status_id" : "592779177855688706", + "indices" : [ + "107", + "129" + ], + "url" : "http://t.co/UyBt9Fk0Tv", + "media_url" : "http://pbs.twimg.com/media/CDn5hOJXIAEl3YE.png", + "id_str" : "592779175104290817", + "source_user_id" : "64643056", + "id" : "592779175104290817", + "media_url_https" : "https://pbs.twimg.com/media/CDn5hOJXIAEl3YE.png", + "source_user_id_str" : "64643056", + "sizes" : { + "medium" : { + "w" : "913", + "h" : "503", + "resize" : "fit" + }, + "large" : { + "w" : "913", + "h" : "503", + "resize" : "fit" + }, + "thumb" : { + "w" : "150", + "h" : "150", + "resize" : "crop" + }, + "small" : { + "w" : "680", + "h" : "375", + "resize" : "fit" + } + }, + "type" : "photo", + "source_status_id_str" : "592779177855688706", + "display_url" : "pic.twitter.com/UyBt9Fk0Tv" + } + ] + } + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ + { + "text" : "SMArchiving", + "indices" : [ + "38", + "50" + ] + }, + { + "text" : "Hypertext2015", + "indices" : [ + "63", + "77" + ] + }, + { + "text" : "socialmedia", + "indices" : [ + "113", + "125" + ] + }, + { + "text" : "archiving", + "indices" : [ + "126", + "136" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Bahareh Heravi", + "screen_name" : "Bahareh360", + "indices" : [ + "3", + "14" + ], + "id_str" : "120098573", + "id" : "120098573" + } + ], + "urls" : [ + { + "url" : "http://t.co/I4c6TuIJJN", + "expanded_url" : "http://www.socialmediaarchiving.net", + "display_url" : "socialmediaarchiving.net", + "indices" : [ + "90", + "112" + ] + } + ] + }, + "display_text_range" : [ + "0", + "140" + ], + "favorite_count" : "0", + "id_str" : "592760066371125248", + "truncated" : false, + "retweet_count" : "0", + "id" : "592760066371125248", + "possibly_sensitive" : false, + "created_at" : "Mon Apr 27 18:39:47 +0000 2015", + "favorited" : false, + "full_text" : "RT @Bahareh360: Paper submissions for #SMArchiving workshop at #Hypertext2015 is now open http://t.co/I4c6TuIJJN #socialmedia #archiving #s…", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ + { + "text" : "Parren15", + "indices" : [ + "44", + "53" + ] + }, + { + "text" : "twitterchat", + "indices" : [ + "114", + "126" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Dr. Rashawn Ray", + "screen_name" : "SociologistRay", + "indices" : [ + "3", + "18" + ], + "id_str" : "551230758", + "id" : "551230758" + }, + { + "name" : "Critical Race @ UMD", + "screen_name" : "UMD_CRI", + "indices" : [ + "54", + "62" + ], + "id_str" : "2835267689", + "id" : "2835267689" + } + ], + "urls" : [ + { + "url" : "https://t.co/Dckn6u0btR", + "expanded_url" : "https://twitter.com/docjorich/status/592104464758214656", + "display_url" : "twitter.com/docjorich/stat…", + "indices" : [ + "20", + "43" + ] + } + ] + }, + "display_text_range" : [ + "0", + "140" + ], + "favorite_count" : "0", + "id_str" : "592736776965480448", + "truncated" : false, + "retweet_count" : "0", + "id" : "592736776965480448", + "possibly_sensitive" : false, + "created_at" : "Mon Apr 27 17:07:14 +0000 2015", + "favorited" : false, + "full_text" : "RT @SociologistRay: https://t.co/Dckn6u0btR\n#Parren15 @UMD_CRI will discuss this Tuesday at 2pm! Tune in live for #twitterchat http://t.co/…", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Nick Krabbenhoeft 🆗", + "screen_name" : "NKrabben", + "indices" : [ + "0", + "9" + ], + "id_str" : "21232655", + "id" : "21232655" + }, + { + "name" : "E Reynolds", + "screen_name" : "emilyrnlds", + "indices" : [ + "10", + "21" + ], + "id_str" : "27699583", + "id" : "27699583" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "57" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "592676885601132544", + "id_str" : "592677109606277121", + "in_reply_to_user_id" : "21232655", + "truncated" : false, + "retweet_count" : "0", + "id" : "592677109606277121", + "in_reply_to_status_id" : "592676885601132544", + "created_at" : "Mon Apr 27 13:10:08 +0000 2015", + "favorited" : false, + "full_text" : "@NKrabben @emilyrnlds nice, thanks for the extra details!", + "lang" : "en", + "in_reply_to_screen_name" : "NKrabben", + "in_reply_to_user_id_str" : "21232655" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "E Reynolds", + "screen_name" : "emilyrnlds", + "indices" : [ + "0", + "11" + ], + "id_str" : "27699583", + "id" : "27699583" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "112" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "592645378752778240", + "id_str" : "592670272202899456", + "in_reply_to_user_id" : "27699583", + "truncated" : false, + "retweet_count" : "0", + "id" : "592670272202899456", + "in_reply_to_status_id" : "592645378752778240", + "created_at" : "Mon Apr 27 12:42:58 +0000 2015", + "favorited" : false, + "full_text" : "@emilyrnlds nice! Was the 1500 just to make things practical for the workshop? Or was that a limit of some kind?", + "lang" : "en", + "in_reply_to_screen_name" : "emilyrnlds", + "in_reply_to_user_id_str" : "27699583" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "E Reynolds", + "screen_name" : "emilyrnlds", + "indices" : [ + "0", + "11" + ], + "id_str" : "27699583", + "id" : "27699583" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "52" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "592327116622012416", + "id_str" : "592631854236364800", + "in_reply_to_user_id" : "27699583", + "truncated" : false, + "retweet_count" : "0", + "id" : "592631854236364800", + "in_reply_to_status_id" : "592327116622012416", + "created_at" : "Mon Apr 27 10:10:19 +0000 2015", + "favorited" : false, + "full_text" : "@emilyrnlds how well did ePADD work on that content?", + "lang" : "en", + "in_reply_to_screen_name" : "emilyrnlds", + "in_reply_to_user_id_str" : "27699583" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweekly.fm", + "entities" : { + "hashtags" : [ + { + "text" : "lastfm", + "indices" : [ + "9", + "16" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ ], + "urls" : [ + { + "url" : "http://t.co/ZqEb9nxUuV", + "expanded_url" : "http://bit.ly/crfbed", + "display_url" : "bit.ly/crfbed", + "indices" : [ + "82", + "104" + ] + } + ] + }, + "display_text_range" : [ + "0", + "104" + ], + "favorite_count" : "1", + "id_str" : "592358842383659008", + "truncated" : false, + "retweet_count" : "0", + "id" : "592358842383659008", + "possibly_sensitive" : false, + "created_at" : "Sun Apr 26 16:05:28 +0000 2015", + "favorited" : false, + "full_text" : "My Top 3 #lastfm Artists: Pale Blue (13), Wire (11) & Fennesz + Sakamoto (11) http://t.co/ZqEb9nxUuV", + "lang" : "pl" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "deray", + "screen_name" : "deray", + "indices" : [ + "3", + "9" + ], + "id_str" : "29417304", + "id" : "29417304" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "140" + ], + "favorite_count" : "0", + "id_str" : "592282954811965440", + "truncated" : false, + "retweet_count" : "0", + "id" : "592282954811965440", + "created_at" : "Sun Apr 26 11:03:55 +0000 2015", + "favorited" : false, + "full_text" : "RT @deray: Property damage is not violence, it is property damage. Violence is when people are hurt, injured, harmed. The police have been …", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "hot babie hippo⁷", + "screen_name" : "melaninbarbie", + "indices" : [ + "3", + "17" + ], + "id_str" : "568773626", + "id" : "568773626" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "125" + ], + "favorite_count" : "0", + "id_str" : "592144262160117760", + "truncated" : false, + "retweet_count" : "0", + "id" : "592144262160117760", + "created_at" : "Sun Apr 26 01:52:48 +0000 2015", + "favorited" : false, + "full_text" : "RT @melaninbarbie: Broken police cars can be replaced. Windows can be fixed. But people cannot be brought back from the dead.", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Baltimore Police", + "screen_name" : "BaltimorePolice", + "indices" : [ + "1", + "17" + ], + "id_str" : "22197119", + "id" : "22197119" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "44" + ], + "favorite_count" : "0", + "id_str" : "592137920003321856", + "truncated" : false, + "retweet_count" : "0", + "id" : "592137920003321856", + "created_at" : "Sun Apr 26 01:27:36 +0000 2015", + "favorited" : false, + "full_text" : ".@BaltimorePolice tweets seem eerily robotic", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ + { + "text" : "FreddieGray", + "indices" : [ + "38", + "50" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Eileen Clancy", + "screen_name" : "clancynewyork", + "indices" : [ + "3", + "17" + ], + "id_str" : "1711281463", + "id" : "1711281463" + }, + { + "name" : "Ed Summers", + "screen_name" : "edsu", + "indices" : [ + "108", + "113" + ], + "id_str" : "14331818", + "id" : "14331818" + } + ], + "urls" : [ + { + "url" : "http://t.co/EONiU6cvI3", + "expanded_url" : "http://edsu.github.io/freddiegray-tweet-viewer/", + "display_url" : "edsu.github.io/freddiegray-tw…", + "indices" : [ + "114", + "136" + ] + } + ] + }, + "display_text_range" : [ + "0", + "140" + ], + "favorite_count" : "0", + "id_str" : "592136540740034560", + "truncated" : false, + "retweet_count" : "0", + "id" : "592136540740034560", + "possibly_sensitive" : false, + "created_at" : "Sun Apr 26 01:22:07 +0000 2015", + "favorited" : false, + "full_text" : "RT @clancynewyork: Best 1% of 190,000 #FreddieGray tweets w/images, video, audio. Amazing looking, powerful @edsu http://t.co/EONiU6cvI3 ht…", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ + { + "text" : "freddiegray", + "indices" : [ + "30", + "42" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Eileen Clancy", + "screen_name" : "clancynewyork", + "indices" : [ + "97", + "111" + ], + "id_str" : "1711281463", + "id" : "1711281463" + } + ], + "urls" : [ + { + "url" : "http://t.co/h9HhPsbg6b", + "expanded_url" : "http://edsu.github.io/freddiegray-tweet-viewer/", + "display_url" : "edsu.github.io/freddiegray-tw…", + "indices" : [ + "50", + "72" + ] + } + ] + }, + "display_text_range" : [ + "0", + "111" + ], + "favorite_count" : "0", + "id_str" : "592123992045133824", + "truncated" : false, + "retweet_count" : "0", + "id" : "592123992045133824", + "possibly_sensitive" : false, + "created_at" : "Sun Apr 26 00:32:15 +0000 2015", + "favorited" : false, + "full_text" : "I just fixed the title on the #freddiegray viewer http://t.co/h9HhPsbg6b thanks for the heads up @clancynewyork", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ + { + "text" : "FreddieGray", + "indices" : [ + "0", + "12" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ ], + "urls" : [ + { + "url" : "https://t.co/3hSfgL7lC2", + "expanded_url" : "https://medium.com/on-archivy/freddiegray-1c332bca11a0?source=tw-3b7be3a90af9-1430000844254", + "display_url" : "medium.com/on-archivy/fre…", + "indices" : [ + "51", + "74" + ] + } + ] + }, + "display_text_range" : [ + "0", + "74" + ], + "favorite_count" : "4", + "id_str" : "592092706375077888", + "truncated" : false, + "retweet_count" : "3", + "id" : "592092706375077888", + "possibly_sensitive" : false, + "created_at" : "Sat Apr 25 22:27:56 +0000 2015", + "favorited" : false, + "full_text" : "#FreddieGray - Social Media Imagery in the Archive https://t.co/3hSfgL7lC2", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ + { + "text" : "HRRlive", + "indices" : [ + "102", + "110" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "110" + ], + "favorite_count" : "5", + "id_str" : "592029033992445952", + "truncated" : false, + "retweet_count" : "1", + "id" : "592029033992445952", + "created_at" : "Sat Apr 25 18:14:55 +0000 2015", + "favorited" : false, + "full_text" : ".@AVAETC If everyone is agreeing and patting you on the back you probably aren’t doing rigorous work. #HRRlive", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Martin Klein", + "screen_name" : "mart1nkle1n", + "indices" : [ + "0", + "12" + ], + "id_str" : "337124515", + "id" : "337124515" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "42" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "591990544022253568", + "id_str" : "591999617845358594", + "in_reply_to_user_id" : "337124515", + "truncated" : false, + "retweet_count" : "0", + "id" : "591999617845358594", + "in_reply_to_status_id" : "591990544022253568", + "created_at" : "Sat Apr 25 16:18:02 +0000 2015", + "favorited" : false, + "full_text" : "@mart1nkle1n neat, how are you doing that?", + "lang" : "en", + "in_reply_to_screen_name" : "mart1nkle1n", + "in_reply_to_user_id_str" : "337124515" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ + { + "text" : "Parren15", + "indices" : [ + "81", + "90" + ] + }, + { + "text" : "FreddieGray", + "indices" : [ + "91", + "103" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ ], + "urls" : [ + { + "url" : "http://t.co/9njXo8QaTN", + "expanded_url" : "http://www.socy.umd.edu/feature/2nd-annual-parren-mitchell-symposium-intellectual-activism-social-justice-criminalization", + "display_url" : "socy.umd.edu/feature/2nd-an…", + "indices" : [ + "104", + "126" + ] + } + ] + }, + "display_text_range" : [ + "0", + "126" + ], + "favorite_count" : "0", + "id_str" : "593076831340867584", + "truncated" : false, + "retweet_count" : "0", + "id" : "593076831340867584", + "possibly_sensitive" : false, + "created_at" : "Tue Apr 28 15:38:30 +0000 2015", + "favorited" : false, + "full_text" : "off to focus on activism, social justice & criminalization for the afternoon #Parren15 #FreddieGray http://t.co/9njXo8QaTN", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Tom Cramer", + "screen_name" : "tcramer", + "indices" : [ + "0", + "8" + ], + "id_str" : "17345803", + "id" : "17345803" + }, + { + "name" : "Mike Giarlo (he/him/his)", + "screen_name" : "mjgiarlo", + "indices" : [ + "9", + "18" + ], + "id_str" : "14453338", + "id" : "14453338" + }, + { + "name" : "Trevor Owens 💾🗄🕚", + "screen_name" : "tjowens", + "indices" : [ + "19", + "27" + ], + "id_str" : "10034972", + "id" : "10034972" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "121" + ], + "favorite_count" : "3", + "in_reply_to_status_id_str" : "593075564505862145", + "id_str" : "593076215340257280", + "in_reply_to_user_id" : "17345803", + "truncated" : false, + "retweet_count" : "0", + "id" : "593076215340257280", + "in_reply_to_status_id" : "593075564505862145", + "created_at" : "Tue Apr 28 15:36:03 +0000 2015", + "favorited" : false, + "full_text" : "@tcramer @mjgiarlo @tjowens I like it too, because in a lot of respects the National Digital Platform we have is the Web.", + "lang" : "en", + "in_reply_to_screen_name" : "tcramer", + "in_reply_to_user_id_str" : "17345803" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ + { + "text" : "FreddieGray", + "indices" : [ + "9", + "21" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ ], + "urls" : [ + { + "url" : "https://t.co/ylkx7iU7dh", + "expanded_url" : "https://docs.google.com/spreadsheets/d/1WdzsQltp4Z_9NBvxW9_xzmjacCKfWwP_USvMjpn-Nsw/edit?usp=sharing", + "display_url" : "docs.google.com/spreadsheets/d…", + "indices" : [ + "61", + "84" + ] + } + ] + }, + "display_text_range" : [ + "0", + "112" + ], + "favorite_count" : "0", + "id_str" : "593074407494520833", + "truncated" : false, + "retweet_count" : "0", + "id" : "593074407494520833", + "possibly_sensitive" : false, + "created_at" : "Tue Apr 28 15:28:52 +0000 2015", + "favorited" : false, + "full_text" : "ratio of #FreddieGray tweets to retweets and tweets w/ media https://t.co/ylkx7iU7dh may be better viz for this?", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ + { + "text" : "stabseverything", + "indices" : [ + "71", + "87" + ] + }, + { + "text" : "IAmAMomAndIDoFullStackDjango", + "indices" : [ + "88", + "117" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Andromeda Yelton", + "screen_name" : "ThatAndromeda", + "indices" : [ + "3", + "17" + ], + "id_str" : "102080846", + "id" : "102080846" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "117" + ], + "favorite_count" : "0", + "id_str" : "593067798353543169", + "truncated" : false, + "retweet_count" : "0", + "id" : "593067798353543169", + "created_at" : "Tue Apr 28 15:02:36 +0000 2015", + "favorited" : false, + "full_text" : "RT @ThatAndromeda: Auuuugh that \"tech is too hard for my mother\" trope #stabseverything #IAmAMomAndIDoFullStackDjango", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ + { + "text" : "ShutItDown", + "indices" : [ + "107", + "118" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ ], + "urls" : [ + { + "url" : "https://t.co/3mbHnt59Eb", + "expanded_url" : "https://github.com/edsu/earls#archiving", + "display_url" : "github.com/edsu/earls#arc…", + "indices" : [ + "119", + "142" + ] + } + ] + }, + "display_text_range" : [ + "0", + "142" + ], + "favorite_count" : "1", + "id_str" : "593066846024261632", + "truncated" : false, + "retweet_count" : "1", + "id" : "593066846024261632", + "possibly_sensitive" : false, + "created_at" : "Tue Apr 28 14:58:49 +0000 2015", + "favorited" : false, + "full_text" : "also, earls is now simple enough that you can create a static site with wget when your event is over & #ShutItDown https://t.co/3mbHnt59Eb", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ + { + "text" : "iipcGA15", + "indices" : [ + "50", + "59" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ ], + "urls" : [ + { + "url" : "http://t.co/jP50XzYerK", + "expanded_url" : "http://inkdroid.org/iipcGA15/", + "display_url" : "inkdroid.org/iipcGA15/", + "indices" : [ + "88", + "110" + ] + } + ] + }, + "display_text_range" : [ + "0", + "110" + ], + "favorite_count" : "6", + "id_str" : "593065503129772032", + "truncated" : false, + "retweet_count" : "9", + "id" : "593065503129772032", + "possibly_sensitive" : false, + "created_at" : "Tue Apr 28 14:53:29 +0000 2015", + "favorited" : false, + "full_text" : "If you are curious what links people at or around #iipcGA15 are taking about on Twitter http://t.co/jP50XzYerK", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Matthew Kirschenbaum", + "screen_name" : "mkirschenbaum", + "indices" : [ + "115", + "129" + ], + "id_str" : "13598262", + "id" : "13598262" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "129" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "593062634926247937", + "id_str" : "593064413709639681", + "in_reply_to_user_id" : "1434905011", + "truncated" : false, + "retweet_count" : "0", + "id" : "593064413709639681", + "in_reply_to_status_id" : "593062634926247937", + "created_at" : "Tue Apr 28 14:49:09 +0000 2015", + "favorited" : false, + "full_text" : "@KyleBickoff sure, I should’ve mentioned your name since you were the impetus to get moving on it ; i can fix that @mkirschenbaum", + "lang" : "en", + "in_reply_to_screen_name" : "KyleJonB", + "in_reply_to_user_id_str" : "1434905011" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Karen Wickett", + "screen_name" : "karenwickett", + "indices" : [ + "0", + "13" + ], + "id_str" : "22418286", + "id" : "22418286" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "20" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "593030421627084801", + "id_str" : "593032062648586240", + "in_reply_to_user_id" : "22418286", + "truncated" : false, + "retweet_count" : "0", + "id" : "593032062648586240", + "in_reply_to_status_id" : "593030421627084801", + "created_at" : "Tue Apr 28 12:40:36 +0000 2015", + "favorited" : false, + "full_text" : "@karenwickett me too", + "lang" : "en", + "in_reply_to_screen_name" : "karenwickett", + "in_reply_to_user_id_str" : "22418286" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Cody Buntain", + "screen_name" : "codybuntain", + "indices" : [ + "0", + "12" + ], + "id_str" : "363200844", + "id" : "363200844" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "126" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "592933916673232896", + "id_str" : "593001113793748992", + "in_reply_to_user_id" : "363200844", + "truncated" : false, + "retweet_count" : "0", + "id" : "593001113793748992", + "in_reply_to_status_id" : "592933916673232896", + "created_at" : "Tue Apr 28 10:37:37 +0000 2015", + "favorited" : false, + "full_text" : "@codybuntain I’ve always been confused about that 1% that gets talked about ; have you ever seen it mentioned in Twitter docs?", + "lang" : "en", + "in_reply_to_screen_name" : "codybuntain", + "in_reply_to_user_id_str" : "363200844" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Matthew Kirschenbaum", + "screen_name" : "mkirschenbaum", + "indices" : [ + "0", + "14" + ], + "id_str" : "13598262", + "id" : "13598262" + } + ], + "urls" : [ + { + "url" : "https://t.co/AoPaWWaSx3", + "expanded_url" : "https://medium.com/on-archivy/freddiegray-1c332bca11a0", + "display_url" : "medium.com/on-archivy/fre…", + "indices" : [ + "108", + "131" + ] + } + ] + }, + "display_text_range" : [ + "0", + "131" + ], + "favorite_count" : "3", + "in_reply_to_status_id_str" : "592903568295895040", + "id_str" : "592906745095266305", + "in_reply_to_user_id" : "13598262", + "truncated" : false, + "retweet_count" : "1", + "id" : "592906745095266305", + "in_reply_to_status_id" : "592903568295895040", + "possibly_sensitive" : false, + "created_at" : "Tue Apr 28 04:22:38 +0000 2015", + "favorited" : false, + "full_text" : "@mkirschenbaum thanks partly to @KyleBickoff who came and asked about it ; I wrote up some work so far here https://t.co/AoPaWWaSx3", + "lang" : "en", + "in_reply_to_screen_name" : "mkirschenbaum", + "in_reply_to_user_id_str" : "13598262" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Matthew Kirschenbaum", + "screen_name" : "mkirschenbaum", + "indices" : [ + "0", + "14" + ], + "id_str" : "13598262", + "id" : "13598262" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "36" + ], + "favorite_count" : "1", + "in_reply_to_status_id_str" : "592903568295895040", + "id_str" : "592905076601126913", + "in_reply_to_user_id" : "13598262", + "truncated" : false, + "retweet_count" : "0", + "id" : "592905076601126913", + "in_reply_to_status_id" : "592903568295895040", + "created_at" : "Tue Apr 28 04:16:00 +0000 2015", + "favorited" : false, + "full_text" : "@mkirschenbaum yes, since April 15th", + "lang" : "en", + "in_reply_to_screen_name" : "mkirschenbaum", + "in_reply_to_user_id_str" : "13598262" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ + { + "text" : "FreddieGray", + "indices" : [ + "38", + "50" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "58" + ], + "favorite_count" : "4", + "id_str" : "592901034609090561", + "truncated" : false, + "retweet_count" : "4", + "id" : "592901034609090561", + "created_at" : "Tue Apr 28 03:59:56 +0000 2015", + "favorited" : false, + "full_text" : "seeing up to 81 tweets per second for #FreddieGray tonight", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ ], + "urls" : [ + { + "url" : "http://t.co/9njXo8QaTN", + "expanded_url" : "http://www.socy.umd.edu/feature/2nd-annual-parren-mitchell-symposium-intellectual-activism-social-justice-criminalization", + "display_url" : "socy.umd.edu/feature/2nd-an…", + "indices" : [ + "121", + "143" + ] + } + ] + }, + "display_text_range" : [ + "0", + "143" + ], + "favorite_count" : "6", + "id_str" : "592892017480441856", + "truncated" : false, + "retweet_count" : "2", + "id" : "592892017480441856", + "possibly_sensitive" : false, + "created_at" : "Tue Apr 28 03:24:07 +0000 2015", + "favorited" : false, + "full_text" : "UMD’s Mitchell Symposium on Intellectual Activism, Social Justice, & Criminalization tomorrow is going to be intense http://t.co/9njXo8QaTN", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Bergis Jules 🇱🇨", + "screen_name" : "BergisJules", + "indices" : [ + "3", + "15" + ], + "id_str" : "1012488631", + "id" : "1012488631" + }, + { + "name" : "VICE News", + "screen_name" : "VICENews", + "indices" : [ + "20", + "29" + ], + "id_str" : "1630896181", + "id" : "1630896181" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "140" + ], + "favorite_count" : "0", + "id_str" : "592887102842531841", + "truncated" : false, + "retweet_count" : "0", + "id" : "592887102842531841", + "created_at" : "Tue Apr 28 03:04:35 +0000 2015", + "favorited" : false, + "full_text" : "RT @BergisJules: RT @vicenews Baltimore mayor says police will use images from social media and broadcast video to prosecute rioters: http:…", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Ondatra iSchoolicus", + "screen_name" : "LibSkrat", + "indices" : [ + "0", + "9" + ], + "id_str" : "47360004", + "id" : "47360004" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "117" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "592880490643861504", + "id_str" : "592882180201775104", + "in_reply_to_user_id" : "47360004", + "truncated" : false, + "retweet_count" : "0", + "id" : "592882180201775104", + "in_reply_to_status_id" : "592880490643861504", + "created_at" : "Tue Apr 28 02:45:01 +0000 2015", + "favorited" : false, + "full_text" : "@LibSkrat wow, that is loathesome; fortunately I have no idea how I could ever even try to collect that information.", + "lang" : "en", + "in_reply_to_screen_name" : "LibSkrat", + "in_reply_to_user_id_str" : "47360004" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "", + "screen_name" : "Virtuous_Queen_", + "indices" : [ + "3", + "19" + ], + "id_str" : "-1", + "id" : "-1" + }, + { + "name" : "kay", + "screen_name" : "kyyraa_", + "indices" : [ + "22", + "30" + ], + "id_str" : "1426087979504705538", + "id" : "1426087979504705538" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "140" + ], + "favorite_count" : "0", + "id_str" : "592880905770901504", + "truncated" : false, + "retweet_count" : "0", + "id" : "592880905770901504", + "created_at" : "Tue Apr 28 02:39:57 +0000 2015", + "favorited" : false, + "full_text" : "RT @Virtuous_Queen_: “@kyyraa_: Someone: \"violence is not the answer\"\nSame person: \" AMERICAN SNIPER IS SUCH A GOOODDDDDDDDD MOVIEEEE\"” thi…", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Ondatra iSchoolicus", + "screen_name" : "LibSkrat", + "indices" : [ + "0", + "9" + ], + "id_str" : "47360004", + "id" : "47360004" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "76" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "592878545568931841", + "id_str" : "592879504273604608", + "in_reply_to_user_id" : "47360004", + "truncated" : false, + "retweet_count" : "0", + "id" : "592879504273604608", + "in_reply_to_status_id" : "592878545568931841", + "created_at" : "Tue Apr 28 02:34:23 +0000 2015", + "favorited" : false, + "full_text" : "@LibSkrat I feel like I should know what you are talking about. But I don’t.", + "lang" : "en", + "in_reply_to_screen_name" : "LibSkrat", + "in_reply_to_user_id_str" : "47360004" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "stacia l. brown", + "screen_name" : "slb79", + "indices" : [ + "3", + "9" + ], + "id_str" : "32178047", + "id" : "32178047" + } + ], + "urls" : [ + { + "url" : "https://t.co/4vLu4vnvZc", + "expanded_url" : "https://twitter.com/taylorlorenz/status/592846891643236352", + "display_url" : "twitter.com/taylorlorenz/s…", + "indices" : [ + "22", + "45" + ] + } + ] + }, + "display_text_range" : [ + "0", + "45" + ], + "favorite_count" : "0", + "id_str" : "592876429878140929", + "truncated" : false, + "retweet_count" : "0", + "id" : "592876429878140929", + "possibly_sensitive" : false, + "created_at" : "Tue Apr 28 02:22:10 +0000 2015", + "favorited" : false, + "full_text" : "RT @slb79: *mic drop* https://t.co/4vLu4vnvZc", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "62" + ], + "favorite_count" : "1", + "id_str" : "592875813252558849", + "truncated" : false, + "retweet_count" : "1", + "id" : "592875813252558849", + "created_at" : "Tue Apr 28 02:19:43 +0000 2015", + "favorited" : false, + "full_text" : "So uh, did we decide if Facebook needed to be archived or not?", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Miriam Posner", + "screen_name" : "miriamkp", + "indices" : [ + "0", + "9" + ], + "id_str" : "56812711", + "id" : "56812711" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "59" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "592804798795272192", + "id_str" : "592873572978294785", + "in_reply_to_user_id" : "56812711", + "truncated" : false, + "retweet_count" : "0", + "id" : "592873572978294785", + "in_reply_to_status_id" : "592804798795272192", + "created_at" : "Tue Apr 28 02:10:49 +0000 2015", + "favorited" : false, + "full_text" : "@miriamkp nytimes & guardian have a lot of API going on", + "lang" : "en", + "in_reply_to_screen_name" : "miriamkp", + "in_reply_to_user_id_str" : "56812711" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ + { + "text" : "imlsfocus", + "indices" : [ + "35", + "45" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "hannah sommers", + "screen_name" : "hsommers", + "indices" : [ + "0", + "9" + ], + "id_str" : "21882385", + "id" : "21882385" + }, + { + "name" : "Trevor Muñoz", + "screen_name" : "trevormunoz", + "indices" : [ + "10", + "22" + ], + "id_str" : "16149989", + "id" : "16149989" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "133" + ], + "favorite_count" : "1", + "in_reply_to_status_id_str" : "593212882256560128", + "id_str" : "593217852460654593", + "in_reply_to_user_id" : "21882385", + "truncated" : false, + "retweet_count" : "1", + "id" : "593217852460654593", + "in_reply_to_status_id" : "593212882256560128", + "created_at" : "Wed Apr 29 00:58:52 +0000 2015", + "favorited" : false, + "full_text" : "@hsommers @trevormunoz I wasn’t at #imlsfocus but I worry sometimes that the issue of scale is a distraction and excuse for inaction.", + "lang" : "en", + "in_reply_to_screen_name" : "hsommers", + "in_reply_to_user_id_str" : "21882385" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "hannah sommers", + "screen_name" : "hsommers", + "indices" : [ + "0", + "9" + ], + "id_str" : "21882385", + "id" : "21882385" + }, + { + "name" : "Trevor Muñoz", + "screen_name" : "trevormunoz", + "indices" : [ + "10", + "22" + ], + "id_str" : "16149989", + "id" : "16149989" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "129" + ], + "favorite_count" : "1", + "in_reply_to_status_id_str" : "593212882256560128", + "id_str" : "593217188414251009", + "in_reply_to_user_id" : "21882385", + "truncated" : false, + "retweet_count" : "0", + "id" : "593217188414251009", + "in_reply_to_status_id" : "593212882256560128", + "created_at" : "Wed Apr 29 00:56:13 +0000 2015", + "favorited" : false, + "full_text" : "@hsommers @trevormunoz at the same time, there’s no better place to enact those big ideas/plans than in your own career/practice.", + "lang" : "en", + "in_reply_to_screen_name" : "hsommers", + "in_reply_to_user_id_str" : "21882385" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ + { + "text" : "IMLSfocus", + "indices" : [ + "25", + "35" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Trevor Owens 💾🗄🕚", + "screen_name" : "tjowens", + "indices" : [ + "3", + "11" + ], + "id_str" : "10034972", + "id" : "10034972" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "143" + ], + "favorite_count" : "0", + "id_str" : "593216011035385857", + "truncated" : false, + "retweet_count" : "0", + "id" : "593216011035385857", + "created_at" : "Wed Apr 29 00:51:33 +0000 2015", + "favorited" : false, + "full_text" : "RT @tjowens: Reminder to #IMLSfocus crowd. Anyone can read the first four funded national digital platform proposals -> http://t.co/7jhGv48…", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "iOS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Nigel Warburton 🧡 #RejoinEU 🇺🇦", + "screen_name" : "philosophybites", + "indices" : [ + "1", + "17" + ], + "id_str" : "37238862", + "id" : "37238862" + } + ], + "urls" : [ + { + "url" : "http://t.co/2WGqU3nAVr", + "expanded_url" : "http://philosophybites.com/2015/01/meira-levinson-on-the-aims-of-education.html", + "display_url" : "philosophybites.com/2015/01/meira-…", + "indices" : [ + "58", + "80" + ] + } + ] + }, + "display_text_range" : [ + "0", + "80" + ], + "favorite_count" : "0", + "id_str" : "593213263405555713", + "truncated" : false, + "retweet_count" : "0", + "id" : "593213263405555713", + "possibly_sensitive" : false, + "created_at" : "Wed Apr 29 00:40:38 +0000 2015", + "favorited" : false, + "full_text" : ".@philosophybites Meira Levinson on the Aims of Education http://t.co/2WGqU3nAVr", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "user_mentions" : [ + { + "name" : "PBS NewsHour", + "screen_name" : "NewsHour", + "indices" : [ + "3", + "12" + ], + "id_str" : "14437914", + "id" : "14437914" + } + ], + "urls" : [ + { + "url" : "http://t.co/pRdkMobGpt", + "expanded_url" : "http://to.pbs.org/1DIYKCL", + "display_url" : "to.pbs.org/1DIYKCL", + "indices" : [ + "73", + "95" + ] + } + ], + "symbols" : [ ], + "media" : [ + { + "expanded_url" : "https://twitter.com/NewsHour/status/593189215787061248/photo/1", + "source_status_id" : "593189215787061248", + "indices" : [ + "96", + "118" + ], + "url" : "http://t.co/ZBVJumnSTF", + "media_url" : "http://pbs.twimg.com/media/CDtfOMwWYAAGhTU.jpg", + "id_str" : "593172473476177920", + "source_user_id" : "14437914", + "id" : "593172473476177920", + "media_url_https" : "https://pbs.twimg.com/media/CDtfOMwWYAAGhTU.jpg", + "source_user_id_str" : "14437914", + "sizes" : { + "thumb" : { + "w" : "150", + "h" : "150", + "resize" : "crop" + }, + "medium" : { + "w" : "1024", + "h" : "696", + "resize" : "fit" + }, + "large" : { + "w" : "1024", + "h" : "696", + "resize" : "fit" + }, + "small" : { + "w" : "680", + "h" : "462", + "resize" : "fit" + } + }, + "type" : "photo", + "source_status_id_str" : "593189215787061248", + "display_url" : "pic.twitter.com/ZBVJumnSTF" + } + ], + "hashtags" : [ ] + }, + "display_text_range" : [ + "0", + "118" + ], + "favorite_count" : "0", + "id_str" : "593189627827232768", + "truncated" : false, + "retweet_count" : "0", + "id" : "593189627827232768", + "possibly_sensitive" : false, + "created_at" : "Tue Apr 28 23:06:42 +0000 2015", + "favorited" : false, + "full_text" : "RT @NewsHour: Baltimore libraries stay open to provide community support http://t.co/pRdkMobGpt http://t.co/ZBVJumnSTF", + "lang" : "en", + "extended_entities" : { + "media" : [ + { + "expanded_url" : "https://twitter.com/NewsHour/status/593189215787061248/photo/1", + "source_status_id" : "593189215787061248", + "indices" : [ + "96", + "118" + ], + "url" : "http://t.co/ZBVJumnSTF", + "media_url" : "http://pbs.twimg.com/media/CDtfOMwWYAAGhTU.jpg", + "id_str" : "593172473476177920", + "source_user_id" : "14437914", + "id" : "593172473476177920", + "media_url_https" : "https://pbs.twimg.com/media/CDtfOMwWYAAGhTU.jpg", + "source_user_id_str" : "14437914", + "sizes" : { + "thumb" : { + "w" : "150", + "h" : "150", + "resize" : "crop" + }, + "medium" : { + "w" : "1024", + "h" : "696", + "resize" : "fit" + }, + "large" : { + "w" : "1024", + "h" : "696", + "resize" : "fit" + }, + "small" : { + "w" : "680", + "h" : "462", + "resize" : "fit" + } + }, + "type" : "photo", + "source_status_id_str" : "593189215787061248", + "display_url" : "pic.twitter.com/ZBVJumnSTF" + } + ] + } + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "code4lib channel bot", + "screen_name" : "bot4lib", + "indices" : [ + "0", + "8" + ], + "id_str" : "116458525", + "id" : "116458525" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "48" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "593162074789781505", + "id_str" : "593170138955907072", + "in_reply_to_user_id" : "116458525", + "truncated" : false, + "retweet_count" : "0", + "id" : "593170138955907072", + "in_reply_to_status_id" : "593162074789781505", + "created_at" : "Tue Apr 28 21:49:16 +0000 2015", + "favorited" : false, + "full_text" : "@bot4lib why would I bother collecting that? :-)", + "lang" : "en", + "in_reply_to_screen_name" : "bot4lib", + "in_reply_to_user_id_str" : "116458525" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Gordon Mohr ꧁👁👁꧂", + "screen_name" : "gojomo", + "indices" : [ + "0", + "7" + ], + "id_str" : "794767", + "id" : "794767" + } + ], + "urls" : [ + { + "url" : "http://t.co/4CbQ3ty9Xi", + "expanded_url" : "http://edsu.github.io/pda2015/", + "display_url" : "edsu.github.io/pda2015/", + "indices" : [ + "117", + "139" + ] + } + ] + }, + "display_text_range" : [ + "0", + "139" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "593165922329755648", + "id_str" : "593166629950922753", + "in_reply_to_user_id" : "794767", + "truncated" : false, + "retweet_count" : "0", + "id" : "593166629950922753", + "in_reply_to_status_id" : "593165922329755648", + "possibly_sensitive" : false, + "created_at" : "Tue Apr 28 21:35:19 +0000 2015", + "favorited" : false, + "full_text" : "@gojomo I've been starting it up as needed and then putting a static snapshot on github when the event is over, e.g. http://t.co/4CbQ3ty9Xi", + "lang" : "en", + "in_reply_to_screen_name" : "gojomo", + "in_reply_to_user_id_str" : "794767" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Gordon Mohr ꧁👁👁꧂", + "screen_name" : "gojomo", + "indices" : [ + "0", + "7" + ], + "id_str" : "794767", + "id" : "794767" + } + ], + "urls" : [ + { + "url" : "https://t.co/kze226na3z", + "expanded_url" : "https://github.com/edsu/earls", + "display_url" : "github.com/edsu/earls", + "indices" : [ + "60", + "83" + ] + } + ] + }, + "display_text_range" : [ + "0", + "137" + ], + "favorite_count" : "1", + "in_reply_to_status_id_str" : "593165922329755648", + "id_str" : "593166201775386625", + "in_reply_to_user_id" : "794767", + "truncated" : false, + "retweet_count" : "0", + "id" : "593166201775386625", + "in_reply_to_status_id" : "593165922329755648", + "possibly_sensitive" : false, + "created_at" : "Tue Apr 28 21:33:37 +0000 2015", + "favorited" : false, + "full_text" : "@gojomo yeah, right now you start it up for a given hashtag https://t.co/kze226na3z it could be more generalizable without too much work?", + "lang" : "en", + "in_reply_to_screen_name" : "gojomo", + "in_reply_to_user_id_str" : "794767" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ + { + "text" : "Parren15", + "indices" : [ + "114", + "123" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Neil Fraistat", + "screen_name" : "fraistat", + "indices" : [ + "3", + "12" + ], + "id_str" : "14089054", + "id" : "14089054" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "123" + ], + "favorite_count" : "0", + "id_str" : "593165935843893248", + "truncated" : false, + "retweet_count" : "0", + "id" : "593165935843893248", + "created_at" : "Tue Apr 28 21:32:34 +0000 2015", + "favorited" : false, + "full_text" : "RT @fraistat: Intellectual activism starts with understanding who \"counts\" as an intellectual in the first place. #Parren15", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Rachel Donahue", + "screen_name" : "sheepeeh", + "indices" : [ + "0", + "9" + ], + "id_str" : "35236404", + "id" : "35236404" + }, + { + "name" : "Trevor Muñoz", + "screen_name" : "trevormunoz", + "indices" : [ + "10", + "22" + ], + "id_str" : "16149989", + "id" : "16149989" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "79" + ], + "favorite_count" : "1", + "in_reply_to_status_id_str" : "593121328808341504", + "id_str" : "593160094705131520", + "in_reply_to_user_id" : "35236404", + "truncated" : false, + "retweet_count" : "0", + "id" : "593160094705131520", + "in_reply_to_status_id" : "593121328808341504", + "created_at" : "Tue Apr 28 21:09:21 +0000 2015", + "favorited" : false, + "full_text" : "@sheepeeh @trevormunoz I kinda want to scale down. Can purple unicorns do that?", + "lang" : "en", + "in_reply_to_screen_name" : "sheepeeh", + "in_reply_to_user_id_str" : "35236404" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ + { + "text" : "imlsfocus", + "indices" : [ + "52", + "62" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Andromeda Yelton", + "screen_name" : "ThatAndromeda", + "indices" : [ + "24", + "38" + ], + "id_str" : "102080846", + "id" : "102080846" + } + ], + "urls" : [ + { + "url" : "http://t.co/1G82xWflrl", + "expanded_url" : "http://pastebin.com/3pW0uwLJ", + "display_url" : "pastebin.com/3pW0uwLJ", + "indices" : [ + "116", + "138" + ] + } + ] + }, + "display_text_range" : [ + "0", + "138" + ], + "favorite_count" : "4", + "id_str" : "593158980165316609", + "truncated" : false, + "retweet_count" : "12", + "id" : "593158980165316609", + "possibly_sensitive" : false, + "created_at" : "Tue Apr 28 21:04:55 +0000 2015", + "favorited" : false, + "full_text" : "must read transcript of @ThatAndromeda's remarks at #imlsfocus focused on our need to transform ourselves, together http://t.co/1G82xWflrl", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "m.a. matienzo", + "screen_name" : "anarchivist", + "indices" : [ + "0", + "12" + ], + "id_str" : "8729782", + "id" : "8729782" + }, + { + "name" : "DPLA", + "screen_name" : "dpla", + "indices" : [ + "27", + "32" + ], + "id_str" : "365017572", + "id" : "365017572" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "119" + ], + "favorite_count" : "0", + "in_reply_to_status_id_str" : "593132148862939137", + "id_str" : "593158720605007872", + "in_reply_to_user_id" : "8729782", + "truncated" : false, + "retweet_count" : "0", + "id" : "593158720605007872", + "in_reply_to_status_id" : "593132148862939137", + "created_at" : "Tue Apr 28 21:03:54 +0000 2015", + "favorited" : false, + "full_text" : "@anarchivist it seems like @dpla was off to a good start with community reps ; I'm not sure how well it's been working.", + "lang" : "en", + "in_reply_to_screen_name" : "anarchivist", + "in_reply_to_user_id_str" : "8729782" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter Web Client", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Andromeda Yelton", + "screen_name" : "ThatAndromeda", + "indices" : [ + "0", + "14" + ], + "id_str" : "102080846", + "id" : "102080846" + } + ], + "urls" : [ + { + "url" : "http://t.co/1G82xWflrl", + "expanded_url" : "http://pastebin.com/3pW0uwLJ", + "display_url" : "pastebin.com/3pW0uwLJ", + "indices" : [ + "59", + "81" + ] + } + ] + }, + "display_text_range" : [ + "0", + "81" + ], + "favorite_count" : "5", + "in_reply_to_status_id_str" : "593128819604729856", + "id_str" : "593156910427308032", + "in_reply_to_user_id" : "102080846", + "truncated" : false, + "retweet_count" : "1", + "id" : "593156910427308032", + "in_reply_to_status_id" : "593128819604729856", + "possibly_sensitive" : false, + "created_at" : "Tue Apr 28 20:56:42 +0000 2015", + "favorited" : false, + "full_text" : "@ThatAndromeda Wow! I was just reading the transcript here http://t.co/1G82xWflrl", + "lang" : "en", + "in_reply_to_screen_name" : "ThatAndromeda", + "in_reply_to_user_id_str" : "102080846" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ + { + "text" : "Parren15", + "indices" : [ + "128", + "137" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "DocJoRich", + "screen_name" : "docjorich", + "indices" : [ + "1", + "11" + ], + "id_str" : "17232357", + "id" : "17232357" + } + ], + "urls" : [ + { + "url" : "http://t.co/jAzz97ejsS", + "expanded_url" : "http://www.theguardian.com/us-news/2015/jan/15/eric-holder-no-reliable-fbi-data-police-related-killings", + "display_url" : "theguardian.com/us-news/2015/j…", + "indices" : [ + "105", + "127" + ] + } + ] + }, + "display_text_range" : [ + "0", + "137" + ], + "favorite_count" : "0", + "id_str" : "593138660305936384", + "truncated" : false, + "retweet_count" : "1", + "id" : "593138660305936384", + "possibly_sensitive" : false, + "created_at" : "Tue Apr 28 19:44:11 +0000 2015", + "favorited" : false, + "full_text" : ".@docjorich pressing on the need to document structural violence by collecting police killing statistics http://t.co/jAzz97ejsS #Parren15", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ + { + "text" : "Parren15", + "indices" : [ + "104", + "113" + ] + }, + { + "text" : "BlackLivesMatter", + "indices" : [ + "121", + "138" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Alice Cook", + "screen_name" : "Cookiemath", + "indices" : [ + "3", + "14" + ], + "id_str" : "2355202830", + "id" : "2355202830" + }, + { + "name" : "deray", + "screen_name" : "deray", + "indices" : [ + "114", + "120" + ], + "id_str" : "29417304", + "id" : "29417304" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "138" + ], + "favorite_count" : "0", + "id_str" : "593129156218658817", + "truncated" : false, + "retweet_count" : "0", + "id" : "593129156218658817", + "created_at" : "Tue Apr 28 19:06:25 +0000 2015", + "favorited" : false, + "full_text" : "RT @Cookiemath: What white people should do is use the privilege you have now to deconstruct privilege. #Parren15 @deray #BlackLivesMatter", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Critical Race @ UMD", + "screen_name" : "UMD_CRI", + "indices" : [ + "3", + "11" + ], + "id_str" : "2835267689", + "id" : "2835267689" + }, + { + "name" : "Brittney Cooper", + "screen_name" : "ProfessorCrunk", + "indices" : [ + "123", + "138" + ], + "id_str" : "470708968", + "id" : "470708968" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "140" + ], + "favorite_count" : "0", + "id_str" : "593106969558392832", + "truncated" : false, + "retweet_count" : "0", + "id" : "593106969558392832", + "created_at" : "Tue Apr 28 17:38:15 +0000 2015", + "favorited" : false, + "full_text" : "RT @UMD_CRI: We need an ethics of engagement. Everyone has a particular role to play. So let's respect each other's place. @ProfessorCrunk …", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ + { + "text" : "parren15", + "indices" : [ + "139", + "148" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Brittney Cooper", + "screen_name" : "ProfessorCrunk", + "indices" : [ + "14", + "29" + ], + "id_str" : "470708968", + "id" : "470708968" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "148" + ], + "favorite_count" : "8", + "id_str" : "593100875922563072", + "truncated" : false, + "retweet_count" : "9", + "id" : "593100875922563072", + "created_at" : "Tue Apr 28 17:14:02 +0000 2015", + "favorited" : false, + "full_text" : "3 people told @ProfessorCrunk that her blog saved their lives. How can academia & the tenure process recognize & reward this work? #parren15", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ + { + "text" : "Parren15", + "indices" : [ + "83", + "92" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Brittney Cooper", + "screen_name" : "ProfessorCrunk", + "indices" : [ + "1", + "16" + ], + "id_str" : "470708968", + "id" : "470708968" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "92" + ], + "favorite_count" : "3", + "id_str" : "593093580467642368", + "truncated" : false, + "retweet_count" : "2", + "id" : "593093580467642368", + "created_at" : "Tue Apr 28 16:45:03 +0000 2015", + "favorited" : false, + "full_text" : ".@ProfessorCrunk we are co-conspirators in a collaborative project of world making #Parren15", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ + { + "text" : "Parren15", + "indices" : [ + "50", + "59" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Critical Race @ UMD", + "screen_name" : "UMD_CRI", + "indices" : [ + "3", + "11" + ], + "id_str" : "2835267689", + "id" : "2835267689" + }, + { + "name" : "Kevin Winstead", + "screen_name" : "Kaerf1", + "indices" : [ + "42", + "49" + ], + "id_str" : "40409319", + "id" : "40409319" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "59" + ], + "favorite_count" : "0", + "id_str" : "593090106245939202", + "truncated" : false, + "retweet_count" : "0", + "id" : "593090106245939202", + "created_at" : "Tue Apr 28 16:31:15 +0000 2015", + "favorited" : false, + "full_text" : "RT @UMD_CRI: \"Is any justice not social?\" @Kaerf1 #Parren15", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ + { + "text" : "Parren15", + "indices" : [ + "0", + "9" + ] + } + ], + "symbols" : [ ], + "user_mentions" : [ ], + "urls" : [ + { + "url" : "https://t.co/BWz6Am9sJV", + "expanded_url" : "https://livestream.com/UMDThestamp/critical-race-symposium15", + "display_url" : "livestream.com/UMDThestamp/cr…", + "indices" : [ + "107", + "130" + ] + } + ] + }, + "display_text_range" : [ + "0", + "130" + ], + "favorite_count" : "2", + "id_str" : "593084226544771072", + "truncated" : false, + "retweet_count" : "6", + "id" : "593084226544771072", + "possibly_sensitive" : false, + "created_at" : "Tue Apr 28 16:07:53 +0000 2015", + "favorited" : false, + "full_text" : "#Parren15 Intellectual Activism, Social Justice & Criminalization getting started. Live stream is here https://t.co/BWz6Am9sJV", + "lang" : "en" + } + } +] diff --git a/test-data/data/urlmap.json b/test-data/data/urlmap.json new file mode 100644 index 0000000..7570e0e --- /dev/null +++ b/test-data/data/urlmap.json @@ -0,0 +1,52 @@ +{ + "https://t.co/25wdpi6qoS": "http://flumes.com/ge2015", + "https://t.co/4LUgKWCYPe": "http://w3c.github.io/csvw/metadata/#metadata-format", + "https://t.co/vOPm7UmNPn": "http://www.w3.org/TR/2015/WD-tabular-data-model-20150108/#link-header", + "https://t.co/TbcdHFlgcD": "http://www.npr.org/2015/03/20/394217017/no-pain-no-scientific-gain-one-mans-quest-to-quantify-bug-stings", + "https://t.co/W49jhBps0a": "https://tools.ietf.org/html/draft-hall-censorship-tech-00", + "https://t.co/q2MJmVzq0V": "http://mith.umd.edu/chances-and-challenges-of-studying-social-media-data/", + "https://t.co/IR4ZyD9Kta": "http://www.vox.com/2015/4/23/8484185/freddie-gray-kevin-moore?utm_campaign=vox&utm_content=article%3Atop&utm_medium=social&utm_source=twitter", + "https://t.co/bs54JmxtWO": "https://indiewebcamp.com/Homebrew_Website_Club", + "https://t.co/Id7D0AaNIj": "https://indiewebcamp.com/2015/DC", + "https://t.co/elcOf8zNxQ": "http://bit.ly/1rBYgHZ", + "https://t.co/elcOf8RoWq": "http://bit.ly/1rBYgHZ", + "https://t.co/hD9wLQYwIB": "https://github.com/edsu/freddiegray-tweet-viewer#start-of-content", + "https://t.co/luKm7KWugH": "http://ind.pn/1IPIhA5", + "https://t.co/hpASPPhEBA": "https://github.com/edsu/freddiegray-tweet-viewer", + "https://t.co/h9HhPsbg6b": "http://edsu.github.io/freddiegray-tweet-viewer/", + "https://t.co/w1cw83eFUP": "http://ewheel.democracynow.org", + "https://t.co/Es0ZjTKe7N": "http://1world1family.me/", + "https://t.co/WGevlYJOQV": "http://inkdroid.org/pda2015/", + "https://t.co/T6syRCUc6v": "https://medium.com/on-archivy/hashtags-of-ferguson-8f52a0aced87", + "https://t.co/Pk1PBmZ076": "https://medium.com/on-archivy/hashtags-of-ferguson-8f52a0aced87?source=tw-9effba784a2c-1429900847167", + "https://t.co/NxdPF8Pgzp": "https://indiewebcamp.com/IRC-people", + "https://t.co/0cLkxhlOwC": "https://aaronparecki.com/articles/2015/04/26/1/html-is-my-api", + "https://t.co/Nmr56WXNji": "https://medium.com/p/fadab1bc34e8", + "https://t.co/YvZCCMrYvp": "http://on.rt.com/ig3bis", + "https://t.co/I4c6TuIJJN": "http://www.socialmediaarchiving.net", + "https://t.co/Dckn6u0btR": "https://twitter.com/docjorich/status/592104464758214656", + "https://t.co/ZqEb9nxUuV": "http://bit.ly/crfbed", + "https://t.co/EONiU6cvI3": "http://edsu.github.io/freddiegray-tweet-viewer/", + "https://t.co/3hSfgL7lC2": "https://medium.com/on-archivy/freddiegray-1c332bca11a0?source=tw-3b7be3a90af9-1430000844254", + "https://t.co/9njXo8QaTN": "http://www.socy.umd.edu/feature/2nd-annual-parren-mitchell-symposium-intellectual-activism-social-justice-criminalization", + "https://t.co/ylkx7iU7dh": "https://docs.google.com/spreadsheets/d/1WdzsQltp4Z_9NBvxW9_xzmjacCKfWwP_USvMjpn-Nsw/edit?usp=sharing", + "https://t.co/3mbHnt59Eb": "https://github.com/edsu/earls#archiving", + "https://t.co/jP50XzYerK": "http://inkdroid.org/iipcGA15/", + "https://t.co/AoPaWWaSx3": "https://medium.com/on-archivy/freddiegray-1c332bca11a0", + "https://t.co/4vLu4vnvZc": "https://twitter.com/taylorlorenz/status/592846891643236352", + "https://t.co/2WGqU3nAVr": "http://philosophybites.com/2015/01/meira-levinson-on-the-aims-of-education.html", + "https://t.co/pRdkMobGpt": "http://to.pbs.org/1DIYKCL", + "https://t.co/4CbQ3ty9Xi": "http://edsu.github.io/pda2015/", + "https://t.co/kze226na3z": "https://github.com/edsu/earls", + "https://t.co/1G82xWflrl": "http://pastebin.com/3pW0uwLJ", + "https://t.co/jAzz97ejsS": "http://www.theguardian.com/us-news/2015/jan/15/eric-holder-no-reliable-fbi-data-police-related-killings", + "https://t.co/BWz6Am9sJV": "https://livestream.com/UMDThestamp/critical-race-symposium15", + "https://t.co/lefLOqjjoQ": "https://twitter.com/scott_bot/status/1158341525518061569/photo/1", + "https://t.co/uRauovhYSc": "https://ift.tt/3eKta2X", + "https://t.co/HPCTGb55xu": "https://ift.tt/2KBfneu", + "https://t.co/TNgunak1Ws": "https://m.youtube.com/watch?v=DgGuTicdtyg", + "https://t.co/jlg2M6AZ": "https://bit.ly/Po9Kxn", + "https://t.co/UWQIK31b6D": "https://twitter.com/ElegantGoose/status/899960415148548096", + "https://t.co/7lm4Iajzfq": "https://twitter.com/jameshodges_/status/1256333367458426881/photo/1", + "https://t.co/sE2gYPV8tt": "https://twitter.com/thehill/status/969921855430815750" +} \ No newline at end of file diff --git a/test.py b/test.py new file mode 100644 index 0000000..d0788b4 --- /dev/null +++ b/test.py @@ -0,0 +1,42 @@ +import os +import twitter_archive_unshorten + +if os.path.isfile("test-data/data/shorturls.json"): + os.unlink("test-data/data/shorturls.json") + +def test_read_mapping(): + url_map = twitter_archive_unshorten.read_url_map('test-data/data/tweet.js') + assert len(url_map) == 42 + +def test_unshorten(): + urls = [ + "https://t.co/7lm4Iajzfq", + "https://t.co/HPCTGb55xu", + "https://t.co/4GbE4w5aGf", + "https://t.co/lefLOqjjoQ", + "https://t.co/uRauovhYSc", + "https://t.co/UWQIK31b6D", + "https://t.co/sE2gYPV8tt", + "https://t.co/TNgunak1Ws", + "https://t.co/jlg2M6AZ", + "https://t.co/ja59OVVkXG", + ] + + expected = [ + "https://twitter.com/jameshodges_/status/1256333367458426881/photo/1", + "https://ift.tt/2KBfneu", + "https://ift.tt/3uaSCEs", + "https://twitter.com/scott_bot/status/1158341525518061569/photo/1", + "https://ift.tt/3eKta2X", + "https://twitter.com/ElegantGoose/status/899960415148548096", + "https://twitter.com/thehill/status/969921855430815750", + "https://m.youtube.com/watch?v=DgGuTicdtyg", + "https://bit.ly/Po9Kxn", + "https://twitter.com/laurensx/status/1018301477176119296/photo/1" + ] + + url_map = twitter_archive_unshorten.unshorten(urls, "test-data") + for i, short_url in enumerate(urls): + assert url_map[short_url] == expected[i] + + diff --git a/twitter_archive_unshorten.py b/twitter_archive_unshorten.py index e9fac82..2dd7710 100755 --- a/twitter_archive_unshorten.py +++ b/twitter_archive_unshorten.py @@ -2,7 +2,7 @@ """ -usage: unshorten.py /path/to/your/twitter/archive/directory +usage: twitter-archive-unshorten.py /path/to/your/twitter/archive/directory Run this program on an unpacked Twitter Archive directory and it will rewrite the t.co short URLs to their unshortened equivalent. @@ -113,20 +113,28 @@ def unshorten(urls, archive_dir): urls = set(urls) # where to write the mapping - url_map_file = join(archive_dir, "data", "urlmap.json") + url_map_file = join(archive_dir, "data", "shorturls.json") - # load any mapping data we have already + # load any existing mapping data (from a previous run perhaps) if os.path.isfile(url_map_file): url_map = json.load(open(url_map_file)) else: url_map = {} + # load short/long mapping already present in tweet.js + url_map.update(read_url_map(join(archive_dir, "data", "tweet.js"))) + count = 0 for short_url in urls: count += 1 # force https: some old t.co URLs use http short_url = re.sub(r'^http://', 'https://', short_url) + + # if we already know what the long url is we can skip it + if short_url in url_map: + continue + try: urllib.request.urlopen(short_url) except urllib.error.HTTPError as e: @@ -141,7 +149,7 @@ def unshorten(urls, archive_dir): print('\r' + msg, end='', flush=True) # periodically dump the mappings we have - if len(url_map) % 10 == 0: + if archive_dir != "" and len(url_map) % 10 == 0: json.dump(url_map, open(url_map_file, "w"), indent=2) # try not to awaken the dragon @@ -150,6 +158,21 @@ def unshorten(urls, archive_dir): print() return url_map +def read_url_map(path): + """Read short/long mapping in existing data. + """ + text = open(path).read() + text = re.sub(r'^window.YTD.tweet.part0 = ', '', text) + data = json.loads(text) + url_map = {} + for tweet in data: + for url in tweet['tweet']['entities']['urls']: + short_url = url['url'] + short_url = re.sub(r'^http://', 'https://', short_url) + if short_url.startswith('https://t.co/'): + url_map[short_url] = url['expanded_url'] + return url_map + # Some shenanigans so urllib gets the redirect but doesn't follow it. # It would be nice to be able to use requests here but I didn't want to # make people install anything extra.