mirror of
https://github.com/Alexey71/opera-proxy.git
synced 2026-05-14 22:50:59 +00:00
WIP
This commit is contained in:
@@ -25,4 +25,12 @@ func main() {
|
|||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
log.Printf("seclient = %#v", seclient)
|
log.Printf("seclient = %#v", seclient)
|
||||||
|
//log.Printf("jar = %#v", seclient.HttpClient.Jar)
|
||||||
|
|
||||||
|
log.Println("------------ DOING DEVICE REGISTRATION ------------")
|
||||||
|
err = seclient.RegisterDevice(context.TODO())
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
log.Printf("seclient = %#v", seclient)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package seclient
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/sha1"
|
||||||
|
"encoding/hex"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func capitalHexSHA1(input string) string {
|
||||||
|
h := sha1.Sum([]byte(input))
|
||||||
|
return strings.ToUpper(hex.EncodeToString(h[:]))
|
||||||
|
}
|
||||||
@@ -48,3 +48,14 @@ type SERegisterSubscriberResponse struct {
|
|||||||
Data interface{} `json:"data"`
|
Data interface{} `json:"data"`
|
||||||
Status SEStatusPair `json:"return_code"`
|
Status SEStatusPair `json:"return_code"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type SERegisterDeviceData struct {
|
||||||
|
ClientType string `json:"client_type"`
|
||||||
|
DeviceID string `json:"device_id"`
|
||||||
|
DevicePassword string `json:"device_password"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SERegisterDeviceResponse struct {
|
||||||
|
Data SERegisterDeviceData `json:"data"`
|
||||||
|
Status SEStatusPair `json:"return_code"`
|
||||||
|
}
|
||||||
|
|||||||
+56
-6
@@ -42,7 +42,6 @@ var DefaultSEEndpoints = SEEndpoints{
|
|||||||
type SESettings struct {
|
type SESettings struct {
|
||||||
ClientVersion string
|
ClientVersion string
|
||||||
ClientType string
|
ClientType string
|
||||||
DeviceHash string
|
|
||||||
DeviceName string
|
DeviceName string
|
||||||
OperatingSystem string
|
OperatingSystem string
|
||||||
UserAgent string
|
UserAgent string
|
||||||
@@ -54,7 +53,6 @@ var DefaultSESettings = SESettings{
|
|||||||
ClientType: "se0316",
|
ClientType: "se0316",
|
||||||
UserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36 OPR/74.0.3911.232",
|
UserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36 OPR/74.0.3911.232",
|
||||||
DeviceName: "Opera-Browser-Client",
|
DeviceName: "Opera-Browser-Client",
|
||||||
DeviceHash: "",
|
|
||||||
OperatingSystem: "Windows",
|
OperatingSystem: "Windows",
|
||||||
Endpoints: DefaultSEEndpoints,
|
Endpoints: DefaultSEEndpoints,
|
||||||
}
|
}
|
||||||
@@ -66,7 +64,7 @@ type SEClient struct {
|
|||||||
SubscriberPassword string
|
SubscriberPassword string
|
||||||
DeviceID string
|
DeviceID string
|
||||||
AssignedDeviceID string
|
AssignedDeviceID string
|
||||||
AssignedDevideIDHash string
|
AssignedDeviceIDHash string
|
||||||
DevicePassword string
|
DevicePassword string
|
||||||
rng *rand.Rand
|
rng *rand.Rand
|
||||||
}
|
}
|
||||||
@@ -144,6 +142,10 @@ func (c *SEClient) Register(ctx context.Context) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if resp.StatusCode != http.StatusOK {
|
||||||
|
return fmt.Errorf("bad http status: %s", resp.Status)
|
||||||
|
}
|
||||||
|
|
||||||
decoder := json.NewDecoder(resp.Body)
|
decoder := json.NewDecoder(resp.Body)
|
||||||
var regRes SERegisterSubscriberResponse
|
var regRes SERegisterSubscriberResponse
|
||||||
err = decoder.Decode(®Res)
|
err = decoder.Decode(®Res)
|
||||||
@@ -159,10 +161,58 @@ func (c *SEClient) Register(ctx context.Context) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *SEClient) RegisterDevice(ctx context.Context) error {
|
||||||
|
registerDeviceInput := url.Values{
|
||||||
|
"client_type": {c.Settings.ClientType},
|
||||||
|
"device_hash": {c.DeviceID},
|
||||||
|
"device_name": {c.Settings.DeviceName},
|
||||||
|
}
|
||||||
|
req, err := http.NewRequestWithContext(
|
||||||
|
ctx,
|
||||||
|
"POST",
|
||||||
|
c.Settings.Endpoints.RegisterDevice,
|
||||||
|
strings.NewReader(registerDeviceInput.Encode()),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
c.populateRequest(req)
|
||||||
|
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||||
|
req.Header.Set("Accept", "application/json")
|
||||||
|
|
||||||
|
resp, err := c.HttpClient.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if resp.StatusCode != http.StatusOK {
|
||||||
|
return fmt.Errorf("bad http status: %s", resp.Status)
|
||||||
|
}
|
||||||
|
|
||||||
|
decoder := json.NewDecoder(resp.Body)
|
||||||
|
var regRes SERegisterDeviceResponse
|
||||||
|
err = decoder.Decode(®Res)
|
||||||
|
cleanupBody(resp.Body)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if regRes.Status.Code != SE_STATUS_OK {
|
||||||
|
return fmt.Errorf("API responded with error message: code=%d, msg=\"%s\"",
|
||||||
|
regRes.Status.Code, regRes.Status.Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
c.AssignedDeviceID = regRes.Data.DeviceID
|
||||||
|
c.DevicePassword = regRes.Data.DevicePassword
|
||||||
|
c.AssignedDeviceIDHash = capitalHexSHA1(regRes.Data.DeviceID)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (c *SEClient) populateRequest(req *http.Request) {
|
func (c *SEClient) populateRequest(req *http.Request) {
|
||||||
req.Header.Set("SE-Client-Version", c.Settings.ClientVersion)
|
req.Header["SE-Client-Version"] = []string{c.Settings.ClientVersion}
|
||||||
req.Header.Set("SE-Operating-System", c.Settings.OperatingSystem)
|
req.Header["SE-Operating-System"] = []string{c.Settings.OperatingSystem}
|
||||||
req.Header.Set("User-Agent", c.Settings.UserAgent)
|
req.Header["User-Agent"] = []string{c.Settings.UserAgent}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Does cleanup of HTTP response in order to make it reusable by keep-alive
|
// Does cleanup of HTTP response in order to make it reusable by keep-alive
|
||||||
|
|||||||
Reference in New Issue
Block a user