|
|
import gradio as gr |
|
|
import base64 |
|
|
import json |
|
|
import re |
|
|
import html |
|
|
|
|
|
def decode_proxy_entry(encoded_str): |
|
|
try: |
|
|
|
|
|
decoded_bytes = base64.b64decode(encoded_str) |
|
|
|
|
|
|
|
|
hex_string = decoded_bytes.decode('ascii') |
|
|
json_string = bytes.fromhex(hex_string).decode('ascii') |
|
|
|
|
|
|
|
|
return json.loads(json_string) |
|
|
except Exception as e: |
|
|
return {"error": f"Decoding failed: {str(e)}"} |
|
|
|
|
|
def process_html_input(html_content): |
|
|
try: |
|
|
|
|
|
unescaped_html = html.unescape(html_content) |
|
|
|
|
|
|
|
|
pattern = r'data-ss="\[(.*?)\]"' |
|
|
match = re.search(pattern, unescaped_html, re.DOTALL) |
|
|
|
|
|
if not match: |
|
|
return {"error": "No data-ss attribute found in the HTML"} |
|
|
|
|
|
data_ss_content = match.group(1) |
|
|
|
|
|
|
|
|
entries = re.findall(r'"([A-Za-z0-9+/=]+)"', data_ss_content) |
|
|
|
|
|
|
|
|
if not entries: |
|
|
entries = re.findall(r'"([A-Za-z0-9+/=]+)"', data_ss_content) |
|
|
|
|
|
if not entries: |
|
|
return {"error": "No base64 encoded entries found in data-ss attribute"} |
|
|
|
|
|
results = [] |
|
|
for i, entry in enumerate(entries): |
|
|
try: |
|
|
result = decode_proxy_entry(entry) |
|
|
results.append({ |
|
|
"entry": i + 1, |
|
|
"decoded_data": result |
|
|
}) |
|
|
except Exception as e: |
|
|
results.append({ |
|
|
"entry": i + 1, |
|
|
"error": f"Failed to decode: {str(e)}" |
|
|
}) |
|
|
|
|
|
return {"results": results, "total_entries": len(results)} |
|
|
except Exception as e: |
|
|
return {"error": f"Error processing HTML: {str(e)}"} |
|
|
|
|
|
def decode_single_entry(encoded_string): |
|
|
try: |
|
|
result = decode_proxy_entry(encoded_string) |
|
|
return result |
|
|
except Exception as e: |
|
|
return {"error": str(e)} |
|
|
|
|
|
|
|
|
test_html = '''<script |
|
|
id="serverSelectorScript" |
|
|
data-ss="["N2IyMjY5NjQyMjNhMzIzMDMxMmMyMjc1NzI2YzIyM2EyMjY4NzQ3NDcwNzMzYTVjMmY1YzJmMzEzMDM4MmUzMTM4MzEyZTMxMzEyZTMxMzczMTVjMmY1ZjVmNjM3MDMyMmU3MDY4NzAyMjJjMjI2ZTYxNmQ2NTIyM2EyMjcwNzM3OTYzNjg3YTRjNmY3MzQxNmU2NzY1NmM2NTczMzI0ZDIyN2Q="]" |
|
|
></script>''' |
|
|
|
|
|
|
|
|
def create_simple_interface(): |
|
|
with gr.Blocks(title="Proxy Decoder", css=".gradio-container {max-width: 1200px !important}") as demo: |
|
|
gr.Markdown("# Proxy Server Decoder") |
|
|
|
|
|
with gr.Tab("Single Entry"): |
|
|
with gr.Row(): |
|
|
with gr.Column(): |
|
|
single_input = gr.Textbox( |
|
|
label="Base64 String", |
|
|
placeholder="Paste base64 string here...", |
|
|
lines=3 |
|
|
) |
|
|
single_btn = gr.Button("Decode", variant="primary") |
|
|
with gr.Column(): |
|
|
single_output = gr.JSON(label="Result") |
|
|
|
|
|
with gr.Tab("HTML Parser"): |
|
|
with gr.Row(): |
|
|
with gr.Column(): |
|
|
html_input = gr.Textbox( |
|
|
label="HTML Content", |
|
|
value=test_html, |
|
|
lines=10 |
|
|
) |
|
|
html_btn = gr.Button("Parse HTML", variant="primary") |
|
|
with gr.Column(): |
|
|
html_output = gr.JSON(label="Results") |
|
|
|
|
|
|
|
|
single_btn.click( |
|
|
decode_single_entry, |
|
|
inputs=single_input, |
|
|
outputs=single_output |
|
|
) |
|
|
|
|
|
html_btn.click( |
|
|
process_html_input, |
|
|
inputs=html_input, |
|
|
outputs=html_output |
|
|
) |
|
|
|
|
|
return demo |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
demo = create_simple_interface() |
|
|
demo.launch( |
|
|
server_name="0.0.0.0", |
|
|
server_port=7860, |
|
|
share=False, |
|
|
inbrowser=True, |
|
|
show_error=True |
|
|
) |