golang Patreon API集成开发插件库patreon-go的使用

golang Patreon API集成开发插件库patreon-go的使用

Build Status GoDoc Go Report Card codecov MIT license Patreon

patreon-go 是一个用于访问 Patreon API 的 Go 客户端库。

如何导入

可以通过以下命令安装 patreon-go 包:

go get gopkg.in/mxpv/patreon-go.v1

或者

import "gopkg.in/mxpv/patreon-go.v1"

基础示例

import "gopkg.in/mxpv/patreon-go.v1"

func main() {
	client := patreon.NewClient(nil)
  
	user, err := client.FetchUser()
	if err != nil {
		// ...
	}

	print(user.Data.Id)
}

认证

patreon-go 库不直接处理认证。相反,在创建新客户端时,传递一个可以为您处理认证的 http.Client,很可能您需要使用 oauth2 包。

以下是使用静态令牌的示例:

import (
	"gopkg.in/mxpv/patreon-go.v1"
	"golang.org/x/oauth2"
)

func NewPatreonClient(ctx context.Context, token string) *patreon.Client {
	ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token})
	tc := oauth2.NewClient(ctx, ts)
	
	client := patreon.NewClient(tc)
	return client
}

自动刷新令牌:

func NewPatreonClient() (*patreon.Client, error) {
	config := oauth2.Config{
		ClientID:     "<client_id>",
		ClientSecret: "<client_secret>",
		Endpoint: oauth2.Endpoint{
			AuthURL:  AuthorizationURL,
			TokenURL: AccessTokenURL,
		},
		Scopes: []string{"users", "pledges-to-me", "my-campaign"},
	}

	token := oauth2.Token{
		AccessToken:  "<current_access_token>",
		RefreshToken: "<current_refresh_token>",
		// 必须非nil,否则令牌不会过期
		Expiry: time.Now().Add(-24 * time.Hour),
	}

	tc := config.Client(context.Background(), &token)

	client := NewClient(tc)
	_, err := client.FetchUser()
	if err != nil {
		panic(err)
	}

	print("OK")
}

示例代码

func Example_fetchPatronsAndPledges() {
	ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: testAccessToken})
	tc := oauth2.NewClient(oauth2.NoContext, ts)

	// 使用静态访问令牌创建客户端
	client := NewClient(tc)

	// 获取您的活动数据
	campaignResponse, err := client.FetchCampaign()
	if err != nil {
		panic(err)
	}

	campaignId := campaignResponse.Data[0].Id

	cursor := ""
	page := 1

	for {
		pledgesResponse, err := client.FetchPledges(campaignId,
			WithPageSize(25),
			WithCursor(cursor))

		if err != nil {
			panic(err)
		}

		// 以便于查找的方式获取所有用户
		users := make(map[string]*User)
		for _, item := range pledgesResponse.Included.Items {
			u, ok := item.(*User)
			if !ok {
				continue
			}

			users[u.Id] = u
		}

		fmt.Printf("Page %d\r\n", page)

		// 遍历pledges获取例如金额和用户名
		for _, pledge := range pledgesResponse.Data {
			amount := pledge.Attributes.AmountCents
			patronId := pledge.Relationships.Patron.Data.Id
			patronFullName := users[patronId].Attributes.FullName

			fmt.Printf("%s is pledging %d cents\r\n", patronFullName, amount)
		}

		// 获取下一页pledges的链接
		nextLink := pledgesResponse.Links.Next
		if nextLink == "" {
			break
		}

		cursor = nextLink
		page++
	}

	fmt.Print("Done!")
}

更多关于golang Patreon API集成开发插件库patreon-go的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang Patreon API集成开发插件库patreon-go的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用 patreon-go 集成 Patreon API

patreon-go 是一个非官方的 Golang 客户端库,用于与 Patreon API 进行交互。下面我将介绍如何使用这个库来集成 Patreon 到你的 Go 应用中。

安装

首先安装 patreon-go 库:

go get github.com/mxpv/patreon-go

基本使用

1. 创建客户端

你需要先创建一个 Patreon 客户端实例:

package main

import (
	"context"
	"fmt"
	"github.com/mxpv/patreon-go"
)

func main() {
	// 从 Patreon 开发者平台获取的凭据
	clientID := "your_client_id"
	clientSecret := "your_client_secret"
	redirectURL := "your_redirect_url"
	
	// 创建客户端
	client := patreon.NewClient(clientID, clientSecret, redirectURL)
	
	// 获取授权URL - 用户需要访问这个URL来授权你的应用
	authURL := client.GetAuthorizationURL("state", []string{"users", "pledges"})
	fmt.Println("请访问以下URL授权:", authURL)
}

2. 处理回调并获取访问令牌

用户授权后,Patreon 会重定向到你的回调URL,你需要处理回调并获取访问令牌:

func handleCallback(code string) (*patreon.AccessToken, error) {
	client := patreon.NewClient(clientID, clientSecret, redirectURL)
	
	// 使用授权码获取访问令牌
	token, err := client.GetAccessToken(context.Background(), code)
	if err != nil {
		return nil, fmt.Errorf("获取访问令牌失败: %v", err)
	}
	
	return token, nil
}

3. 使用访问令牌获取用户信息

func getUserInfo(accessToken string) (*patreon.UserResponse, error) {
	client := patreon.NewClient(clientID, clientSecret, redirectURL)
	client.SetAccessToken(accessToken)
	
	// 获取当前用户信息
	user, err := client.FetchUser(context.Background())
	if err != nil {
		return nil, fmt.Errorf("获取用户信息失败: %v", err)
	}
	
	return user, nil
}

高级功能

获取支持者列表

func getCampaignAndPledges(accessToken string) (*patreon.CampaignResponse, *patreon.PledgeResponse, error) {
	client := patreon.NewClient(clientID, clientSecret, redirectURL)
	client.SetAccessToken(accessToken)
	
	// 获取当前用户的 campaign
	campaign, err := client.FetchCampaign(context.Background())
	if err != nil {
		return nil, nil, fmt.Errorf("获取campaign失败: %v", err)
	}
	
	// 获取该campaign的所有pledges
	pledges, err := client.FetchPledges(campaign.Data[0].ID)
	if err != nil {
		return nil, nil, fmt.Errorf("获取pledges失败: %v", err)
	}
	
	return campaign, pledges, nil
}

刷新访问令牌

func refreshToken(refreshToken string) (*patreon.AccessToken, error) {
	client := patreon.NewClient(clientID, clientSecret, redirectURL)
	
	newToken, err := client.RefreshToken(context.Background(), refreshToken)
	if err != nil {
		return nil, fmt.Errorf("刷新令牌失败: %v", err)
	}
	
	return newToken, nil
}

完整示例

下面是一个完整的示例,展示如何实现OAuth流程:

package main

import (
	"context"
	"fmt"
	"log"
	"net/http"
	
	"github.com/mxpv/patreon-go"
)

const (
	clientID     = "your_client_id"
	clientSecret = "your_client_secret"
	redirectURL  = "http://localhost:8080/callback"
)

var client = patreon.NewClient(clientID, clientSecret, redirectURL)

func main() {
	http.HandleFunc("/", handleRoot)
	http.HandleFunc("/auth", handleAuth)
	http.HandleFunc("/callback", handleCallback)
	
	log.Println("服务器启动在 :8080")
	log.Fatal(http.ListenAndServe(":8080", nil))
}

func handleRoot(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, `<a href="/auth">登录Patreon</a>`)
}

func handleAuth(w http.ResponseWriter, r *http.Request) {
	// 生成授权URL并重定向
	authURL := client.GetAuthorizationURL("random_state", []string{"users", "pledges"})
	http.Redirect(w, r, authURL, http.StatusFound)
}

func handleCallback(w http.ResponseWriter, r *http.Request) {
	code := r.URL.Query().Get("code")
	if code == "" {
		http.Error(w, "未提供授权码", http.StatusBadRequest)
		return
	}
	
	// 获取访问令牌
	token, err := client.GetAccessToken(context.Background(), code)
	if err != nil {
		http.Error(w, fmt.Sprintf("获取令牌失败: %v", err), http.StatusInternalServerError)
		return
	}
	
	// 设置访问令牌
	client.SetAccessToken(token.AccessToken)
	
	// 获取用户信息
	user, err := client.FetchUser(context.Background())
	if err != nil {
		http.Error(w, fmt.Sprintf("获取用户信息失败: %v", err), http.StatusInternalServerError)
		return
	}
	
	// 显示用户信息
	fmt.Fprintf(w, "欢迎, %s!<br>", user.Data.Attributes.FullName)
	fmt.Fprintf(w, "你的Patreon ID: %s", user.Data.ID)
}

注意事项

  1. API速率限制:Patreon API有速率限制,确保你的应用正确处理429响应码。
  2. 令牌过期:访问令牌会过期,需要定期刷新。
  3. 权限范围:请求适当的权限范围,不要请求不必要的权限。
  4. 错误处理:始终检查API调用的错误响应。
  5. 生产环境:在生产环境中,应该安全地存储客户端凭据和访问令牌。

通过 patreon-go 库,你可以方便地将 Patreon 集成到你的 Go 应用中,实现用户认证、获取支持者信息等功能。

回到顶部