localtunnel.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. """
  2. 使用 localtunnel 替代 ngrok
  3. """
  4. import subprocess
  5. import time
  6. import re
  7. def setup_localtunnel(port=8101, subdomain=None):
  8. """设置 localtunnel"""
  9. print("🔄 Setting up localtunnel...")
  10. # 1. 安装 localtunnel (需要 Node.js)
  11. try:
  12. # 检查 npm 是否可用
  13. subprocess.run(['npm', '--version'], check=True, capture_output=True)
  14. print("✅ npm is available")
  15. except subprocess.CalledProcessError:
  16. print("❌ npm not found. Please install Node.js first:")
  17. print(" curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -")
  18. print(" sudo apt-get install -y nodejs")
  19. return None
  20. # 2. 安装 localtunnel
  21. try:
  22. env = {
  23. 'https_proxy': 'http://172.16.40.16:7280',
  24. 'http_proxy': 'http://172.16.40.16:7280'
  25. }
  26. subprocess.run(['npm', 'install', '-g', 'localtunnel'], check=True, env=env)
  27. print("✅ localtunnel installed")
  28. except subprocess.CalledProcessError as e:
  29. print(f"❌ Installation failed: {e}")
  30. return None
  31. # 3. 启动隧道
  32. cmd = ['lt', '--port', str(port)]
  33. if subdomain:
  34. cmd.extend(['--subdomain', subdomain])
  35. try:
  36. print(f"🚀 Starting tunnel for port {port}...")
  37. process = subprocess.Popen(
  38. cmd,
  39. stdout=subprocess.PIPE,
  40. stderr=subprocess.PIPE,
  41. text=True,
  42. env={
  43. 'https_proxy': 'http://172.16.40.16:7280',
  44. 'http_proxy': 'http://172.16.40.16:7280'
  45. }
  46. )
  47. # 等待并获取 URL
  48. for _ in range(20):
  49. output = process.stdout.readline()
  50. if output:
  51. print(f"Output: {output.strip()}")
  52. # 查找 URL
  53. url_match = re.search(r'https://.*?\.loca\.lt', output)
  54. if url_match:
  55. url = url_match.group(0)
  56. print(f"✅ Tunnel URL: {url}")
  57. return url, process
  58. if process.poll() is not None:
  59. stderr = process.stderr.read()
  60. print(f"❌ Process failed: {stderr}")
  61. return None
  62. time.sleep(1)
  63. print("⏰ Timeout waiting for tunnel URL")
  64. process.terminate()
  65. return None
  66. except Exception as e:
  67. print(f"❌ Failed to start tunnel: {e}")
  68. return None
  69. if __name__ == "__main__":
  70. result = setup_localtunnel(8101)
  71. if result:
  72. url, process = result
  73. print(f"🌐 Your service is now accessible at: {url}")
  74. print("Press Ctrl+C to stop the tunnel")
  75. try:
  76. process.wait()
  77. except KeyboardInterrupt:
  78. print("\n🛑 Stopping tunnel...")
  79. process.terminate()