{"record":{"id":"3e62fb5d1971eee4","repo":"AlistGo/alist","slug":"div-style-font-family-arial-sans-serif-paddi","errorCode":null,"errorMessage":"\n<div style=\"font-family: Arial, sans-serif; padding: 15px; border-radius: 5px; border: 1px solid #e0e0e0;>\n    <h3 style=\"color: #d9534f; margin-top: 0;\">\n        <span style=\"font-size: 16px;\">🔒 本次登录需要验证</span><br>\n        <span style=\"font-size: 14px; font-weight: normal; color: #666;\">This login requires verification</span>\n    </h3>\n    <p style=\"font-size: 14px; margin-bottom: 15px;\">下面是验证所需要的数据，具体使用方法请参照对应的驱动文档<br>\n    <span style=\"color: #666; font-size: 13px;\">Below are the relevant verification data. For specific usage methods, please refer to the corresponding driver documentation.</span></p>\n    <div style=\"border: 1px solid #ddd; border-radius: 4px; padding: 10px; overflow-x: auto; font-family: 'Courier New', monospace; font-size: 13px;\">\n        <pre style=\"margin: 0; white-space: pre-wrap;\"><code>%s</code></pre>\n    </div>\n</div>","messagePattern":"\n<div style=\"font-family: Arial, sans-serif; padding: 15px; border-radius: 5px; border: 1px solid #e0e0e0;>\n    <h3 style=\"color: #d9534f; margin-top: 0;\">\n        <span style=\"font-size: 16px;\">🔒 本次登录需要验证</span><br>\n        <span style=\"font-size: 14px; font-weight: normal; color: #666;\">This login requires verification</span>\n    </h3>\n    <p style=\"font-size: 14px; margin-bottom: 15px;\">下面是验证所需要的数据，具体使用方法请参照对应的驱动文档<br>\n    <span style=\"color: #666; font-size: 13px;\">Below are the relevant verification data\\. For specific usage methods, please refer to the corresponding driver documentation\\.</span></p>\n    <div style=\"border: 1px solid #ddd; border-radius: 4px; padding: 10px; overflow-x: auto; font-family: 'Courier New', monospace; font-size: 13px;\">\n        <pre style=\"margin: 0; white-space: pre-wrap;\"><code>%s</code></pre>\n    </div>\n</div>","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"drivers/thunder/util.go","lineNumber":228,"sourceCode":"\n\tif err := utils.Json.Unmarshal(res.Body(), &reviewResp); err != nil {\n\t\treturn err\n\t}\n\n\tdeviceSign := generateDeviceSign(c.DeviceID, c.PackageName)\n\n\treviewData = ReviewData{\n\t\tCreditkey:  reviewResp.Creditkey,\n\t\tReviewurl:  reviewResp.Reviewurl + \"&deviceid=\" + deviceSign,\n\t\tDeviceid:   deviceSign,\n\t\tDevicesign: deviceSign,\n\t}\n\n\t// 将reviewData转为JSON字符串\n\treviewDataJSON, _ := json.MarshalIndent(reviewData, \"\", \"  \")\n\t//reviewDataJSON, _ := json.Marshal(reviewData)\n\n\treturn fmt.Errorf(`\n<div style=\"font-family: Arial, sans-serif; padding: 15px; border-radius: 5px; border: 1px solid #e0e0e0;>\n    <h3 style=\"color: #d9534f; margin-top: 0;\">\n        <span style=\"font-size: 16px;\">🔒 本次登录需要验证</span><br>\n        <span style=\"font-size: 14px; font-weight: normal; color: #666;\">This login requires verification</span>\n    </h3>\n    <p style=\"font-size: 14px; margin-bottom: 15px;\">下面是验证所需要的数据，具体使用方法请参照对应的驱动文档<br>\n    <span style=\"color: #666; font-size: 13px;\">Below are the relevant verification data. For specific usage methods, please refer to the corresponding driver documentation.</span></p>\n    <div style=\"border: 1px solid #ddd; border-radius: 4px; padding: 10px; overflow-x: auto; font-family: 'Courier New', monospace; font-size: 13px;\">\n        <pre style=\"margin: 0; white-space: pre-wrap;\"><code>%s</code></pre>\n    </div>\n</div>`, string(reviewDataJSON))\n}\n\n// 计算文件Gcid\nfunc getGcid(r io.Reader, size int64) (string, error) {\n\tcalcBlockSize := func(j int64) int64 {\n\t\tvar psize int64 = 0x40000\n\t\tfor float64(j)/float64(psize) > 0x200 && psize < 0x200000 {","sourceCodeStart":210,"sourceCodeEnd":246,"githubUrl":"https://github.com/AlistGo/alist/blob/843d9dc8149126976b2625911e45a4d3ffd6f2f5/drivers/thunder/util.go#L210-L246","documentation":"Thrown by the Thunder (Xunlei) driver when the API responds with error code/error message 'review_panel', meaning the account login was flagged and requires SMS/device verification. The driver collects ReviewData (credit key, review URL with deviceid, device sign) into JSON and embeds it in an HTML-styled error so the user can complete verification using the thunder-jwt or verification tools described in the driver docs. It is not a bug: it is a controlled credential-verification flow surfaced through fmt.Errorf.","triggerScenarios":"Any Thunder API request executed through Common.Request whose response body unmarshals to ErrResp with ErrorMsg == \"review_panel\"; getReviewData is then called and returns this HTML error containing the marshaled ReviewData (creditkey, reviewurl + deviceid, devicesign).","commonSituations":"Logging into Thunder from a new IP or datacenter, long-lived tokens expiring their trust, frequent re-logins, or account risk control. Common after changing machines or when using the account without completing SMS verification once.","solutions":["Read the JSON block inside the HTML error and follow the Thunder driver doc: use the creditkey/reviewurl/deviceid to complete verification (e.g. via the verification page or thunder-jwt flow), then re-login.","Complete the review URL (it already contains deviceid) in a browser where you are logged into the same Thunder account, approve the SMS/device check, then retry the mount.","Rotate the login: refresh token / re-run login so a new JWT with fresh device sign is issued, and avoid triggering risk control (shared IPs, rapid restarts).","If it recurs persistently, treat it as account-level risk control: change password or verify the account on the official Xunlei client first."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"if err := driver.Request(...); err != nil {\n    if strings.Contains(err.Error(), \"本次登录需要验证\") || strings.Contains(err.Error(), \"review_panel\") {\n        // parse embedded JSON, guide user through verification flow\n        log.Warn(\"thunder verification required: complete review flow, then re-login\")\n    }\n    return err\n}","preventionTips":["Persist a stable DeviceID in the storage config to reduce risk-control triggers","Avoid frequent re-logins or IP changes for Thunder accounts","Complete SMS/device verification once via the review URL before automating"],"tags":["thunder","xunlei","authentication","verification","risk-control"],"backgroundTag":null,"analyzedSha":"843d9dc8149126976b2625911e45a4d3ffd6f2f5","analyzedAt":"2026-08-15T12:14:11.722Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}