Akwbw's picture
Update app.py
1c379b8 verified
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>
"""
@app.route('/')
def index():
servers, error = get_vpn_servers()
return render_template_string(HTML_TEMPLATE, servers=servers, error=error)
@app.route('/download/<ip>/<config_base64>')
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)