Esquema de implementación de mensajes push de robot WeChat

El autor:La bondad, Creado: 2020-07-24 09:52:33, Actualizado: 2023-10-26 20:04:21

img

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.

Plan de ejecución

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.postMsgfunció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 cuandopostMsgLa 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.

Prueba

La operación del robot FMZ (el docker también se ejecuta localmente):

img

img

Ventana de WeChat

img

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.


Relacionados

Más.