猿问

推送二维码给客户端

尝试将登录屏幕设置为 WhatsApp,将二维码推送到客户端进行扫描,因此我编写了以下服务器代码:

<html>

<head></head>

<body>

    note: <span id="content"></span><br>

    <img id="photo" style="display: block;-webkit-user-select: none;">

</body>

    <script>

      /*  (function(){

                document.getElementById("content").innerHTML='<object type="text/html" data="http://localhost:9999/" ></object>';

        })(); 

*/

        const myRequest = new Request('http://127.0.0.1:9999/', {

        method: 'GET',

        headers: new Headers(),

        type: "arraybuffer",

        mode: 'cors',

        cache: 'default',

        });  


        var source = new EventSource("http://127.0.0.1:9999/");

        source.onmessage = function (event) {

            console.log(event)

            var counter = event.data; // JSON.parse(event.data);

            document.getElementById("content").innerHTML = counter;

        }


    fetch(myRequest).then(response => {

        console.log(response)

        console.log(response.headers)

    const contentType = response.headers.get("content-type");

        if (contentType && contentType.indexOf("application/json") !== -1) {

            return response.json().then(data => {

            var obj = JSON.parse(str);

            console.log(obj)

            // Process your data as a JavaScript object

            });

        }  if (contentType && contentType.indexOf("image/jpeg") !== -1) {

            console.log("Image received")

            return response.blob().then(data => {

                var reader = new FileReader();

                reader.readAsDataURL(blob); 

                reader.onloadend = function() {

                    var imageUrl = reader.result;                

                    var img = document.querySelector("#photo");

                    img.src = imageUrl;

                }

            });

        } 

如果我运行并查看显示的页面,我会看到:

有什么帮助吗?



慕娘9325324
浏览 174回答 1
1回答

偶然的你

我解决了购买将 QR 字符串推送到服务器,并使用qrcodejs将其转换为 QR 的问题。如果有兴趣,我的完整代码是:// main.gopackage mainimport (&nbsp; &nbsp; "context"&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "net/http"&nbsp; &nbsp; "os"&nbsp; &nbsp; "os/signal"&nbsp; &nbsp; "syscall"&nbsp; &nbsp; _ "github.com/mattn/go-sqlite3"&nbsp; &nbsp; "google.golang.org/protobuf/proto"&nbsp; &nbsp; "go.mau.fi/whatsmeow"&nbsp; &nbsp; "go.mau.fi/whatsmeow/store"&nbsp; &nbsp; "go.mau.fi/whatsmeow/store/sqlstore"&nbsp; &nbsp; "go.mau.fi/whatsmeow/types/events"&nbsp; &nbsp; waLog "go.mau.fi/whatsmeow/util/log")func eventHandler(evt interface{}) {&nbsp; &nbsp; switch v := evt.(type) {&nbsp; &nbsp; case *events.Message:&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Received a message!", v.Message.GetConversation())&nbsp; &nbsp; }}func main() {&nbsp; &nbsp; passer := &DataPasser{logs: make(chan string)}&nbsp; &nbsp; http.HandleFunc("/sse/dashboard", passer.handleHello)&nbsp; &nbsp; go http.ListenAndServe(":1234", nil)&nbsp; &nbsp; /*&nbsp; &nbsp; &nbsp; &nbsp; ticker := time.NewTicker(500 * time.Millisecond)&nbsp; &nbsp; &nbsp; &nbsp; defer ticker.Stop()&nbsp; &nbsp; &nbsp; &nbsp; done := make(chan bool)&nbsp; &nbsp; &nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case <-done:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case <-ticker.C:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; fmt.Println("Tick at", t)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // passer.logs <- buffer.String()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }()&nbsp; &nbsp; */&nbsp; &nbsp; store.DeviceProps.Os = proto.String("WhatsApp GO")&nbsp; &nbsp; dbLog := waLog.Stdout("Database", "DEBUG", true)&nbsp; &nbsp; // Make sure you add appropriate DB connector imports, e.g. github.com/mattn/go-sqlite3 for SQLite&nbsp; &nbsp; container, err := sqlstore.New("sqlite3", "file:datastore.db?_foreign_keys=on", dbLog)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; panic(err)&nbsp; &nbsp; }&nbsp; &nbsp; // If you want multiple sessions, remember their JIDs and use .GetDevice(jid) or .GetAllDevices() instead.&nbsp; &nbsp; deviceStore, err := container.GetFirstDevice()&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; panic(err)&nbsp; &nbsp; }&nbsp; &nbsp; clientLog := waLog.Stdout("Client", "DEBUG", true)&nbsp; &nbsp; client := whatsmeow.NewClient(deviceStore, clientLog)&nbsp; &nbsp; client.AddEventHandler(eventHandler)&nbsp; &nbsp; if client.Store.ID == nil {&nbsp; &nbsp; &nbsp; &nbsp; // No ID stored, new login&nbsp; &nbsp; &nbsp; &nbsp; qrChan, _ := client.GetQRChannel(context.Background())&nbsp; &nbsp; &nbsp; &nbsp; err = client.Connect()&nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; panic(err)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; for evt := range qrChan {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; switch evt.Event {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case "success":&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; passer.logs <- "success"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Login event: success")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case "timeout":&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; passer.logs <- "timeout"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Login event: timeout")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case "code":&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("new code recieved")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(evt.Code)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; passer.logs <- evt.Code&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; // Already logged in, just connect&nbsp; &nbsp; &nbsp; &nbsp; passer.logs <- "Already logged"&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Already logged")&nbsp; &nbsp; &nbsp; &nbsp; err = client.Connect()&nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; panic(err)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; // Listen to Ctrl+C (you can also do something else that prevents the program from exiting)&nbsp; &nbsp; c := make(chan os.Signal, 1)&nbsp; &nbsp; signal.Notify(c, os.Interrupt, syscall.SIGTERM)&nbsp; &nbsp; <-c&nbsp; &nbsp; client.Disconnect()}和// api.gopackage mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "net/http"&nbsp; &nbsp; "sync")var (&nbsp; &nbsp; mux sync.Mutex)type DataPasser struct {&nbsp; &nbsp; logs chan string}func (p *DataPasser) handleHello(w http.ResponseWriter, r *http.Request) {&nbsp; &nbsp; fmt.Println("from here")&nbsp; &nbsp; flusher, ok := w.(http.Flusher)&nbsp; &nbsp; if !ok {&nbsp; &nbsp; &nbsp; &nbsp; http.Error(w, "Internal error", 500)&nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; }&nbsp; &nbsp; w.Header().Set("Content-Type", "text/event-stream")&nbsp; &nbsp; w.Header().Set("Cache-Control", "no-cache")&nbsp; &nbsp; w.Header().Set("Connection", "keep-alive")&nbsp; &nbsp; setupCORS(&w, r)&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; case c := <-p.logs:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("recieved")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mux.Lock()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //counter++&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //c := counter&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mux.Unlock()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Fprintf(w, "data: %v\n\n", c)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; flusher.Flush()&nbsp; &nbsp; &nbsp; &nbsp; case <-r.Context().Done():&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Connection closed")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}func setupCORS(w *http.ResponseWriter, req *http.Request) {&nbsp; &nbsp; (*w).Header().Set("Cache-Control", "no-cache")&nbsp; &nbsp; (*w).Header().Set("Access-Control-Allow-Origin", "*")&nbsp; &nbsp; (*w).Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")&nbsp; &nbsp; (*w).Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")}客户端是:<html><head>&nbsp; <meta charset="utf-8">&nbsp; <meta name="viewport" content="width=device-width, initial-scale=1">&nbsp; <script src="https://cdn.rawgit.com/davidshimjs/qrcodejs/gh-pages/qrcode.min.js"></script></head><body>&nbsp; <h5>Server message/Code: <span id="message"></span></h5>&nbsp; <div id="qr"></div>&nbsp; <script>&nbsp; &nbsp; var source = new EventSource("http://localhost:1234/sse/dashboard");&nbsp; &nbsp; source.onmessage = function (event) {&nbsp; &nbsp; &nbsp; &nbsp; var message = event.data&nbsp; &nbsp; &nbsp; &nbsp; document.querySelector('#message').innerHTML = message;&nbsp; &nbsp; &nbsp; &nbsp; if (new String(message).valueOf() == "success" || new String(message).valueOf() == "timeout"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; || new String(message).valueOf() == "Already logged") {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; document.querySelector('#qr').innerHTML = "";&nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var qrcode = new QRCode("qr", {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; text: message,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width: 128,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; height: 128,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; colorDark : "#000000",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; colorLight : "#ffffff",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; correctLevel : QRCode.CorrectLevel.M&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }/*&nbsp; &nbsp; var qrcode = new QRCode(&nbsp; &nbsp; "qr",&nbsp; &nbsp; &nbsp; &nbsp; [&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "BEGIN:VCARD",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "VERSION:2.1",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "N:Doe;John;;Dr;",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "FN:Dr. John Doe",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "EMAIL:johndoe@hotmail.com",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "TEL;TYPE=cell:(123) 555-5832",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "END:VCARD"&nbsp; &nbsp; &nbsp; &nbsp; ].join("\r\n")&nbsp; &nbsp; ); */&nbsp; &nbsp;&nbsp;&nbsp; </script></body></html>
随时随地看视频慕课网APP

相关分类

Go
我要回答