|
触发器我自己还没测试过
只是程序测试的话 这里有张图

这里说一下触发器的创建

json在这里说明一下:
用户信息添加到users里
access_times是访问空间的次数
interval是发送请求的时间间隔, 单位是秒
- {
- "users": [
- {"username": "yjsx86", "password": "xxxxxxxxxxx"},
- {"username": "yjsx87", "password": "test"}
- ],
- "access_times": 2,
- "interval": 3
- }
复制代码
编译好的文件在这里:https://urair.lanzoui.com/i1Zh7pgxksh
怕文件有鬼的源码在这里(自己编译再上传):
- package main
- import (
- "errors"
- "fmt"
- "github.com/tencentyun/scf-go-lib/cloudfunction"
- "io"
- "io/ioutil"
- "log"
- "math/rand"
- "net/http"
- "net/http/cookiejar"
- "net/url"
- "regexp"
- "strings"
- "time"
- )
- var client = NewClient()
- var AccessTimes int
- var InterVal int
- func main() {
- cloudfunction.Start(start)
- }
- func NewClient() *http.Client {
- j, _ := cookiejar.New(nil)
- //proxyurl, _ := url.Parse("http://127.0.0.1:1080")
- //proxy := http.ProxyURL(proxyurl)
- //transport := &http.Transport{Proxy: proxy}
- cli := &http.Client{
- //Transport: transport,
- Jar: j,
- }
- return cli
- }
- // start 程序入口
- func start(event DefineEvent) {
- AccessTimes = event.AccessTimes
- InterVal = event.Interval
- users := event.Users
- for _, user := range users {
- u := user
- HostlocSign(u)
- }
- }
- // HostlocSign 程序主体
- func HostlocSign(u User) {
- isLogin, err := u.Login()
- if err != nil {
- log.Println(err)
- return
- }
- if isLogin {
- log.Printf("user %s: Login Success\n", u.Username)
- u.AccessRandomSpace()
- }
- fmt.Println("Done")
- u.Logout()
- }
- // DefineEvent 定义消息事件结构体
- type DefineEvent struct {
- Users []User `json:"users"`
- AccessTimes int `json:"access_times"`
- Interval int `json:"interval"`
- }
- // User 定义用户结构体
- type User struct {
- Username string `json:"username"`
- Password string `json:"password"`
- }
- // Login 登陆方法
- func (u *User) Login() (bool, error) {
- api := "https://hostloc.com/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1"
- data := make(url.Values)
- data.Add("fastloginfield", "username")
- data.Add("username", u.Username)
- data.Add("password", u.Password)
- data.Add("quickforward", "yes")
- data.Add("handlekey", "ls")
- req, _ := http.NewRequest("POST", api, strings.NewReader(data.Encode()))
- req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.3")
- req.Header.Set("content-type", "application/x-www-form-urlencoded")
- resp, err := client.Do(req)
- if err != nil {
- return false, err
- }
- body, _ := io.ReadAll(resp.Body)
- if isContains := strings.Contains(string(body), "https://hostloc.com/./"); isContains {
- return true, nil
- } else {
- return false, errors.New(fmt.Sprintf("user %s: username or password error\n", u.Username))
- }
- }
- // Logout 用户退出
- func (u *User) Logout() {
- j, _ := cookiejar.New(nil)
- client.Jar = j
- }
- // AccessRandomSpace 访问随机用户空间
- func (u *User) AccessRandomSpace() {
- rand.Seed(time.Now().UnixNano())
- var count int
- var failCount int
- //循环访问空间
- for count < AccessTimes {
- if failCount > 3 {
- log.Fatal("Failed more than 3 times, There was an error in the program or network!exit")
- }
- spaceUrl := fmt.Sprintf("https://hostloc.com/space-uid-%d.html", rand.Intn(53484))
- fmt.Printf("Visit: %s ", spaceUrl)
- req, _ := http.NewRequest("GET", spaceUrl, nil)
- req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.3")
- resp, err := client.Do(req)
- if err != nil {
- fmt.Printf("False:%s\n", err)
- failCount++
- time.Sleep(time.Duration(InterVal) * time.Second)
- continue
- }
- body, err := ioutil.ReadAll(resp.Body)
- //获取title
- r, _ := rege**pile("<title>(.*?)</title>")
- title := r.FindStringSubmatch(string(body))[1]
- //判断title是否以:XXX的空间 XXX的个人资料 开头
- ismatched1, _ := regexp.MatchString("^.*?的空间", title)
- ismatched2, _ := regexp.MatchString("^.*?的个人资料", title)
- if ismatched1 || ismatched2 {
- fmt.Println("True")
- count++
- } else {
- fmt.Println("False")
- }
- time.Sleep(time.Duration(InterVal) * time.Second)
- }
- }
复制代码
|
|