简单说明
一篇文章教你如何让你的微信公众号实现题库对接。这个题库功能,本人的公众号也在使用,各位可以去体验一下,扫侧栏的二维码,关注即可。具体代码已经写好了,只要复制到相应的位置即可【建议使用本人修改后的公众号配置文件,微信公众号的配置具体看:https://www.gtabox.cn/post/1376/ 这篇文章!】,使用起来十分方便,且看下面的操作步骤。
注:只是提供了一个思路,你可以把代码里的题库改成其他的,甚至美化,这都随便。
操作步骤
将下面代码添加到 【// 构造回复内容】if语句后面,elif语句前面:
// 题目查询处理 elseif (mb_strpos($content, '题目:') === 0) { $prefix = '题目:'; $questionText = trim(mb_substr($content, mb_strlen($prefix))); if (empty($questionText)) { $replyContent = "⚠️ 题目内容不能为空"; } else { list($error, $answer) = query_question_bank($questionText); $replyContent = $answer ?: $error; } $reply = <<<XML <xml> <ToUserName><![CDATA[{$fromUser}]]></ToUserName> <FromUserName><![CDATA[{$toUser}]]></FromUserName> <CreateTime>{time()}</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[{$replyContent}]]></Content> </xml> XML; }将下面代码添加到wechat.php的最下方:
function query_question_bank($question) { // 参数验证 if (empty($question) || mb_strlen($question) > 500) { return ["问题内容不合法(长度限制500字符)", null]; } // 缓存机制(APCu示例) $cacheKey = 'qbank_'.md5($question); if (apcu_exists($cacheKey)) { $cached = apcu_fetch($cacheKey); return $cached['error'] ? [$cached['data'], null] : [null, $cached['data']]; } // API配置 $apiUrl = 'https://cx.icodef.com/wyn-nb?v=4'; $headers = [ 'Content-Type: application/x-www-form-urlencoded', 'Authorization: 6LDgu0KMkIi8s3B4' ]; $retry = 0; do { $ch = curl_init(); try { curl_setopt_array($ch, [ CURLOPT_URL => $apiUrl, CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query(['question' => $question]), CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 5, // 延长至5秒 CURLOPT_SSL_VERIFYPEER => true, // 启用SSL验证 CURLOPT_CAINFO => '/path/to/cacert.pem', // CA证书路径 CURLOPT_ENCODING => 'gzip' // 启用压缩 ]); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $errorNo = curl_errno($ch); // 记录日志 file_put_contents('query.log', date('[Y-m-d H:i:s]')." [Q]:{$question} [HTTP:{$httpCode}] [CURL:{$errorNo}] [RES:".substr($response,0,100)."]\n", FILE_APPEND ); // 网络层错误处理 if ($errorNo) { $errorMsg = "题库连接失败(".curl_strerror($errorNo).")"; if ($retry < 2) { usleep(500000 * ($retry + 1)); // 指数退避 continue; } apcu_store($cacheKey, ['error' => true, 'data' => $errorMsg], 60); // 缓存错误60秒 return [$errorMsg, null]; } // HTTP状态码处理 if ($httpCode != 200) { $errorMap = [ 400 => "请求参数错误", 429 => "请求过于频繁", 503 => "服务暂时不可用" ]; $errorMsg = $errorMap[$httpCode] ?? "接口响应异常(HTTP {$httpCode})"; apcu_store($cacheKey, ['error' => true, 'data' => $errorMsg], 60); return [$errorMsg, null]; } // 数据解析 $result = json_decode($response, true); if (json_last_error() !== JSON_ERROR_NONE) { apcu_store($cacheKey, ['error' => true, 'data' => "数据解析失败"], 60); return ["数据解析失败", null]; } // 业务逻辑处理 if ($result['code'] === 1 && !empty($result['data'])) { $answer = wordwrap(trim($result['data']), 40, "\n", true); // 格式化答案 apcu_store($cacheKey, ['error' => false, 'data' => $answer], 3600); // 缓存1小时 return [null, $answer]; } $errorMsg = $result['msg'] ?? ($result['code'] ?? '未知错误'); apcu_store($cacheKey, ['error' => true, 'data' => $errorMsg], 1800); // 缓存错误30分钟 return [$errorMsg, null]; } finally { curl_close($ch); } } while ($retry++ < 2); return ["系统繁忙,请稍后再试", null]; }- 还是一句话,不会就喂AI,让它帮你处理......
效果展示
全部修改完毕后,用户回复“题目:XXX”,公众号即可自动获取题目答案并输出。
