原文:

国庆节假期学了2个新东西,分享下我的学习成果mp.weixin.qq.com/s/-9zzkEHsBvJU1UrIdahsCA

分享下我学习golang 的过程。

搭建golang环境

下载对应系统的安装包https://go.dev/dl/ ,如果下载慢可以用镜像 https://golang.google.cn/dl/ ,http://mirrors.ustc.edu.cn/golang/ ,https://studygolang.com/dl ,比如Windows系统下载这个https://studygolang.com/dl/golang/go1.19.1.windows-amd64.msi ,如果电脑里已经有go,安装之前会提示卸载旧版本,确定后直接覆盖安装在原来的Go目录。

安装成功后打开命令行输入go version就可以看到go版本了,这里用的命令行工具是微软的https://github.com/microsoft/terminal很多人问命令行是什么?有什么用, 比如用python下载公众号文章 一键批量下载微信公众号文章内容/图片/封面/视频/音频,支持导出html和pdf格式,包含阅读数/点赞数/在看数/留言数 ,命令行里的链接可以可以直接打开,不用再复制了。

ctrl+shift+pgo install update toolsvscode Code Runner
vi test.go
package main
func  main(){
     println("hello word")
}
go run test.go

临时测试代码可以用在线网站https://go.dev/play , https://jsplay.goplus.org/ ,还方便生成分享链接,新建个测试文件 test.http 点send request即可请求。

//GET http://localhost:8090/welcome HTTP/1.1

GET http://httpbin.org/ip

### post 
POST http://localhost:8090/companies HTTP/1.1

然后用golang 写个公众号批量下载工具,之前用python写了个公众号话题批量下载我又开发了个公众号音频视频和话题批量下载工具 ,以这个音频话题为例:https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MjM5NjAxOTU4MA==&action=getalbum&album_id=1777378132866465795&scene=173#wechat_redirect

输入话题地址的下载效果如图,990个音频很快就下载完了。


这次用golang重写了下,代码如下:

package main

import (
 "fmt"
 "io"
 "io/ioutil"
 "net/http"
 "os"
 "regexp"
)

func Exists(path string) bool {
 _, err := os.Stat(path) 
 if err != nil {
  if os.IsExist(err) {
   return true
  }
  return false
 }
 return true
}
func InArray(items []string, item string) bool {
 for _, eachItem := range items {
  if eachItem == item {
   return true
  }
 }
 return false
}
func main() {
 defer func() {
  if err := recover(); err != nil {
   fmt.Print("错误信息:")
   fmt.Println(err)  
  }
 }()
 var url string
 // https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MjM5NjAxOTU4MA==&action=getalbum&album_id=1777378132866465795&scene=173
 fmt.Print("公众号苏生不惑提示你请输入话题地址:")
 fmt.Scanln(&url)
 if len(url) == 0 {
  panic("话题地址为空")
 }
 client := &http.Client{}
 reqest, err := http.NewRequest("GET", url, nil)
 reqest.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1301.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat")
 if err != nil {
  panic(err)
 }
 response, _ := client.Do(reqest)
 defer response.Body.Close()
 bResp, _ := io.ReadAll(response.Body)
 // json, _ := simplejson.NewJson(bResp)
 content := string(bResp)
 var voiceids = regexp.MustCompile(`data-voiceid="(.*)"`).FindAllStringSubmatch(content, -1)
 var titles = regexp.MustCompile(`data-title="(.*)" data-voiceid`).FindAllStringSubmatch(content, -1)
 fileName := "wechat_topic_audio_list.txt"
 // fmt.Print(voiceids, titles)
 fileContent, _ := ioutil.ReadFile(fileName)
 var voice_urls = regexp.MustCompile(`\n`).Split(string(fileContent), -1)
 // fmt.Print(voice_urls)
 var f2 *os.File
 for k, v := range voiceids {
  if InArray(voice_urls, "https://res.wx.qq.com/voice/getvoice?mediaid="+v[1]) {
   fmt.Println("已经下载过音频:" + titles[k][1])
   continue
  }
  res, _ := http.Get("https://res.wx.qq.com/voice/getvoice?mediaid=" + v[1])
  f, _ := os.Create(titles[k][1] + ".mp3")
  io.Copy(f, res.Body)
  if Exists(fileName) {
   f2, _ = os.OpenFile(fileName, os.O_APPEND, 0666)
  } else {
   f2, _ = os.Create(fileName)
  }
  defer f2.Close()
  fmt.Println("正在下载音频:" + titles[k][1])
  // _, _ = io.WriteString(f2, "https://res.wx.qq.com/voice/getvoice?mediaid="+v[1]+"\n")
  // _, _ =f2.Write([]byte("https://res.wx.qq.com/voice/getvoice?mediaid="+v[1]+"\n"))
  _, _ = f2.WriteString("https://res.wx.qq.com/voice/getvoice?mediaid=" + v[1] + "\n")
  // _, _ = ioutil.WriteFile(fileName, []byte("https://res.wx.qq.com/voice/getvoice?mediaid="+v[1]+"\n"), 0666)

 }
 fmt.Print("下载完成")
}

下载效果:


更多我开发的工具:

更新版:整理下苏生不惑开发过的那些工具和脚本mp.weixin.qq.com/s/u9PTjbR5B5-od9fC_lyXLA