static internal async Task<List<GuokrPost>> _getPosts(RestClient client, RestRequest req, Dictionary<string, string> xpath, GuokrGroup group = null) { var resp = await RestSharpAsync.RestSharpExecuteAsyncTask(client, req); List<GuokrPost> ress = new List<GuokrPost>(); #if WP8 await Task.Run(() => #else await TaskEx.Run(() => #endif { var html = resp.Content; var doc = new HtmlDocument(); doc.LoadHtml(html); var ul = doc.DocumentNode.SelectSingleNode(xpath["ul"]); if (!(xpath.ContainsKey("title") && xpath.ContainsKey("reply_count") && xpath.ContainsKey("posted_by") && xpath.ContainsKey("replied_dt") && xpath.ContainsKey("group") )) throw new NotImplementedException("xpath expressions not sufficient"); if (ul == null) return; var titles = ul.SelectNodes(ul.XPath + xpath["title"]); var reply_counts = ul.SelectNodes(ul.XPath + xpath["reply_count"]); var posted_bys = ul.SelectNodes(ul.XPath + xpath["posted_by"]); var replied_dts = ul.SelectNodes(ul.XPath + xpath["replied_dt"]); var groups = ul.SelectNodes(ul.XPath + xpath["group"]); if (titles == null || titles.Count <= 1) return; if (titles.Count != reply_counts.Count || titles.Count != posted_bys.Count || titles.Count != replied_dts.Count || titles.Count != groups.Count) throw new ArgumentOutOfRangeException(); for (int i = 0; i < titles.Count; i++) { var p = new GuokrPost(); ress.Add(p); try { if (xpath.ContainsKey("title")) { var title = titles[i]; p.title = HtmlEntity.DeEntitize(title.InnerText); p.wwwurl = GetAttribute(title, "href"); } if (xpath.ContainsKey("reply_count")) p.reply_count = Convert.ToInt32(reply_counts[i].InnerText); if (group != null) p.group = group; else if (xpath.ContainsKey("group")) { p.group = new GuokrGroup(); var grouplink = groups[i]; p.group.name = grouplink.InnerText; p.group.path = grouplink.Attributes["href"].Value; } else p.group = null; if (xpath.ContainsKey("posted_by")) { p.posted_by = new GuokrUser(); var n = posted_bys[i]; p.posted_by.nickname = n.InnerText; p.posted_by.uri = GetAttribute(n, "href"); } if (xpath.ContainsKey("replied_dt")) { var dt = replied_dts[i].InnerText; var match = Regex.Match(dt, @"\d{4}-\d{1,2}-\d{1,2} \d{2}:\d{2}:\d{2}"); p.replied_dt = match.Success && match.Groups.Count > 0 ? match.Groups[1].Value : ""; } } catch (Exception e) { DebugLogging.Append("exception", e.Message, ""); } } }); return ress; }
public static async Task<GuokrObjectWithId> GetGuokrObjectFromReply(string url) { var response = await GetRedirectUri(new Uri(url, UriKind.Absolute)); GuokrObjectWithId a = null; if (response.AbsolutePath.Contains("/post/")) a = new GuokrPost() { m_url = response.AbsolutePath }; else if (response.AbsolutePath.Contains("/article/")) a = new article() { wwwurl = response.DnsSafeHost + response.AbsolutePath }; else throw new NotImplementedException(); return a; }
public static async Task<string> GetPostContentString(GuokrPost p) { var t = await GetPostContent(p); if (t == null) return ""; return t.OuterHtml; }
public static async Task<string> GetPostDetail(GuokrPost p) { if (p == null) throw new ArgumentNullException(); var req = NewJsonRequest(); req.Resource = "apis/group/post/{post_id}.json"; req.Method = Method.GET; req.AddParameter(new Parameter() { Name = "post_id", Value = p.id, Type = ParameterType.UrlSegment }); var resp = await RestSharpAsync.RestSharpExecuteAsyncTask<GetPostDetailResponse>(WwwClient, req); ProcessError(resp); if (resp.Data != null) Deployment.Current.Dispatcher.BeginInvoke(() => { p.reply_count = resp.Data.result.replies_count; }); else return ""; if (string.IsNullOrEmpty(p.parent_name)) { p.group = new GuokrGroup() { name = resp.Data.result.group.name, path = resp.Data.result.group.url }; } string html = "<div class=\"post\">\n" + "<h1 id=\"articleTitle\">" + resp.Data.result.title + "</h1>\n" + "<div class=\"post-pic\"><img id=\"articleAuthorImg\" style=\"display: block !important;\" src=\"" + resp.Data.result.author.avatar.normal + "\"/></div>\n" + "<div class=\"post-info\">" + "<a id=\"articleAuthor\" href=\"" + resp.Data.result.author.url + "\">" + resp.Data.result.author.nickname + "</a>\n" + "<p>" + Common.HumanReadableTime(DateTime.Parse(resp.Data.result.date_created)) + "</p>\n" + "</div>" + "<div class=\"post-detail\" style=\"margin-top: 10px !important;\"><p/>" + Common.PostBBParser.ToHtml( Regex.Replace(resp.Data.result.content.Replace("\r", ""), @"\x5Btable\x5D.*?\x5B\/table\x5D", m=> Regex.Replace(m.Value, @"(\x5Btable\x5D.*?\x5btd\x5d)|(\x5B\/td\x5D.*?\x5btd\x5d)|(\x5B\/td\x5D.*?\x5b\/table\x5d)", mm => mm.Value.Replace("\n", ""), RegexOptions.Singleline), RegexOptions.Singleline) .Replace("\n\n", "[br]").Replace("\n", "[br]")) + "</div>" + "</div>"; if (string.IsNullOrEmpty(p.title)) { p.title = resp.Data.result.title; p.HtmlContent = html; p.CommentCount = resp.Data.result.replies_count; } return html; }
public static async Task<HtmlNode> GetPostContent(GuokrPost p) { var req = new RestRequest(); req.Resource = p.m_url; req.Method = Method.GET; buf.SetBufToInProgress(req.Resource); var resp = await RestSharpAsync.RestSharpExecuteAsyncTask(WwwClient, req); ProcessError(resp); var doc = new HtmlDocument(); doc.LoadHtml(resp.Content); var n = doc.DocumentNode.SelectSingleNode(@"//div[@class=""post""]"); if (p.wwwurl.Contains("post")) { //n.SelectSingleNode(@"//div[@id=""share""]").Remove(); var k = n.SelectSingleNode(@"//div[@class=""gpack post-txt""]"); n.RemoveChild(k); n.AppendChildren(k.ChildNodes); var m = n.SelectSingleNode(@"//div[@class=""post-pic""]"); string s = m.InnerHtml; n.SelectSingleNode(@"//div[@class=""post-info""]").PrependChild(HtmlNode.CreateNode(@"<p class=""fl"">" + s + @"</p>")); m.Remove(); } if (string.IsNullOrEmpty(p.parent_name)) { var s = doc.DocumentNode.SelectSingleNode(@"//div[@class=""gbreadcrumb""]/ul/li[2]/a"); if (s != null) { p.group = new GuokrGroup() { name = s.InnerText.Trim(new char[] { '\n', ' ', '\t' }), path = s.GetAttributeValue("href", "") }; } } #if WP8 Task.Run(() => ParsePostComments(req.Resource, doc)); #else TaskEx.Run(() => ParsePostComments(req.Resource, doc)); #endif return n; }