贴吧自动签到

语言:Golang

源码:

package main

import (
	"bytes"
	"encoding/json"
	"errors"
	"fmt"
	"io"
	"net/http"
	"net/url"
	"os"
	"time"
)

/*
步骤
1. 获取cookie
2. 获取用户id
3. 获取贴吧列表
3. 开始签到(获取tbs)
*/

func main() {
	// 1. 获取用户cookie
	fileBuf, err := os.ReadFile("./init.json")
	if err != nil {
		fmt.Println("读取配置文件失败,err: ", err)
		panic("--------------------------")
	}
	var cf struct {
		Cookie string
	}
	err = json.Unmarshal(fileBuf, &cf)
	if err != nil {
		fmt.Println("解析配置文件失败,err: ", err)
		panic("--------------------------")
	}
	fmt.Printf("成功解析到配置文件中Cookie, Cookie 长度: %d\r\n", len(cf.Cookie))
	// 2. 获取用户id
	userID, err := GetUserIDRequest(cf.Cookie)
	if err != nil {
		fmt.Printf("ERROR: 获取用户id失败, err:%v\r\n", err)
		panic("--------------------------")
	}
	fmt.Printf("成功通过请求获取到用户ID: %d\r\n", userID)
	// 3. 获取贴吧列表
	names, err := GetNameListRequest(cf.Cookie, userID)
	if err != nil {
		fmt.Printf("ERROR: 获取用户贴吧列表失败, error:%v\r\n", err)
		panic("--------------------------")
	}
	fmt.Printf("成功通过请求获取到用户贴吧, 获取到数量: %d\r\n", len(names))

	fmt.Printf("\r\n\r\n开始签到\r\n\r\n")
	for index, tmp := range names {
		time.Sleep(time.Millisecond * 10)
		fmt.Printf("%d ----- %s 吧 开始签到\r\n", index, tmp)
		tbs, err := GetTBSRequest(cf.Cookie)
		if err != nil {
			fmt.Printf("ERROR: 获取用户贴吧TBS失败, error:%v\r\n", err)
			panic("--------------------------")
		}
		err = SendPostFormFileRequest(cf.Cookie, tmp, tbs)
		if err != nil {
			fmt.Printf("%s 吧 签到失败, err: %v\r\n", tmp, err)
		}
		fmt.Printf("%d ----- %s 吧 签到成功\r\n\r\n\r\n", index, tmp)
	}

}

func GetUserIDRequest(cookie string) (int, error) {
	request, err := http.NewRequest("GET", "https://tieba.baidu.com/mo/q/sync", nil)
	if err != nil {
		return 0, err
	}
	request.Header.Set("Cookie", cookie)
	client := &http.Client{
		Timeout: time.Duration(1) * time.Minute, // 超时时间10分钟
	}
	resp, err := client.Do(request)
	if resp == nil {
		return 0, err
	}

	defer resp.Body.Close()
	resBuf, err := io.ReadAll(resp.Body)
	if err != nil {
		return 0, err
	}

	var us struct {
		Error string
		Data  struct {
			UserID int `json:"user_id"`
		}
	}
	err = json.Unmarshal(resBuf, &us)
	if err != nil {
		return 0, err
	}
	if us.Error != "success" {
		return 0, err
	}
	return us.Data.UserID, nil
}

func GetNameListRequest(cookie string, userID int) ([]string, error) {
	var names []string
	request, err := http.NewRequest("GET", fmt.Sprintf("https://tieba.baidu.com/p/getLikeForum?uid=%d", userID), nil)
	if err != nil {
		return names, err
	}
	request.Header.Set("Cookie", cookie)
	client := &http.Client{
		Timeout: time.Duration(1) * time.Minute, // 超时时间10分钟
	}
	resp, err := client.Do(request)
	if resp == nil {
		return names, err
	}

	defer resp.Body.Close()
	resBuf, err := io.ReadAll(resp.Body)
	if err != nil {
		return names, err
	}

	type Info struct {
		ForumName string `json:"forum_name"`
	}

	var item struct {
		ErrMsg string
		Data   struct {
			Info []Info `json:"info"`
		}
	}
	err = json.Unmarshal(resBuf, &item)
	if err != nil {
		return names, err
	}
	if item.ErrMsg != "success" {
		return names, err
	}
	if len(item.Data.Info) > 0 {
		for _, tmp := range item.Data.Info {
			if tmp.ForumName != "" {
				names = append(names, tmp.ForumName)
			} else {
				continue
			}
		}
	}
	return names, nil
}

func GetTBSRequest(cookie string) (string, error) {
	request, err := http.NewRequest("GET", "http://tieba.baidu.com/dc/common/tbs", nil)
	if err != nil {
		return "", err
	}
	request.Header.Set("Cookie", cookie)
	client := &http.Client{
		Timeout: time.Duration(1) * time.Minute, // 超时时间10分钟
	}
	resp, err := client.Do(request)
	if resp == nil {
		return "", err
	}

	defer resp.Body.Close()
	resBuf, err := io.ReadAll(resp.Body)
	if err != nil {
		return "", err
	}

	var item struct {
		IsLogin int    `json:"is_login"`
		Tbs     string `json:"tbs"`
	}
	err = json.Unmarshal(resBuf, &item)
	if err != nil {
		return "", err
	}
	if item.IsLogin != 1 || item.Tbs == "" {
		fmt.Println("item: ", item)
		return "", errors.New("请求返回值有误")
	}

	return item.Tbs, nil
}

func SendPostFormFileRequest(cookie, kw, tbs string) error {
	form := url.Values{}

	form.Add("ie", "utf-8")
	form.Add("kw", kw)
	form.Add("tbs", tbs)

	request, err := http.NewRequest("POST", "https://tieba.baidu.com/sign/add", bytes.NewBufferString(form.Encode()))
	if err != nil {
		return err
	}
	request.Header.Set("Cookie", cookie)
	client := &http.Client{
		Timeout: time.Duration(10) * time.Minute, // 超时时间10分钟
	}
	resp, err := client.Do(request)
	if resp == nil {
		return err
	}

	defer resp.Body.Close()
	result, err := io.ReadAll(resp.Body)
	if err != nil {
		return err
	}
	var item struct {
		Error string
		Data  struct {
			Errmsg string `json:"errmsg"`
		}
	}

	err = json.Unmarshal(result, &item)
	if err != nil {
		return err
	}
	if item.Error != "" || item.Data.Errmsg != "success" {
		return err
	}
	return nil
}

你可能感兴趣的:(个人随笔,golang)