| |
| import streamlit as st |
| import os |
|
|
| |
| |
| |
|
|
| |
| try: |
| query_params = st.query_params if hasattr(st, 'query_params') else st.experimental_get_query_params() |
| if "code" in query_params and "authenticated" not in st.session_state: |
| |
| st.switch_page("pages/oauth_callback.py") |
| except: |
| pass |
|
|
| |
| |
| |
|
|
| def show_dashboard(): |
| """Show the main dashboard after login""" |
| |
| if "user_info" not in st.session_state: |
| st.error("Session expired. Please login again.") |
| st.session_state.clear() |
| st.rerun() |
| return |
| |
| user = st.session_state.user_info |
| |
| |
| st.markdown(""" |
| <style> |
| .stApp { background-color: #0e1117; color: white; } |
| .main-header { background: linear-gradient(135deg, #1a2a6c, #b21f1f); color: white; padding: 2rem; border-radius: 10px; text-align: center; margin-bottom: 2rem; } |
| .platform-card { background-color: #262730; padding: 1.5rem; border-radius: 10px; border-left: 4px solid; margin: 1rem 0; height: 280px; } |
| .linkedin-card { border-left-color: #0077B5; } |
| .facebook-card { border-left-color: #1877F2; } |
| .facebook-pro-card { border-left-color: #FF6B35; } |
| .feature-list { margin: 1rem 0; padding-left: 1.5rem; flex-grow: 1; } |
| </style> |
| """, unsafe_allow_html=True) |
| |
| |
| st.markdown(f""" |
| <div class="main-header"> |
| <h1 style="margin:0;">π Social Media Data Extractor</h1> |
| <p style="margin:0; opacity: 0.9;">Welcome back, {user.get('name', 'User')}! π</p> |
| </div> |
| """, unsafe_allow_html=True) |
|
|
| |
| with st.sidebar: |
| if user.get('picture'): |
| st.image(user.get('picture'), width=80) |
| else: |
| st.image("https://cdn-icons-png.flaticon.com/512/149/149071.png", width=80) |
| |
| st.write(f"**π€ {user.get('name', 'User')}**") |
| st.write(f"π§ {user.get('email', '')}") |
| st.markdown("---") |
| |
| |
| if st.button("πͺ Logout", use_container_width=True, type="primary"): |
| st.session_state.clear() |
| st.rerun() |
| |
| |
| st.markdown("## π Launch Extractors") |
| |
| col1, col2, col3 = st.columns(3) |
| |
| with col1: |
| st.markdown(""" |
| <div class="platform-card linkedin-card"> |
| <h3>πΌ LinkedIn Extractor</h3> |
| <ul class="feature-list"> |
| <li>No login required</li> |
| <li>Profile, company, and post analysis</li> |
| <li>Quick data extraction</li> |
| <li>AI-powered insights</li> |
| <li>100% Free</li> |
| </ul> |
| </div> |
| """, unsafe_allow_html=True) |
| |
| if st.button("π Launch LinkedIn Extractor", key="linkedin_btn", use_container_width=True): |
| st.switch_page("pages/linkedin_extractor.py") |
|
|
| with col2: |
| st.markdown(""" |
| <div class="platform-card facebook-card"> |
| <h3>π Facebook Extractor</h3> |
| <ul class="feature-list"> |
| <li>Manual login required</li> |
| <li>Group post extraction</li> |
| <li>Works with private groups</li> |
| <li>AI conversation analysis</li> |
| <li>100% Free</li> |
| </ul> |
| </div> |
| """, unsafe_allow_html=True) |
| |
| if st.button("π Launch Facebook Extractor", key="facebook_btn", use_container_width=True): |
| st.switch_page("pages/facebook_extractor.py") |
| |
| with col3: |
| st.markdown(""" |
| <div class="platform-card facebook-pro-card"> |
| <h3>π₯ Facebook Extractor 2.0</h3> |
| <ul class="feature-list"> |
| <li>Enhanced Facebook data extraction</li> |
| <li>More powerful algorithms</li> |
| <li>Faster processing speed</li> |
| <li>Advanced AI analysis</li> |
| <li>100% Free</li> |
| </ul> |
| </div> |
| """, unsafe_allow_html=True) |
| |
| if st.button("π Launch Facebook Extractor 2.0", key="facebook_pro_btn", use_container_width=True): |
| st.switch_page("pages/facebook_extractor_pro.py") |
|
|
| |
| with st.expander("π How to Use", expanded=True): |
| st.markdown(f""" |
| 1. **Click any extractor to launch** |
| 2. **For LinkedIn:** Enter any LinkedIn URL |
| 3. **For Facebook:** Public data extraction available |
| 4. **AI Analysis:** Chat with extracted data |
| |
| **Note:** All extractors are 100% free and require no local setup. |
| |
| **Logged in as:** {user.get('email', 'User')} |
| """) |
|
|
| |
| |
| |
|
|
| def show_login_page(): |
| """Show login page if user is not authenticated""" |
| GOOGLE_CLIENT_ID = os.getenv("GOOGLE_CLIENT_ID", "") |
| |
| if not GOOGLE_CLIENT_ID: |
| st.error("Google OAuth not configured") |
| return |
| |
| st.title("π Social Media Data Extractor") |
| st.markdown("### Welcome! Please login to continue") |
| |
| |
| redirect_uri = "https://refat81-social-media-data-extractor-chatbot.hf.space/oauth_callback" |
| login_url = f"https://accounts.google.com/o/oauth2/v2/auth?client_id={GOOGLE_CLIENT_ID}&redirect_uri={redirect_uri}&response_type=code&scope=openid%20email%20profile&access_type=offline&prompt=consent" |
| |
| st.markdown(f""" |
| <a href="{login_url}"> |
| <div style=" |
| background-color: #4285F4; |
| color: white; |
| padding: 15px 30px; |
| border-radius: 8px; |
| border: none; |
| cursor: pointer; |
| font-size: 18px; |
| font-weight: 600; |
| text-align: center; |
| margin: 30px 0; |
| display: inline-block; |
| "> |
| <img src="https://cdn-icons-png.flaticon.com/512/2991/2991148.png" width="24" height="24" style="vertical-align: middle; margin-right: 12px;"> |
| Sign in with Google |
| </div> |
| </a> |
| """, unsafe_allow_html=True) |
|
|
| |
| |
| |
|
|
| def main(): |
| """Main app routing""" |
| st.set_page_config( |
| page_title="Social Media Data Extractor", |
| page_icon="π", |
| layout="wide", |
| initial_sidebar_state="expanded" |
| ) |
| |
| |
| if "user_info" in st.session_state: |
| st.sidebar.success(f"Logged in as: {st.session_state.user_info.get('name')}") |
| |
| |
| if "authenticated" in st.session_state and st.session_state.authenticated: |
| show_dashboard() |
| else: |
| show_login_page() |
|
|
| if __name__ == "__main__": |
| main() |