Skip to content
This repository has been archived by the owner on Sep 6, 2023. It is now read-only.

Commit

Permalink
Fix new response
Browse files Browse the repository at this point in the history
  • Loading branch information
canhlinh committed Aug 21, 2021
1 parent f35f7bb commit 0f769be
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 45 deletions.
80 changes: 38 additions & 42 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"net/http/cookiejar"
"net/url"
"os"
"regexp"
"strings"
"time"

Expand Down Expand Up @@ -46,6 +47,10 @@ const (

var (
HomePageURL, _ = url.Parse(GooglePhotoURL)
regex1 = regexp.MustCompile(`"SNlM0e":"[a-zA-Z0-9_-]+:\d+"`)
regex2 = regexp.MustCompile(`\n\[\["wrb.fr","mdpdU","(.*?)"\]\]\n`)
regex3 = regexp.MustCompile(`\n\[\["wrb.fr","Z5xsfc",(.*?)\]\]\n`)
regex4 = regexp.MustCompile(`\n\[\["wrb.fr","OXvT9d",(.*?)\]\]\n`)
)

// Client present a upload client
Expand Down Expand Up @@ -144,7 +149,7 @@ func (c *Client) Login(user, pass string) error {
cookies, _ := page.GetCookies()
c.hClient.Jar.SetCookies(HomePageURL, cookies)

if err := c.parseAtToken(); err != nil {
if err := c.parseMagicToken(); err != nil {
return errors.New("Login failure. Can not get the magic token")
}

Expand All @@ -165,7 +170,7 @@ func (c *Client) Upload(filePath string, filename string, album string, progress
fileInfo, _ := file.Stat()

// A magic token need to be genarate firstly.
if err := c.parseAtToken(); err != nil {
if err := c.parseMagicToken(); err != nil {
return nil, err
}

Expand All @@ -186,12 +191,14 @@ func (c *Client) Upload(filePath string, filename string, album string, progress
log.Error("Failed to upload data, got error %s", err.Error())
return nil, err
}
fmt.Println("uploadToken:", uploadToken)

photoID, photoURL, err := c.enableUploadedFile(uploadToken, filename, fileInfo.ModTime().UnixNano()/1000000)
if err != nil {
log.Error("Failed to enable upload url, got error %s", err.Error())
return nil, err
}
fmt.Println("photoID:", photoID)

if album == "" {
album = DefaultAlbum
Expand All @@ -208,8 +215,8 @@ func (c *Client) Upload(filePath string, filename string, album string, progress
return photo, nil
}

//parseAtToken get the at token ( a magic token ) then set it as the magicToken
func (c *Client) parseAtToken() error {
//parseMagicToken get the at token ( a magic token ) then set it as the magicToken
func (c *Client) parseMagicToken() error {
log.Info("Request to get the magic token")

res, err := c.hClient.Get(GooglePhotoURL)
Expand All @@ -222,32 +229,17 @@ func (c *Client) parseAtToken() error {
}

doc, _ := goquery.NewDocumentFromReader(res.Body)

var magicToken MagicToken
doc.Find("script").Each(func(i int, s *goquery.Selection) {
if strings.HasPrefix(s.Text(), "window.WIZ_global_data") {
script := s.Text()
scriptObject := script[strings.Index(script, "{"):]
scriptObject = scriptObject[:strings.LastIndex(scriptObject, "}")+1]

json.Unmarshal([]byte(scriptObject), &magicToken)
return
}
})

if magicToken.Token == "" {
s := doc.Text()
s = regex1.FindString(s)
if len(s) == 0 {
return errors.New("Failed to get the magic token")
}

c.magicToken = magicToken.Token
s = strings.TrimLeft(s, `"SNlM0e":`)
s = strings.Trim(s, `"`)
c.magicToken = s
return nil
}

func (c *Client) getRawMatigToken() string {
arr := strings.Split(c.magicToken, ":")
return arr[0]
}

//createUploadURL create an new upload url
func (c *Client) createUploadURL(fileName string, fileSize int64) (string, error) {
log.Info("Request to create a new upload url")
Expand Down Expand Up @@ -306,15 +298,18 @@ func (c *Client) enableUploadedFile(uploadBase64Token, fileName string, fileModA
log.Error(err)
return "", "", err
}
defer body.Close()

parsedBody := JsonBodyByScanLine(BodyToString(body), 4, 7)
s := BodyToString(body)
s = regex2.FindString(s)
log.Debug(s)
var enableImage EnableImageResponse
photoURL, err := enableImage.getEnabledImageURL(parsedBody)
photoURL, err := enableImage.getEnabledImageURL(s)
if err != nil {
log.Error(err)
return "", "", err
}
photoID, err := enableImage.getEnabledImageID(parsedBody)
photoID, err := enableImage.getEnabledImageID(s)
if err != nil {
log.Error(err)
return "", "", err
Expand All @@ -325,9 +320,10 @@ func (c *Client) enableUploadedFile(uploadBase64Token, fileName string, fileModA

// DoQuery executes http request
func (client *Client) DoQuery(endpoint string, query string) (io.ReadCloser, error) {
if err := client.parseAtToken(); err != nil {
return nil, err
if client.magicToken == "" {
return nil, errors.New("Empty magic token")
}

form := url.Values{}
form.Add("at", client.magicToken)
form.Add("f.req", query)
Expand All @@ -350,18 +346,17 @@ func (client *Client) DoQuery(endpoint string, query string) (io.ReadCloser, err
// GetAlbums gets all google photo albums
func (client *Client) GetAlbums() (Albums, error) {
log.Info("Request to get albums")
query := fmt.Sprintf(`[[["Z5xsfc","[null,null,null,null,1]",null,"3"]]]`)

body, err := client.DoQuery(GoogleCommandDataURL, query)
body, err := client.DoQuery(GoogleCommandDataURL, `[[["Z5xsfc","[null,null,null,null,1]",null,"3"]]]`)
if err != nil {
return nil, err
}
defer body.Close()

stringBody := BodyToString(body)
jsonBody := JsonBodyByScanLine(stringBody, 4, -1)
albumlResponse := NewAlbumlResponse(jsonBody)
s := BodyToString(body)
s = regex3.FindString(s)
log.Debug(s)

albumlResponse := NewAlbumlResponse(s)
albums, err := albumlResponse.Albums()
if err != nil {
return nil, err
Expand Down Expand Up @@ -403,26 +398,26 @@ func (c *Client) CreateAlbum(albumName string) (*Album, error) {
}
defer body.Close()

stringBody := BodyToString(body)
jsonBody := JsonBodyByScanLine(stringBody, 4, 7)
s := BodyToString(body)
s = regex4.FindString(s)

var arr []interface{}
if err := json.Unmarshal([]byte(jsonBody), &arr); err != nil {
if err := json.Unmarshal([]byte(s), &arr); err != nil {
return nil, err
}

arr = arr[0].([]interface{})
s := arr[2].(string)
id := arr[2].(string)
var o interface{}
if err := json.Unmarshal([]byte(s), &o); err != nil {
return nil, err
}
arr = o.([]interface{})
arr = arr[0].([]interface{})
s = arr[0].(string)
id = arr[0].(string)

album := &Album{
ID: s,
ID: id,
Name: albumName,
}

Expand Down Expand Up @@ -519,6 +514,7 @@ func (c *Client) moveToAlbum(albumName string, photoID string) (*Photo, error) {
return nil, err
}

log.Debug("Added phonto:%d to album:%s", photoID, album.ID)
photo.AlbumID = album.ID
return &photo, nil
}
Expand Down
4 changes: 2 additions & 2 deletions examples/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (

func main() {

cookies := GetCookiesFromJSON("./json.")
cookies := GetCookiesFromJSON("./cookie.json")
client := gphoto.NewClient(cookies...)

photo, err := client.Upload("../sample_data/sample.mp4", "sample.mp4", "AnyAlbumName", progressHandler)
Expand All @@ -35,5 +35,5 @@ func GetCookiesFromJSON(path string) []*http.Cookie {
}

func progressHandler(current int64, total int64) {
fmt.Printf("current %d , total %d ", current, total)
// fmt.Printf("current %d , total %d ", current, total)
}
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,5 @@ require (
github.com/stretchr/testify v1.2.2
golang.org/x/net v0.0.0-20181102091132-c10e9556a7bc
)

go 1.13
3 changes: 3 additions & 0 deletions models.go
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,9 @@ func (al *AlbumlResponse) getMainArray() []interface{} {
b = b[0].([]interface{})
obj := b[2].(string)
json.Unmarshal([]byte(obj), &b)
if b[0] == nil {
return []interface{}{}
}

b = b[0].([]interface{})
return b
Expand Down
30 changes: 30 additions & 0 deletions models_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package gphoto

import (
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestAlbumlResponseAlbums(t *testing.T) {
t.Run("Have 1 album", func(t *testing.T) {
s := `[["wrb.fr","Z5xsfc","[[[\"AF1QipN_G84JQnuyofD4YBpbtWHCTlqrNdbTg823uRQZ\",[\"https://lh3.googleusercontent.com/ARRuDgTKczB7FHobmJpWaGJVles36iY_U5NxxchYlVvmzT9V4sXhZJ-QsSN_TAaoAhxZUydvpJAh6gQWGUteRhs-ukdREIPcLEOSAteXiPB99jZUKMvksXioE8nfSohCuhXSJfU6IoHUVnKi0mSKw-GuiBkd0dZYR2YuLNR5Ybw7j4iuZx0RnOxtwN-MxKwXOmwRWeNk3V9KN6aLfgmPY1KUS7T_Vg2fHGUYgOoZ9CFlua8ifh7VjeNvOmZQBZZfYPckWut9TYSMeityaoixyqYay3siPIurclxlLIzPlOsBug88bnKSeQl3C12RYlb1qSMavDMU4Ajzc9pmSxrJHgpycaqYYcP20am2zVkXO26cbvFBPOTiZc86u-c9GCCfxW4ZvQubkWyHFBBO5M9mvlwyvh1feD0cH_gZjOvq7qE8DFbOaVNdjdRmpv3Y-8Q3sqnHFXPUV7N-gz4rq437B6vE_wgwbWSV_VtgEHpD9iGgMYLBTHT2HRyJ606RP84tLaOw7PhK-gXO8qlJdBHS7DzNsb9j3JtYk_hGDvcuXa4W2tGcBd38CvW7kOk-PJBdOna_KW45JCBqvEJq1kptMS6GxGuyDARhLoS7q2kJELSsLAn0OTd8kEqo555pQcSwEjS3Nzgz9yi9yZQ71wdPIwEjPOjhUrseBFgsAeD7hTJrkHR3YJmjnR-6VX6hSJDnU4DGBywFAkL-GZx1a36CbOPL\",1280,720,null,null,null,null,null,null,[9938222]],null,null,null,null,null,[[3],[4],[5],[6],[8],[21],[10],[11],[13],[12],[16],[19],[22],[23],[34,false,true]],null,null,null,null,null,null,null,{\"72930366\":[1,\"FUAKEHREKKKKKKKKKKKKKKKKKKK\",[1629549478000,1629549478000,null,null,1629551887000,[1629549478000,25200000],[1629549478000,25200000],null,null,1629552023283],1,null,null,[19999]]}]],null,[1]]",null,null,null,"1"],["di",191],["af.httprm",190,"7128235394984688870",20]]`
r := NewAlbumlResponse(s)
albums, err := r.Albums()
require.NoError(t, err)
assert.Len(t, albums, 1)
for _, album := range albums {
assert.NotEmpty(t, album.ID)
assert.NotEmpty(t, album.Name)
}
})

t.Run("Have 0 album", func(t *testing.T) {
s := `[["wrb.fr","Z5xsfc","[null,null,[1]]",null,null,null,"3"],["di",111],["af.httprm",110,"-4701098615363376220",24]]`
r := NewAlbumlResponse(s)
albums, err := r.Albums()
require.NoError(t, err)
assert.Len(t, albums, 0)
})
}
5 changes: 4 additions & 1 deletion uploader.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,16 @@ func (u *Uploader) do(url string, file io.Reader, fileSize int64) chan *UploadRe
req.ContentLength = fileSize
req.Header.Add("content-type", "application/octet-stream")
req.Header.Add("user-agent", ChromeUserAgent)
req.Header.Add("x-goog-upload-command", "upload, finalize")
req.Header.Add("x-goog-upload-offset", "0")
req.Header.Add("referer", "https://photos.google.com/")
req.Header.Add("origin", "https://photos.google.com")

res, err := u.hClient.Do(req)
if err != nil {
result.Err = err
return
}

result.Resp = res

}()
Expand Down

0 comments on commit 0f769be

Please sign in to comment.