| import gradio as gr |
| import requests |
| import time |
| import socket |
|
|
| def check_url_status(): |
| """检查目标URL的状态""" |
| target_url = "http://47.95.6.204:51000/" |
| |
| |
| try: |
| sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
| sock.settimeout(5) |
| result = sock.connect_ex(('47.95.6.204', 51000)) |
|
|
| sock.close() |
| if result != 0: |
| return f"❌ 端口连接失败: 无法连接到 47.95.6.204:51000 (端口可能未开放)" |
| except Exception as e: |
| return f"❌ 网络错误: {str(e)}" |
| |
| |
| try: |
| response = requests.get(target_url, timeout=10) |
| return f"✅ URL状态: {response.status_code} - 可访问" |
| except requests.exceptions.ConnectTimeout: |
| return f"❌ 连接超时: 服务器响应时间过长" |
| except requests.exceptions.ConnectionError: |
| return f"❌ 连接错误: 无法连接到服务器" |
| except Exception as e: |
| return f"❌ URL错误: {str(e)}" |
|
|
| def ping_server(): |
| """简单的服务器连通性测试""" |
| try: |
| import subprocess |
| result = subprocess.run(['ping', '-n', '2', '47.95.6.204'], |
| capture_output=True, text=True, timeout=10) |
| if result.returncode == 0: |
| return "✅ 服务器IP可达" |
| else: |
| return "❌ 服务器IP不可达" |
| except Exception as e: |
| return f"❌ Ping测试失败: {str(e)}" |
|
|
| def create_webpage_display(): |
| """创建显示指定网页的HTML内容""" |
| |
| debug_info = f"调试时间: {time.strftime('%Y-%m-%d %H:%M:%S')}<br>" |
| debug_info += f"目标URL: http://47.95.6.204:51000/<br>" |
| debug_info += f"网络连通性: {ping_server()}<br>" |
| debug_info += f"服务状态: {check_url_status()}<br><br>" |
| |
| iframe_html = f''' |
| <div style="border: 2px solid #ccc; padding: 10px; margin: 10px 0;"> |
| <h3>🔍 详细诊断信息:</h3> |
| <div style="background: #f8f9fa; padding: 10px; border-radius: 5px; font-family: monospace;"> |
| {debug_info} |
| </div> |
| |
| <h3>📋 可能的解决方案:</h3> |
| <div style="background: #fff3cd; padding: 10px; border-radius: 5px; border-left: 4px solid #ffc107;"> |
| <p><strong>如果服务器不可达,可以尝试以下方案:</strong></p> |
| <ol> |
| <li>检查服务器是否正在运行</li> |
| <li>确认端口47.95.6.204:51000是否开放</li> |
| <li>检查防火墙设置</li> |
| <li>使用下面的演示URL进行测试</li> |
| </ol> |
| </div> |
| |
| <h3>🌐 方式1: 直接链接测试</h3> |
| <p><a href="http://47.95.6.204:51000/" target="_blank" style="font-size: 18px; color: blue;">🔗 点击测试原始链接</a></p> |
| <p><a href="https://httpbin.org/html" target="_blank" style="font-size: 18px; color: green;">🔗 点击测试演示链接 (httpbin.org)</a></p> |
| |
| <h3>🖼️ 方式2: iframe嵌入测试</h3> |
| <div style="margin: 10px 0;"> |
| <p><strong>原始URL iframe:</strong></p> |
| <div style="width: 100%; height: 300px; border: 2px solid #dc3545; background: #f8d7da;"> |
| <iframe src="http://47.95.6.204:51000/" |
| width="100%" |
| height="100%" |
| frameborder="1" |
| allowfullscreen> |
| <p style="color: red; text-align: center; padding: 50px;"> |
| ⚠️ 原始服务器无法访问 |
| </p> |
| </iframe> |
| </div> |
| </div> |
| |
| <div style="margin: 10px 0;"> |
| <p><strong>演示URL iframe (应该可以正常显示):</strong></p> |
| <div style="width: 100%; height: 300px; border: 2px solid #28a745;"> |
| <iframe src="https://httpbin.org/html" |
| width="100%" |
| height="100%" |
| frameborder="1" |
| allowfullscreen> |
| <p>演示iframe加载失败</p> |
| </iframe> |
| </div> |
| </div> |
| |
| <h3>📊 技术说明</h3> |
| <div style="background: #e7f3ff; padding: 10px; border-radius: 5px; border-left: 4px solid #007bff;"> |
| <p><strong>在Hugging Face Spaces上部署时需要注意:</strong></p> |
| <ul> |
| <li>HF Spaces运行在HTTPS环境中,可能无法加载HTTP内容</li> |
| <li>某些网站设置了X-Frame-Options禁止iframe嵌入</li> |
| <li>需要确保目标服务器对外开放且稳定运行</li> |
| <li>建议使用HTTPS协议的目标URL</li> |
| </ul> |
| </div> |
| </div> |
| ''' |
| return iframe_html |
|
|
| |
| with gr.Blocks(title="网页显示器", theme=gr.themes.Soft()) as demo: |
| gr.Markdown("# 🌐 网页内容显示器") |
| gr.Markdown("**目标**: 显示来自 `http://47.95.6.204:51000/` 的网页内容") |
| |
| with gr.Tab("📋 诊断信息"): |
| |
| webpage_html = gr.HTML(value=create_webpage_display()) |
| |
| |
| refresh_btn = gr.Button("🔄 刷新诊断", variant="primary") |
| refresh_btn.click(fn=create_webpage_display, outputs=webpage_html) |
| |
| with gr.Tab("🔧 备用方案"): |
| gr.Markdown("### 如果原始服务器无法访问,可以尝试以下方案:") |
| |
| |
| def get_webpage_content(): |
| try: |
| response = requests.get("http://47.95.6.204:51000/", timeout=5) |
| content = response.text |
| |
| import re |
| content = re.sub(r'<script.*?</script>', '', content, flags=re.DOTALL) |
| return f"<div style='border: 1px solid #28a745; padding: 10px; max-height: 400px; overflow-y: auto; background: #f8f9fa;'><h4>✅ 网页源码获取成功:</h4><pre style='white-space: pre-wrap; font-size: 12px;'>{content[:3000]}{'...' if len(content) > 3000 else ''}</pre></div>" |
| except Exception as e: |
| return f"<div style='border: 1px solid #dc3545; padding: 10px; background: #f8d7da; color: #721c24;'><h4>❌ 获取失败:</h4><p>{str(e)}</p><p><strong>建议:</strong></p><ul><li>检查服务器是否运行</li><li>确认网络连接</li><li>尝试在浏览器中直接访问URL</li></ul></div>" |
| |
| content_btn = gr.Button("📄 尝试获取网页源码", variant="secondary") |
| content_output = gr.HTML() |
| content_btn.click(fn=get_webpage_content, outputs=content_output) |
| |
| gr.Markdown("---") |
| |
| |
| def show_demo_content(): |
| demo_html = ''' |
| <div style="border: 2px solid #28a745; padding: 20px; border-radius: 10px; background: #d4edda;"> |
| <h3>🎉 演示网页内容</h3> |
| <p>这是一个演示,说明iframe功能正常工作。</p> |
| <div style="background: white; padding: 15px; border-radius: 5px; margin: 10px 0;"> |
| <h4>如果你的服务器恢复,应该显示类似的内容:</h4> |
| <iframe src="https://example.com" width="100%" height="300" frameborder="1"></iframe> |
| </div> |
| <p><strong>部署到Hugging Face时注意:</strong></p> |
| <ul> |
| <li>确保你的服务器URL可以从公网访问</li> |
| <li>使用HTTPS协议更安全</li> |
| <li>检查服务器的CORS设置</li> |
| </ul> |
| </div> |
| ''' |
| return demo_html |
| |
| demo_btn = gr.Button("🎬 显示演示内容", variant="secondary") |
| demo_output = gr.HTML() |
| demo_btn.click(fn=show_demo_content, outputs=demo_output) |
|
|
| |
| if __name__ == "__main__": |
| demo.launch() |
|
|