You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
3.7 KiB
139 lines
3.7 KiB
package qq
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"github.com/ouxuanserver/osmanthuswine/src/helper"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"net/url"
|
|
)
|
|
|
|
var (
|
|
Appid = ""
|
|
AppKey = ""
|
|
RedirectUri = ""
|
|
DefaultScope = "get_user_info"
|
|
CodeUrl = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=%s&redirect_uri=%s&state=%s&scope=%s"
|
|
TokenUrl = "https://graph.qq.com/oauth2.0/authorize?grant_type=authorization_code&client_id=%s&client_serect=%s&code=%s&redirect_uri=%s"
|
|
RefreshUrl = "https://graph.qq.com/oauth2.0/token?grant_type=refresh_token&client_id=%s&client_serect=%s&refresh_token=%s"
|
|
PcOpenidUrl = "https://graph.qq.com/oauth2.0/me?access_token=%s"
|
|
WapOpenidUrl = "https://graph.z.qq.com/moc2/me?access_token=%s"
|
|
UserInfoUrl = "https://graph.qq.com/user/get_user_info?access_token=%s&oauth_consumer_key=%s&openid=%s&format=json"
|
|
)
|
|
|
|
func GetCodeUrl() string {
|
|
uid := helper.CreateUUID()
|
|
return fmt.Sprintf(CodeUrl, Appid, url.PathEscape(RedirectUri), uid, DefaultScope)
|
|
}
|
|
|
|
func GetTokenUrl(code string) string {
|
|
return fmt.Sprintf(TokenUrl, Appid, AppKey, code, RedirectUri)
|
|
}
|
|
|
|
func GetRefreshUrl(refreshToken string) string {
|
|
return fmt.Sprintf(RefreshUrl, Appid, AppKey, refreshToken)
|
|
}
|
|
|
|
func GetPcOpenidUrl(accessToken string) string {
|
|
return fmt.Sprintf(PcOpenidUrl, accessToken)
|
|
}
|
|
|
|
func GetWapOpenidUrl(accessToken string) string {
|
|
return fmt.Sprintf(WapOpenidUrl, accessToken)
|
|
}
|
|
|
|
func GetUserInfoUrl(accessToken, openid string) string {
|
|
return fmt.Sprintf(UserInfoUrl, accessToken, Appid, openid)
|
|
}
|
|
|
|
type Token struct {
|
|
AccessToken string `json:"access_token"`
|
|
ExpiresIn int64 `json:"expires_in"`
|
|
RefreshToken string `json:"refresh_token"`
|
|
}
|
|
|
|
func GetToken(code string) (*Token, error) {
|
|
tokenUrl := GetTokenUrl(code)
|
|
resp, err := http.Get(tokenUrl)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
defer resp.Body.Close()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
token := new(Token)
|
|
err = json.Unmarshal(body, token)
|
|
return token, err
|
|
}
|
|
|
|
func RefreshToken(refreshToken string) (*Token, error) {
|
|
refreshUrl := GetRefreshUrl(refreshToken)
|
|
resp, err := http.Get(refreshUrl)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
defer resp.Body.Close()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
token := new(Token)
|
|
err = json.Unmarshal(body, token)
|
|
return token, err
|
|
}
|
|
|
|
type Open struct {
|
|
Openid string `json:"openid"`
|
|
ClientId string `json:"client_id"`
|
|
}
|
|
|
|
func GetPcOpenid(accessToken string) (*Open, error) {
|
|
pcOpenidUrl := GetPcOpenidUrl(accessToken)
|
|
resp, err := http.Get(pcOpenidUrl)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
defer resp.Body.Close()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
open := new(Open)
|
|
err = json.Unmarshal(body, open)
|
|
return open, err
|
|
}
|
|
|
|
type UserInfo struct {
|
|
Ret int `json:"ret"`
|
|
Msg string `json:"msg"`
|
|
Nickname string `json:"nickname"`
|
|
Figureurl string `json:"figureurl"`
|
|
Figureurl1 string `json:"figureurl_1"`
|
|
Figureurl2 string `json:"figureurl_2"`
|
|
FigureurlQq1 string `json:"figureurl_qq_1"`
|
|
FigureurlQq2 string `json:"figureurl_qq_2"`
|
|
Gender string `json:"gender"`
|
|
IsYellowVip string `json:"is_yellow_vip"`
|
|
Vip string `json:"vip"`
|
|
YellowVipLevel string `json:"yellow_vip_level"`
|
|
Level string `json:"level"`
|
|
IsYellowYearVip string `json:"is_yellow_year_vip"`
|
|
}
|
|
|
|
func GetUserInfo(accessToken, openid string) (*UserInfo, error) {
|
|
userInfoUrl := GetUserInfoUrl(accessToken, openid)
|
|
resp, err := http.Get(userInfoUrl)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
userInfo := new(UserInfo)
|
|
err = json.Unmarshal(body, userInfo)
|
|
return userInfo, err
|
|
}
|