CoolFace
Apppublic

HugBuddyAI/children-stories

sourceHugging Faceapache-2.0updated 2y agoView on Hugging Face
0likes
utils.py264 linesDownload Raw Back to meta_ai_api
1import logging2import random3import time4 5from requests_html import HTMLSession6import requests7from bs4 import BeautifulSoup8 9from meta_ai_api.exceptions import FacebookInvalidCredentialsException10 11 12def generate_offline_threading_id() -> str:13    """14    Generates an offline threading ID.15 16    Returns:17        str: The generated offline threading ID.18    """19    # Maximum value for a 64-bit integer in Python20    max_int = (1 << 64) - 121    mask22_bits = (1 << 22) - 122 23    # Function to get the current timestamp in milliseconds24    def get_current_timestamp():25        return int(time.time() * 1000)26 27    # Function to generate a random 64-bit integer28    def get_random_64bit_int():29        return random.getrandbits(64)30 31    # Combine timestamp and random value32    def combine_and_mask(timestamp, random_value):33        shifted_timestamp = timestamp << 2234        masked_random = random_value & mask22_bits35        return (shifted_timestamp | masked_random) & max_int36 37    timestamp = get_current_timestamp()38    random_value = get_random_64bit_int()39    threading_id = combine_and_mask(timestamp, random_value)40 41    return str(threading_id)42 43 44def extract_value(text: str, start_str: str, end_str: str) -> str:45    """46    Helper function to extract a specific value from the given text using a key.47 48    Args:49        text (str): The text from which to extract the value.50        start_str (str): The starting key.51        end_str (str): The ending key.52 53    Returns:54        str: The extracted value.55    """56    start = text.find(start_str) + len(start_str)57    end = text.find(end_str, start)58    return text[start:end]59 60 61def format_response(response: dict) -> str:62    """63    Formats the response from Meta AI to remove unnecessary characters.64 65    Args:66        response (dict): The dictionnary containing the response to format.67 68    Returns:69        str: The formatted response.70    """71    text = ""72    for content in (73        response.get("data", {})74        .get("node", {})75        .get("bot_response_message", {})76        .get("composed_text", {})77        .get("content", [])78    ):79        text += content["text"] + "\n"80    return text81 82 83# Function to perform the login84def get_fb_session(email, password, proxies=None):85    login_url = "https://mbasic.facebook.com/login/"86    headers = {87        "authority": "mbasic.facebook.com",88        "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",89        "accept-language": "en-US,en;q=0.9",90        "sec-ch-ua": '"Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122"',91        "sec-ch-ua-mobile": "?0",92        "sec-ch-ua-platform": '"macOS"',93        "sec-fetch-dest": "document",94        "sec-fetch-mode": "navigate",95        "sec-fetch-site": "none",96        "sec-fetch-user": "?1",97        "upgrade-insecure-requests": "1",98        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",99    }100    # Send the GET request101    response = requests.get(login_url, headers=headers, proxies=proxies)102    soup = BeautifulSoup(response.text, "html.parser")103 104    # Parse necessary parameters from the login form105    lsd = soup.find("input", {"name": "lsd"})["value"]106    jazoest = soup.find("input", {"name": "jazoest"})["value"]107    li = soup.find("input", {"name": "li"})["value"]108    m_ts = soup.find("input", {"name": "m_ts"})["value"]109 110    # Define the URL and body for the POST request to submit the login form111    post_url = "https://mbasic.facebook.com/login/device-based/regular/login/?refsrc=deprecated&lwv=100"112    data = {113        "lsd": lsd,114        "jazoest": jazoest,115        "m_ts": m_ts,116        "li": li,117        "try_number": "0",118        "unrecognized_tries": "0",119        "email": email,120        "pass": password,121        "login": "Log In",122        "bi_xrwh": "0",123    }124 125    headers = {126        "authority": "mbasic.facebook.com",127        "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",128        "accept-language": "en-US,en;q=0.9",129        "cache-control": "no-cache",130        "content-type": "application/x-www-form-urlencoded",131        "cookie": f"datr={response.cookies.get('datr')}; sb={response.cookies.get('sb')}; ps_n=1; ps_l=1",132        "dpr": "2",133        "origin": "https://mbasic.facebook.com",134        "pragma": "no-cache",135        "referer": "https://mbasic.facebook.com/login/",136        "sec-fetch-site": "same-origin",137        "sec-fetch-user": "?1",138        "upgrade-insecure-requests": "1",139        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",140        "viewport-width": "1728",141    }142 143    # Send the POST request144    session = requests.session()145    session.proxies = proxies146 147    result = session.post(post_url, headers=headers, data=data)148    if "sb" not in session.cookies:149        raise FacebookInvalidCredentialsException(150            "Was not able to login to Facebook. Please check your credentials. "151            "You may also have been rate limited. Try to connect to Facebook manually."152        )153 154    cookies = {155        **result.cookies.get_dict(),156        "sb": session.cookies["sb"],157        "xs": session.cookies["xs"],158        "fr": session.cookies["fr"],159        "c_user": session.cookies["c_user"],160    }161 162    response_login = {163        "cookies": cookies,164        "headers": result.headers,165        "response": response.text,166    }167    meta_ai_cookies = get_cookies()168 169    url = "https://www.meta.ai/state/"170 171    payload = f'__a=1&lsd={meta_ai_cookies["lsd"]}'172    headers = {173        "authority": "www.meta.ai",174        "accept": "*/*",175        "accept-language": "en-US,en;q=0.9",176        "cache-control": "no-cache",177        "content-type": "application/x-www-form-urlencoded",178        "cookie": f'ps_n=1; ps_l=1; dpr=2; _js_datr={meta_ai_cookies["_js_datr"]}; abra_csrf={meta_ai_cookies["abra_csrf"]}; datr={meta_ai_cookies["datr"]};; ps_l=1; ps_n=1',179        "origin": "https://www.meta.ai",180        "pragma": "no-cache",181        "referer": "https://www.meta.ai/",182        "sec-fetch-mode": "cors",183        "sec-fetch-site": "same-origin",184        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",185    }186 187    response = requests.request("POST", url, headers=headers, data=payload, proxies=proxies)188 189    state = extract_value(response.text, start_str='"state":"', end_str='"')190 191    url = f"https://www.facebook.com/oidc/?app_id=1358015658191005&scope=openid%20linking&response_type=code&redirect_uri=https%3A%2F%2Fwww.meta.ai%2Fauth%2F&no_universal_links=1&deoia=1&state={state}"192    payload = {}193    headers = {194        "authority": "www.facebook.com",195        "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",196        "accept-language": "en-US,en;q=0.9",197        "cache-control": "no-cache",198        "cookie": f"datr={response_login['cookies']['datr']}; sb={response_login['cookies']['sb']}; c_user={response_login['cookies']['c_user']}; xs={response_login['cookies']['xs']}; fr={response_login['cookies']['fr']}; m_page_voice={response_login['cookies']['m_page_voice']}; abra_csrf={meta_ai_cookies['abra_csrf']};",199        "sec-fetch-dest": "document",200        "sec-fetch-mode": "navigate",201        "sec-fetch-site": "cross-site",202        "sec-fetch-user": "?1",203        "upgrade-insecure-requests": "1",204        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",205    }206    session = requests.session()207    session.proxies = proxies208    response = session.get(url, headers=headers, data=payload, allow_redirects=False)209 210    next_url = response.headers["Location"]211 212    url = next_url213 214    payload = {}215    headers = {216        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:125.0) Gecko/20100101 Firefox/125.0",217        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",218        "Accept-Language": "en-US,en;q=0.5",219        "Accept-Encoding": "gzip, deflate, br",220        "Referer": "https://www.meta.ai/",221        "Connection": "keep-alive",222        "Cookie": f'dpr=2; abra_csrf={meta_ai_cookies["abra_csrf"]}; datr={meta_ai_cookies["_js_datr"]}',223        "Upgrade-Insecure-Requests": "1",224        "Sec-Fetch-Dest": "document",225        "Sec-Fetch-Mode": "navigate",226        "Sec-Fetch-Site": "cross-site",227        "Sec-Fetch-User": "?1",228        "TE": "trailers",229    }230    session.get(url, headers=headers, data=payload)231    cookies = session.cookies.get_dict()232    if "abra_sess" not in cookies:233        raise FacebookInvalidCredentialsException(234            "Was not able to login to Facebook. Please check your credentials. "235            "You may also have been rate limited. Try to connect to Facebook manually."236        )237    logging.info("Successfully logged in to Facebook.")238    return cookies239 240 241def get_cookies() -> dict:242    """243    Extracts necessary cookies from the Meta AI main page.244 245    Returns:246        dict: A dictionary containing essential cookies.247    """248    session = HTMLSession()249    response = session.get("https://www.meta.ai/")250    return {251        "_js_datr": extract_value(252            response.text, start_str='_js_datr":{"value":"', end_str='",'253        ),254        "abra_csrf": extract_value(255            response.text, start_str='abra_csrf":{"value":"', end_str='",'256        ),257        "datr": extract_value(258            response.text, start_str='datr":{"value":"', end_str='",'259        ),260        "lsd": extract_value(261            response.text, start_str='"LSD",[],{"token":"', end_str='"}'262        ),263    }264