Python代码,请记住__cf_bm cookie必须有效才能获得JSON响应。__cf_bm的有效期只有30分钟左右,所以你必须自己从https://kick.com获取一个cookie来复制这个例子。
import requests
headers = {
'Accept':'application/json',
'Cookie':'__cf_bm=yBP__EtLom8aR55x2yIow3GYMpKSMiAAATdk4xHO7CA-1687137561-0-AbAdr3HpoqE97ImTJi4fWsbDp8iOzl6PBzrSwDnFBoTENSfjb7ZOTVx5YX4fuuUMnrIxzqgyWE+kQlENR3ouM3vkVKSWPljxD/JRJJVGGWFy',
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
resp = requests.request('GET', 'https://kick.com/api/v1/channels/xqc', headers=headers)
print (resp.text)
用户代理与cookie绑定,请确保使用获取cookie的用户代理,而不是示例中的用户代理。接受:application/json不是很重要,可以省略。
问题是,当我在golang中使用相同的头部、cookie和user-agent发出相同的请求时,我会得到一个cloudflare响应(当__cf_bm cookie过期时,这是相同的响应),但我知道cookie还没有过期。
Golang Code,go version go1.20.5 linux/amd64
package main
import (
"compress/gzip"
"fmt"
"io"
"io/ioutil"
"net/http"
)
func MakeRequest(url string) (*string, error) {
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36")
req.Header.Set("Accept", "application/json")
req.Header.Set("Connection", "keep-alive")
req.Header.Set("Accept-Encoding", "gzip, deflate")
req.AddCookie(&http.Cookie{Name: "__cf_bm", Value: "yBP__EtLom8aR55x2yIow3GYMpKSMiAAATdk4xHO7CA-1687137561-0-AbAdr3HpoqE97ImTJi4fWsbDp8iOzl6PBzrSwDnFBoTENSfjb7ZOTVx5YX4fuuUMnrIxzqgyWE+kQlENR3ouM3vkVKSWPljxD/JRJJVGGWFy"})
client := &http.Client{}
resp, err := client.Do(req)
var body string
if err != nil {
return &body, err
}
defer resp.Body.Close()
var reader io.ReadCloser
reader, _ = gzip.NewReader(resp.Body)
bytes, _ := ioutil.ReadAll(reader)
body = string(bytes)
return &body, nil
}
func main() {
data, _ := MakeRequest("https://kick.com/api/v1/channels/xqc")
fmt.Println(*data)
}
我添加了Connection和Accept-Encoding头,python请求默认添加,但golang没有。
python和golang的头是一样的,但是响应不是,我做错了什么,或者是golang发送请求的方式。我看不出我做错了什么……
1条答案
按热度按时间olmpazwi1#
需要gzip mod吗?