Spaces:
Sleeping
Sleeping
| from flask import Flask, request, jsonify | |
| import requests | |
| from bs4 import BeautifulSoup | |
| import json | |
| app = Flask(__name__) | |
| # Step 1: Fetch the authenticity_token and commitOid from the GitHub edit page | |
| def fetch_authenticity_token_and_commit_oid(): | |
| url = "https://github.com/omarnuwrar/api/edit/main/user.json" | |
| headers = { | |
| "cookie": "_octo=GH1.1.1509769180.1721774314; _device_id=0038e28d4f7d4f9baf8f76b6b9fb8980; _gh_sess=XxMNHmqq58kaNJpj3HKllufdyrUNNjxg3%2FW7rJNFwdwO%2FHbrcT2QcSEdzfhBTWdu3PrkDAVy6vs46R6I5kEENdJ%2Bhixu1gb5HiLv1uKh4lKCiwbG16TlJfbkGXUhvou9zTc9Bszn%2F4HOPD0%2FlG%2BauN1hu2MYcajmfMV%2Fb2R%2FvM8tABljOethGPx5CzrGE1b8EgZxMeOP5wNBrZH4KHPIAD6IAb2z7j%2FJaXHAImK9tmU5CIb5Q9fi9FH6l%2BjWdmSYXekDVHzrKK8mXmO2%2B8N%2BaG0r%2BqoBACKdpj3rbC9x1%2BSKMZjSmu0uNrCmJAPymukisTHFRVtuMikNtEZtVx8QYH%2F9j4hDPs6fOE7wAegPTG7xYeBM1QCNJgiHHGHzoawBFbs0DtEcZwIvRQgVCXYpE0YIUbp6LCEoVxxQeSiTYrBZcoXZ%2F%2BFvw7J7mZSG5pBfo%2FuZ6xQSblzlWpzg--SXX57IvnIMkLdZCr--s5FjBmuKtrEf71mhHx1g2g%3D%3D; saved_user_sessions=155741452%3Avhq2fotRhM6ixLZuU8plCTagdBxOI9UGuu5XwPf569UWHPOg; user_session=vhq2fotRhM6ixLZuU8plCTagdBxOI9UGuu5XwPf569UWHPOg; __Host-user_session_same_site=vhq2fotRhM6ixLZuU8plCTagdBxOI9UGuu5XwPf569UWHPOg; logged_in=yes; dotcom_user=omarnuwrar; color_mode=%7B%22color_mode%22%3A%22auto%22%2C%22light_theme%22%3A%7B%22name%22%3A%22light%22%2C%22color_mode%22%3A%22light%22%7D%2C%22dark_theme%22%3A%7B%22name%22%3A%22dark%22%2C%22color_mode%22%3A%22dark%22%7D%7D; cpu_bucket=lg; preferred_color_mode=light; tz=Africa%2FTripoli", | |
| "if-none-match": 'W/"2ff86bd1792cfee5ed79ee070b3b46de"', | |
| "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36", | |
| "x-github-target": "dotcom", | |
| "x-react-router": "json", | |
| "x-requested-with": "XMLHttpRequest", | |
| } | |
| response = requests.get(url, headers=headers) | |
| if response.status_code == 200: | |
| soup = BeautifulSoup(response.text, 'html.parser') | |
| script_tag = soup.find("script", {"type": "application/json", "data-target": "react-app.embeddedData"}) | |
| if script_tag: | |
| try: | |
| json_data = json.loads(script_tag.string.strip()) | |
| authenticity_token = json_data["payload"]["csrf_tokens"]["/omarnuwrar/api/tree-save/main/user.json"]["post"] | |
| commit_oid = json_data["payload"]["webCommitInfo"]["commitOid"] | |
| return authenticity_token, commit_oid | |
| except (KeyError, json.JSONDecodeError) as e: | |
| print(f"Error: Failed to extract data. Details: {str(e)}") | |
| return None, None | |
| else: | |
| print("Error: Could not find the required <script> tag.") | |
| return None, None | |
| else: | |
| print(f"Error: Failed to fetch the page. Status code: {response.status_code}") | |
| return None, None | |
| # Step 2: Send the POST request to update the user.json file | |
| def update_user_json_file(authenticity_token, commit_oid, new_content): | |
| url = "https://github.com/omarnuwrar/api/tree-save/main/user.json" | |
| headers = { | |
| "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36", | |
| "x-requested-with": "XMLHttpRequest", | |
| "github-verified-fetch": "true", | |
| "content-type": "application/x-www-form-urlencoded", | |
| "cookie": "_octo=GH1.1.1509769180.1721774314; _device_id=0038e28d4f7d4f9baf8f76b6b9fb8980; _gh_sess=XxMNHmqq58kaNJpj3HKllufdyrUNNjxg3%2FW7rJNFwdwO%2FHbrcT2QcSEdzfhBTWdu3PrkDAVy6vs46R6I5kEENdJ%2Bhixu1gb5HiLv1uKh4lKCiwbG16TlJfbkGXUhvou9zTc9Bszn%2F4HOPD0%2FlG%2BauN1hu2MYcajmfMV%2Fb2R%2FvM8tABljOethGPx5CzrGE1b8EgZxMeOP5wNBrZH4KHPIAD6IAb2z7j%2FJaXHAImK9tmU5CIb5Q9fi9FH6l%2BjWdmSYXekDVHzrKK8mXmO2%2B8N%2BaG0r%2BqoBACKdpj3rbC9x1%2BSKMZjSmu0uNrCmJAPymukisTHFRVtuMikNtEZtVx8QYH%2F9j4hDPs6fOE7wAegPTG7xYeBM1QCNJgiHHGHzoawBFbs0DtEcZwIvRQgVCXYpE0YIUbp6LCEoVxxQeSiTYrBZcoXZ%2F%2BFvw7J7mZSG5pBfo%2FuZ6xQSblzlWpzg--SXX57IvnIMkLdZCr--s5FjBmuKtrEf71mhHx1g2g%3D%3D; saved_user_sessions=155741452%3Avhq2fotRhM6ixLZuU8plCTagdBxOI9UGuu5XwPf569UWHPOg; user_session=vhq2fotRhM6ixLZuU8plCTagdBxOI9UGuu5XwPf569UWHPOg; __Host-user_session_same_site=vhq2fotRhM6ixLZuU8plCTagdBxOI9UGuu5XwPf569UWHPOg; logged_in=yes; dotcom_user=omarnuwrar; color_mode=%7B%22color_mode%22%3A%22auto%22%2C%22light_theme%22%3A%7B%22name%22%3A%22light%22%2C%22color_mode%22%3A%22light%22%7D%2C%22dark_theme%22%3A%7B%22name%22%3A%22dark%22%2C%22color_mode%22%3A%22dark%22%7D%7D; cpu_bucket=lg; preferred_color_mode=light; tz=Africa%2FTripoli", | |
| } | |
| payload = { | |
| "message": "Update user.json", | |
| "placeholder_message": "Update user.json", | |
| "description": "", | |
| "commit-choice": "direct", | |
| "target_branch": "main", | |
| "quick_pull": "", | |
| "guidance_task": "", | |
| "commit": commit_oid, | |
| "same_repo": "1", | |
| "pr": "", | |
| "content_changed": "true", | |
| "filename": "user.json", | |
| "new_filename": "user.json", | |
| "value": new_content, | |
| "authenticity_token": authenticity_token, | |
| } | |
| response = requests.post(url, headers=headers, data=payload) | |
| if response.status_code == 200: | |
| return {"success": True, "message": "user.json has been updated!"} | |
| else: | |
| return {"success": False, "message": f"Request failed with status code {response.status_code}", "details": response.text} | |
| # Function to fetch and extract the JSON data | |
| def fetch_json_from_github(): | |
| # URL of the GitHub page | |
| url = "https://github.com/omarnuwrar/api/blob/main/user.json" | |
| # Custom headers | |
| headers = { | |
| "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36", | |
| "Cookie": "_octo=GH1.1.613060662.1706026873; _device_id=a558b3829e717bb44a5756b2c914dad5; saved_user_sessions=169075744%3AYasgfrHcDi5hMOq-6Ry9Zv_VegdDA8KTM1voh_g-TGBKt85u; logged_in=no; cpu_bucket=lg; preferred_color_mode=light; tz=Africa%2FTripoli; _gh_sess=46lFv47ysdZXaDQjVTezeQ2FMXGNQcxjYKkJL2KyZuDGDnHEcIklvDAso6lZdCrKsvKTCh2Kg1OVIurbR2lKoCZHg%2FlZa6iX022mwXRsFjind%2Bwho8gLOT9FBpX%2B9Anu9aRubdkqajNFct4%2BjNOIkMIPPwVjLtdLi3jomLZjj4sVYSzIoJVi1pDooq76bjZRZgndwXocfXHD0Yo8t14l9wTrihU97ahTq2fU7UAetTQ0Xd%2BpqTaBLkcS%2F0SNieGg4MHlBoi2ecgyWQAk2625HiQCKGrVOtNsiihmaiRd%2FtfNxcja--XhXgdENhrRbNN6aw--DtMKGX0uq6kGd8BnbON4zw%3D%3D" | |
| } | |
| try: | |
| # Fetch the HTML content of the page | |
| response = requests.get(url, headers=headers) | |
| response.raise_for_status() # Raise an exception for HTTP errors | |
| # Parse the HTML using BeautifulSoup | |
| soup = BeautifulSoup(response.text, 'html.parser') | |
| # Find the <script> tag with type="application/json" and `data-target="react-app.embeddedData"` | |
| script_tag = soup.find('script', {'type': 'application/json', 'data-target': 'react-app.embeddedData'}) | |
| if script_tag: | |
| # Load the JSON content from the <script> tag | |
| embedded_data = json.loads(script_tag.string) | |
| # Navigate to the "blob" > "rawLines" key for the JSON in the file | |
| raw_lines = embedded_data.get("payload", {}).get("blob", {}).get("rawLines", []) | |
| if raw_lines: | |
| # The JSON content is in the first element of the rawLines list | |
| json_content = raw_lines[0] | |
| # Parse the JSON content | |
| data = json.loads(json_content) | |
| # Return the extracted JSON data | |
| return {"success": True, "data": data} | |
| else: | |
| return {"success": False, "message": "JSON data not found in the 'rawLines' key."} | |
| else: | |
| return {"success": False, "message": "Could not find the <script> tag with embedded JSON data."} | |
| except requests.exceptions.RequestException as e: | |
| return {"success": False, "message": f"Error fetching data: {e}"} | |
| except json.JSONDecodeError as je: | |
| return {"success": False, "message": f"Error parsing JSON: {je}"} | |
| def fetch_user_json(): | |
| result = fetch_json_from_github() | |
| return jsonify(result) | |
| # API Endpoint to update user.json | |
| def update_user_json(): | |
| data = request.json | |
| if not data or 'content' not in data: | |
| return jsonify({"success": False, "message": "Invalid request. 'content' field is required."}), 400 | |
| # Step 1: Fetch the authenticity_token and commitOid | |
| authenticity_token, commit_oid = fetch_authenticity_token_and_commit_oid() | |
| if authenticity_token and commit_oid: | |
| # Step 2: Perform the file update | |
| result = update_user_json_file(authenticity_token, commit_oid, data['content']) | |
| return jsonify(result) | |
| else: | |
| return jsonify({"success": False, "message": "Failed to fetch required tokens."}), 500 | |
| if __name__ == "__main__": | |
| app.run(host="0.0.0.0", port=7860) |