golang实现短信发送功能的textbelt API客户端插件库textbelt的使用

Golang实现短信发送功能的textbelt API客户端插件库textbelt的使用

简介

textbelt是一个用于发送短信到手机的Golang库,它基于textbelt.com的API服务。

安装

使用go get命令安装textbelt库:

$ go get gopkg.in/dietsche/textbelt.v1

示例代码

下面是一个完整的示例,展示如何使用textbelt库发送短信:

package main

import (
    "gopkg.in/dietsche/textbelt.v1"
)

func main() {
    // 创建一个新的textbelt客户端
    texter := textbelt.New()
    
    // 设置要发送短信的手机号码
    phoneToText := "123-456-7890"
    
    // 发送短信内容
    if err := texter.Text(phoneToText, "txt msg from go!"); err != nil {
        panic(err)
    }
}

代码说明

  1. 首先导入textbelt库:gopkg.in/dietsche/textbelt.v1
  2. 创建textbelt客户端实例:textbelt.New()
  3. 定义接收短信的手机号码(示例中使用的是"123-456-7890",实际使用时请替换为真实的手机号)
  4. 调用Text()方法发送短信,参数为手机号和短信内容
  5. 处理可能的错误

注意事项

  1. 请确保使用有效的手机号码替换示例中的"123-456-7890"
  2. textbelt.com可能有使用限制,请参考其官方文档了解详情
  3. 在实际生产环境中,建议添加更完善的错误处理逻辑,而不是直接panic

这个库提供了简单直接的API来发送短信,适合需要快速集成短信功能的Golang项目。


更多关于golang实现短信发送功能的textbelt API客户端插件库textbelt的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现短信发送功能的textbelt API客户端插件库textbelt的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang实现短信发送功能的Textbelt API客户端

Textbelt是一个简单的短信API服务,允许开发者通过HTTP请求发送短信。下面我将介绍如何使用Golang实现一个Textbelt API客户端。

安装

首先,确保你已经安装了Golang环境。然后创建一个新的Go模块:

mkdir textbelt-client
cd textbelt-client
go mod init github.com/yourusername/textbelt-client

基础实现

创建一个textbelt.go文件,实现基本的短信发送功能:

package textbelt

import (
	"bytes"
	"encoding/json"
	"errors"
	"fmt"
	"net/http"
)

// Client 表示Textbelt API客户端
type Client struct {
	APIKey     string
	BaseURL    string
	HTTPClient *http.Client
}

// NewClient 创建一个新的Textbelt客户端
func NewClient(apiKey string) *Client {
	return &Client{
		APIKey:     apiKey,
		BaseURL:    "https://textbelt.com",
		HTTPClient: &http.Client{},
	}
}

// SendSMSRequest 表示发送短信的请求体
type SendSMSRequest struct {
	Phone   string `json:"phone"`
	Message string `json:"message"`
	Key     string `json:"key"`
}

// SendSMSResponse 表示发送短信的响应
type SendSMSResponse struct {
	Success bool   `json:"success"`
	TextID  string `json:"textId,omitempty"`
	Error   string `json:"error,omitempty"`
}

// SendSMS 发送短信
func (c *Client) SendSMS(phone, message string) (*SendSMSResponse, error) {
	if phone == "" || message == "" {
		return nil, errors.New("phone and message are required")
	}

	requestBody := SendSMSRequest{
		Phone:   phone,
		Message: message,
		Key:     c.APIKey,
	}

	jsonBody, err := json.Marshal(requestBody)
	if err != nil {
		return nil, fmt.Errorf("failed to marshal request body: %v", err)
	}

	resp, err := c.HTTPClient.Post(
		c.BaseURL+"/text",
		"application/json",
		bytes.NewBuffer(jsonBody),
	)
	if err != nil {
		return nil, fmt.Errorf("failed to send request: %v", err)
	}
	defer resp.Body.Close()

	var response SendSMSResponse
	if err := json.NewDecoder(resp.Body).Decode(&response); err != nil {
		return nil, fmt.Errorf("failed to decode response: %v", err)
	}

	if !response.Success {
		return &response, fmt.Errorf("failed to send SMS: %s", response.Error)
	}

	return &response, nil
}

使用示例

创建一个main.go文件来演示如何使用这个客户端:

package main

import (
	"fmt"
	"log"

	"github.com/yourusername/textbelt-client/textbelt"
)

func main() {
	// 替换为你的Textbelt API密钥
	apiKey := "your_textbelt_api_key"
	client := textbelt.NewClient(apiKey)

	// 发送短信
	phone := "+1234567890" // 替换为目标电话号码
	message := "Hello from Go Textbelt client!"

	response, err := client.SendSMS(phone, message)
	if err != nil {
		log.Fatalf("Failed to send SMS: %v", err)
	}

	fmt.Printf("SMS sent successfully! Text ID: %s\n", response.TextID)
}

高级功能扩展

Textbelt还提供了一些其他功能,我们可以扩展我们的客户端:

// QuotaResponse 表示配额查询响应
type QuotaResponse struct {
	Success bool `json:"success"`
	Quota   int  `json:"quota"`
}

// CheckQuota 检查剩余短信配额
func (c *Client) CheckQuota() (*QuotaResponse, error) {
	resp, err := c.HTTPClient.Get(fmt.Sprintf("%s/quota/%s", c.BaseURL, c.APIKey))
	if err != nil {
		return nil, fmt.Errorf("failed to check quota: %v", err)
	}
	defer resp.Body.Close()

	var response QuotaResponse
	if err := json.NewDecoder(resp.Body).Decode(&response); err != nil {
		return nil, fmt.Errorf("failed to decode quota response: %v", err)
	}

	if !response.Success {
		return nil, errors.New("failed to check quota")
	}

	return &response, nil
}

错误处理与重试

我们可以添加简单的重试机制:

// SendSMSWithRetry 带重试机制的短信发送
func (c *Client) SendSMSWithRetry(phone, message string, maxRetries int) (*SendSMSResponse, error) {
	var lastErr error
	
	for i := 0; i < maxRetries; i++ {
		response, err := c.SendSMS(phone, message)
		if err == nil {
			return response, nil
		}
		lastErr = err
	}
	
	return nil, fmt.Errorf("after %d retries, last error: %v", maxRetries, lastErr)
}

测试

创建一个简单的测试文件textbelt_test.go:

package textbelt

import (
	"net/http"
	"net/http/httptest"
	"testing"
)

func TestSendSMS(t *testing.T) {
	// 创建测试服务器
	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.WriteHeader(http.StatusOK)
		w.Write([]byte(`{"success": true, "textId": "test123"}`))
	}))
	defer ts.Close()

	client := NewClient("testkey")
	client.BaseURL = ts.URL // 覆盖为测试服务器URL

	resp, err := client.SendSMS("+1234567890", "test message")
	if err != nil {
		t.Fatalf("Expected no error, got %v", err)
	}

	if !resp.Success {
		t.Error("Expected success to be true")
	}

	if resp.TextID != "test123" {
		t.Errorf("Expected textId 'test123', got '%s'", resp.TextID)
	}
}

注意事项

  1. Textbelt有免费和付费版本,免费版本有发送限制
  2. 国际号码需要包含国家代码(如+86)
  3. 短信内容有长度限制(通常为160个字符)
  4. 生产环境应考虑添加更完善的错误处理和日志记录

这个实现提供了基本的Textbelt API集成,你可以根据需要进一步扩展功能,如添加并发控制、更完善的错误处理等。

回到顶部