{"record":{"id":"a5b3196a02fadb22","repo":"fish2018/pansou","slug":"s-a5b319","errorCode":null,"errorMessage":"[%s] 未能抓取到有效网盘链接","messagePattern":"\\[(.+?)\\] 未能抓取到有效网盘链接","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"plugin/yiove/yiove.go","lineNumber":183,"sourceCode":"\t\t\t\tLinks:    limitLinks(linksWithTitle, detailLinkLimit),\n\t\t\t\tTags:     mergeTags(thread.Tags, detail.tags),\n\t\t\t\tChannel:  \"\",\n\t\t\t\tDatetime: detail.datetime,\n\t\t\t}\n\n\t\t\tresultM.Lock()\n\t\t\tresults = append(results, result)\n\t\t\tresultM.Unlock()\n\n\t\t\tlogDebug(debug, \"[%s] 详情抓取成功 URL=%s 链接数=%d\", p.Name(), thread.URL, len(result.Links))\n\t\t}()\n\t}\n\n\twg.Wait()\n\n\tif len(results) == 0 {\n\t\tlogDebug(debug, \"[%s] 所有线程抓取完成但无有效链接\", p.Name())\n\t\treturn nil, fmt.Errorf(\"[%s] 未能抓取到有效网盘链接\", p.Name())\n\t}\n\n\tfiltered := plugin.FilterResultsByKeyword(results, searchKeyword)\n\tlogDebug(debug, \"[%s] 过滤后结果数=%d\", p.Name(), len(filtered))\n\tfor idx, res := range filtered {\n\t\tlinkSummaries := make([]string, 0, len(res.Links))\n\t\tfor _, link := range res.Links {\n\t\t\tlinkSummaries = append(linkSummaries, fmt.Sprintf(\"%s(%s)\", link.Type, link.URL))\n\t\t}\n\t\tlogDebug(\n\t\t\tdebug,\n\t\t\t\"[%s] Result#%d | UID=%s | Title=%s | Links=%d | LinkDetail=%v\",\n\t\t\tp.Name(),\n\t\t\tidx,\n\t\t\tres.UniqueID,\n\t\t\tres.Title,\n\t\t\tlen(res.Links),\n\t\t\tlinkSummaries,","sourceCodeStart":165,"sourceCodeEnd":201,"githubUrl":"https://github.com/fish2018/pansou/blob/beaa56133755a548ebc51b090b3816e2ae044aa6/plugin/yiove/yiove.go#L165-L201","documentation":"After concurrently fetching each thread's detail page, searchImpl fails with '[%s] 未能抓取到有效网盘链接' when no worker extracted any valid pan (net-disk) links. All detail fetches either failed or the pages contained no recognizable share links.","triggerScenarios":"Every fetched thread detail contains no valid cloud-drive links — posts were deleted/link-stripped, detail pages require login, anti-bot blocks the detail requests, or the link-extraction regex no longer matches the page markup.","commonSituations":"Forum purges or hides share links for old posts; guests see link placeholders instead of real URLs; detail request rate-limited so all workers get challenge pages; site changed its link format so extraction returns nothing.","solutions":["Check one thread detail page in a browser to confirm whether share links are still present and guest-visible","Add/refresh cookies or authentication so detail pages return real links instead of placeholders","Slow the workers (lower detailWorkerCount) or add retries to avoid anti-bot rate limiting","Update the link-extraction patterns if the forum changed how pan links are rendered","Verify network/proxy health so detail requests are not all failing"],"exampleFix":"// before\nsem = make(chan struct{}, detailWorkerCount)\n// after\nsem = make(chan struct{}, 2) // reduce concurrency to avoid anti-bot blocks on detail pages","handlingStrategy":"retry","validationCode":"// cannot pre-validate; guard after the call\nif err != nil && strings.Contains(err.Error(), \"未能抓取到有效网盘链接\") { /* retry or fallback */ }","typeGuard":"func isNoLinksErr(err error) bool { return err != nil && strings.Contains(err.Error(), \"未能抓取到有效网盘链接\") }","tryCatchPattern":"results, err := plugin.Search(ctx, keyword)\nif isNoLinksErr(err) {\n    // retry once with lower concurrency / fresh cookies, else fall back to another plugin\n    time.Sleep(time.Second)\n    results, err = plugin.Search(ctx, keyword)\n}\nif err != nil { return err }","preventionTips":["Throttle detailWorkerCount to avoid tripping anti-bot rate limits on detail pages","Keep valid session cookies so share links are rendered for your requests","Retry transient detail fetch failures per-thread before giving up entirely","Alert on this error spiking — it usually means the forum changed link markup or deleted posts"],"tags":["empty-results","scraping","links","upstream"],"backgroundTag":"empty-result-set","analyzedSha":"beaa56133755a548ebc51b090b3816e2ae044aa6","analyzedAt":"2026-09-07T00:31:18.025Z","contentChangedAt":"2026-09-07T00:31:18.025Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}