go fyne 跨平台开发框架 gui 编程 抖音下载 去水印编程 学习交流

 

package filetool

import (
   "os"
   "path/filepath"
   "strings"
)

/*
获取程序运行路径
*/
func GetCurrentDirectory() string {
dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
if err != nil {

}
return strings.Replace(dir, "\\", "/", -1)
}

没有用废弃了。之后引用ttf字体库

package texttool

import "golang.org/x/text/encoding/simplifiedchinese"

type Charset string

const (
   UTF8    = Charset("UTF-8")
   GB18030 = Charset("GB18030")
   HZGB2312 = Charset("HZGB2312")
   GBK = Charset("GBK")
)

func ConvertByte2String(byte []byte, charset Charset) string {

   var str string
   switch charset {
   case GB18030:
      var decodeBytes,_=simplifiedchinese.GB18030.NewDecoder().Bytes(byte)
      str= string(decodeBytes)
   case GBK:
      var decodeBytes,_=simplifiedchinese.GBK.NewDecoder().Bytes(byte)
      str= string(decodeBytes)
   case HZGB2312:
      var decodeBytes,_=simplifiedchinese.HZGB2312.NewDecoder().Bytes(byte)
      str= string(decodeBytes)
   case UTF8:
      fallthrough
   default:
      str = string(byte)
   }

   return str
}

 目录结构

网络参考
package http

import (
   "bufio"
   "fmt"
   "golang.org/x/net/html/charset"
   "golang.org/x/text/encoding"
   "golang.org/x/text/encoding/unicode"
   "golang.org/x/text/transform"
   "io/ioutil"
   "log"
   "net/http"
   "strings"
)

func Httppost()  {
   data :=`{"type":"10","msg":"hello."}`
   request, _ := http.NewRequest("POST", "http://0.0.0.0:8090/msg", strings.NewReader(data))
   //post数据并接收http响应
   resp,err :=http.DefaultClient.Do(request)
   if err!=nil{
      fmt.Printf("post data error:%v\n",err)
   }else {
      fmt.Println("post a data successful.")
      respBody,_ :=ioutil.ReadAll(resp.Body)
      fmt.Printf("response data:%v\n",string(respBody))
   }
}
func HttpRequest(url string) (*http.Response, error) {
   request, err := http.NewRequest("GET", url, nil)
   if err != nil {
      return nil, err
   }
   // 设置请求投
   request.Header.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")
   request.Header.Add("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3")
   request.Header.Add("Connection", "keep-alive")
   request.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36")

   client := http.Client{}
   // Do sends an HTTP request and returns an HTTP response
   // 发起一个HTTP请求,返回一个HTTP响应
   return client.Do(request)
}


// 根据URL提取
func Fetch(url string) ([]byte, error) {
   resp, err := HttpRequest(url)
   if err != nil {
      return nil, err
   }
   defer resp.Body.Close()
   if resp.StatusCode != http.StatusOK {
      return nil, fmt.Errorf("wrong status code: %d of %s", resp.StatusCode, url)
   }
   r := bufio.NewReader(resp.Body)
   e := determineEncoding(r)
   utf8Reader := transform.NewReader(r,  e.NewDecoder())
   return ioutil.ReadAll(utf8Reader)
}

// 编码识别
func determineEncoding(
   r *bufio.Reader) encoding.Encoding{
   bytes, err:=r.Peek(1024)
   if err!=nil {
      log.Printf("fetch error : %v\n", err )
      // 如果没有识别到,返回一个UTF-8(默认)
      return unicode.UTF8
   }
   e, _, _ := charset.DetermineEncoding(
      bytes, "")
   return e
}
func httpRequest2(url string) (*http.Response, error) {
   request, err := http.NewRequest("GET", url, nil)
   if err != nil {
      return nil, err
   }
   request.Header.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")
   request.Header.Add("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3")
   request.Header.Add("Connection", "keep-alive")
   request.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36")

   client := http.Client{}
   return client.Do(request)
}
// 根据指定的URL进行数据抓取
func Fetch2(url string)([]byte,error)  {
   resp, err := HttpRequest(url)
   if err != nil{
      return nil,err
   }
   defer resp.Body.Close()
   if resp.StatusCode != http.StatusOK {
      return nil, fmt.Errorf("wrong status code: %d of %s", resp.StatusCode, url)
   }
   return ioutil.ReadAll(resp.Body)

}

 

参考了 python下载抖音爬虫做法

package http

import (
   "fmt"
   "fyne.io/fyne/cmd/filetool"
   "io"
   "net/http"
   "os"
   "regexp"
   "strconv"
   "strings"
   "time"
)

func Download_video(url string, callback func(length, downLen int64)) error {
   var (
      fsize   int64
      buf     = make([]byte, 32*1024)
      written int64
   )
   client := &http.Client{}
   //生成要访问的url

   //提交请求
   request, err := http.NewRequest("GET", url, nil)

   //增加header选项
   //reqest.Header.Add("Cookie", "xxxxxx")
   request.Header.Add("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/14A456 Safari/602.1")
   //reqest.Header.Add("X-Requested-With", "xxxx")
   request.Header.Set("Content-Type", "application/json")
   request.Header.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")
   request.Header.Add("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3")
   request.Header.Add("Connection", "keep-alive")

   if err != nil {
      panic(err)
   }
   //处理返回结果
   response, _ := client.Do(request)
   defer response.Body.Close()

   //读取服务器返回的文件大小
   fsize, err = strconv.ParseInt(response.Header.Get("Content-Length"), 10, 32)
   if err != nil {
      fmt.Println(err)
   }

   var currentPath = filetool.GetCurrentDirectory();
   pwd, _ := os.Getwd()
   var pathPrefix = ""
   //mac 环境 goland 直接点击运行会有 类似  /private/var/folders/lr/2yjc0y7519vbldvfs8lpcl8m0000gn/T  路劲
   if strings.Index(currentPath, "/private/var/folders/") == -1 {
      pathPrefix = currentPath;
   } else {
      pathPrefix = pwd

   }
   var fileSp = "/"
   if strings.Index(pathPrefix, ":") != -1 {
      fileSp = "\\"
   } else {
      fileSp = "/"
   }
   var timestampStr = time.Now().Format("2016-01-02 15:04:05.000")
   timestampStr = strings.ReplaceAll(timestampStr, ":", "_")
   var filename = pathPrefix + fileSp + timestampStr + ".mp4"
   fmt.Println("filefullpath :" + filename)
   f, err := os.Create(filename)
   for {
      //读取bytes
      nr, er := response.Body.Read(buf)
      if nr > 0 {
         //写入bytes
         nw, ew := f.Write(buf[0:nr])
         //数据长度大于0
         if nw > 0 {
            written += int64(nw)
         }
         //写入出错
         if ew != nil {
            err = ew
            break
         }
         //读取是数据长度不等于写入的数据长度
         if nr != nw {
            err = io.ErrShortWrite
            break
         }
      }
      if er != nil {
         if er != io.EOF {
            err = er
         }
         break
      }
      //没有错误了快使用 callback

      callback(fsize, written)
   }

   //下面是 io.copyBuffer() 的简化版本
   io.Copy(f, response.Body)

   return nil
}

//# source = "#在抖音,记录美好生活##主播说联播 大兴国际机场投运,两栖攻击舰下水,国庆节前“刷礼物”的节奏。大国威武!中国一定行! http://v.douyin.com/HrXT8b/ 复制此链接,打开【抖音短视频】,直接观看视频!"
func Decode_video_url(content string) (realUrl string, err error) {

   reg := regexp.MustCompile(`http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+`)
   params := reg.FindStringSubmatch(content)

   for _, param := range params {
      fmt.Println(param)
   }
   var resp, error = Fetch(params[0]);
   if error != nil {
      return "", error
   }
   //网页内容
   //fmt.Println(string(resp))

   var text = string(resp)
   reg = regexp.MustCompile(`playAddr:(.*?)\,`)
   data := reg.FindStringSubmatch(text)[0]
   println(data)
   playurl := strings.ReplaceAll(data, "playAddr: \"", "")
   println(playurl)
   playurl = strings.ReplaceAll(playurl, "playwm", "play")
   playurl = strings.TrimRight(playurl, "\",")
   return playurl, nil
}

 

 

 

 

 

 

 

// Package main provides various examples of Fyne API capabilities
package main

//入口

import (
   "fmt"
   "fyne.io/fyne"
   "fyne.io/fyne/app"
   "fyne.io/fyne/canvas"
   "fyne.io/fyne/cmd/filetool"
   "fyne.io/fyne/cmd/http"
   "fyne.io/fyne/cmd/texttool"
   "fyne.io/fyne/layout"
   "fyne.io/fyne/theme"
   "fyne.io/fyne/widget"
   "io/ioutil"
   "log"
   "net/url"
   "os"
   "os/exec"
   "path/filepath"
   "strings"
)

func formApp(app fyne.App) {
   w := app.NewWindow("Form")

   name := widget.NewEntry()
   name.SetPlaceHolder("John Smith")
   email := widget.NewEntry()
   email.SetPlaceHolder("test@example.com")
   password := widget.NewPasswordEntry()
   largeText := widget.NewMultiLineEntry()

   form := &widget.Form{

      OnCancel: func() {
         w.Close()
      },
      OnSubmit: func() {
         fmt.Println("Form submitted")
         fmt.Println("Name:", name.Text)
         fmt.Println("Email:", email.Text)
         fmt.Println("Password:", password.Text)
         fmt.Println("Message:", largeText.Text)
      },
   }
   form.Append("Name", name)
   form.Append("Email", email)
   form.Append("Password", password)
   form.Append("Message", largeText)
   w.SetContent(form)
   w.Show()
}

func confirmCallback(response bool) {
   fmt.Println("Responded with", response)
}

//yahalala 08/22 23:00
//如何支持中文?
//举报
//reenvs 08/28 08:48
//下一个ttf字体文件,再配下环境变量 FYNE_FONT=ttf文件路径,就可以了
 
func main() {
   a := app.New()
   w := a.NewWindow("Fyne")

   logo := canvas.NewImageFromResource(theme.FyneLogo())
   logo.SetMinSize(fyne.NewSize(64, 64))

   fyneio, err := url.Parse("http://www.baidu.com")
   if err != nil {
      fyne.LogError("无法转化url ", err)
   }

   var entry = widget.NewMultiLineEntry()

   var progressBar = widget.NewProgressBar()

   entry.SetPlaceHolder(texttool.ConvertByte2String([]byte("粘贴抖音连接到这里"), "UTF8"))

   w.SetContent(widget.NewVBox(
      //widget.NewToolbar(widget.NewToolbarAction(theme.MailComposeIcon(), func() { fmt.Println("New") }),
      // widget.NewToolbarSeparator(),
      // widget.NewToolbarSpacer(),
      // widget.NewToolbarAction(theme.ContentCutIcon(), func() { fmt.Println("Cut") }),
      // widget.NewToolbarAction(theme.ContentCopyIcon(), func() { fmt.Println("Copy") }),
      // widget.NewToolbarAction(theme.ContentPasteIcon(), func() { fmt.Println("Paste") }),
      //),

      //widget.NewGroup("Demos", widget.NewVBox(
      // widget.NewButton("Canvas", func() { Canvas(a) }),
      // widget.NewButton("Icons", func() { Icons(a) }),
      // widget.NewButton("Layout", func() { Layout(a) }),
      // widget.NewButton("Widgets", func() { Widget(a) }),
      // widget.NewButton("Form", func() { formApp(a) }),
      // widget.NewButton("Dialogs", func() { Dialogs(a) }),
      //)),

      widget.NewGroup("抖音去水印下载",
         fyne.NewContainerWithLayout(layout.NewGridLayout(2),
            widget.NewButton("暗色", func() {
               a.Settings().SetTheme(theme.DarkTheme())
            }),
            widget.NewButton("亮色", func() {
               a.Settings().SetTheme(theme.LightTheme())
            }),
         ),
      ),

      widget.NewHBox(layout.NewSpacer(), logo, layout.NewSpacer()),
      widget.NewHyperlinkWithStyle("www.baidu.com", fyneio, fyne.TextAlignCenter, fyne.TextStyle{}),

      layout.NewSpacer(),

      widget.NewGroup("下载",
         fyne.NewContainerWithLayout(layout.NewGridLayout(1),
            progressBar,
            entry,
            widget.NewButton("清除", func() {
               entry.SetText("")
            }),
            widget.NewButton("下载", func() {
               fmt.Println(entry.Text)
               if entry.Text == "" {
                  fmt.Println("信息为空")
                  return

               }
               if strings.Index(entry.Text, "http") == -1 {
                  fmt.Println("信息有错误")
                  return
               }

               url, err := http.Decode_video_url(entry.Text)
               if err != nil {
                  fmt.Println("Decode_video_url error")
                  return
               }
               err = http.Download_video(url, func(length, downLen int64) {
                  fmt.Println(length, downLen, float32(downLen)/float32(length))

                  progressValue := float64(downLen) / float64(length)
                  fmt.Println("down percent ", float64(downLen/length))
                  progressBar.SetValue(progressValue + 0.01) //误差0.01 下载只到0.998

               })
               if err != nil {
                  fmt.Println("Download_video err ", err)
               }

            }),
         )),

      //widget.NewButton("Input", func() { Input(a) }),
      //widget.NewButton("Advanced", func() { Advanced(a) }),
      widget.NewButtonWithIcon("退出", theme.CancelIcon(), func() {
         a.Quit()
      }),
   ))
   w.Resize(fyne.Size{500, 500})
   w.ShowAndRun()
}

func text() {
   osPath := filetool.GetCurrentDirectory()
   //文件完整路径

   filePath, _ := exec.LookPath(os.Args[0])

   //文件相对路径
   dirPath := filepath.Dir(osPath)

   //文件名

   fileName := filepath.Base(osPath)

   fmt.Println(filePath)
   fmt.Println(dirPath)
   fmt.Println(fileName)

   pwd, _ := os.Getwd()
   fmt.Println(pwd)
   //获取文件或目录相关信息
   fileInfoList, err := ioutil.ReadDir(pwd)
   if err != nil {
      log.Fatal(err)
   }
   fmt.Println(len(fileInfoList))
   for i := range fileInfoList {
      fmt.Println(fileInfoList[i].Name()) //打印当前文件或目录下的文件或目录名
   }

   fmt.Println(filetool.GetCurrentDirectory())
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值