로봇 WeChat 메시지 푸시 구현 계획

저자:선함, 2020-07-24 09:52:33, 업데이트: 2023-10-26 20:04:21

img

웨이 그룹은 같은 생각을 가진 친구들이 모이는 공공 장소이며, 양적 거래 서클의 웨이 그룹은 예외가 아닙니다. 최근 많은 FMZ 사용자가 웨이 그룹에 메시지를 어떻게 보낼 수 있는지 묻습니다. 예를 들어, 그들의 전략은 거래 신호를 전송하지만 거래를 자동화하고 싶지 않습니다. 로봇이 제공하는 신호가 참조로 웨이 그룹에 전송 될 수 있기를 바랍니다.

이러한 이유로, 나는 아마도 WeChat 인터페이스를 살펴보고 공식 계정이 필요하다는 것을 발견했습니다. 이것은 특별히 편리하지 않습니다. 그래서 나는 다른 접근 방식을 취하고 다음 솔루션을 시도하기로 결정했습니다. 나의 제한된 용량으로 인해이 요구 사항의 가장 기본적인 기능만 완료 할 수 있으며, 그것은 참조만을위한 것입니다.

시행계획

저는 글쓰기 위해 골랑을 사용하기로 결정했습니다. 골랑 도서관을 사용해야 합니다.github.com/go-vgo/robotgo, 기본적으로 이 라이브러리가 솔루션의 요구 사항을 달성합니다.

먼저 컴퓨터에서 서비스 프로그램을 실행합니다. 코드는 다음과 같습니다.

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)
}

이 서비스 프로그램의 기능은 요청을 기다리는 것입니다. 요청을 받은 후,postMsg함수는 WeChat 소프트웨어 창을 열고 미리 정의된 영역을 클릭하고 요청에 정보를 입력하고 WeChat 그룹으로 전송하는 일련의 모의 마우스 움직임 클릭과 입력 작업을 수행합니다.

두 가지 시나리오를 확인하고 테스트하기 위해 WeChat 창의 영역을 클릭합니다. 첫 번째는 WeChat 그룹의 이름 이미지를 저장하는 것입니다.postMsg이 방법의 인식 비율은 매우 높지 않으며 때로는 인식 할 수 없습니다. 그래서 두 번째 솔루션을 사용합니다. 그것은 더 신뢰할 수 있습니다. 클릭 영역을 고정하고 클릭 영역의 좌표 집합을 계획합니다. 즉:arrArea위의 코드에서 변수. 좌표는 어디에 있습니까? 답: 스크린샷의 픽셀 좌표를 보고 T_T를 측정합니다.

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)
    }
}

이 전략은 트랜잭션 신호를 전송하는 것을 시뮬레이션합니다. (n==20가 되면, 트랜잭션 신호가 이 시간에 트리거되고 거래가 가능하다고 생각되는 경우) 로컬 서비스에 요청을 보내서http://127.0.0.1:9090/data.

테스트

FMZ 로봇 동작 (도커 또한 로컬로 실행):

img

img

웨이

img

푸시 메시지는:

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

이 계획은 시작일 뿐이고, 더 좋은 계획이 있다면, 토론할 수 있습니다.


관련

더 많은