Procházet zdrojové kódy

weibo_history_list

Xingyu Xian před 2 dny
rodič
revize
88f7ec6b47

+ 1 - 1
handler/get_user_info.go

@@ -44,7 +44,7 @@ func (h *GetUserInfoHandler) getResponse() interface{} {
 }
 
 func (h *GetUserInfoHandler) run() {
-	userData, err := service.SUserInfo.FindBUserInfoByToken(h.ctx, h.req.Token)
+	userData, err := service.SUserInfo.FindSUserInfoByToken(h.ctx, h.req.Token)
 	if err != nil {
 		logrus.Errorf("[CodeLoginHandler] call AuthCode err:%+v\n", err)
 		util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, err.Error())

+ 55 - 0
handler/histort_data_list.go

@@ -0,0 +1,55 @@
+package handler
+
+import (
+	"github.com/gin-gonic/gin"
+	"youngee_b_api/model/http_model"
+	"youngee_b_api/service"
+)
+
+func WrapHistoryDataListHandler(ctx *gin.Context) {
+	handler := newHistoryDataListHandler(ctx)
+	baseRun(handler)
+}
+
+func newHistoryDataListHandler(ctx *gin.Context) *HistoryDataListHandler {
+	return &HistoryDataListHandler{
+		req:  http_model.NewHistoryDataListRequest(),
+		resp: http_model.NewHistoryDataListResponse(),
+		ctx:  ctx,
+	}
+}
+
+type HistoryDataListHandler struct {
+	req  *http_model.HistoryDataListRequest
+	resp *http_model.CommonResponse
+	ctx  *gin.Context
+}
+
+func (h *HistoryDataListHandler) getRequest() interface{} {
+	return h.req
+}
+
+func (h *HistoryDataListHandler) getContext() *gin.Context {
+	return h.ctx
+}
+
+func (h *HistoryDataListHandler) getResponse() interface{} {
+	return h.resp
+}
+
+func (h *HistoryDataListHandler) run() {
+	talentListData, err := service.STCooperate.GetHistoryDataList(h.ctx, h.req)
+	if err != nil {
+		h.resp.Message = err.Error()
+		h.resp.Data = err
+		h.resp.Status = 40000
+		return
+	}
+	h.resp.Message = "ok"
+	h.resp.Data = talentListData
+	h.resp.Status = 20000
+}
+
+func (h *HistoryDataListHandler) checkParam() error {
+	return nil
+}

+ 23 - 21
model/gorm_model/platform_kuaishou_user_info.go

@@ -5,27 +5,29 @@ import (
 )
 
 type PlatformKuaishouUserInfo struct {
-	Id           int       `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT;comment:主键,自增长" json:"id"`
-	OpenId       string    `gorm:"column:open_id;type:varchar(255);comment:快手用户唯一表示" json:"open_id"`
-	PlatformId   int       `gorm:"column:platform_id;type:int(11);comment:平台id,与third_platform_info中的id相同" json:"platform_id"`
-	TalentId     string    `gorm:"column:talent_id;type:varchar(255);comment:达人id" json:"talent_id"`
-	Code         string    `gorm:"column:code;type:varchar(255);comment:扫码后获得的临时票据" json:"code"`
-	AccessToken  string    `gorm:"column:access_token;type:varchar(1000);comment:调用API需要的参数" json:"access_token"`
-	RefreshToken string    `gorm:"column:refresh_token;type:varchar(1000);comment:用于刷新access_token" json:"refresh_token"`
-	NickName     string    `gorm:"column:nick_name;type:varchar(255);comment:快手昵称" json:"nick_name"`
-	HeadUri      string    `gorm:"column:head_uri;type:varchar(255);comment:用户头像" json:"head_uri"`
-	Fan          string    `gorm:"column:fan;type:varchar(255);comment:用户粉丝数" json:"fan"`
-	Expired      int       `gorm:"column:expired;type:tinyint(4);comment:access_token是否可用" json:"expired"`
-	SaleNum30Day int       `gorm:"column:sale_num_30day;type:int(11);comment:30日销量" json:"sale_num_30day"`
-	SaleNumTotal int       `gorm:"column:sale_num_total;type:int(11);comment:总销量" json:"sale_num_total"`
-	CreateTime   time.Time `gorm:"column:create_time;type:datetime;comment:创建时间" json:"create_time"`
-	UpdateTime   time.Time `gorm:"column:update_time;type:datetime;comment:更新时间" json:"update_time"`
-	IsDelete     int       `gorm:"column:is_delete;type:int(11);default:0;comment:是否被删除" json:"is_delete"`
-	LikeNum      int       `gorm:"column:like_num;type:int(11);default:0;comment:点赞数" json:"like_num"`
-	VideoNum     int       `gorm:"column:video_num;type:int(11);default:0;comment:作品数" json:"video_num"`
-	Gender       string    `gorm:"column:gender;type:varchar(255);comment:快手性别" json:"gender"`
-	City         string    `gorm:"column:city;type:varchar(255);comment:快手用户城市所在地" json:"city"`
-	Skill        string    `gorm:"column:skill"` // 技能
+	Id                 int       `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT;comment:主键,自增长" json:"id"`
+	OpenId             string    `gorm:"column:open_id;type:varchar(255);comment:快手用户唯一表示" json:"open_id"`
+	PlatformId         int       `gorm:"column:platform_id;type:int(11);comment:平台id,与third_platform_info中的id相同" json:"platform_id"`
+	TalentId           string    `gorm:"column:talent_id;type:varchar(255);comment:达人id" json:"talent_id"`
+	Code               string    `gorm:"column:code;type:varchar(255);comment:扫码后获得的临时票据" json:"code"`
+	AccessToken        string    `gorm:"column:access_token;type:varchar(1000);comment:调用API需要的参数" json:"access_token"`
+	RefreshToken       string    `gorm:"column:refresh_token;type:varchar(1000);comment:用于刷新access_token" json:"refresh_token"`
+	NickName           string    `gorm:"column:nick_name;type:varchar(255);comment:快手昵称" json:"nick_name"`
+	HeadUri            string    `gorm:"column:head_uri;type:varchar(255);comment:用户头像" json:"head_uri"`
+	Fan                string    `gorm:"column:fan;type:varchar(255);comment:用户粉丝数" json:"fan"`
+	Expired            int       `gorm:"column:expired;type:tinyint(4);comment:access_token是否可用" json:"expired"`
+	SaleNum30Day       int       `gorm:"column:sale_num_30day;type:int(11);comment:30日销量" json:"sale_num_30day"`
+	SaleNumTotal       int       `gorm:"column:sale_num_total;type:int(11);comment:总销量" json:"sale_num_total"`
+	CreateTime         time.Time `gorm:"column:create_time;type:datetime;comment:创建时间" json:"create_time"`
+	UpdateTime         time.Time `gorm:"column:update_time;type:datetime;comment:更新时间" json:"update_time"`
+	IsDelete           int       `gorm:"column:is_delete;type:int(11);default:0;comment:是否被删除" json:"is_delete"`
+	LikeNum            int       `gorm:"column:like_num;type:int(11);default:0;comment:点赞数" json:"like_num"`
+	VideoNum           int       `gorm:"column:video_num;type:int(11);default:0;comment:作品数" json:"video_num"`
+	Gender             string    `gorm:"column:gender;type:varchar(255);comment:快手性别" json:"gender"`
+	City               string    `gorm:"column:city;type:varchar(255);comment:快手用户城市所在地" json:"city"`
+	Skill              string    `gorm:"column:skill"`                 // 技能
+	HomePageCaptureUrl string    `gorm:"column:home_page_capture_url"` // 用户主页链接截图
+	HomePageUrl        string    `gorm:"column:home_page_url"`         // 用户主页链接
 }
 
 func (m *PlatformKuaishouUserInfo) TableName() string {

+ 28 - 0
model/http_model/history_data_list.go

@@ -0,0 +1,28 @@
+package http_model
+
+type HistoryDataListRequest struct {
+	PlatformUserId int `json:"platform_user_id"` // 平台用户ID
+}
+
+type HistoryDataListData struct {
+	TalentLocalDataListInfo []*HistoryDataList `json:"talent_local_data_list_info"`
+	Total                   int64              `json:"total"`
+}
+
+type HistoryDataList struct {
+	MainPhotoUrl string `json:"main_photo_url"` // 主图ID
+	CreatedAt    string `json:"created_at"`     // 创建时间
+	LikeCount    int    `json:"like_count"`     // 点赞
+	CollectCount int    `json:"collect_count"`  // 收藏
+	CommitCount  int    `json:"commit_count"`   // 评论数
+}
+
+func NewHistoryDataListRequest() *HistoryDataListRequest {
+	return new(HistoryDataListRequest)
+}
+
+func NewHistoryDataListResponse() *CommonResponse {
+	resp := new(CommonResponse)
+	resp.Data = new(HistoryDataListData)
+	return resp
+}

+ 1 - 0
route/init.go

@@ -111,6 +111,7 @@ func InitRoute(r *gin.Engine) {
 		c.POST("/talentCooperateData", handler.WrapTalentCooperateDataHandler) // 达人库合作数据-活跃数据查询
 		c.POST("/projectList", handler.WrapTalentProjectListHandler)           // 达人种草表现
 		c.POST("/localList", handler.WrapTalentLocalListHandler)               // 达人本地生活表现
+		c.POST("/historyDataList", handler.WrapHistoryDataListHandler)         // 达人历史作品列表
 	}
 
 	// 本地生活

+ 32 - 0
service/s_t_cooperate.go

@@ -272,3 +272,35 @@ func (*stcooperate) GetTalentLocalList(ctx context.Context, request *http_model.
 
 	return nil, nil
 }
+
+// GetHistoryDataList 历史作品列表
+func (*stcooperate) GetHistoryDataList(ctx context.Context, request *http_model.HistoryDataListRequest) (*http_model.HistoryDataListData, error) {
+
+	var historyRespList *http_model.HistoryDataListData
+	historyRespList = &http_model.HistoryDataListData{}
+
+	// 1. 查找达人第三方平台授权信息
+	platformUserInfo, platformUserErr := db.FindUserInfoById(ctx, request.PlatformUserId)
+	if platformUserErr != nil {
+		return nil, platformUserErr
+	}
+	if platformUserInfo != nil {
+
+		// 2. 查找平台历史作品列表
+		historyList, err := GetWeiBoHistoryList(ctx, platformUserInfo.HomePageUrl)
+		if err != nil {
+			return nil, err
+		}
+		if historyList != nil {
+			for _, history := range historyList {
+				var historyResp *http_model.HistoryDataList
+				historyResp = &http_model.HistoryDataList{}
+				historyResp.CommitCount = history.Likes
+				historyResp.CommitCount = history.Comments
+				historyResp.CreatedAt = history.CreatedAt
+				historyRespList.TalentLocalDataListInfo = append(historyRespList.TalentLocalDataListInfo, historyResp)
+			}
+		}
+	}
+	return historyRespList, nil
+}

+ 10 - 4
service/s_user_info.go

@@ -13,8 +13,8 @@ var SUserInfo *sUserInfo
 type sUserInfo struct {
 }
 
-// FindBUserInfoByToken 根据Token查询商家端用户信息
-func (*sUserInfo) FindBUserInfoByToken(ctx context.Context, token string) (*http_model.GetUserInfoData, error) {
+// FindSUserInfoByToken 根据Token查询服务商端用户信息
+func (*sUserInfo) FindSUserInfoByToken(ctx context.Context, token string) (*http_model.GetUserInfoData, error) {
 	if token != "" {
 		if auth, err := LoginAuth.AuthToken(ctx, token); err == nil {
 			var userInfo *http_model.GetUserInfoData
@@ -48,12 +48,18 @@ func (*sUserInfo) FindBUserInfoByToken(ctx context.Context, token string) (*http
 				userInfo.CooperatePermission = jobInfo.CooperatePermission
 				userInfo.FinancialPermission = jobInfo.FinancialPermission
 			}
-			supplierUserInfo, supplierUserErr := db.GetUserByPhone(ctx, auth.Phone)
+			supplierUserInfo, supplierUserErr := db.GetSupplierById(ctx, auth.SupplierId)
 			if supplierUserErr != nil {
 				return nil, supplierUserErr
 			}
 			if supplierUserInfo != nil {
-				userInfo.AuthStatus = supplierUserInfo.AuthStatus
+				if supplierUserInfo.ReviewStatus == 1 {
+					userInfo.AuthStatus = 1
+					userInfo.SupplierType = 0
+				} else if supplierUserInfo.ReviewStatus == 2 {
+					userInfo.AuthStatus = 2
+					userInfo.SupplierType = supplierUserInfo.SupplierType
+				}
 			}
 			return userInfo, nil
 		} else {

+ 354 - 0
service/talent_platform_link_info.go

@@ -0,0 +1,354 @@
+package service
+
+import (
+	"context"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"strconv"
+	"strings"
+)
+
+// RedBookNoteResponse 小红书链接接收结构体
+type RedBookNoteResponse struct {
+	Code int `json:"code"`
+	Data struct {
+		ResponseBody struct {
+			Data struct {
+				Items []struct {
+					NoteCard struct {
+						InteractInfo struct {
+							LikedCount     string `json:"liked_count"`     // 点赞数
+							CommentCount   string `json:"comment_count"`   // 评论数
+							CollectedCount string `json:"collected_count"` // 收藏数
+							ShareCount     string `json:"share_count"`     // 分享数
+						} `json:"interact_info"`
+					} `json:"note_card"`
+				} `json:"items"`
+			} `json:"data"`
+		} `json:"response_body"`
+	} `json:"data"`
+}
+
+// WeiboPostResponse 微博链接接收结构体
+type WeiboPostResponse struct {
+	Code int    `json:"code"`
+	Msg  string `json:"msg"`
+	Data struct {
+		AttitudesCount int `json:"attitudes_count"` // 点赞数
+		CommentsCount  int `json:"comments_count"`  // 评论数
+		RepostsCount   int `json:"reposts_count"`   // 转发数
+		ReadsCount     int `json:"reads_count"`     // 浏览数
+	} `json:"data"`
+}
+
+// parseNoteStats 小红书接收方法
+func parseNoteStats(jsonData []byte) (likes, comments, collects, shares string, err error) {
+	var resp RedBookNoteResponse
+	if err := json.Unmarshal(jsonData, &resp); err != nil {
+		return "", "", "", "", fmt.Errorf("JSON解析失败: %v", err)
+	}
+
+	// 检查数据是否存在
+	if len(resp.Data.ResponseBody.Data.Items) == 0 {
+		return "", "", "", "", errors.New("未找到笔记数据")
+	}
+
+	stats := resp.Data.ResponseBody.Data.Items[0].NoteCard.InteractInfo
+	return stats.LikedCount, stats.CommentCount, stats.CollectedCount, stats.ShareCount, nil
+}
+
+// parseWeiboStats 微博接收方法
+func parseWeiboStats(jsonData []byte) (likes, comments, reposts, reads string, err error) {
+	var resp WeiboPostResponse
+
+	// 解析JSON
+	if err := json.Unmarshal(jsonData, &resp); err != nil {
+		return "", "", "", "", fmt.Errorf("JSON解析失败: %v", err)
+	}
+
+	// 检查状态码(微博通常用 code=200 表示成功)
+	if resp.Code != 200 {
+		return "", "", "", "", fmt.Errorf("API返回错误: %s", resp.Msg)
+	}
+
+	// 返回数值(转为字符串,保持与原函数一致)
+	return strconv.Itoa(resp.Data.AttitudesCount),
+		strconv.Itoa(resp.Data.CommentsCount),
+		strconv.Itoa(resp.Data.RepostsCount),
+		strconv.Itoa(resp.Data.ReadsCount),
+		nil
+}
+
+// GetRedBookLinkDetail 获取小红书链接数据详情
+func GetRedBookLinkDetail(ctx context.Context, shareText string) (int, int, int, int, error) {
+
+	url := "http://120.46.92.62:6888/api/xhs/note_detail"
+	method := "POST"
+
+	// 构造请求体结构
+	requestBody := struct {
+		ShareText string `json:"share_text"`
+		Proxy     string `json:"proxy"`
+	}{
+		ShareText: shareText,
+		Proxy:     "",
+	}
+
+	jsonData, err := json.Marshal(requestBody)
+	if err != nil {
+		fmt.Println("JSON编码失败:", err)
+		return 0, 0, 0, 0, err
+	}
+
+	payload := strings.NewReader(string(jsonData))
+
+	client := &http.Client{}
+	req, err := http.NewRequest(method, url, payload)
+
+	if err != nil {
+		// fmt.Println(err)
+		return 0, 0, 0, 0, err
+	}
+	req.Header.Add("Cookie", "abRequestId=87d8ec6f-314f-5914-af1d-21296bf34c5f; a1=197a0b8a06djmry91j6taqhe0kcutwojdcu15nypd50000386246; webId=ae01b40eef7780a778b6624a3b295f4f; gid=yjW08S8Y2yffyjW08DY08SIvKfV6FvjyVK907UfAxd8TSy2879ElV2888qYKJ4K82qfKy82D; webBuild=4.68.0; acw_tc=0a4a2d6e17510033969926232e7b39d55058a43fb37e1ddc19745e6642f746; websectiga=7750c37de43b7be9de8ed9ff8ea0e576519e8cd2157322eb972ecb429a7735d4; sec_poison_id=b4fae566-5d78-4269-85c6-28fc28ec20d3; xsecappid=xhs-pc-web; web_session=040069b22467fb3084e74f796b3a4b11424ee0; loadts=1751003476156; unread={%22ub%22:%22685b56850000000020019eef%22%2C%22ue%22:%22685df405000000002201fd00%22%2C%22uc%22:14}")
+	req.Header.Add("Content-Type", "application/json")
+
+	res, err := client.Do(req)
+	if err != nil {
+		// fmt.Println(err)
+		return 0, 0, 0, 0, err
+	}
+	defer res.Body.Close()
+
+	body, err := ioutil.ReadAll(res.Body)
+	if err != nil {
+		// fmt.Println(err)
+		return 0, 0, 0, 0, err
+	}
+	fmt.Println(string(body))
+
+	// 提取互动数据
+	likes, comments, collects, shares, err := parseNoteStats(body)
+	if err != nil {
+		//fmt.Println("解析互动数据失败:", err)
+		return 0, 0, 0, 0, err
+	}
+
+	like, likeErr := strconv.Atoi(likes)
+	if likeErr != nil {
+	}
+	comment, commentErr := strconv.Atoi(comments)
+	if commentErr != nil {
+	}
+	collect, collectErr := strconv.Atoi(collects)
+	if collectErr != nil {
+	}
+	share, shareErr := strconv.Atoi(shares)
+	if shareErr != nil {
+	}
+	return like, comment, collect, share, nil
+}
+
+// GetWeiBoLinkDetail 获取微博链接数据详情
+func GetWeiBoLinkDetail(ctx context.Context, shareText string) (int, int, int, int, error) {
+	url := "http://120.46.92.62:6888/api/weibo/post_detail"
+	method := "POST"
+
+	fmt.Println(shareText)
+
+	requestBody := struct {
+		Id        string `json:"id"`
+		ShareText string `json:"share_text"`
+		Proxy     string `json:"proxy"`
+	}{
+		Id:        "",
+		ShareText: shareText,
+		Proxy:     "",
+	}
+
+	jsonData, err := json.Marshal(requestBody)
+	if err != nil {
+		fmt.Println("JSON编码失败:", err)
+		return 0, 0, 0, 0, err
+	}
+
+	payload := strings.NewReader(string(jsonData))
+
+	client := &http.Client{}
+	req, err := http.NewRequest(method, url, payload)
+
+	fmt.Println(req)
+
+	if err != nil {
+		//fmt.Println(err)
+		return 0, 0, 0, 0, err
+	}
+	req.Header.Add("Content-Type", "application/json")
+
+	res, err := client.Do(req)
+	if err != nil {
+		fmt.Println(err)
+		return 0, 0, 0, 0, err
+	}
+	defer res.Body.Close()
+
+	body, err := ioutil.ReadAll(res.Body)
+	if err != nil {
+		fmt.Println(err)
+		return 0, 0, 0, 0, err
+	}
+	// fmt.Println(string(body))
+
+	likes, comments, collects, shares, err := parseWeiboStats(body)
+	if err != nil {
+		//fmt.Println("解析互动数据失败:", err)
+		return 0, 0, 0, 0, err
+	}
+
+	like, likeErr := strconv.Atoi(likes)
+	if likeErr != nil {
+	}
+	comment, commentErr := strconv.Atoi(comments)
+	if commentErr != nil {
+	}
+	collect, collectErr := strconv.Atoi(collects)
+	if collectErr != nil {
+	}
+	share, shareErr := strconv.Atoi(shares)
+	if shareErr != nil {
+	}
+	return like, comment, collect, share, nil
+}
+
+// WeiboPostsResponse 微博多条数据接收结构体
+type WeiboPostsResponse struct {
+	Code int    `json:"code"`
+	Msg  string `json:"msg"`
+	Data struct {
+		Data struct {
+			Cards []struct {
+				Mblog struct {
+					Id              string   `json:"id"`
+					Text            string   `json:"text"`
+					CreatedAt       string   `json:"created_at"`
+					AttitudesCount  int      `json:"attitudes_count"`  // 点赞数
+					CommentsCount   int      `json:"comments_count"`   // 评论数
+					RepostsCount    int      `json:"reposts_count"`    // 转发数
+					PendingApproval int      `json:"pending_approval"` // 待审数
+					PicIds          []string `json:"pic_ids"`          // 图片ID列表
+					PageInfo        struct {
+						Type    string `json:"type"` // 内容类型(video/article)
+						PagePic struct {
+							Url string `json:"url"` // 封面图URL
+						} `json:"page_pic"`
+						MediaInfo struct {
+							StreamUrl string `json:"stream_url"` // 视频流地址
+						} `json:"media_info"`
+					} `json:"page_info"`
+				} `json:"mblog"`
+			} `json:"cards"`
+		} `json:"data"`
+	} `json:"data"`
+}
+
+// WeiboPostStats 单条微博的互动数据
+type WeiboPostStats struct {
+	Id            string `json:"id"`
+	CreatedAt     string `json:"created_at"`
+	Likes         int    `json:"likes"`           // 点赞数
+	Comments      int    `json:"comments"`        // 评论数
+	Reposts       int    `json:"reposts"`         // 转发数
+	Pending       int    `json:"pending"`         // 待审数
+	HasImages     bool   `json:"has_images"`      // 是否有图片
+	HasVideo      bool   `json:"has_video"`       // 是否有视频
+	CoverImageUrl string `json:"cover_image_url"` // 封面图URL(视频/文章)
+	VideoUrl      string `json:"video_url"`       // 视频地址(如果有)
+}
+
+// parseWeiboPosts 解析微博多条数据
+func parseWeiboPosts(body []byte) ([]WeiboPostStats, error) {
+	var resp WeiboPostsResponse
+	if err := json.Unmarshal(body, &resp); err != nil {
+		return nil, fmt.Errorf("JSON解析失败: %v", err)
+	}
+
+	if resp.Code != 200 {
+		return nil, fmt.Errorf("API返回错误: %s", resp.Msg)
+	}
+
+	var posts []WeiboPostStats
+	for i, card := range resp.Data.Data.Cards {
+		if i >= 5 { // 只取前5条
+			break
+		}
+
+		mblog := card.Mblog
+		hasVideo := mblog.PageInfo.Type == "video"
+
+		posts = append(posts, WeiboPostStats{
+			Id:            mblog.Id,
+			CreatedAt:     mblog.CreatedAt,
+			Likes:         mblog.AttitudesCount,
+			Comments:      mblog.CommentsCount,
+			Reposts:       mblog.RepostsCount,
+			Pending:       mblog.PendingApproval,
+			HasImages:     len(mblog.PicIds) > 0,
+			HasVideo:      hasVideo,
+			CoverImageUrl: mblog.PageInfo.PagePic.Url,
+			VideoUrl:      mblog.PageInfo.MediaInfo.StreamUrl,
+		})
+	}
+	return posts, nil
+}
+
+func GetWeiBoHistoryList(ctx context.Context, homePageUrl string) ([]WeiboPostStats, error) {
+	url := "http://120.46.92.62:6888/api/weibo/user_post" // 替换为实际API地址
+	method := "POST"
+
+	requestBody := struct {
+		Uid       string `json:"uid"`
+		ShareText string `json:"share_text"`
+		SinceId   string `json:"since_id"`
+		Proxy     string `json:"proxy"`
+	}{
+		ShareText: homePageUrl,
+		Proxy:     "",
+	}
+
+	client := &http.Client{}
+
+	jsonData, err := json.Marshal(requestBody)
+	if err != nil {
+		fmt.Println("JSON编码失败:", err)
+		return nil, err
+	}
+
+	payload := strings.NewReader(string(jsonData))
+	req, err := http.NewRequest(method, url, payload)
+
+	if err != nil {
+		fmt.Println(err)
+		return nil, err
+	}
+	req.Header.Add("Content-Type", "application/json")
+
+	res, err := client.Do(req)
+	if err != nil {
+		fmt.Println(err)
+		return nil, err
+	}
+	defer res.Body.Close()
+
+	body, err := ioutil.ReadAll(res.Body)
+	if err != nil {
+		fmt.Println(err)
+		return nil, err
+	}
+	hisData, hisErr := parseWeiboPosts(body)
+	if hisErr != nil {
+		fmt.Println(hisErr)
+	}
+	return hisData, nil
+}