El grupo de WeChat es un lugar público donde se reúnen amigos de ideas afines, y el grupo de WeChat en el círculo comercial cuantitativo no es una excepción. Recientemente, muchos usuarios de FMZ preguntan cómo pueden enviar mensajes al grupo de WeChat. Por ejemplo, su estrategia envía una señal comercial, pero no quieren automatizar la transacción.
Por esta razón, probablemente miré la interfaz de WeChat y encontré que se necesita una cuenta oficial, lo que no es particularmente conveniente. Así que decidí tomar un enfoque diferente y probé las siguientes soluciones. Debido a la capacidad limitada de mí, solo se puede completar la función más básica de este requisito, y es solo para referencia.
Decidí usar Golang para escribir, necesito usar una biblioteca Golanggithub.com/go-vgo/robotgo
, básicamente los requisitos de la solución se logra por esta biblioteca.
Primero ejecutamos un programa de servicio en nuestra computadora, el código es el siguiente:
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)
}
La función de este programa de servicio es esperar la solicitud.postMsg
función para realizar una serie de clics simulados de movimiento del ratón y operaciones de entrada para abrir la ventana del software de WeChat, hacer clic en el área predefinida, ingresar la información en la solicitud y enviar al grupo de WeChat.
Haga clic en el área en la ventana de WeChat para confirmar y probar dos escenarios. El primero es guardar la imagen del nombre del grupo de WeChat, cargar la pantalla de comparación de imágenes cuandopostMsg
La velocidad de reconocimiento de este método no es muy alta, y a veces no se puede reconocer. Por lo tanto, se utiliza la segunda solución, que es más confiable. Es fijar el área de clic y planificar un conjunto de coordenadas del área de clic, es decir: las coordenadas registradas por elarrArea
¿Dónde están las coordenadas? Respuesta: Mira las coordenadas de píxeles de la captura de pantalla y mide T_T.
Programa de pruebas de estrategia de la plataforma 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)
}
}
Esta estrategia simula el envío de una señal de transacción (cuando n==20, asumiendo que la señal de transacción se activa en este momento, y se considera posible el comercio), envía una solicitud al servicio local enhttp://127.0.0.1:9090/data
.
La operación del robot FMZ (el docker también se ejecuta localmente):
Ventana de WeChat
El mensaje de empuje es:
{"type":"msg","robotId":130350,"msg":"hello fmz!"}
Este plan es sólo para empezar, y si tienes un plan mejor, eres bienvenido a discutirlo.