示例#1
0
        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;
        }
示例#2
0
        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;
        }
示例#3
0
 public static async Task<string> GetPostContentString(GuokrPost p)
 {
     var t = await GetPostContent(p);
     if (t == null)
         return "";
     return t.OuterHtml;
 }
示例#4
0
        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;
        }
示例#5
0
        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;
        }