Spaces:
Sleeping
Sleeping
| from flask import Flask, render_template_string, Response | |
| import requests | |
| import base64 | |
| import csv | |
| app = Flask(__name__) | |
| # Timeout kam kar diya taake app latkay nahi | |
| VPNGATE_API_URL = "http://www.vpngate.net/api/iphone/" | |
| def get_vpn_servers(): | |
| servers = [] | |
| try: | |
| headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"} | |
| # Timeout sirf 3 second rakha hai | |
| response = requests.get(VPNGATE_API_URL, headers=headers, timeout=3) | |
| if response.status_code != 200: | |
| return [], "Server Busy (Error 200)" | |
| text_data = response.text | |
| lines = [line for line in text_data.split('\n') if not line.startswith('*')] | |
| reader = csv.DictReader(lines) | |
| for row in reader: | |
| if row and 'OpenVPN_ConfigData_Base64' in row: | |
| try: | |
| servers.append({ | |
| 'host': row['HostName'], | |
| 'ip': row['IP'], | |
| 'country': row['CountryLong'], | |
| 'speed': "Fast", | |
| 'ping': row['Ping'], | |
| 'config': row['OpenVPN_ConfigData_Base64'] | |
| }) | |
| except: | |
| pass | |
| return servers[:20], "" # Sirf top 20 servers layega taake load kam ho | |
| except Exception as e: | |
| # Agar error aaye to console mein dikhaye | |
| print(f"ERROR AYA HAI: {e}") | |
| return [], f"Connection Failed: {str(e)}" | |
| # HTML Design | |
| HTML_TEMPLATE = """ | |
| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <title>VPN Store</title> | |
| <meta name="viewport" content="width=device-width, initial-scale=1"> | |
| <style> | |
| body { font-family: sans-serif; padding: 20px; text-align: center; } | |
| .card { border: 1px solid #ddd; padding: 10px; margin: 10px 0; border-radius: 5px; } | |
| .btn { background: #007bff; color: white; padding: 8px 15px; text-decoration: none; border-radius: 4px; } | |
| </style> | |
| </head> | |
| <body> | |
| <h2>🚀 Free VPN List</h2> | |
| {% if error %} | |
| <p style="color: red;">⚠️ Status: {{ error }}</p> | |
| <p>Agar list nahi aa rahi, to 'Refresh' karein.</p> | |
| {% endif %} | |
| {% for server in servers %} | |
| <div class="card"> | |
| <h3>{{ server.country }}</h3> | |
| <p>IP: {{ server.ip }}</p> | |
| <a href="/download/{{ server.ip }}/{{ server.config }}" class="btn">Connect Now</a> | |
| </div> | |
| {% endfor %} | |
| </body> | |
| </html> | |
| """ | |
| def index(): | |
| servers, error = get_vpn_servers() | |
| return render_template_string(HTML_TEMPLATE, servers=servers, error=error) | |
| def download_config(ip, config_base64): | |
| try: | |
| decoded_config = base64.b64decode(config_base64) | |
| return Response( | |
| decoded_config, | |
| mimetype="application/x-openvpn-profile", | |
| headers={"Content-disposition": f"attachment; filename=VPN_{ip}.ovpn"} | |
| ) | |
| except: | |
| return "Download Error" | |
| if __name__ == '__main__': | |
| app.run(host='0.0.0.0', port=7860) |