好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 xiaoxiaoY520 于 2024-12-17 09:09 编辑
go语言写的签到程序,可以配合windows平台计划任务进行自动化执行,linux平台请自测。
食用方法:浏览器F12找登录包,复制原始包到data.txt,原封不动粘上去就行,放同级目录或随意,默认是同级目录的data.txt文件:
有个file参数可以指定文件:
偶尔用一下可以,毕竟是白嫖的,不签白不签,这个平台貌似不稳定,验证逻辑太简单了,人家后期可能改验证逻辑导致签到程序失效。
源码放出来了,很简单,可以自己改,计划任务设置自行百度。自己编译一下吧,编译文件大了一点,上传不了。
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
"strings"
)
type ResponseToken struct {
RespTime int `json:"time"`
RespStatus string `json:"status"`
RespToken string `json:"token"`
}
func main() {
// 读取 .txt 文件内容, 默认为data.txt,兼容后期添加参数,用循环赋值
filePath := "data.txt"
if len(os.Args) > 1 {
for i := 1; i < len(os.Args); i++ {
if os.Args[i] == "file" && i+1 < len(os.Args) {
filePath = os.Args[i+1
break
}
}
}
data, err := os.ReadFile(filePath)
if err != nil {
fmt.Printf("无法读取文件: %v\n", err)
return
}
// 分割请求头和请求体,回车换行分隔
parts := bytes.Split(data, []byte("\n\r"))
if len(parts) < 2 {
fmt.Println("文件格式不正确")
return
}
// 解析请求头
headers := make(http.Header)
headerLines := strings.Split(string(parts[0]), "\n")
for _, line := range headerLines {
if line == "" {
continue
}
if strings.HasPrefix(line, "POST") {
// 解析 URL 和查询参数
urlParts := strings.Fields(line)
if len(urlParts) >= 2 {
url := urlParts[1
fmt.Printf("目标 URL: %s\n", url)
}
} else {
// 设置请求头
headerParts := strings.SplitN(line, ": ", 2)
if len(headerParts) == 2 {
key, value := headerParts[0], headerParts[1
// 去除末尾的\r换行符
value = strings.TrimRight(value, "\r")
headers.Set(key, value)
}
}
}
// 设置请求体
jsonData := parts[1
// 创建 HTTPs POST 请求,可改为参数解析形式,省事用固定
url := "https://https.ghs.wiki:7002/API?void=post"
req, err := http.NewRequest("POST", url, bytes.NewReader(jsonData))
if err != nil {
fmt.Printf("创建请求时出错: %v\n", err)
return
}
// 设置请求头
for key, values := range headers {
for _, value := range values {
req.Header.Add(key, value)
}
}
// 修正 Content-Length
req.ContentLength = int64(len(jsonData))
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Printf("发送请求时出错: %v\n", err)
return
}
defer resp.Body.Close()
// 读取并打印响应
respBody, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Printf("读取响应时出错: %v\n", err)
return
}
fmt.Printf("响应状态: %s\n", resp.Status)
fmt.Printf("响应内容:\n%s\n", string(respBody))
var response ResponseToken
if resp.Status == "200 OK" {
err = json.Unmarshal(respBody, &response)
if err != nil {
fmt.Printf("解析 JSON 时出错: %v\n", err)
return
}
fmt.Println("token:", response.RespToken)
} else {
fmt.Println("获取token失败")
return
}
//构造签到请求数据
newData := map[stringinterface{}{
"type": "signIn",
"token": response.RespToken,
}
newJsonData, err := json.Marshal(newData)
if err != nil {
fmt.Printf("编码新数据时出错: %v\n", err)
return
}
// 创建新的请求,二次签到请求
newReq, err := http.NewRequest("POST", url, bytes.NewReader(newJsonData))
if err != nil {
fmt.Printf("创建新请求时出错: %v\n", err)
return
}
// 使用之前解析的请求头
for key, values := range headers {
for _, value := range values {
newReq.Header.Add(key, value)
}
}
// 发送新请求
newResp, err := client.Do(newReq)
if err != nil {
fmt.Printf("发送新请求时出错: %v\n", err)
return
}
defer newResp.Body.Close()
// 读取并打印新响应
newRespBody, err := io.ReadAll(newResp.Body)
if err != nil {
fmt.Printf("读取新响应时出错: %v\n", err)
return
}
fmt.Printf("新响应状态: %s\n", newResp.Status)
fmt.Printf("新响应内容:\n%s\n", string(newRespBody))
}
|
免费评分
-
参与人数 2 | 吾爱币 +4 |
热心值 +1 |
收起
理由
|
Tiniaual
| + 1 |
+ 1 |
我很赞同! |
天轩科技
| + 3 |
|
https://www.52pojie.cn/thread-1990457-1-1.html 我写了一个python版本的 ... |
查看全部评分
|