Golang中如何从二进制文件反序列化cookiejar结构体

Golang中如何从二进制文件反序列化cookiejar结构体 大家好!请帮帮我! 我有一个二进制cookie文件。 在Python中我是这样解析的:

with open('/usr/local/mail_validator/dv/scripts/cookies_mail.ru', 'rb') as f:
    Session.cookies.update(pickle.load(f))

那么在Go中该如何反序列化这个文件呢?

3 回复

谢谢你,老兄!)

更多关于Golang中如何从二进制文件反序列化cookiejar结构体的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


如果你必须将文件保存为Python的pickle格式,或许可以使用stalecucumber来解析它。

或者将其保存为JSON等格式的文件。

在Go语言中,要从二进制文件反序列化cookiejar结构体,你需要使用标准库的encoding/gob包。不过需要注意的是,cookiejar本身并不直接支持序列化/反序列化,你需要自己实现相关逻辑。

以下是一个完整的示例:

package main

import (
    "encoding/gob"
    "fmt"
    "net/http"
    "net/http/cookiejar"
    "os"
)

// 自定义结构体来存储cookiejar的内容
type SerializableCookieJar struct {
    Cookies map[string][]*http.Cookie
}

// 从文件加载cookiejar
func LoadCookieJar(filename string) (*cookiejar.Jar, error) {
    file, err := os.Open(filename)
    if err != nil {
        return nil, err
    }
    defer file.Close()

    var serializableJar SerializableCookieJar
    decoder := gob.NewDecoder(file)
    err = decoder.Decode(&serializableJar)
    if err != nil {
        return nil, err
    }

    // 创建新的cookiejar
    jar, err := cookiejar.New(nil)
    if err != nil {
        return nil, err
    }

    // 将反序列化的cookies设置到jar中
    for urlStr, cookies := range serializableJar.Cookies {
        u, err := url.Parse(urlStr)
        if err != nil {
            continue
        }
        jar.SetCookies(u, cookies)
    }

    return jar, nil
}

// 保存cookiejar到文件
func SaveCookieJar(jar *cookiejar.Jar, filename string) error {
    file, err := os.Create(filename)
    if err != nil {
        return err
    }
    defer file.Close()

    // 收集所有cookies
    cookiesMap := make(map[string][]*http.Cookie)
    // 这里需要你知道具体的URL,或者遍历所有已知的URL
    // 这是一个简化的示例

    serializableJar := SerializableCookieJar{
        Cookies: cookiesMap,
    }

    encoder := gob.NewEncoder(file)
    return encoder.Encode(serializableJar)
}

func main() {
    // 从文件加载cookiejar
    jar, err := LoadCookieJar("cookies_mail.ru")
    if err != nil {
        fmt.Printf("Error loading cookie jar: %v\n", err)
        return
    }

    // 使用加载的cookiejar创建HTTP客户端
    client := &http.Client{
        Jar: jar,
    }

    // 现在可以使用client进行请求,cookies会自动携带
    fmt.Println("Cookie jar loaded successfully")
}

如果你是从Python的pickle格式转换,可能需要先了解pickle的具体格式,然后编写相应的解析器。如果pickle文件包含的是标准的cookie数据,你可以这样解析:

package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "net/http/cookiejar"
    "os"
)

// 简单的cookie结构体
type SimpleCookie struct {
    Name  string
    Value string
    Path  string
    Domain string
}

func LoadFromPickleFormat(filename string) (*cookiejar.Jar, error) {
    file, err := os.Open(filename)
    if err != nil {
        return nil, err
    }
    defer file.Close()

    // 这里需要根据实际的pickle格式来解析
    // 假设pickle文件包含的是JSON格式的cookie数据
    var cookies []SimpleCookie
    decoder := json.NewDecoder(file)
    err = decoder.Decode(&cookies)
    if err != nil {
        return nil, err
    }

    jar, err := cookiejar.New(nil)
    if err != nil {
        return nil, err
    }

    // 将cookies添加到jar中
    // 注意:这里需要知道每个cookie对应的URL
    // 这是一个简化的示例
    for _, cookie := range cookies {
        httpCookie := &http.Cookie{
            Name:   cookie.Name,
            Value:  cookie.Value,
            Path:   cookie.Path,
            Domain: cookie.Domain,
        }
        // 这里需要设置正确的URL
        // u, _ := url.Parse("https://mail.ru")
        // jar.SetCookies(u, []*http.Cookie{httpCookie})
    }

    return jar, nil
}

需要注意的是,Python的pickle格式是Python特有的,Go语言无法直接解析。你可能需要:

  1. 在Python端将数据转换为JSON或其他通用格式
  2. 或者使用Go的Python绑定来调用Python的pickle解析功能
  3. 或者实现一个pickle解析器(比较复杂)

推荐的做法是在Python端将数据保存为JSON格式,然后在Go中解析JSON。

回到顶部