Skip to content

Commit

Permalink
Use goroutines for long sequences
Browse files Browse the repository at this point in the history
  • Loading branch information
Davincible committed Aug 24, 2021
1 parent aa95868 commit 155582f
Show file tree
Hide file tree
Showing 5 changed files with 236 additions and 126 deletions.
199 changes: 131 additions & 68 deletions goinsta.go
Original file line number Diff line number Diff line change
Expand Up @@ -494,89 +494,152 @@ func (insta *Instagram) OpenApp() (err error) {
return
}

err = insta.getAccountFamily()
if err != nil {
insta.WarnHandler("Non fatal error while fetching account family:", err)
}

err = insta.sync()
if err != nil {
return
}

err = insta.getNdxSteps()
if err != nil {
insta.WarnHandler("Non fatal error while fetching ndx steps:", err)
if err := insta.sync(); err != nil {
return err
}

if !insta.Timeline.Next() {
return errors.New("Failed to fetch timeline during login procedure: " +
insta.Timeline.err.Error())
}
wg := &sync.WaitGroup{}
errChan := make(chan error, 15)

err = insta.callNotifBadge()
if err != nil {
insta.WarnHandler("Non fatal error while fetching notify badge", err)
}
wg.Add(1)
go func() {
defer wg.Done()
err := insta.getAccountFamily()
if err != nil {
insta.WarnHandler("Non fatal error while fetching account family:", err)
}
}()

err = insta.banyan()
if err != nil {
insta.WarnHandler("Non fatal error while fetching banyan", err)
}
wg.Add(1)
go func() {
defer wg.Done()
if err := insta.getNdxSteps(); err != nil {
insta.WarnHandler("Non fatal error while fetching ndx steps:", err)
}
}()

wg.Add(1)
go func() {
defer wg.Done()
if !insta.Timeline.Next() {
errChan <- errors.New("Failed to fetch timeline: " +
insta.Timeline.err.Error())
}
}()

err = insta.callMediaBlocked()
if err != nil {
insta.WarnHandler("Non fatal error while fetching blocked media", err)
}
wg.Add(1)
go func() {
defer wg.Done()
if err := insta.callNotifBadge(); err != nil {
insta.WarnHandler("Non fatal error while fetching notify badge", err)
}
}()

// no clue what theses values could be used for
_, err = insta.getCooldowns()
if err != nil {
insta.WarnHandler("Non fatal error while fetching cool downs", err)
}
wg.Add(1)
go func() {
defer wg.Done()
if err := insta.banyan(); err != nil {
insta.WarnHandler("Non fatal error while fetching banyan", err)
}
}()

if !insta.Discover.Next() {
insta.WarnHandler("Non fatal error while fetching explore page",
insta.Discover.Error())
}
wg.Add(1)
go func() {
defer wg.Done()
if err = insta.callMediaBlocked(); err != nil {
insta.WarnHandler("Non fatal error while fetching blocked media", err)
}
}()

err = insta.getConfig()
if err != nil {
insta.WarnHandler("Non fatal error while fetching config", err)
}
wg.Add(1)
go func() {
defer wg.Done()
// no clue what theses values could be used for
_, err = insta.getCooldowns()
if err != nil {
insta.WarnHandler("Non fatal error while fetching cool downs", err)
}
}()

wg.Add(1)
go func() {
defer wg.Done()
if !insta.Discover.Next() {
insta.WarnHandler("Non fatal error while fetching explore page",
insta.Discover.Error())
}
}()

// no clue what theses values could be used for
_, err = insta.getScoresBootstrapUsers()
if err != nil {
insta.WarnHandler("Non fatal error while fetching bootstrap user scores", err)
}
wg.Add(1)
go func() {
defer wg.Done()
if err := insta.getConfig(); err != nil {
insta.WarnHandler("Non fatal error while fetching config", err)
}
}()

if !insta.Activity.Next() {
return errors.New("Failed to fetch recent activity: " +
insta.Activity.err.Error())
}
wg.Add(1)
go func() {
defer wg.Done()
// no clue what theses values could be used for
_, err = insta.getScoresBootstrapUsers()
if err != nil {
insta.WarnHandler("Non fatal error while fetching bootstrap user scores", err)
}
}()

wg.Add(1)
go func() {
defer wg.Done()
if !insta.Activity.Next() {
errChan <- errors.New("Failed to fetch recent activity: " +
insta.Activity.err.Error())
}
}()

err = insta.sendAdID()
if err != nil {
insta.WarnHandler("Non fatal error while sending ad id", err)
}
wg.Add(1)
go func() {
defer wg.Done()
if err := insta.sendAdID(); err != nil {
insta.WarnHandler("Non fatal error while sending ad id", err)
}
}()

err = insta.callStClPushPerm()
if err != nil {
insta.WarnHandler("Non fatal error while calling store client push permissions", err)
}
wg.Add(1)
go func() {
defer wg.Done()
if err := insta.callStClPushPerm(); err != nil {
insta.WarnHandler("Non fatal error while calling store client push permissions", err)
}
}()

wg.Add(1)
go func() {
defer wg.Done()
if !insta.Inbox.InitialSnapshot() {
err := insta.Inbox.Error()
if err != ErrNoMore {
errChan <- errors.New("Failed to fetch initial messages inbox snapshot: " +
err.Error())
}
}
}()

if !insta.Inbox.InitialSnapshot() {
return errors.New("Failed to fetch initial messages inbox snapshot: " +
insta.Inbox.err.Error())
}
wg.Add(1)
go func() {
defer wg.Done()
if err := insta.callContPointSig(); err != nil {
insta.WarnHandler("Non fatal error while calling contact point signal:", err)
}
}()

err = insta.callContPointSig()
if err != nil {
insta.WarnHandler("Non fatal error while calling contact point signal:", err)
wg.Wait()
select {
case err := <-errChan:
return err
default:
return nil
}

return nil
}

func (insta *Instagram) login() error {
Expand Down
127 changes: 81 additions & 46 deletions profiles.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"encoding/json"
"errors"
"fmt"
"time"
"sync"
)

// Profiles allows user function interactions
Expand All @@ -22,10 +22,10 @@ type Profile struct {
User *User
Friendship *Friendship

Feed FeedMedia
Stories StoryMedia
Feed *FeedMedia
Stories *StoryMedia
Highlights []*Reel
IGTV IGTVChannel
IGTV *IGTVChannel
}

// VisitProfile will perform the same request sequence as if you visited a profile
Expand Down Expand Up @@ -65,63 +65,98 @@ func (insta *Instagram) VisitProfile(handle string) (*Profile, error) {
// which will perform a search, register the click, and call this method.
//
func (user *User) VisitProfile() (*Profile, error) {
p := Profile{User: user}
p := &Profile{User: user}

wg := &sync.WaitGroup{}
info := &sync.WaitGroup{}
errChan := make(chan error, 10)

// Fetch Profile Info
wg.Add(1)
go func(wg *sync.WaitGroup) {
info.Add(1)
defer wg.Done()
defer info.Done()
if err := user.Info("entry_point", "profile", "from_module", "blended_search"); err != nil {
errChan <- err
}
}(wg)

// Fetch Friendship
fr, err := user.GetFriendship()
if err != nil {
return nil, err
}
p.Friendship = fr
wg.Add(1)
go func(wg *sync.WaitGroup) {
defer wg.Done()
fr, err := user.GetFriendship()
if err != nil {
errChan <- err
}
p.Friendship = fr
}(wg)

// Fetch Feed
// usually gets called 3 times on profile visit, if enough media available
feed := user.Feed()
for i := 0; i < 3; i++ {
s := feed.Next()
err := feed.Error()
if !s && err != ErrNoMore {
return nil, err
wg.Add(1)
go func(wg *sync.WaitGroup) {
defer wg.Done()
feed := user.Feed()
p.Feed = feed
if !feed.Next() && feed.Error() != ErrNoMore {
errChan <- feed.Error()
}
time.Sleep(200 * time.Millisecond)
}
p.Feed = *feed
}(wg)

// Fetch Stories
stories, err := user.Stories()
if err != nil {
return nil, err
}
p.Stories = *stories
wg.Add(1)
go func(wg *sync.WaitGroup) {
defer wg.Done()
stories, err := user.Stories()
p.Stories = stories
if err != nil {
errChan <- err
}
}(wg)

// Fetch Highlights
h, err := user.Highlights()
if err != nil {
return nil, err
}
p.Highlights = h

// Fetch Profile Info
err = user.Info("entry_point", "profile", "from_module", "blended_search")
if err != nil {
return nil, err
}
wg.Add(1)
go func(wg *sync.WaitGroup) {
defer wg.Done()
h, err := user.Highlights()
p.Highlights = h
if err != nil {
errChan <- err
}
}(wg)

// Fetch Featured Accounts
_, err = user.GetFeaturedAccounts()
if err != nil {
user.insta.WarnHandler(err)
}
wg.Add(1)
go func(wg *sync.WaitGroup) {
defer wg.Done()
_, err := user.GetFeaturedAccounts()
if err != nil {
user.insta.WarnHandler(err)
}
}(wg)

// Fetch IGTV
if user.IGTVCount > 0 {
igtv, err := user.IGTV()
if err != nil {
return nil, err
wg.Add(1)
go func(wg *sync.WaitGroup) {
defer wg.Done()
info.Wait()
if user.IGTVCount > 0 {
igtv, err := user.IGTV()
if err != nil {
errChan <- err
}
p.IGTV = igtv
}
p.IGTV = *igtv
}(wg)

wg.Wait()
select {
case err := <-errChan:
return p, err
default:
return p, nil
}
return &p, nil
}

func newProfiles(insta *Instagram) *Profiles {
Expand Down
3 changes: 2 additions & 1 deletion request.go
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,8 @@ func (insta *Instagram) sendRequest(o *reqOptions) (body []byte, h http.Header,
}

func (insta *Instagram) checkXmidExpiry() {
if insta.xmidExpiry != -1 && time.Now().Unix() > insta.xmidExpiry-10 {
t := time.Now().Unix()
if insta.xmidExpiry != -1 && t > insta.xmidExpiry-10 {
insta.xmidExpiry = -1
insta.zrToken()
}
Expand Down
Loading

0 comments on commit 155582f

Please sign in to comment.