_

发表于 2025-09-01 | 更新于 2025-09-01 | 0 评论 | 226 阅读
网络技巧 微信相关

简单说明

一篇文章教你如何让你的微信公众号实现题库对接。这个题库功能,本人的公众号也在使用,各位可以去体验一下,扫侧栏的二维码,关注即可。具体代码已经写好了,只要复制到相应的位置即可【建议使用本人修改后的公众号配置文件,微信公众号的配置具体看:https://www.gtabox.cn/post/1376/ 这篇文章!】,使用起来十分方便,且看下面的操作步骤。

注:只是提供了一个思路,你可以把代码里的题库改成其他的,甚至美化,这都随便。

操作步骤

  1. 将下面代码添加到 【// 构造回复内容】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;
     } 
  2. 将下面代码添加到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];
    }
  3. 还是一句话,不会就喂AI,让它帮你处理......

效果展示

全部修改完毕后,用户回复“题目:XXX”,公众号即可自动获取题目答案并输出。

wechat_2025-09-01_143415_270.webp

昵称
邮箱
网址
取消

俠盒分享博客提醒您:来不及找到心仪的内容?按CtrlD收藏我们后继续追找哦!