From 3802feadb7e330f31c7563b2b6c980664263213f Mon Sep 17 00:00:00 2001 From: Claromes Date: Sun, 23 Jun 2024 00:46:05 -0300 Subject: [PATCH] update strealit app, add legacy streamlit app, update viz module and export module, fix requets module --- .streamlit/config.toml | 2 +- README.md | 3 + app/app.py | 544 +++++++++++------------------- app/requirements.txt | 1 - assets/download.svg | 9 + assets/parthenon.png | Bin 13169 -> 6574 bytes assets/preview_image.jpg | Bin 0 -> 48253 bytes assets/waybacktweets.png | Bin 5648 -> 7319 bytes legacy_app/.streamlit/config.toml | 11 + legacy_app/legacy_app.py | 525 ++++++++++++++++++++++++++++ legacy_app/requirements.txt | 2 + poetry.lock | 12 +- waybacktweets/api/export.py | 2 +- waybacktweets/api/request.py | 6 +- waybacktweets/api/visualize.py | 49 +-- 15 files changed, 785 insertions(+), 381 deletions(-) create mode 100644 assets/download.svg create mode 100644 assets/preview_image.jpg create mode 100644 legacy_app/.streamlit/config.toml create mode 100644 legacy_app/legacy_app.py create mode 100644 legacy_app/requirements.txt diff --git a/.streamlit/config.toml b/.streamlit/config.toml index 3b1df1a..cb97cf1 100644 --- a/.streamlit/config.toml +++ b/.streamlit/config.toml @@ -4,7 +4,7 @@ primaryColor = "black" secondaryBackgroundColor = "gainsboro" textColor = "black" backgroundColor = "whitesmoke" -font = "sans serif" +font = "serif" [client] toolbarMode = "minimal" diff --git a/README.md b/README.md index 96fe6c0..bb3f763 100644 --- a/README.md +++ b/README.md @@ -59,3 +59,6 @@ if archived_tweets: - Tristan Lee (Bellingcat's Data Scientist) for the idea of the application. - Jessica Smith (Snowflake's Marketing Specialist) and Streamlit/Snowflake teams for the additional server resources on Streamlit Cloud. - OSINT Community for recommending the application. + +> [!NOTE] +> If the application is down, please check the [Streamlit Cloud Status](https://www.streamlitstatus.com/). diff --git a/app/app.py b/app/app.py index d8ea1a5..8a209d5 100644 --- a/app/app.py +++ b/app/app.py @@ -1,43 +1,43 @@ +import base64 from datetime import datetime import streamlit as st -import streamlit.components.v1 as components from waybacktweets.api.export import TweetsExporter -from waybacktweets.api.parse import JsonParser, TweetsParser +from waybacktweets.api.parse import TweetsParser from waybacktweets.api.request import WaybackTweets -from waybacktweets.config.config import config +from waybacktweets.api.visualize import HTMLTweetsVisualizer +from waybacktweets.config import FIELD_OPTIONS, config -# Initial Settings +# ------ Initial Settings ------ # -LOGO = "assets/parthenon.png" +PAGE_ICON = "assets/parthenon.png" TITLE = "assets/waybacktweets.png" -FIELD_OPTIONS = [ - "parsed_archived_timestamp", - "archived_tweet_url", - "parsed_archived_tweet_url", - "original_tweet_url", - "parsed_tweet_url", - "available_tweet_text", - "available_tweet_is_RT", - "available_tweet_info", - "archived_mimetype", - "archived_statuscode", -] +PREVIEW_IMAGE = "assets/preview_image.jpg" +DOWNLOAD = "assets/download.svg" + +collapse = None +matchtype = None +start_date = datetime(2006, 1, 1) +end_date = datetime.now() + +# ------ Verbose Mode Configuration ------ # + +config.verbose = True + +# ------ Page Configuration ------ # st.set_page_config( page_title="Wayback Tweets", - page_icon=LOGO, + page_icon=PAGE_ICON, layout="centered", menu_items={ "About": f""" [![GitHub release (latest by date including pre-releases)](https://img.shields.io/github/v/release/claromes/waybacktweets?include_prereleases)](https://github.com/claromes/waybacktweets/releases) [![License](https://img.shields.io/github/license/claromes/waybacktweets)](https://github.com/claromes/waybacktweets/blob/main/LICENSE.md) [![Star](https://img.shields.io/github/stars/claromes/waybacktweets?style=social)](https://github.com/claromes/waybacktweets) - Application that displays multiple archived tweets on Wayback Machine to avoid opening each link manually. + The application is a prototype hosted on Streamlit Cloud, allowing users to apply filters and download the data in different formats. - The application is a prototype hosted on Streamlit Cloud, allowing users to apply filters and view tweets that lack the original URL. [Read more](https://claromes.github.io/waybacktweets/streamlit.html). - - © 2023 - {datetime.now().year}, [Claromes](https://claromes.com) · Icon by The Doodle Library · Title font by Google, licensed under the Open Font License + © 2023 - {end_date.year}, [Claromes](https://claromes.com) --- """, # noqa: E501 @@ -45,99 +45,43 @@ st.set_page_config( }, ) -# https://discuss.streamlit.io/t/remove-hide-running-man-animation-on-top-of-page/21773/3 -st.html( - """ - -""" -) +# ------ Set States ------ # if "current_username" not in st.session_state: st.session_state.current_username = "" -if "prev_disabled" not in st.session_state: - st.session_state.prev_disabled = False - -if "next_disabled" not in st.session_state: - st.session_state.next_disabled = False - -if "next_button" not in st.session_state: - st.session_state.next_button = False - -if "prev_button" not in st.session_state: - st.session_state.prev_button = False - -if "update_component" not in st.session_state: - st.session_state.update_component = 0 - -if "offset" not in st.session_state: - st.session_state.offset = 0 - if "count" not in st.session_state: st.session_state.count = False -start_date = datetime(2006, 1, 1) -end_date = datetime.now() - if "archived_timestamp_filter" not in st.session_state: st.session_state.archived_timestamp_filter = (start_date, end_date) +# ------ Add Custom CSS Style ------ # -# Verbose mode configuration - -config.verbose = True - - -# Pagination Settings - - -def scroll_into_view(): - script = f""" - +st.html( """ + + """ +) - components.html(script, width=0, height=0) - - -def prev_page(): - st.session_state.offset -= tweets_per_page - - st.session_state.update_component += 1 - scroll_into_view() - - -def next_page(): - st.session_state.offset += tweets_per_page - - st.session_state.update_component += 1 - scroll_into_view() - - -# Requesting +# ------ Requestings ------ # -@st.cache_data(ttl=1800, show_spinner=False) +@st.cache_data(ttl=600, show_spinner=True) def wayback_tweets( username, collapse, @@ -161,301 +105,205 @@ def wayback_tweets( return archived_tweets -@st.cache_data(ttl=1800, show_spinner=False) -def tweets_parser(archived_tweets, field_options): +@st.cache_data(ttl=600, show_spinner=True) +def tweets_parser(archived_tweets, username, field_options): parser = TweetsParser(archived_tweets, username, field_options) parsed_tweets = parser.parse() return parsed_tweets -@st.cache_data(ttl=1800, show_spinner=False) +@st.cache_data(ttl=600, show_spinner=True) def tweets_exporter(parsed_tweets, username, field_options): exporter = TweetsExporter(parsed_tweets, username, field_options) df = exporter.dataframe + file_name = exporter.filename - return df + return df, file_name -@st.cache_data(ttl=1800, show_spinner=False) -def tweets_json_parser(): - if archived_mimetype[i] == "application/json": - json_parser = JsonParser(parsed_archived_tweet_url[i]) - text_json = json_parser.parse() +# ------ User Interface Settings ------ # - if text_json: - return text_json +st.info( + """🥳 [**Pre-release 1.0x: New Streamlit app, CLI and Python module**](https://claromes.github.io/waybacktweets)""" # noqa: E501 +) - return None +st.image(TITLE, use_column_width="never") +st.caption( + "[![GitHub release (latest by date including pre-releases)](https://img.shields.io/github/v/release/claromes/waybacktweets?include_prereleases)](https://github.com/claromes/waybacktweets/releases) [![Star](https://img.shields.io/github/stars/claromes/waybacktweets?style=social)](https://github.com/claromes/waybacktweets)" # noqa: E501 +) +st.write("Retrieve archived tweets CDX data in CSV, JSON, and HTML formats.") +st.caption( + "This application uses the Wayback Tweets Python package, which can be used as a module or as a standalone command line tool. [Read the documentation](https://claromes.github.io/waybacktweets)." # noqa: E501 +) -def display_tweet_header(): - header = st.markdown( - f"[**archived url ↗**]({archived_tweet_url[i]}) · [**tweet url ↗**]({original_tweet_url[i]}) · **mimetype:** {archived_mimetype[i]} · **archived timestamp:** {parsed_archived_timestamp[i]} · **archived status code:** {archived_statuscode[i]}" # noqa: E501 - ) +st.caption( + "To access the legacy version of Wayback Tweets [click here](https://waybacktweets-legacy.streamlit.app)." # noqa: E501 +) + +st.divider() - return header +# -- Filters -- # +username = st.text_input("Username *", key="username", placeholder="Without @") -def display_tweet_iframe(): - tweet_iframe = components.iframe( - archived_tweet_url[i], - height=500, - scrolling=True, +with st.expander("Filtering"): + start_date = datetime(2006, 1, 1) + end_date = datetime.now() + + st.session_state.archived_timestamp_filter = st.date_input( + "Tweets saved between", + (start_date, end_date), + start_date, + end_date, + format="YYYY/MM/DD", + help="Using the `from` and `to` filters. Format: YYYY/MM/DD", ) - return tweet_iframe + col1, col2 = st.columns(2) + + with col1: + limit = st.text_input( + "Limit", + key="limit", + help="Query result limits", + ) + with col2: + offset = st.text_input( + "Offset", + key="offset", + help="Allows for a simple way to scroll through the results", + ) -# Interface Settings + col3, col4 = st.columns(2) -st.logo(LOGO) + with col3: + not_available = st.checkbox( + "Only tweets not available", + key="not_available", + help="Checks if the archived URL still exists on Twitter", + ) -st.success( - """**v1.0 🎉: CLI and Python Module** + with col4: + unique = st.checkbox( + "Only unique Wayback Machine URLs", + key="unique", + help="Filtering by the collapse option using the `urlkey` field and the URL Match Scope `prefix`", # noqa: E501 + ) -$ `pip install waybacktweets` -$ `waybacktweets --from 20150101 --to 20191231 --limit 250 jack` +query = st.button("Query", type="primary", use_container_width=True) -Retrieve archived tweets CDX data in CSV, JSON, and HTML formats using the command line. +# ------ Results ------ # -Read the documentation: [claromes.github.io/waybacktweets](https://claromes.github.io/waybacktweets).""" # noqa: E501 -) +if username != st.session_state.current_username: + st.session_state.current_username = username -st.image(TITLE, use_column_width="never") -st.caption( - "[![GitHub release (latest by date including pre-releases)](https://img.shields.io/github/v/release/claromes/waybacktweets?include_prereleases)](https://github.com/claromes/waybacktweets/releases) [![Star](https://img.shields.io/github/stars/claromes/waybacktweets?style=social)](https://github.com/claromes/waybacktweets)" # noqa: E501 -) -st.caption("Display multiple archived tweets on Wayback Machine.") -st.caption( - "Download data via command line with the [`waybacktweets`](https://pypi.org/project/waybacktweets) Python package." # noqa: E501 -) +if query or st.session_state.count: + if unique: + collapse = "urlkey" + matchtype = "prefix" -username = st.text_input("Username", placeholder="Without @") + try: + wayback_tweets = wayback_tweets( + st.session_state.current_username, + collapse, + st.session_state.archived_timestamp_filter[0], + st.session_state.archived_timestamp_filter[1], + limit, + offset, + matchtype, + ) -start_date = datetime(2006, 1, 1) -end_date = datetime.now() + if not wayback_tweets: + st.error("No data was saved due to an empty response.") + st.stop() -st.session_state.archived_timestamp_filter = st.date_input( - "Tweets saved between", - (start_date, end_date), - start_date, - end_date, - format="YYYY/MM/DD", - help="Using the `from` and `to` filters. Format: YYYY/MM/DD", -) + parsed_tweets = tweets_parser( + wayback_tweets, st.session_state.current_username, FIELD_OPTIONS + ) -not_available = st.checkbox( - "Only tweets not available", - help="Checks if the archived URL still exists on Twitter", -) + df, file_name = tweets_exporter( + parsed_tweets, st.session_state.current_username, FIELD_OPTIONS + ) -unique = st.checkbox( - "Only unique Wayback Machine URLs", - help="Filtering by the collapse option using the `urlkey` field and the URL Match Scope `prefix`", # noqa: E501 -) + csv_data = df.to_csv(index=False) + json_data = df.to_json(orient="records", lines=False) + html = HTMLTweetsVisualizer(username, json_data) + html_content = html.generate() -query = st.button("Query", type="primary", use_container_width=True) + st.session_state.count = len(df) + st.write(f"**{st.session_state.count} URLs have been captured**") -# Tweet Listing Settings + # -- HTML -- # -if username != st.session_state.current_username: - st.session_state.current_username = username - st.session_state.offset = 0 + st.header("HTML", divider="gray") + st.write( + f"Visualize tweets more efficiently through iframes. Download the @{st.session_state.current_username}'s archived tweets in HTML." # noqa: E501 + ) -if query or st.session_state.count: - tweets_per_page = 25 + col5, col6 = st.columns([1, 18]) - collapse = None - matchType = None + with col5: + st.image(DOWNLOAD, width=22) - if unique: - collapse = "urlkey" - matchType = "prefix" + with col6: + b64_html = base64.b64encode(html_content.encode()).decode() + href_html = f"data:text/html;base64,{b64_html}" - try: - with st.spinner("Waybacking..."): - wayback_tweets = wayback_tweets( - st.session_state.current_username, - collapse, - st.session_state.archived_timestamp_filter[0], - st.session_state.archived_timestamp_filter[1], - tweets_per_page, - st.session_state.offset, - matchType, + st.markdown( + f'{file_name}.html', # noqa: E501 + unsafe_allow_html=True, ) - parsed_tweets = tweets_parser(wayback_tweets, FIELD_OPTIONS) - df = tweets_exporter( - parsed_tweets, st.session_state.current_username, FIELD_OPTIONS - ) + st.image(PREVIEW_IMAGE, "Preview image") - st.session_state.count = len(df) - - # st.caption( - # "The number of tweets per page is set to 25, and this is a fixed value due to the API rate limit." # noqa: E501 - # ) - # st.write(f"**{st.session_state.count} URLs have been captured**") - - if st.session_state.count: - if tweets_per_page > st.session_state.count: - tweets_per_page = st.session_state.count - - # Tweet Listing Processing - - progress = st.empty() - - parsed_archived_timestamp = df["parsed_archived_timestamp"] - archived_tweet_url = df["archived_tweet_url"] - parsed_archived_tweet_url = df["parsed_archived_tweet_url"] - original_tweet_url = df["original_tweet_url"] - parsed_tweet_url = df["parsed_tweet_url"] - available_tweet_text = df["available_tweet_text"] - available_tweet_is_RT = df["available_tweet_is_RT"] - available_tweet_info = df["available_tweet_info"] - archived_mimetype = df["archived_mimetype"] - archived_statuscode = df["archived_statuscode"] - - st.divider() - st.session_state.current_username = username - - return_none_count = 0 - - start_index = st.session_state.offset - end_index = min(st.session_state.count, start_index + tweets_per_page) - - for i in range(tweets_per_page): - try: - parsed_text_json = tweets_json_parser() - - # Display all tweets - if not not_available: - # Display available tweets - if available_tweet_text[i]: - display_tweet_header() - - if available_tweet_is_RT[i]: - st.info("*Retweet*") - - st.write(available_tweet_text[i]) - st.write(f"**{available_tweet_info[i]}**") - - st.divider() - # Display tweets not available with text/html, unk, warc/revisit mimetype or application/json mimetype without parsed JSON text # noqa: E501 - elif ( - archived_mimetype[i] != "application/json" - and not available_tweet_text[i] - ): - display_tweet_header() - if ( - ".jpg" in parsed_tweet_url[i] - or ".png" in parsed_tweet_url[i] - ) and (400 <= archived_statuscode[i] <= 511): - display_tweet_iframe() - elif "/status/" not in parsed_tweet_url[i]: - st.info( - "This isn't a status or is not available" # noqa: E501 - ) - elif ( - f"{st.session_state.current_username}" - not in parsed_tweet_url[i] - ): - st.info( - f"Replying to {st.session_state.current_username}" # noqa: E501 - ) - else: - display_tweet_iframe() - - st.divider() - # Display tweets not available with application/json mimetype and parsed JSON text # noqa: E501 - elif ( - archived_mimetype[i] == "application/json" - and not available_tweet_text[i] - ): - display_tweet_header() - st.code(parsed_text_json) - - st.divider() - - # Display only tweets not available - if not_available: - # Display tweets not available with text/html, unk, warc/revisit return # noqa: E501 - if ( - archived_mimetype[i] != "application/json" - and not available_tweet_text[i] - ): - return_none_count += 1 - - display_tweet_header() - if ( - ".jpg" in parsed_tweet_url[i] - or ".png" in parsed_tweet_url[i] - ) and (400 <= archived_statuscode[i] <= 511): - display_tweet_iframe() - elif "/status/" not in parsed_tweet_url[i]: - st.info( - "This isn't a status or is not available" # noqa: E501 - ) - elif ( - f"{st.session_state.current_username}" - not in parsed_tweet_url[i] - ): - st.info( - f"Replying to {st.session_state.current_username}" # noqa: E501 - ) - else: - display_tweet_iframe() - - st.divider() - - # Display tweets not available with application/json return # noqa: E501 - elif ( - archived_mimetype[i] == "application/json" - and not available_tweet_text[i] - ): - return_none_count += 1 - - display_tweet_header() - st.code(parsed_text_json) - - st.divider() - - progress.write( - f"{return_none_count} URLs have been captured in the range {start_index}-{end_index}" # noqa: E501 - ) - except IndexError: - if start_index <= 0: - st.session_state.prev_disabled = True - else: - st.session_state.prev_disabled = False - - st.session_state.next_disabled = True - - prev, _, next = st.columns([3, 4, 3]) - - prev.button( - "Previous", - disabled=st.session_state.prev_disabled, - key="prev_button_key", - on_click=prev_page, - type="primary", - use_container_width=True, - ) - next.button( - "Next", - disabled=st.session_state.next_disabled, - key="next_button_key", - on_click=next_page, - type="primary", - use_container_width=True, + # -- CSV -- # + + st.header("CSV", divider="gray") + st.write( + "Check the data returned in the dataframe below and download the file." ) - if not wayback_tweets: - st.error( - "Failed to establish a new connection with web.archive.org. Max retries exceeded. Please wait a few minutes and try again." # noqa: E501 + col7, col8 = st.columns([1, 18]) + + with col7: + st.image(DOWNLOAD, width=22) + + with col8: + b64_csv = base64.b64encode(csv_data.encode()).decode() + href_csv = f"data:file/csv;base64,{b64_csv}" + + st.markdown( + f'{file_name}.csv', # noqa: E501 + unsafe_allow_html=True, + ) + + st.dataframe(df, use_container_width=True) + + # -- JSON -- # + + st.header("JSON", divider="gray") + st.write("Check the data returned in JSON format below and download the file.") + + col9, col10 = st.columns([1, 18]) + + with col9: + st.image(DOWNLOAD, width=22) + + with col10: + b64_json = base64.b64encode(json_data.encode()).decode() + href_json = f"data:file/json;base64,{b64_json}" + + st.markdown( + f'{file_name}.json', # noqa: E501 + unsafe_allow_html=True, ) + + st.json(json_data, expanded=False) except TypeError as e: st.error( f""" @@ -463,7 +311,7 @@ if query or st.session_state.count: If the problem persists [open an issue](https://github.com/claromes/waybacktweets/issues).""" # noqa: E501 ) - st.session_state.offset = 0 + st.stop() except Exception as e: - st.error(f"{e}") + st.error(str(e)) st.stop() diff --git a/app/requirements.txt b/app/requirements.txt index 7b81516..d09b089 100644 --- a/app/requirements.txt +++ b/app/requirements.txt @@ -1,3 +1,2 @@ -requests>=2.30.0 streamlit==1.35.0 waybacktweets>=1.0 diff --git a/assets/download.svg b/assets/download.svg new file mode 100644 index 0000000..959a8d7 --- /dev/null +++ b/assets/download.svg @@ -0,0 +1,9 @@ + + upload-svg + + + + + \ No newline at end of file diff --git a/assets/parthenon.png b/assets/parthenon.png index 64222fbe835ffdef9d866201e939ceb72c96e494..191b5b5c473c653e904c50635a69e8c68da6b092 100644 GIT binary patch delta 6362 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 literal 13169 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 b!QYQu;F2kXoF3PIzeLDLD2i8uz6JjuBA=#O diff --git a/assets/preview_image.jpg b/assets/preview_image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5adcfeeff51caafd3146d6a495bc1f5be8f77e9a GIT binary patch literal 48253 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 Eg6==H?EnA( delta 4980 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 + header[data-testid="stHeader"] { + opacity: 0.5; + } + iframe { + border: 1px solid #dddddd; + border-radius: 0.5rem; + } + div[data-testid="InputInstructions"] { + visibility: hidden; + } + +""" + +st.markdown(hide_streamlit_style, unsafe_allow_html=True) + +if "current_handle" not in st.session_state: + st.session_state.current_handle = "" + +if "prev_disabled" not in st.session_state: + st.session_state.prev_disabled = False + +if "next_disabled" not in st.session_state: + st.session_state.next_disabled = False + +if "next_button" not in st.session_state: + st.session_state.next_button = False + +if "prev_button" not in st.session_state: + st.session_state.prev_button = False + +if "update_component" not in st.session_state: + st.session_state.update_component = 0 + +if "offset" not in st.session_state: + st.session_state.offset = 0 + +if "saved_at" not in st.session_state: + st.session_state.saved_at = (2006, year) + +if "count" not in st.session_state: + st.session_state.count = False + + +def scroll_into_view(): + js = f""" + + """ # noqa: E501 + + components.html(js, width=0, height=0) + + +def clean_tweet(tweet): + handle = st.session_state.current_handle.lower() + tweet_lower = tweet.lower() + + pattern = re.compile(r"/status/(\d+)") + match_lower_case = pattern.search(tweet_lower) + match_original_case = pattern.search(tweet) + + if match_lower_case and handle in tweet_lower: + return f"https://twitter.com/{st.session_state.current_handle}/status/{match_original_case.group(1)}" # noqa: E501 + else: + return tweet + + +def clean_link(link): + handle = st.session_state.current_handle.lower() + link = link.lower() + + pattern = re.compile(r"/status/(\d+)") + match = pattern.search(link) + + if match and handle in link: + return f"https://web.archive.org/web/{timestamp[i]}/https://twitter.com/{st.session_state.current_handle}/status/{match.group(1)}" # noqa: E501 + else: + return link + + +def pattern_tweet(tweet): + # Reply: /status// + # Link: /status/// + # Twimg: /status/https://pbs + + pattern = re.compile(r'/status/"([^"]+)"') + + match = pattern.search(tweet) + if match: + return match.group(1).lstrip("/") + else: + return tweet + + +def pattern_tweet_id(tweet): + # Delete sub-endpoint (/photos, /likes, /retweet...) + pattern_username = re.compile(r"https://twitter\.com/([^/]+)/status/\d+") + match_username = pattern_username.match(tweet) + + pattern_id = r"https://twitter.com/\w+/status/(\d+)" + match_id = re.search(pattern_id, tweet) + + if match_id and match_username: + tweet_id = match_id.group(1) + username = match_username.group(1) + return f"https://twitter.com/{username}/status/{tweet_id}" + else: + return tweet + + +def check_double_status(url_wb, url_tweet): + if url_wb.count("/status/") == 2 and "twitter.com" not in url_tweet: + return True + + return False + + +def embed(tweet): + try: + url = f"https://publish.twitter.com/oembed?url={clean_tweet(tweet)}" + response = requests.get(url) + + regex = r'