-
-
Save divyajyotiuk/9fb29c046e1dfcc8d5683684d7068efe to your computer and use it in GitHub Desktop.
import json | |
import glob | |
all_bookmarks = [] | |
md_file = open("bookmarks.md", "w+") # saving in markdown file, if no file exists using '+' creates one | |
files = [file for file in glob.glob("JSONBookmarks/*")] # using glob to read all files from the folder | |
for file_name in files: | |
print(file_name) | |
with open(file_name) as bk: | |
data = json.load(bk) # reads json data | |
all_bookmarks.append(data) | |
#print(json.dumps(response, indent = 1)) # pretty prints JSON data | |
# Function to get profile pic if you need | |
def getAuthorProfilePic(id): | |
return response["users"][id]["profile_image_url_https"] | |
# Function to get username | |
def getUserName(id): | |
return response["users"][id]["screen_name"] | |
# Function to construct bookmarked tweet url | |
def constructUrl(tweet_id, username): | |
return "https://twitter.com/" + username + "/status/" + tweet_id | |
# Function to format the text to write in file | |
def formatText(text): | |
text = text.replace("\n-", " ") | |
text = text.replace("\n", " ") | |
text = text[:100] + "..." | |
return text | |
# Run a loop through all_bookmarks | |
for data in all_bookmarks: | |
response = data["globalObjects"] | |
for tweet_id in response["tweets"]: | |
tweet = response["tweets"][tweet_id] | |
text = tweet["full_text"] | |
text = formatText(text) | |
url = constructUrl(tweet_id, getUserName(tweet["user_id_str"])) | |
bookmarked_tweet = "\n- " + text + "\n" + "\t - " + url | |
md_file.write(bookmarked_tweet) |
import json | |
import glob | |
import functools | |
all_bookmarks = [] | |
md_file = open("bookmarks.md", "w+") # saving in markdown file, if no file exists using '+' creates one | |
files = [file for file in glob.glob("JSONBookmarks/*")] # using glob to read all files from the folder | |
for file_name in files: | |
print(file_name) | |
with open(file_name) as bk: | |
data = json.load(bk) # reads json data | |
all_bookmarks.append(data) | |
#print(json.dumps(response, indent = 1)) # pretty prints JSON data | |
# Function to construct bookmarked tweet url | |
def constructUrl(tweet_id, username): | |
return "https://twitter.com/" + username + "/status/" + tweet_id | |
# Function to format the text to write in file | |
def formatText(text): | |
text = text.replace("\n-", " ") | |
text = text.replace("\n", " ") | |
text = text[:100] + "..." | |
return text | |
# Method to get value of nested dictionary | |
def deep_get(dictionary, keys, default=None): | |
return functools.reduce(lambda d, key: d.get(key, default) if isinstance(d, dict) else default, keys.split("."), dictionary) | |
# Run a loop through all_bookmarks | |
for data in all_bookmarks: | |
instructions_list = deep_get(data, "data.bookmark_timeline.timeline.instructions") | |
tweet_entries_list = deep_get(instructions_list[0], "entries") | |
for tweet_entry in tweet_entries_list: | |
result = deep_get(tweet_entry, "content.itemContent.tweet_results.result") | |
username = deep_get(result, "core.user.legacy.screen_name") | |
text = deep_get(result, "legacy.full_text") | |
tweet_id = deep_get(result, "rest_id") | |
if tweet_id == None or username == None or text == None: | |
continue | |
text = formatText(text) | |
url = constructUrl(tweet_id, username) | |
bookmarked_tweet = "\n- " + text + "\n" + "\t - " + url | |
md_file.write(bookmarked_tweet) |
import json | |
import glob | |
import functools | |
all_bookmarks = [] | |
md_file = open("bookmarks.md", "w+") # saving in markdown file, if no file exists using '+' creates one | |
files = [file for file in glob.glob("JSONBookmarks/*")] # using glob to read all files from the folder | |
for file_name in files: | |
print(file_name) | |
with open(file_name) as bk: | |
data = json.load(bk) # reads json data | |
all_bookmarks.append(data) | |
# print(json.dumps(all_bookmarks, indent = 1)) # pretty prints JSON data | |
# Function to construct bookmarked tweet url | |
def constructUrl(tweet_id, username): | |
return "https://twitter.com/" + username + "/status/" + tweet_id | |
# Function to format the text to write in file | |
def formatText(text): | |
text = text.replace("\n-", " ") | |
text = text.replace("\n", " ") | |
text = text[:100] + "..." | |
return text | |
# Method to get value of nested dictionary | |
def deep_get(dictionary, keys, default=None): | |
return functools.reduce(lambda d, key: d.get(key, default) if isinstance(d, dict) else default, keys.split("."), dictionary) | |
# Run a loop through all_bookmarks | |
for data in all_bookmarks: | |
instructions_list = deep_get(data, "data.bookmark_timeline.timeline.instructions") | |
if instructions_list==None: continue | |
tweet_entries_list = deep_get(instructions_list[0], "entries") | |
for tweet_entry in tweet_entries_list: | |
result = deep_get(tweet_entry, "content.itemContent.tweet_results.result") | |
username = deep_get(result, "core.user_results.result.legacy.screen_name") | |
text = deep_get(result, "legacy.full_text") | |
tweet_id = deep_get(result, "rest_id") | |
if tweet_id == None or username == None or text == None: continue | |
text = formatText(text) | |
url = constructUrl(tweet_id, username) | |
bookmarked_tweet = "\n- " + text + "\n" + "\t - " + url | |
md_file.write(bookmarked_tweet) |
If you call .sort()
on the file name list, the output seems to be in the correct order (by bookmark add date if I'm not mistaken.) That is, assuming the user saved their response JSON files in order of appearance in their devtools.
As it is, my files would sort like this:
You might change line 8 to read something like this:
globresult = glob.glob("JSONBookmarks/*")
globresult.sort() # Get files in name order
files = [file for file in globresult]
After this change, my files sorted like this:
(I also modified the Python script to look in a different folder, for my own purposes.)
Dear @divyajyotiuk , v3 works for me, thanks.
Dear @AverageHelper , yes, the sort is useful to have.
I'm a little unclear on the origin of the JSONBookmarks/*
data. Could you clarify how to initially populate the bookmark data? Are you using data from /2/users/:id/bookmarks?
I'm a little unclear on the origin of the
JSONBookmarks/*
data. Could you clarify how to initially populate the bookmark data? Are you using data from /2/users/:id/bookmarks?
See https://dev.to/divyajyotiuk/exporting-your-twitter-bookmarks-in-markdown-file-19bj
@divyajyotiuk I just did an export of my bookmarks and the json looked like this (note the "v2"):
{"data":{"bookmark_timeline_v2":{"timeline":{"instructions":[{"type":"TimelineAddEntries","entries":[{...
When changing that in your v3 code, it works smoothly for me.
Thanks ! The v3 works for me.
In my case, I have to add encoding utf8 :
md_file = open("bookmarks.md", "w+", encoding="utf8")
open(file_name, encoding="utf8")
Like @kiu I also needed to update line 34 to this to parse the bookmarks I just downloaded:
instructions_list = deep_get(data, "data.bookmark_timeline_v2.timeline.instructions")
(the bookmark_timeline_v2
is the new part)
Thanks for the update! I have updated the code. Checkout v3 version.