Tài nguyên đang được tải lên... tải...

Robot WeChat chương trình thực hiện tin nhắn đẩy

Tác giả:Tốt, Tạo: 2020-07-24 09:52:33, Cập nhật: 2023-10-26 20:04:21

img

Nhóm WeChat là một nơi công cộng nơi những người bạn cùng chí hướng tụ họp, và nhóm WeChat trong vòng tròn giao dịch định lượng cũng không ngoại lệ. Gần đây, nhiều người dùng FMZ hỏi làm thế nào họ có thể đẩy tin nhắn đến nhóm WeChat. Ví dụ, chiến lược của họ gửi tín hiệu giao dịch, nhưng họ không muốn tự động hóa giao dịch. Họ hy vọng rằng tín hiệu được cung cấp bởi robot có thể được gửi đến nhóm WeChat làm tài liệu tham khảo.

Vì lý do này, có lẽ tôi đã nhìn vào giao diện WeChat và thấy rằng một tài khoản chính thức là cần thiết, điều này không đặc biệt thuận tiện. Vì vậy, tôi quyết định tiếp cận khác và thử các giải pháp sau. Do khả năng hạn chế của tôi, chỉ có chức năng cơ bản nhất của yêu cầu này có thể được hoàn thành, và nó chỉ để tham khảo.

Kế hoạch thực hiện

Tôi quyết định sử dụng Golang để viết, cần phải sử dụng một thư viện Golanggithub.com/go-vgo/robotgo, về cơ bản các yêu cầu của giải pháp được đạt được bởi thư viện này.

Đầu tiên chúng ta chạy một chương trình dịch vụ trên máy tính của chúng ta, mã là như sau:

package main 
import (
    "fmt"
    "time"
    "github.com/go-vgo/robotgo" 
    "net/http"
    "io/ioutil"
)

func postMsg (msg string) {    
    fmt.Println("Start the mission!") 
    // process ids
    processIds := "WeChat"
    fpid, err3 := robotgo.FindIds(processIds)
    robotgo.ActivePID(fpid[0])
    time.Sleep(time.Millisecond * 2000)
    if err3 == nil {
        fmt.Println(fmt.Sprintf("find %s", processIds), "ids:", fpid)
        /* Use image recognition method to get the coordinates of the click area
        arrPicFileName := []string{"pic1.png", "pic2.png", "pic3.png"}
        for _, name := range arrPicFileName {
            picPath := fmt.Sprintf("/xxx/xxx/Desktop/xxx/%s", name)
            fmt.Println("picPath:", fmt.Sprintf("/xxx/xxx/Desktop/xxx/%s", name))
            fx, fy := robotgo.FindPic(picPath)
            fmt.Println("move to :", fx+10, fy+10)
            robotgo.MoveMouseSmooth(fx+10, fy+10)
            time.Sleep(time.Millisecond * 2000)
            robotgo.MouseClick("left", false)
            robotgo.TypeStr(msg)
            time.Sleep(time.Second)
            robotgo.KeyTap("enter")
            time.Sleep(time.Second)
        }
        */

        // /* Fixed area coordinates, the coordinates of the upper right corner of the screen are 0,0
        arrArea := []map[string]int{
            map[string]int{
                "x" : 190,
                "y" : 200,
            },
            map[string]int{
                "x" : 190,
                "y" : 200+70,
            },
            map[string]int{
                "x" : 190,
                "y" : 200+70+70,
            },
        }
        for _, area := range arrArea {
            robotgo.MoveMouseSmooth(area["x"], area["y"])
            time.Sleep(time.Millisecond * 2000)
            robotgo.MouseClick("left", false)
            robotgo.TypeStr(msg)
            time.Sleep(time.Second)
            robotgo.KeyTap("enter")
            time.Sleep(time.Second)
        }
        // */
    }
    fmt.Println("The mission is complete!") 
}



func Handle (w http.ResponseWriter, r *http.Request) {
    b, err := ioutil.ReadAll(r.Body)
    if err != nil {
        panic(err)
    }

    fmt.Println("req body:", string(b)) 
    postMsg(string(b))
    w.Write([]byte("finished!"))
}

func main () {
    fmt.Println("listen http://127.0.0.1:9090")
    http.HandleFunc("/data", Handle)
    http.ListenAndServe("127.0.0.1:9090", nil)
}

Chức năng của chương trình dịch vụ này là chờ cho yêu cầu.postMsgchức năng để thực hiện một loạt các cú nhấp chuột mô phỏng và các hoạt động đầu vào để mở cửa sổ phần mềm WeChat, nhấp vào khu vực được xác định trước, nhập thông tin trong yêu cầu và gửi đến nhóm WeChat.

Nhấp vào khu vực trên cửa sổ WeChat để xác nhận và kiểm tra hai kịch bản.postMsglà kích hoạt, và tìm tọa độ để nhấp chuột. tỷ lệ nhận dạng của phương pháp này không phải là rất cao, và đôi khi nó không thể được nhận ra. Vì vậy, giải pháp thứ hai được sử dụng, đó là đáng tin cậy hơn. Nó là để cố định khu vực nhấp chuột và lập kế hoạch một tập hợp tọa độ của khu vực nhấp chuột, đó là: các tọa độ được ghi lại bởiarrAreaĐáp: Hãy nhìn vào tọa độ pixel của ảnh chụp màn hình và đo T_T.

Chương trình thử nghiệm chiến lược nền tảng FMZ:

function main() {
    var msg = {
        "type" : "msg",
        "robotId" : _G(),
        "msg" : "hello fmz!"
    }
    var n = 0 
    while(true) {
        if(n == 20) {
            var ret = HttpQuery("http://127.0.0.1:9090/data", JSON.stringify(msg))
            Log("Exit")
            break    
        }
        n++
        LogStatus(_D(), "n:", n)
        Sleep(1000)
    }
}

Chiến lược này mô phỏng việc gửi tín hiệu giao dịch (khi n==20, giả sử rằng tín hiệu giao dịch được kích hoạt tại thời điểm này, và nó được coi là có thể giao dịch), nó gửi yêu cầu đến dịch vụ địa phương tạihttp://127.0.0.1:9090/data.

Kiểm tra

Hoạt động robot FMZ (docker cũng chạy cục bộ):

img

img

Cửa sổ WeChat

img

Tin nhắn đẩy là:

{"type":"msg","robotId":130350,"msg":"hello fmz!"}

Kế hoạch này chỉ là để bắt đầu, và nếu bạn có một kế hoạch tốt hơn, bạn được chào đón để thảo luận về nó.


Có liên quan

Thêm nữa