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 = ["
Date: {mention["date"].strftime('%Y-%m-%d')}
{mention["text"]}
Sentiment: {mention["sentiment"]:.2f}