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.
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.postMsg
fonction 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.postMsg
La 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 learrArea
la 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
.
L'opération du robot FMZ (le dock est également exécuté localement):
La fenêtre de WeChat
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.