Golang实现阿里云盘扫码登录及登录凭证刷新

Golang实现阿里云盘扫码登录及登录凭证刷新

本文仅做记录,参考价值不大,推荐参考

aoaostar/alidrive-uploader: 阿里云盘上传工具 (github.com)

foyoux/aligo: 🔥简单、易用、可扩展的阿里云盘 API 接口库🚀 (github.com)

获取会话ID

func authAuthorize() (sessionId *http.Cookie, err error) {
	inter := "https://auth.aliyundrive.com/v2/oauth/authorize"
	params := map[string]string{
		"login_type":    "custom",
		"response_type": "code",
		"redirect_uri":  "https://www.aliyundrive.com/sign/callback",
		"client_id":     "25dzX3vbYqktVxyX",
		"state":         `{"origin":"file://"}`,
	}
	res, err := get(Request{
		Url:    inter,
		Params: params,
	})
	if err != nil {
		return
	}
	for _, cookie := range res.Cookies() {
		if cookie.Name == "SESSIONID" {
			return cookie, nil
		}
	}
	return nil, ErrSessionId
}

获取二维码

func (ali *AliClient) QrcodeGenerate() (qrData QrCodeData, err error) {
	sessionId, err := authAuthorize()
	if err != nil {
		return
	}
	ali.Cookies = append(ali.Cookies, sessionId)
	inter := PASSPORT_HOST + NEWLOGIN_QRCODE_GENERATE_DO
	res, err := ali.get(Request{
		Url:    inter,
		Params: UniParams,
	})
	if err != nil {
		return
	}
	body, err := io.ReadAll(res.Body)
	if err != nil {
		return
	}
	qrDataStr := gjson.GetBytes(body, "content.data").String()
	err = json.Unmarshal([]byte(qrDataStr), &qrData)
	if err != nil {
		return
	}
	if qrData.CodeContent == "" {
		err = ErrQrCode
	}
	return
}

检查二维码状态

func (ali *AliClient) QrcodeCheck(qrCodeData QrCodeData) (refreshToken string, err error) {
	inter := PASSPORT_HOST + NEWLOGIN_QRCODE_QUERY_DO
	data, err := StructToMapString(qrCodeData)
	if err != nil {
		return
	}
	res, err := ali.post(Request{
		Url:    inter,
		Params: UniParams,
		Data:   data,
	})
	if err != nil {
		return
	}
	body, err := io.ReadAll(res.Body)
	if err != nil {
		return
	}
	qrCodeStatus := gjson.GetBytes(body, "content.data.qrCodeStatus").String()
	switch qrCodeStatus {
	case "NEW":
		err = ErrQrCodeNew
	case "SCANED":
		err = ErrQrCodeSCANED
	case "EXPIRED":
		err = ErrQrCodeEXPIRED
	case "CONFIRMED":
		// 已确认
		bizExt := gjson.GetBytes(body, "content.data.bizExt").String()
		// bizExt为base64 gb18030 编码的json字符串 需要解码
		decodedBytes, err := base64.StdEncoding.DecodeString(bizExt)
		if err != nil {
			return "", err
		}
		reader := transform.NewReader(bytes.NewReader(decodedBytes), simplifiedchinese.GB18030.NewDecoder())
		bizExtJson, err := io.ReadAll(reader)
		if err != nil {
			return "", err
		}
		bizExt = string(bizExtJson)
		refreshToken = gjson.Get(bizExt, "pds_login_result.refreshToken").String()
		ali.User.RefreshToken = refreshToken
		return refreshToken, nil
	default:
		err = ErrQrCodeUnKnown
	}
	return
}

使用RefreshToken获取AccessToken

func (ali *AliClient) RefreshTokenFunc() error {
	inter := API_HOST + V2_ACCOUNT_TOKEN
	res, err := ali.post(Request{
		Url: inter,
		Json: map[string]interface{}{
			"refresh_token": ali.User.RefreshToken,
			"grant_type":    "refresh_token",
		},
	})
	if err != nil {
		return err
	}
	body, err := io.ReadAll(res.Body)
	if err != nil {
		return err
	}
	err = json.Unmarshal(body, &ali.User)
	if err != nil {
		return err
	}
	if ali.User.AccessToken != "" {
		if ali.Headers == nil {
			ali.Headers = make(map[string]string)
		}
		ali.Headers["Authorization"] = ali.User.AccessToken
		return nil
	} else {
		return ErrRefreshToken
	}
}
Built with Hugo
主题 StackJimmy 设计
本网站由 提供 CDN加速/云储存服务