golang 批量下载QQ邮箱附件

该博客介绍了一种方法,通过HTTP GET请求和Go语言实现批量下载QQ邮箱中的所有附件。首先获取浏览器中的cookie和sid,然后利用这两个参数构造请求URL,遍历不同页面获取附件信息。通过正则表达式匹配下载路径和文件名,最后调用下载函数完成文件保存。此过程涉及到网络请求、数据解析和文件操作等技术。
摘要由CSDN通过智能技术生成

利用http GET请求方式下载所有附件,当然可以自行对名称进行过滤

1、参数的获取

cookie:浏览器登陆QQ邮箱后,进入开发者选项,获取document.cookie
sid:登录QQ邮箱后,url地址中有sid值,格式如下

https://mail.qq.com/cgi-bin/frame_html?sid=*******&r=*******

2、确定请求地址

2.1、获取所有附件信息

点击附近收藏->全部附近,在开发者选项中查看请求地址
在这里插入图片描述
地址格式如下

https://mail.qq.com/cgi-bin/attachfolder?topmails=0&sid=*********&s=search&folderid=all&hflag=all&action=&page=0&t=attach_folder_list&searchmode=attach&advancesearch=0&perpage=40&loc=&isNeedToRedraw=true&ver=863972.1&cacheage=7200

其中需要个人的sid,还有个重要参数page,通过改变page达到遍历所有文件的目的。

2.2、获取附件名称和下载路径

在浏览器中访问上述地址可以看到如下信息
在这里插入图片描述
图中:
sDown:附件下载路径
最终下载路径:“https://mail.qq.com/”+sDown+"&loc=attachfolder,down,"+文件格式+"&"
sFileName:附件名称

获取了这些信息后就可以做批量下载了
代码如下

package main

import (
	"fmt"
	"golang.org/x/text/encoding/simplifiedchinese"
	"io"
	"io/ioutil"
	"net/http"
	"os"
	"regexp"
	"strings"
	"sync"
)

const (
	User_Agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
	Cookie="*******"
)
type Charset string
const (
	UTF8    = Charset("UTF-8")
	GB18030 = Charset("GB18030")
)

var client=&http.Client{}
var wg=sync.WaitGroup{}
func main(){
	sid:="********"
	/*
	获取文件下载地址,文件名称
	*/
	go func(){
		for i:=20;i<24;i++ {
			URL := fmt.Sprintf(`https://mail.qq.com/cgi-bin/attachfolder?topmails=0&sid=%s&s=search&folderid=all&hflag=all&action=&page=%d&t=attach_folder_list&searchmode=attach&advancesearch=0&perpage=40&loc=&isNeedToRedraw=true&ver=805371.1&cacheage=7200`,sid,i)
			//%D7%F7%D2%B5
			request, err := http.NewRequest("GET", URL, nil)
			request.Header.Add("User-Agent", User_Agent)
			request.Header.Add("Cookie", Cookie)
			if err != nil {
				panic(err)
			}
			response, err := client.Do(request)
			if err != nil {
				panic(err)
			}
			defer response.Body.Close()

			context, err := ioutil.ReadAll(response.Body)

			if err!=nil {
				panic(err)
			}
			context_uft8 := convertByte2String(context, GB18030)

			search(context_uft8)
		}
		defer close(jobs)
	}()

	wg.Add(4)
	for i:=0;i<4;i++ {
		go worker(jobs)
	}
	wg.Wait()
}
var jobs=make(chan []string,0)
func search(context string){
	re:=regexp.MustCompile("sDown : \"(.*?)\"")
	path := re.FindAllStringSubmatch(context, -1)
	re=regexp.MustCompile("sFileName : \"(.*?)\"")
	name := re.FindAllStringSubmatch(context, -1)
	for i:=0;i<len(name);i++ {
		jobs<-[]string{name[i][1],path[i][1]}
	}
}
func worker(jobs chan []string){
	for job:=range jobs {
		download(job[0],job[1])
	}
	defer wg.Done()
}
func download(filename,path string){
	fmt.Println("开始下载:  ",filename)
	temp:=strings.Split(filename,".")
	URL:="https://mail.qq.com/"+path+"&loc=attachfolder,down,"+temp[1]+"&"
	URL=strings.Replace(URL,"\\x26","&",-1)
	request, err := http.NewRequest("GET", URL, nil)
	if err != nil {
		panic(err)
	}
	request.Header.Add("User-Agent", User_Agent)
	request.Header.Add("Cookie", Cookie)
	response,err:=client.Do(request)
	if err != nil {
		panic(err)
	}
	f, err := os.Create(filename)
	if err != nil {
		fmt.Println(err)
	}
	io.Copy(f, response.Body)
}
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 UTF8:
		fallthrough
	default:
		str = string(byte)
	}
	return str
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用golang下载gmail邮件附件的示例代码: ```go package main import ( "encoding/base64" "fmt" "io" "log" "net/mail" "net/smtp" "os" "path/filepath" "strings" "github.com/joho/godotenv" "golang.org/x/net/context" "golang.org/x/oauth2" "golang.org/x/oauth2/google" "google.golang.org/api/gmail/v1" ) func main() { // 加载.env环境变量文件 err := godotenv.Load() if err != nil { log.Fatalf("Error loading .env file: %v", err) } // 获取OAuth2访问令牌 ctx := context.Background() config, err := google.ConfigFromJSON([]byte(os.Getenv("GOOGLE_CLIENT_SECRET")), gmail.GmailReadonlyScope) if err != nil { log.Fatalf("Unable to parse client secret file to config: %v", err) } token := &oauth2.Token{ AccessToken: os.Getenv("GOOGLE_ACCESS_TOKEN"), RefreshToken: os.Getenv("GOOGLE_REFRESH_TOKEN"), TokenType: "Bearer", Expiry: oauth2.Now(), } client := config.Client(ctx, token) // 创建Gmail服务 srv, err := gmail.New(client) if err != nil { log.Fatalf("Unable to retrieve Gmail client: %v", err) } // 获取最新的10封邮件 user := "me" r, err := srv.Users.Messages.List(user).MaxResults(10).Q("is:unread").Do() if err != nil { log.Fatalf("Unable to retrieve messages: %v", err) } // 下载每个邮件的附件 for _, m := range r.Messages { msg, err := srv.Users.Messages.Get(user, m.Id).Do() if err != nil { log.Fatalf("Unable to retrieve message %v: %v", m.Id, err) } // 解析邮件头部 h := msg.Payload.Headers var subject, from, date string for _, v := range h { switch v.Name { case "Subject": subject = v.Value case "From": from = v.Value case "Date": date = v.Value } } // 下载附件 for _, p := range msg.Payload.Parts { if p.Filename != "" { part := p.Body data, err := base64.URLEncoding.DecodeString(part.Data) if err != nil { log.Fatalf("Unable to decode attachment %v: %v", p.Filename, err) } // 将附件保存到本地 ext := filepath.Ext(p.Filename) filename := fmt.Sprintf("%s_%s%s", strings.ReplaceAll(from, "@", "_"), subject, ext) f, err := os.Create(filename) if err != nil { log.Fatalf("Unable to create file %v: %v", filename, err) } defer f.Close() _, err = io.Copy(f, strings.NewReader(string(data))) if err != nil { log.Fatalf("Unable to save file %v: %v", filename, err) } log.Printf("Attachment saved: %v", filename) } } } } ``` 在上面的代码中,首先加载.env文件,该文件包含Google应用程序凭据和OAuth2访问令牌。 然后使用OAuth2访问令牌创建Gmail客户端,并使用该客户端获取最新的10封未读邮件。 对于每个邮件,我们获取其详细信息,包括邮件头部和附件。然后,我们使用base64解码附件数据,并将其保存到本地文件中。文件名采用发送方的电子邮件地址、主题和附件扩展名的组合。 最后,我们在控制台输出“Attachment saved: filename”以指示附件已成功保存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值