Die Ressourcen sind geladen. Beförderung...

Implementierungsschema für Roboter mit WeChat-Push-Nachrichten

Schriftsteller:Gutes, Erstellt: 2020-07-24 09:52:33, Aktualisiert: 2023-10-26 20:04:21

img

Eine WeChat-Gruppe ist ein öffentlicher Ort, an dem sich gleichgesinnte Freunde versammeln, und die WeChat-Gruppe im quantitativen Handelskreis ist keine Ausnahme. In letzter Zeit fragen viele FMZ-Nutzer, wie sie Nachrichten an die WeChat-Gruppe schieben können. Zum Beispiel sendet ihre Strategie ein Handelssignal, aber sie wollen die Transaktion nicht automatisieren. Sie hoffen, dass das vom Roboter bereitgestellte Signal als Referenz an die WeChat-Gruppe gesendet werden kann.

Aus diesem Grund habe ich wahrscheinlich die WeChat-Schnittstelle angeschaut und festgestellt, dass ein offizielles Konto benötigt wird, was nicht besonders praktisch ist. Also habe ich beschlossen, einen anderen Ansatz zu wählen und die folgenden Lösungen auszuprobieren. Aufgrund meiner begrenzten Kapazität kann nur die grundlegendste Funktion dieser Anforderung erfüllt werden, und es ist nur zur Referenz.

Durchführungsplan

Ich beschloss, Golang zu verwenden, um zu schreiben, muss eine Golang Bibliothek verwendengithub.com/go-vgo/robotgo, werden die Anforderungen der Lösung durch diese Bibliothek erreicht.

Zuerst starten wir ein Serviceprogramm auf unserem Computer, der Code lautet wie folgt:

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

Die Funktion dieses Serviceprogramms besteht darin, auf die Anfrage zu warten.postMsgFunktion, um eine Reihe simulierter Mausklicks und Eingabeoperationen durchzuführen, um das WeChat-Softwarefenster zu öffnen, auf den vordefinierten Bereich zu klicken, die Informationen in die Anfrage einzugeben und an die WeChat-Gruppe zu senden.

Klicken Sie auf den Bereich im WeChat-Fenster, um zwei Szenarien zu bestätigen und zu testen.postMsgDie Erkennungsrate dieser Methode ist nicht sehr hoch, und manchmal kann sie nicht erkannt werden. Also wird die zweite Lösung verwendet, die zuverlässiger ist. Es ist, den Klickbereich zu fixieren und einen Satz von Koordinaten des Klickbereichs zu planen, dh: die Koordinaten, die vom Klickbereich aufgezeichnet werden.arrAreaAntwort: Schauen Sie sich die Pixelkoordinaten des Screenshots an und messen Sie T_T.

Das Programm zur Prüfung der Strategie der FMZ-Plattform:

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

Diese Strategie simuliert das Senden eines Transaktionssignals (wenn n==20, vorausgesetzt, dass das Transaktionssignal zu diesem Zeitpunkt ausgelöst wird und es als möglich angesehen wird, zu handeln), sendet sie eine Anfrage an den lokalen Dienst anhttp://127.0.0.1:9090/data.

Prüfung

Die Funktion des FMZ-Roboters (der Docker läuft auch lokal):

img

img

WeChat-Fenster

img

Die Push-Nachricht lautet:

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

Dieser Plan ist nur ein Anfang, und wenn Sie einen besseren Plan haben, können Sie ihn gerne besprechen.


Verwandt

Mehr