#!/usr/bin/env python3 """ 使用POST搜索API获取法律列表和bbbs ID 根据API文档,POST /law-search/search/list 可能可以获取完整的法律列表包含bbbs """ import json import time import urllib.parse import urllib.request import ssl from datetime import datetime ssl_context = ssl.create_default_context() ssl_context.check_hostname = False ssl_context.verify_mode = ssl.CERT_NONE API_BASE = "https://flk.npc.gov.cn/law-search" def post_search_laws(title: str = "", page: int = 1, size: int = 20, category_id: int = None): """使用POST API搜索法律""" url = f"{API_BASE}/search/list" # 构建请求体 body = { "title": title, "page": page, "size": size } if category_id: body["flflId"] = category_id # 分类ID data = json.dumps(body).encode('utf-8') req = urllib.request.Request( url, data=data, headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Accept': 'application/json', 'Content-Type': 'application/json;charset=UTF-8', 'Referer': 'https://flk.npc.gov.cn/' }, method='POST' ) try: with urllib.request.urlopen(req, context=ssl_context, timeout=30) as response: return json.loads(response.read().decode('utf-8')) except Exception as e: print(f"POST request failed: {e}") return None def search_by_category(category_id: int, category_name: str, max_pages: int = 20): """按分类搜索获取所有法律""" print(f"\nSearching category: {category_name} (id={category_id})") all_laws = [] for page in range(1, max_pages + 1): print(f" Page {page}...") result = post_search_laws(category_id=category_id, page=page, size=100) if not result or result.get('code') != 200: print(f" Failed at page {page}") break data = result.get('data', {}) items = data.get('rows', []) if not items: print(f" No more items") break for item in items: all_laws.append({ 'bbbs': item.get('bbbs'), 'title': item.get('title'), 'type': item.get('flxz'), 'authority': item.get('zdjgName'), 'publish_date': item.get('gbrq'), 'effective_date': item.get('sxrq') }) total = data.get('total', 0) print(f" Found {len(items)} items, total={total}") if len(all_laws) >= total: break time.sleep(0.5) return all_laws def search_specific_law(title: str): """搜索特定法律并获取bbbs""" print(f"\nSearching: {title}") result = post_search_laws(title=title, page=1, size=10) if not result or result.get('code') != 200: print(f" Search failed") return None data = result.get('data', {}) items = data.get('rows', []) # 精确匹配 for item in items: if item.get('title') == title: print(f" Found exact match: bbbs={item.get('bbbs')}") return { 'bbbs': item.get('bbbs'), 'title': item.get('title'), 'type': item.get('flxz'), 'authority': item.get('zdjgName'), 'publish_date': item.get('gbrq'), 'effective_date': item.get('sxrq') } # 返回最接近的匹配 if items: print(f" No exact match, closest: {items[0].get('title')}") return None return None def main(): print("=" * 60) print("Testing POST search API for bbbs ID") print("=" * 60) # 测试POST搜索API # 先尝试搜索特定法律 test_titles = [ "中华人民共和国社会保险法", "中华人民共和国建筑法", "中华人民共和国合伙企业法", "工伤保险条例", ] results = [] for title in test_titles: law = search_specific_law(title) if law: results.append(law) time.sleep(0.5) # 输出结果 output = { "search_date": datetime.now().isoformat(), "method": "POST_search_api", "results": results } with open('project-docs/phase14-legal-fulltext-library/bbbs-lookup-test.json', 'w', encoding='utf-8') as f: json.dump(output, f, ensure_ascii=False, indent=2) print(f"\n\nResults saved to: project-docs/phase14-legal-fulltext-library/bbbs-lookup-test.json") print(f"Found {len(results)} laws with bbbs") return results if __name__ == '__main__': main()