Schéma de mise en œuvre des messages push robot WeChat

Auteur:La bonté, Créé: 2020-07-24 09:52:33, Mis à jour: 2023-10-26 20:04:21

img

Le groupe WeChat est un lieu public où se rassemblent des amis partageant les mêmes idées, et le groupe WeChat dans le cercle de trading quantitatif ne fait pas exception. Récemment, de nombreux utilisateurs de FMZ demandent comment ils peuvent envoyer des messages au groupe WeChat.

Pour cette raison, j'ai probablement regardé l'interface WeChat et j'ai constaté qu'un compte officiel était nécessaire, ce qui n'est pas particulièrement pratique. J'ai donc décidé d'adopter une approche différente et j'ai essayé les solutions suivantes. En raison de ma capacité limitée, seule la fonction la plus basique de cette exigence peut être remplie, et c'est uniquement à titre de référence.

Plan de mise en œuvre

J'ai décidé d'utiliser Golang pour écrire, besoin d'utiliser une bibliothèque Golanggithub.com/go-vgo/robotgo, essentiellement les exigences de la solution est atteint par cette bibliothèque.

Tout d'abord, nous exécutons un programme de service sur notre ordinateur, le code est le suivant:

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 fonction de ce programme de service est d'attendre la demande.postMsgfonction pour effectuer une série de clics de mouvement de souris simulés et d'opérations d'entrée pour ouvrir la fenêtre du logiciel WeChat, cliquer sur la zone prédéfinie, entrer les informations dans la demande, et envoyer au groupe WeChat.

Cliquez sur la zone de la fenêtre de WeChat pour confirmer et tester deux scénarios.postMsgLa méthode de reconnaissance de cette méthode n'est pas très élevée, et parfois elle ne peut pas être reconnue. La deuxième solution est donc utilisée, qui est plus fiable. Il s'agit de fixer la zone de clic et de planifier un ensemble de coordonnées de la zone de clic, c'est-à-dire: les coordonnées enregistrées par learrAreala variable dans le code ci-dessus. Où sont les coordonnées? Réponse: Regardez les coordonnées des pixels de la capture d'écran et mesurez T_T.

Le programme de test de la stratégie de la plateforme 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)
    }
}

Cette stratégie simule l'envoi d'un signal de transaction (lorsque n==20, en supposant que le signal de transaction est déclenché à ce moment, et il est considéré comme possible de négocier), il envoie une demande au service local àhttp://127.0.0.1:9090/data.

Test de détection

L'opération du robot FMZ (le dock est également exécuté localement):

img

img

La fenêtre de WeChat

img

Le message est:

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

Ce plan n'est qu'un début, et si vous avez un meilleur plan, vous êtes invités à en discuter.


Relationnée

Plus de