main.go
package main
import (
"flag"
"github.com/PuerkitoBio/goquery"
"io"
"log"
"net/http"
"net/url"
"os"
)
var (
urlStr = flag.String("url", "", "the download url")
outputDir = flag.String("o", "", "the output dir")
)
func init() {
flag.Parse()
if *urlStr == "" {
flag.PrintDefaults()
os.Exit(0)
}
if l := len(*urlStr); (*urlStr)[l-1:] == "/" {
*urlStr = (*urlStr)[:l-1]
}
if *outputDir == "" {
*outputDir = "."
}
if l := len(*outputDir); (*outputDir)[l-1:] == "/" {
*outputDir = (*outputDir)[:l-1]
}
os.MkdirAll(*outputDir, 0755)
}
func main() {
download()
}
func download() bool {
doc, err := goquery.NewDocument(*urlStr)
if err != nil {
log.Println("下載失敗", err.Error())
return false
}
sl := doc.Find("a")
if sl == nil {
log.Println("沒有找到下載信息")
return false
}
a := sl.Last()
if a == nil {
log.Println("沒有找到下載信息")
return false
}
href, ok := a.Attr("href")
if !ok {
log.Println("沒有找到下載信息")
return false
}
if href == "../" {
log.Println("沒有找到下載信息")
return false
}
downloadUrl := *urlStr + "/" + href
encFilename, _ := url.PathUnescape(href)
fileName := *outputDir + "/" + encFilename
log.Println("開始下載", downloadUrl)
f, err := os.Create(fileName)
if err != nil {
log.Println("下載失敗", err.Error())
return false
}
defer f.Close()
res, err := http.Get(downloadUrl)
if err != nil {
log.Println("下載失敗", err.Error())
return false
}
if _, err := io.Copy(f, res.Body); err != nil {
log.Println("下載失敗", err.Error())
return false
}
log.Println("下載成功", fileName)
return true
}
build
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w" -o dd.s
run
./dds -url http://192.168.1.100/down/ -o download/