使用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
更多关于使用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会失败。

