使用Golang从HTTP请求中捕获特定单词

使用Golang从HTTP请求中捕获特定单词 我们尝试从HTTP请求中捕获响应,该响应是JSON和非JSON格式的组合,我们想要使用Go语言捕获请求生成的Token。

以下是响应格式: $(“link.favicon”).attr(“href”, $.url(‘/web.shell.common/productBranding:/res/images/favicon.ico’));

	`var pageView = new infaw.isp.SymphonyNextLoginPageView({
		logo: "/web.shell.common/?fileName=loginPageLogo",
		logo2: "",
		namespaces : [{"id":"Native","label":"Native"}],
		bgImages : [{"0":"/"},{"1":"/web.ldm./image2.jpg"},{"2":"/image3.jpg"}],
		version : "Version 10.1",
		modeURL : "web.isp/login",
		year : "(c) Copyright 2023.",
		isSAMLDomain:"false",
		pageTitle: "Administrator",
		Token: "XGD%2B-5EC11gFv0UUI7A*"
	});`

我编写了以下Go函数来捕获请求的响应。它能够捕获响应,但在尝试捕获Token时失败了,并出现以下错误。

package main

import (
"encoding/json"
"fmt"
"net/http"
"io/ioutil"
"reflect"
)
type Asset struct {
Id   string
Name string
}
func main() {
resp, err := http.Get(“httprequst”)

fmt.Println(resp)
if err != nil {
fmt.Println(err)
}
body, error := ioutil.ReadAll(resp.Body)
if error != nil {
fmt.Println(error)
}
// close response body
resp.Body.Close()

// print response body
fmt.Println(string(body))

var obj Asset
if err := json.NewDecoder(resp.Body).Decode(&obj); err != nil {
fmt.Println(resp.Body)
fmt.Println(err)
}
//stringData := json.parse(body)
mySimpleMap := make(map[string]interface{})
err1 := json.Unmarshal([]byte(string(body)), &mySimpleMap)
if err1 != nil {
fmt.Println(“error while unmarshal”, err1)
} else {
fmt.Println(reflect.TypeOf(mySimpleMap[“Id”]))
fmt.Printf(“%f\n”, mySimpleMap[“Id”])
//fmt.Println(int(mySimpleMap[“Id”].(float64)))
}
myAsset := Asset{}
err = json.Unmarshal([]byte(body), &myAsset)
if err != nil {
fmt.Println(“error while unmarshal”, err)
} else {
fmt.Printf(“%d”, myAsset.Id)
}

运行Go代码后出现以下错误:

error while unmarshall invalid character ‘$’ looking for beginning of value


更多关于使用Golang从HTTP请求中捕获特定单词的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于使用Golang从HTTP请求中捕获特定单词的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你的响应数据不是标准JSON格式,而是混合了JavaScript代码。要提取其中的Token值,需要使用字符串处理或正则表达式。以下是几种解决方案:

方法1:使用正则表达式直接提取Token

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "regexp"
)

func extractTokenFromResponse(body string) (string, error) {
    // 正则表达式匹配 Token: "value" 格式
    re := regexp.MustCompile(`Token:\s*"([^"]+)"`)
    matches := re.FindStringSubmatch(body)
    
    if len(matches) < 2 {
        return "", fmt.Errorf("Token not found")
    }
    
    return matches[1], nil
}

func main() {
    resp, err := http.Get("http://your-url-here")
    if err != nil {
        fmt.Println("HTTP request error:", err)
        return
    }
    defer resp.Body.Close()
    
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Read body error:", err)
        return
    }
    
    bodyStr := string(body)
    fmt.Println("Raw response:", bodyStr)
    
    token, err := extractTokenFromResponse(bodyStr)
    if err != nil {
        fmt.Println("Error extracting token:", err)
        return
    }
    
    fmt.Println("Extracted Token:", token)
}

方法2:提取JSON部分后解析

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "regexp"
    "strings"
)

func extractJSONFromResponse(body string) (string, error) {
    // 提取 new infaw.isp.SymphonyNextLoginPageView({ ... }) 中的内容
    start := strings.Index(body, "new infaw.isp.SymphonyNextLoginPageView({")
    if start == -1 {
        return "", fmt.Errorf("JSON object not found")
    }
    
    start += len("new infaw.isp.SymphonyNextLoginPageView(")
    braceCount := 0
    inString := false
    escapeNext := false
    
    for i := start; i < len(body); i++ {
        char := body[i]
        
        if escapeNext {
            escapeNext = false
            continue
        }
        
        if char == '\\' {
            escapeNext = true
            continue
        }
        
        if char == '"' && !escapeNext {
            inString = !inString
        }
        
        if !inString {
            if char == '{' {
                braceCount++
            } else if char == '}' {
                braceCount--
                if braceCount == 0 {
                    return body[start : i+1], nil
                }
            }
        }
    }
    
    return "", fmt.Errorf("Malformed JSON object")
}

func main() {
    resp, err := http.Get("http://your-url-here")
    if err != nil {
        fmt.Println("HTTP request error:", err)
        return
    }
    defer resp.Body.Close()
    
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Read body error:", err)
        return
    }
    
    bodyStr := string(body)
    
    // 提取JSON部分
    jsonStr, err := extractJSONFromResponse(bodyStr)
    if err != nil {
        fmt.Println("Error extracting JSON:", err)
        // 回退到正则表达式方法
        re := regexp.MustCompile(`Token:\s*"([^"]+)"`)
        matches := re.FindStringSubmatch(bodyStr)
        if len(matches) >= 2 {
            fmt.Println("Token (regex fallback):", matches[1])
        }
        return
    }
    
    fmt.Println("Extracted JSON:", jsonStr)
    
    // 解析JSON
    var data map[string]interface{}
    if err := json.Unmarshal([]byte(jsonStr), &data); err != nil {
        fmt.Println("JSON unmarshal error:", err)
        return
    }
    
    if token, ok := data["Token"].(string); ok {
        fmt.Println("Token from JSON:", token)
    } else {
        fmt.Println("Token field not found in JSON")
    }
}

方法3:简单字符串分割(针对你的具体格式)

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "strings"
)

func main() {
    resp, err := http.Get("http://your-url-here")
    if err != nil {
        fmt.Println("HTTP request error:", err)
        return
    }
    defer resp.Body.Close()
    
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Read body error:", err)
        return
    }
    
    bodyStr := string(body)
    
    // 查找Token行
    lines := strings.Split(bodyStr, "\n")
    for _, line := range lines {
        if strings.Contains(line, "Token:") {
            // 提取引号内的值
            start := strings.Index(line, `"`)
            if start == -1 {
                continue
            }
            end := strings.LastIndex(line, `"`)
            if end > start {
                token := line[start+1 : end]
                fmt.Println("Extracted Token:", token)
                break
            }
        }
    }
}

方法4:使用更精确的正则表达式

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "regexp"
)

func main() {
    resp, err := http.Get("http://your-url-here")
    if err != nil {
        fmt.Println("HTTP request error:", err)
        return
    }
    defer resp.Body.Close()
    
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Read body error:", err)
        return
    }
    
    // 匹配 Token: 后面直到逗号或换行的内容
    re := regexp.MustCompile(`Token:\s*"([^"]*)"\s*[,}]`)
    matches := re.FindSubmatch(body)
    
    if len(matches) >= 2 {
        token := string(matches[1])
        fmt.Println("Extracted Token:", token)
    } else {
        fmt.Println("Token not found")
    }
}

第一个方法(正则表达式)最简单直接,适合你的用例。错误"invalid character ‘$’ looking for beginning of value"是因为你的响应包含JavaScript代码$(“link.favicon”),不是有效的JSON格式,所以json.Unmarshal会失败。

回到顶部