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

Commit

Permalink
Update to the new way to enable photo
Browse files Browse the repository at this point in the history
  • Loading branch information
canhlinh committed Jul 13, 2018
1 parent bf0a5eb commit 52804ec
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 60 deletions.
42 changes: 17 additions & 25 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ const (
GooglePhotoDataQueryURL = "https://photos.google.com/_/PhotosUi/data"

// GoogleCommandDataURL
GoogleCommandDataURL = "https://photos.google.com/_/PhotosUi/data/batchexecute?f.sid=0&hl=en&soc-app=165&soc-platform=1&soc-device=1&_reqid=0&rt=c"
GoogleCommandDataURL = "https://photos.google.com/_/PhotosUi/data/batchexecute?f.sid=0&bl=boq_photosuiserver_20180711.03_p0&hl=en&soc-app=165&soc-platform=1&soc-device=1&_reqid=785335&rt=c"

// GoogleLoginSite the url to login
GoogleLoginSite = "https://accounts.google.com/ServiceLogin"
Expand Down Expand Up @@ -184,7 +184,7 @@ func (c *Client) Upload(filePath string, filename string, album string, progress
return nil, err
}

photoID, photoURL, err := c.enableUploadedFile(uploadToken, filename, fileInfo.ModTime().Unix()*1000)
photoID, photoURL, err := c.enableUploadedFile(uploadToken, filename, fileInfo.ModTime().UnixNano()/1000000)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -289,55 +289,47 @@ func (c *Client) upload(uploadURL string, file io.ReadCloser, fileSize int64, pr
}

func (c *Client) enableUploadedFile(uploadBase64Token, fileName string, fileModAt int64) (string, string, error) {
log.Info("Request to enable the uploaded photo")

query := NewMutateQuery(QueryNumberEnableImage,
[]interface{}{
[]interface{}{
[]interface{}{
uploadBase64Token,
fileName,
fileModAt,
},
},
},
)

body, err := c.DoQuery(GooglePhotoMutateQueryURL, query)
log.Info("Request to enable the uploaded photo %d", fileModAt)
query := fmt.Sprintf(`[[["mdpdU","[[[\"%s\",\"%s\",%d]]]",null,"generic"]]]`, uploadBase64Token, fileName, fileModAt)
body, err := c.DoQuery(GoogleCommandDataURL, query)
if err != nil {
log.Error(err)
return "", "", err
}

parsedBody := JsonBodyByScanLine(BodyToString(body))
var enableImage EnableImageResponse
if err := json.Unmarshal(BodyToBytes(body)[6:], &enableImage); err != nil {
photoURL, err := enableImage.getEnabledImageURL(parsedBody)
if err != nil {
log.Error(err)
return "", "", err
}

photoURL, err := enableImage.getEnabledImageURL()
photoID, err := enableImage.getEnabledImageID(parsedBody)
if err != nil {
log.Error(err)
return "", "", err
}

return enableImage.getEnabledImageId(), photoURL, nil
return photoID, photoURL, nil
}

func (client *Client) DoQuery(endpoint string, query string) (io.ReadCloser, error) {

if err := client.parseAtToken(); err != nil {
return nil, err
}
form := url.Values{}
form.Add("at", client.magicToken)
form.Add("f.req", query)

req, _ := http.NewRequest("POST", endpoint, strings.NewReader(form.Encode()))
req.Header.Add("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8")
req.Header.Add("User-Agent", ChromeUserAgent)

req.Header.Add("referer", "https://photos.google.com/")
res, err := client.hClient.Do(req)
if err != nil {
return nil, err
}
if res.StatusCode > 299 {
// DumpRequest(req)
// DumpResponse(res)
return nil, errors.New(res.Status)
}

Expand Down
2 changes: 1 addition & 1 deletion client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,6 @@ func TestUpload(t *testing.T) {
})

t.Run("UploadSuccessWithProgressHandler", func(t *testing.T) {

var current int64
var total int64
progressHandler := func(c int64, t int64) {
Expand Down Expand Up @@ -119,6 +118,7 @@ func BenchmarkReUpload(b *testing.B) {
}

func TestLogin(t *testing.T) {
t.Skip()

user := os.Getenv("GOOGLE_USERNAME")
pass := os.Getenv("GOOGLE_PASSWORD")
Expand Down
65 changes: 33 additions & 32 deletions models.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package gphoto
import (
"encoding/json"
"fmt"
"strconv"
"strings"
)

Expand Down Expand Up @@ -134,39 +133,41 @@ func NewSessionUploadFromJson(body string) *SessionUpload {

type EnableImageResponse []interface{}

func (r EnableImageResponse) getEnabledImageId() string {
innerArray := r[0].([]interface{})
innerObject := innerArray[1].(map[string]interface{})
secondInnerArray := innerObject[fmt.Sprintf("%v", QueryNumberEnableImage)].([]interface{})
thirdInnerArray := secondInnerArray[0].([]interface{})
fourthInnerArray := thirdInnerArray[0].([]interface{})
fifthInnerObject := fourthInnerArray[1].([]interface{})
return fifthInnerObject[0].(string)
}

func (eir EnableImageResponse) getEnabledImageURL() (string, error) {
var inner3Array, inner6Array []interface{}
if len(eir) > 0 {
if inner1Array, ok := eir[0].([]interface{}); ok && len(inner1Array) >= 2 {
if inner2Map, ok := inner1Array[1].(map[string]interface{}); ok {
inner3Array = inner2Map[strconv.Itoa(QueryNumberEnableImage)].([]interface{})
}
}
}
if len(inner3Array) > 0 {
if inner4Array, ok := inner3Array[0].([]interface{}); ok && len(inner4Array) > 0 {
if inner5Array, ok := inner4Array[0].([]interface{}); ok && len(inner5Array) >= 2 {
inner6Array = inner5Array[1].([]interface{})
}
// getInfoArray un-safe function
func (r EnableImageResponse) getInfoArray(s string) []interface{} {
json.Unmarshal([]byte(s), &r)
b := r[0].([]interface{})
obj := b[2].(string)
json.Unmarshal([]byte(obj), &b)

b = b[0].([]interface{})
b = b[0].([]interface{})
b = b[1].([]interface{})
return b
}

// getEnabledImageID un-safe function
func (r EnableImageResponse) getEnabledImageID(body string) (s string, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("%v", r)
}
}
if len(inner6Array) >= 2 {
inner7Array := inner6Array[1].([]interface{})
if enabledImageURL, ok := inner7Array[0].(string); ok {
return enabledImageURL, nil
}()

infoArr := r.getInfoArray(body)
return infoArr[0].(string), nil
}

// getEnabledImageURL un-safe function
func (r EnableImageResponse) getEnabledImageURL(body string) (s string, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("%v", r)
}
}
return "", fmt.Errorf("no enabledImageURL")
}()

infoArr := r.getInfoArray(body)
return infoArr[0].(string), err
}

func NewDataQuery(queryNumber int, query interface{}) string {
Expand Down
Binary file removed sample_data/1528707310_sample.mp4
Binary file not shown.
28 changes: 26 additions & 2 deletions util.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package gphoto

import (
"bufio"
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"net/http/httputil"
"strings"
"time"
)

//NewJSONBody create a new json request body from an interface
Expand Down Expand Up @@ -36,10 +39,31 @@ func NewJSONString(model interface{}) string {

func DumpRequest(request *http.Request) {
d, _ := httputil.DumpRequest(request, true)
fmt.Printf("%s\n", d)
fmt.Printf("Request: %s\n", d)
}

func DumpResponse(response *http.Response) {
d, _ := httputil.DumpResponse(response, true)
fmt.Printf("%s\n", d)
fmt.Printf("Response: %s\n", d)
}

func UnixMiliSeconds() int64 {
return time.Now().UnixNano() / 1000000
}

func SpritMagicToken(t string) []string {
return strings.Split(t, ":")
}

func JsonBodyByScanLine(s string) string {
scanner := bufio.NewScanner(strings.NewReader(s))
i := 0
var b string
for scanner.Scan() {
i++
if i >= 4 && i <= 7 {
b += scanner.Text()
}
}
return b
}

0 comments on commit 52804ec

Please sign in to comment.