[Golang] Discover Instagram Top Live
Interesting small program to discover Instagram top lives on local machines in Go.
In this program only Go standard library is used, no third-party packages.
To access the Instagram API via local Go program, you need to login Instagram and get the following information from your browser:
- ds_user_id
- sessionid
- csrftoken
Please see this SO answer to get above values on Chrome browser.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | package instago // This file implements Instagram discover top live API. import ( "encoding/json" "errors" "io/ioutil" "net/http" "strconv" ) const urlToplive = `https://i.instagram.com/api/v1/discover/top_live/` // Decode JSON data returned from Instagram top live API type IGTopliveResp struct { Broadcasts []struct { Id int64 `json:"id"` RtmpPlaybackUrl string `json:"rtmp_playback_url"` DashPlaybackUrl string `json:"dash_playback_url"` DashAbrPlaybackUrl string `json:"dash_abr_playback_url"` BroadcastStatus string `json:"broadcast_status"` ViewerCount float64 `json:"viewer_count"` InternalOnly bool `json:"internal_only"` CoverFrameUrl string `json:"cover_frame_url"` BroadcastOwner struct { Pk int64 `json:"pk"` Username string `json:"username"` FullName string `json:"full_name"` IsPrivate bool `json:"is_private"` ProfilePicUrl string `json:"profile_pic_url"` ProfilePicId string `json:"profile_pic_id"` FriendshipStatus struct { Following bool `json:"following"` FollowedBy bool `json:"followed_by"` Blocking bool `json:"blocking"` IsPrivate bool `json:"is_private"` IncomingRequest bool `json:"incoming_request"` OutgoingRequest bool `json:"outgoing_request"` IsBestie bool `json:"is_bestie"` } `json:"friendship_status"` IsVerified bool `json:"is_verified"` } `json:"broadcast_owner"` PublishedTime int64 `json:"published_time"` MediaId string `json:"media_id"` BroadcastMessage string `json:"broadcast_message"` OrganicTrackingToken string `json:"organic_tracking_token"` } `json:"broadcasts"` MoreAvailable bool `json:"more_available"` AutoLoadMoreEnabled bool `json:"auto_load_more_enabled"` NextMaxId int64 `json:"next_max_id"` Status string `json:"status"` } // Send HTTP request and get http response on behalf of a specific Instagram // user. After login to Instagram, you can get the cookies of *ds_user_id*, // *sessionid*, *csrftoken* in Chrome Developer Tools. // See https://stackoverflow.com/a/44773079 // or // https://github.com/hoschiCZ/instastories-backup#obtain-cookies func getHTTPResponse(url, ds_user_id, sessionid, csrftoken string) (b []byte, err error) { req, err := http.NewRequest("GET", url, nil) if err != nil { return } req.AddCookie(&http.Cookie{Name: "ds_user_id", Value: ds_user_id}) req.AddCookie(&http.Cookie{Name: "sessionid", Value: sessionid}) req.AddCookie(&http.Cookie{Name: "csrftoken", Value: csrftoken}) req.Header.Set("User-Agent", "Instagram 10.3.2 (iPhone7,2; iPhone OS 9_3_3; en_US; en-US; scale=2.00; 750x1334) AppleWebKit/420+") client := &http.Client{} resp, err := client.Do(req) if err != nil { return } defer resp.Body.Close() if resp.StatusCode != 200 { err = errors.New( "resp.StatusCode: " + strconv.Itoa(resp.StatusCode)) return } return ioutil.ReadAll(resp.Body) } // Given a string, return the users that best matches the string. This is // actually *topsearch* on Instagram web. func Toplive(ds_user_id, sessionid, csrftoken string) (tr IGTopliveResp, err error) { b, err := getHTTPResponse(urlToplive, ds_user_id, sessionid, csrftoken) if err != nil { return } err = json.Unmarshal(b, &tr) return } |
Example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package instago import ( "os" "testing" ) func ExampleToplive(t *testing.T) { tl, err := Toplive( os.Getenv("IG_DS_USER_ID"), os.Getenv("IG_SESSIONID"), os.Getenv("IG_CSRFTOKEN")) if err != nil { t.Error(err) return } t.Log(tl) } |
The full code is also available on my GitHub repo [1].
Tested on: Ubuntu Linux 17.10, Go 1.9.4.
References:
[1] | GitHub - siongui/instago: Get photos, videos, stories, following and followers of Instagram |