main.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "net"
  6. "net/http"
  7. "os"
  8. "path/filepath"
  9. )
  10. const scriptsDir = "scripts"
  11. func getLocalIP() (string, error) {
  12. addrs, err := net.InterfaceAddrs()
  13. if err != nil {
  14. return "", err
  15. }
  16. for _, addr := range addrs {
  17. var ip net.IP
  18. switch v := addr.(type) {
  19. case *net.IPNet:
  20. ip = v.IP
  21. case *net.IPAddr:
  22. ip = v.IP
  23. }
  24. if ip == nil || ip.IsLoopback() {
  25. continue
  26. }
  27. ip = ip.To4()
  28. if ip == nil {
  29. continue
  30. }
  31. return ip.String(), nil
  32. }
  33. return "", fmt.Errorf("no local IP address found")
  34. }
  35. func main() {
  36. // 服务端口号
  37. port := "18123"
  38. // 确保脚本目录存在
  39. if _, err := os.Stat(scriptsDir); os.IsNotExist(err) {
  40. os.Mkdir(scriptsDir, os.ModePerm)
  41. }
  42. // 遍历脚本目录并输出文件列表
  43. files, err := os.ReadDir(scriptsDir)
  44. if err != nil {
  45. log.Fatalf("无法读取脚本目录: %v", err)
  46. }
  47. if len(files) > 0 {
  48. ip, err := getLocalIP()
  49. if err != nil {
  50. fmt.Println("Error:", err)
  51. } else {
  52. fmt.Println("Local IP address:", ip)
  53. }
  54. fmt.Println("脚本目录下的文件有:")
  55. for _, file := range files {
  56. if !file.IsDir() {
  57. fmt.Printf("// @require http://%s:%s/scripts/%s\n", ip, port, file.Name())
  58. }
  59. }
  60. } else {
  61. fmt.Println("脚本目录为空。")
  62. }
  63. fmt.Println("")
  64. // 提供脚本下载
  65. http.HandleFunc("/scripts/", func(w http.ResponseWriter, r *http.Request) {
  66. if r.Method == http.MethodGet {
  67. fileName := filepath.Base(r.URL.Path)
  68. filePath := filepath.Join(scriptsDir, fileName)
  69. // 检查文件是否存在
  70. if _, err := os.Stat(filePath); os.IsNotExist(err) {
  71. http.Error(w, "脚本未找到", http.StatusNotFound)
  72. return
  73. }
  74. // 打开文件
  75. file, err := os.Open(filePath)
  76. if err != nil {
  77. http.Error(w, "无法打开文件", http.StatusInternalServerError)
  78. return
  79. }
  80. defer file.Close()
  81. // 获取文件的修改时间
  82. fileInfo, err := file.Stat()
  83. if err != nil {
  84. http.Error(w, "无法获取文件信息", http.StatusInternalServerError)
  85. return
  86. }
  87. // 提供文件下载
  88. http.ServeContent(w, r, fileName, fileInfo.ModTime(), file)
  89. } else {
  90. http.Error(w, "不支持的方法", http.StatusMethodNotAllowed)
  91. }
  92. })
  93. // 启动服务器
  94. fmt.Printf("服务器已启动,监听端口: %s\n", port)
  95. log.Fatal(http.ListenAndServe(":"+port, nil))
  96. }