header = [ 'content-type:application/json;charset=UTF-8', 'accept:*/*', 'accept-encoding:gzip, deflate', 'accept-language:zh-CN,zh;q=0.9,en;q=0.8', 'cookie:Hm_lvt_352975963075889e3e294c05c9b5b506=1775198593; HMACCOUNT=958D4906DE24C8E1; Hm_lpvt_352975963075889e3e294c05c9b5b506=1775203189; JSESSIONID=F3391B6142667B4DEE48F9FD47B90056', 'host:nb.ncha.gov.cn', 'proxy-connection:keep-alive', 'referer:http://nb.ncha.gov.cn/museum.html?page=1&nianfen=2024&level=%E4%BA%8C%E7%BA%A7&showModel=list&order=default', 'user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36', 'x-requested-with:XMLHttpRequest', ]; } /** * 尝试将接口返回内容转成 UTF-8,避免 GBK/GB18030 导致的乱码 * @param string $str * @return string */ private function ensureUtf8($str) { if (!is_string($str) || $str === '') { return $str; } // 强制检测:优先判断是否已经是 UTF-8 $enc = mb_detect_encoding($str, ['UTF-8', 'GB18030', 'GBK', 'GB2312'], true); if ($enc && strtoupper($enc) !== 'UTF-8') { return mb_convert_encoding($str, 'UTF-8', $enc); } // 如果明显出现替换字符(常见于编码不匹配),尝试兜底从 GB18030 转码 if (strpos($str, '�') !== false) { $converted = @mb_convert_encoding($str, 'UTF-8', 'GB18030'); if (is_string($converted) && $converted !== '') { return $converted; } } return $str; } /** * 博物馆分页数据 * @author 唐远望 * @version 1.0 * @date 2026-01-08 */ public function getMuseumPageData() { $url = $this->baseUrl . '/je/api/loadDataNBLNList?current=1&size=15&NB_ND=2024'; $response = self::curl_get($url, $this->header); $response_data = json_decode($response, true); if (isset($response_data['rows']) && !empty($response_data['rows'])) { $page_data = [ 'totle' => $response_data['rows']['total'], 'current' => $response_data['rows']['current'], 'pages' => $response_data['rows']['pages'], 'size' => $response_data['rows']['size'], ]; } else { $page_data = [ 'totle' => 0, 'current' => 0, 'pages' => 0, 'size' => 0, ]; } return $page_data; } /** * 博物馆数据信息列表 * @author 唐远望 * @version 1.0 * @date 2026-01-08 */ public function getMuseumList($page) { $url = $this->baseUrl . '/je/api/loadDataNBLNList?current='.$page.'&size=100&NB_ND=2024&NB_BWGXZ_NAME=&NB_ZLDJ_NAME=&NB_MFKF=&NB_S_NAME=&NB_SS_NAME=&NB_BWGMC='; $response = self::curl_get($url, $this->header); $response_data = json_decode($response, true); return $response_data; } /** * 获取博物馆详情 * @author 唐远望 * @version 1.0 * @date 2026-01-08 */ public function getMuseumDetail($BWG_NB_ID) { $url = $this->baseUrl . '/je/api/loadDataNBLN?parameter={"current":1,"size":-1,"BWG_NB_ID":"' . $BWG_NB_ID . '"}'; $response = self::curl_get($url, $this->header); $response_data = json_decode($response, true); return $response_data; } /** * 发送http post请求 * @param string $url 请求地址 * @param array $headers 请求头 * @param json $postdata 请求数据 * @param array $options curl配置项 */ public static function curl_post($url = '', $headers = '', $postdata = '', $options = array()) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); curl_setopt($ch, CURLOPT_TIMEOUT, 5); curl_setopt($ch, CURLOPT_ENCODING, ''); // 添加这一行,让 cURL 自动处理压缩 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); if (!empty($headers)) { curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); } if (!empty($options)) { curl_setopt_array($ch, $options); } $data = curl_exec($ch); return $data; } /** * 发送http get请求 */ public static function curl_get($url = '', $headers = '', $options = array()) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 5); curl_setopt($ch, CURLOPT_ENCODING, ''); // 添加这一行,让 cURL 自动处理压缩 if (!empty($headers)) { curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); } if (!empty($options)) { curl_setopt_array($ch, $options); } $data = curl_exec($ch); return $data; } }