HugBuddyAI/children-stories
0
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 