웨이
이러한 이유로, 나는 아마도 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 로봇 동작 (도커 또한 로컬로 실행):
웨이
푸시 메시지는:
{"type":"msg","robotId":130350,"msg":"hello fmz!"}
이 계획은 시작일 뿐이고, 더 좋은 계획이 있다면, 토론할 수 있습니다.