docker-wechatPc icon indicating copy to clipboard operation
docker-wechatPc copied to clipboard

连上websocket之后无法获取到消息,是还需要额外传什么参数吗?

Open lixh00 opened this issue 2 years ago • 0 comments

代码如下


Python:

import hashlib
import hmac
import time

import websocket


def on_message(ws, message):
    print("收到消息啦")
    # print(ws)
    print(message)


def on_error(ws, error):
    print(ws)
    print(error)


def on_close(ws):
    print(ws)
    print("### closed ###")


def get_sign(query, app_secret):
    sss = "{q}&app_key={ak}".format(q=query, ak=app_secret)
    return hashlib.sha256(sss.encode('utf-8')).hexdigest()
    # hmac.new(sss.encode('utf-8'), hashlib.sha256).hexdigest()


if __name__ == '__main__':
    app_id = "sgkjg8uafpcfh6z8yrgqf5gf2a55ekx3"
    app_secret = "Z6epEb5NEu4qeEJRs3LWx36kvQcVHLY7"
    url = "ws://10.0.0.51:5678/?"

    query = "app_id={app_id}&timestamp={timestamp}".format(app_id=app_id, timestamp=int(time.time() * 1000))
    sign = get_sign(query, app_secret)
    query = "{query}&hash={sign}".format(query=query, sign=sign)
    print(query)

    url = "{url}{query}".format(url=url, query=query)
    print(url)

    websocket.enableTrace(True)
    ws = websocket.WebSocketApp(url,
                                on_message=on_message,
                                on_error=on_error,
                                on_close=on_close)

    ws.run_forever()

Golang

package main

import (
	"crypto/sha256"
	"encoding/hex"
	"fmt"
	"gitee.ltd/lxh/logger"
	"github.com/gorilla/websocket"
	"time"
)

const (
	WsUrl     = "ws://10.0.0.51:5678/?"
	AppId     = "sgkjg8uafpcfh6z8yrgqf5gf2a55ekx3"
	AppSecret = "Z6epEb5NEu4qeEJRs3LWx36kvQcVHLY7"
)

func main() {
	// 参数拼接
	query := fmt.Sprintf("app_id=%s&timestamp=%v", AppId, time.Now().Local().UnixMilli())

	h := sha256.New()
	h.Write([]byte(fmt.Sprintf("%s&app_key=%s", query, AppSecret)))
	hashKey := hex.EncodeToString(h.Sum(nil))

	query = fmt.Sprintf("%s&hash=%s", query, hashKey)
	logger.Say.Debugf("WebSocket连接参数: %s", query)

	//创建一个拨号器,也可以用默认的 websocket.DefaultDialer
	dialer := websocket.DefaultDialer
	// 创建ws客户端
	conn, _, err := dialer.Dial(WsUrl+query, nil)
	if err != nil {
		logger.Say.Panicf("微信接口服务器连接失败: %v", err)
	}
	//离开作用域关闭连接,go 的常规操作
	defer conn.Close()

	// 循环读取服务器消息
	for {
		// 休眠两秒钟
		time.Sleep(2 * time.Second)
		// 设置超时
		//err = conn.SetReadDeadline(time.Now().Add(time.Second * 10))
		//if err != nil {
		//	logger.Say.Errorf("设置超时失败: %v", err)
		//}
		var messageType int
		var messageData []byte
		messageType, messageData, err = conn.ReadMessage()
		if err != nil {
			logger.Say.Errorf("读取消息失败: %v", err)
			continue
		}
		logger.Say.Debugf("消息类型: %v", messageType)
		logger.Say.Debugf("消息内容: %v", string(messageData))
	}
}

lixh00 avatar Apr 25 '22 01:04 lixh00