import json import time import re import os from datetime import datetime from urllib.parse import quote from requests_oauthlib import OAuth2Session from textblob import TextBlob import matplotlib.pyplot as plt from sessions import create_session def extract_text_from_commentary(commentary): return re.sub(r"{.*?}", "", commentary).strip() def analyze_sentiment(text): return TextBlob(text).sentiment.polarity def generate_mentions_dashboard(comm_client_id, comm_token_dict): org_urn = "urn:li:organization:19010008" encoded_urn = quote(org_urn, safe='') session = create_session(comm_client_id, token=comm_token_dict) session.headers.update({ "X-Restli-Protocol-Version": "2.0.0" }) base_url = ( "https://api.linkedin.com/rest/organizationalEntityNotifications" "?q=criteria" "&actions=List(COMMENT,SHARE_MENTION)" f"&organizationalEntity={encoded_urn}" "&count=20" ) all_notifications = [] start = 0 while True: url = f"{base_url}&start={start}" resp = session.get(url) if resp.status_code != 200: break data = resp.json() elements = data.get("elements", []) all_notifications.extend(elements) if len(elements) < data.get("paging", {}).get("count", 0): break start += len(elements) time.sleep(0.5) # Extract mentions and their share URNs mention_shares = [e.get("generatedActivity") for e in all_notifications if e.get("action") == "SHARE_MENTION"] mention_data = [] for share_urn in mention_shares: if not share_urn: continue encoded_share_urn = quote(share_urn, safe='') share_url = f"https://api.linkedin.com/rest/posts/{encoded_share_urn}" response = session.get(share_url) if response.status_code != 200: continue post = response.json() commentary_raw = post.get("commentary", "") if not commentary_raw: continue commentary = extract_text_from_commentary(commentary_raw) sentiment = analyze_sentiment(commentary) timestamp = post.get("createdAt", 0) dt = datetime.fromtimestamp(timestamp / 1000.0) mention_data.append({ "date": dt, "text": commentary, "sentiment": sentiment }) # Save HTML html_parts = ["

📣 Mentions Sentiment Dashboard

"] for mention in mention_data: html_parts.append(f"""

Date: {mention["date"].strftime('%Y-%m-%d')}

{mention["text"]}

Sentiment: {mention["sentiment"]:.2f}

""") html_path = "mentions_dashboard.html" with open(html_path, "w", encoding="utf-8") as f: f.write("\n".join(html_parts)) # Plot if mention_data: dates = [m["date"] for m in mention_data] sentiments = [m["sentiment"] for m in mention_data] plt.figure(figsize=(10, 5)) plt.plot(dates, sentiments, marker='o', linestyle='-', color='blue') plt.title("Sentiment Over Time") plt.xlabel("Date") plt.ylabel("Sentiment") plt.grid(True) plt.tight_layout() plt.savefig("mentions_sentiment_plot.png") plt.close() return html_path