import streamlit as st import requests from transformers import pipeline from deepface import DeepFace from PIL import Image import io # Load Fake News Detection Model from Hugging Face fake_news_pipeline = pipeline("text-classification", model="mrm8488/bert-tiny-finetuned-fake-news-detection") def classify_text(news_text): """Classifies text as Fake or Real with accuracy.""" result = fake_news_pipeline(news_text)[0] label = result['label'].lower() score = result['score'] * 100 # Convert to percentage return ("Fake" if label == "fake" else "Real"), round(score, 2) def analyze_image(image): """Analyzes image using DeepFace and provides a result.""" try: analysis = DeepFace.analyze(image, actions=['emotion']) dominant_emotion = analysis[0]['dominant_emotion'] return f"Analysis Complete - Dominant Emotion: {dominant_emotion}", 90.0 # Dummy Accuracy except Exception as e: return f"Error: {str(e)}", 0.0 def verify_news(news_text): """Generates a Google search link for verification.""" search_url = f"https://www.google.com/search?q={'+'.join(news_text.split())}" return search_url def check_video_fake_news(video_url): """Uses Google Fact-Check API for video verification.""" api_url = f"https://factchecktools.googleapis.com/v1alpha1/claims:search?query={video_url}&key=YOUR_API_KEY" response = requests.get(api_url) if response.status_code == 200: data = response.json() if 'claims' in data: return "Fake", 85.0 # Fake News Detected (Dummy Value) else: return "Real", 92.0 # Seems Real (Dummy Value) return "Unknown", 0.0 # Could Not Verify # Streamlit UI st.set_page_config(page_title="Fake News Detector", layout="wide") st.title("📰 Fake News Detector") # 🔹 Sidebar for Input Selection st.sidebar.title("Select Input Type") option = st.sidebar.radio("Choose an option", ["Text", "Image", "Video Link"]) # 🔹 Ensure session state variables are initialized for key in ["analyze_text", "result_text", "accuracy_text", "analyze_image", "analyze_video", "news_image", "video_url"]: if key not in st.session_state: st.session_state[key] = None # 🔹 Text Input Section if option == "Text": news_text = st.text_area("Enter the news content to check:", height=200) if st.button("Analyze News"): if not news_text.strip(): st.warning("Please enter some text.") else: result, accuracy = classify_text(news_text) st.session_state["result_text"] = result st.session_state["accuracy_text"] = accuracy # 🔹 Image Upload Section elif option == "Image": uploaded_image = st.file_uploader("Upload a news image", type=["jpg", "png", "jpeg"]) if uploaded_image and st.button("Analyze Image"): image = Image.open(uploaded_image) st.session_state["news_image"] = image result, accuracy = analyze_image(image) st.session_state["result_text"] = result st.session_state["accuracy_text"] = accuracy # 🔹 Video Link Section elif option == "Video Link": video_url = st.text_input("Enter the video link:") if st.button("Analyze Video"): if not video_url.strip(): st.warning("Please enter a valid video link.") else: st.session_state["video_url"] = video_url result, accuracy = check_video_fake_news(video_url) st.session_state["result_text"] = result st.session_state["accuracy_text"] = accuracy # 🔹 Results Section st.subheader("📊 Analysis Results") if st.session_state["result_text"]: result = st.session_state["result_text"] accuracy = st.session_state["accuracy_text"] if result == "Fake": st.error(f"❌ This is likely **Fake News**! (Accuracy: {accuracy}%)", icon="⚠️") else: st.success(f"✅ This is likely **Real News**! (Accuracy: {accuracy}%)", icon="✅") # 🔹 Verification Sources st.subheader("🔍 Verification & Trusted Sources") sources = [ "https://www.bbc.com/news", "https://www.cnn.com", "https://www.reuters.com", "https://factcheck.org", "https://www.snopes.com", "https://www.politifact.com" ] for link in sources: st.markdown(f"[🔗 {link}]({link})") if option == "Text": verification_link = verify_news(st.session_state["result_text"]) st.markdown(f"[🔎 Verify on Google]({verification_link})") # 🔹 Display Image if Uploaded if st.session_state["news_image"]: st.image(st.session_state["news_image"], caption="Uploaded Image", use_column_width=True) # 🔹 Display Video if Entered if st.session_state["video_url"]: st.video(st.session_state["video_url"])