private static string graphql_qurey(InstagramExtractorOption option, string query_hash, Dictionary <string, string> param) { var url = $"https://www.instagram.com/graphql/query/?query_hash=" + query_hash + "&variables=" + HttpUtility.UrlEncode(JsonConvert.SerializeObject(param)); option.PageReadCallback?.Invoke(url); return(NetTools.DownloadString(url)); }
/// <summary> /// Get userid from user nickname /// </summary> /// <param name="html">https://www.instagram.com/(.*?)/</param> /// <returns></returns> public static User get_user(InstagramExtractorOption option, string html) { var json = Regex.Match(html, @"window\._sharedData = (.*);</script>").Groups[1].Value; var juser = (JToken.Parse(json)["entry_data"]["ProfilePage"] as JArray)[0]["graphql"]["user"]; var user = new User { UserId = juser["id"].ToString(), UserName = juser["username"].ToString(), FullName = juser["full_name"].ToString(), TotalPostsCount = juser["edge_owner_to_timeline_media"]["count"].ToString().ToInt(), FirstPost = new Posts { HasNext = (bool)juser["edge_owner_to_timeline_media"]["page_info"]["has_next_page"], EndCursor = juser["edge_owner_to_timeline_media"]["page_info"]["end_cursor"].ToString(), DisplayUrls = new List <string>(), } }; option.ProgressMax?.Invoke(user.TotalPostsCount); option.ThumbnailCallback?.Invoke(NetTask.MakeDefault(juser["profile_pic_url_hd"].ToString())); foreach (var post in juser["edge_owner_to_timeline_media"]["edges"]) { user.FirstPost.PostCount++; if (post["node"]["__typename"].ToString() == "GraphImage" || option.OnlyThumbnail) { user.FirstPost.DisplayUrls.Add(post["node"]["display_url"].ToString()); } else { var short_code = post["node"]["shortcode"].ToString(); var json2 = graphql_qurey(option, sidecar_query_hash(), new Dictionary <string, string> { { "shortcode", short_code } }); if (post["node"]["__typename"].ToString() == "GraphVideo") { var media = JToken.Parse(json2)["data"]["shortcode_media"]; extract_url(media, option, user.FirstPost.DisplayUrls); } else { foreach (var media in JToken.Parse(json2)["data"]["shortcode_media"]["edge_sidecar_to_children"]["edges"]) { extract_url(media["node"], option, user.FirstPost.DisplayUrls); } } } } return(user); }
private static void extract_url(JToken media, InstagramExtractorOption option, List <string> urls) { if ((bool)media["is_video"] && !option.OnlyImages) { urls.Add(media["video_url"].ToString()); if (option.IncludeThumbnail) { urls.Add(media["display_url"].ToString()); } } else { urls.Add(media["display_url"].ToString()); } }
public static Posts query_next(InstagramExtractorOption option, string query_hash, string id, string first, string after) { RETRY: try { var json = graphql_qurey(option, query_hash, new Dictionary <string, string> { { "id", id }, { "first", first }, { "after", after } }); var jmedia = JToken.Parse(json)["data"]["user"]["edge_owner_to_timeline_media"]; var posts = new Posts { HasNext = (bool)jmedia["page_info"]["has_next_page"], EndCursor = jmedia["page_info"]["end_cursor"].ToString(), DisplayUrls = new List <string>() }; foreach (var post in jmedia["edges"]) { posts.PostCount++; if (post["node"]["__typename"].ToString() != "GraphSidecar" || option.OnlyThumbnail) { extract_url(post["node"], option, posts.DisplayUrls); } else { foreach (var media in post["node"]["edge_sidecar_to_children"]["edges"]) { extract_url(media["node"], option, posts.DisplayUrls); } } } return(posts); } catch { Thread.Sleep(2000); goto RETRY; } }