/// <summary> /// 数据解析 /// </summary> /// <param name="context">处理上下文</param> /// <returns></returns> public override async Task HandleAsync(DataFlowContext context) { context.NotNull(nameof(context)); context.Response.NotNull(nameof(context.Response)); if (!IsValidRequest(context.Request)) { Logger.LogInformation( $"{GetType().Name} ignore parse request {context.Request.RequestUri}, {context.Request.Hash}"); return; } if (context.Selectable == null) { if (SelectableBuilder != null) { context.Selectable = SelectableBuilder(context); } else { var text = context.Response.ReadAsString().TrimStart(); if (text.StartsWith("<!DOCTYPE html>") || text.StartsWith("<html>")) { context.Selectable = CreateHtmlSelectable(context, text); } else { try { var token = (JObject)JsonConvert.DeserializeObject(text); context.Selectable = new JsonSelectable(token); } catch { context.Selectable = new TextSelectable(text); } } } } await ParseAsync(context); var requests = new List <Request>(); if (_followRequestQueriers != null) { foreach (var followRequestQuerier in _followRequestQueriers) { var followRequests = followRequestQuerier(context); if (followRequests != null) { requests.AddRange(followRequests); } } } foreach (var request in requests) { if (IsValidRequest(request)) { // 在此强制设制 Owner, 防止用户忘记导致出错 request.Owner = context.Request.Owner; request.Agent = context.Response.Agent; context.AddFollowRequests(request); } } }