├── .gitignore ├── .editorconfig ├── config └── headers.py ├── README.md ├── utils └── common_tools.py ├── run.py ├── 番茄小说APP抓包分享.md └── dicts └── font_map.py /.gitignore: -------------------------------------------------------------------------------- 1 | # 忽略配置文件 2 | .idea 3 | __pycache__ 4 | # 忽略全局环境变量 5 | .env 6 | # 忽略日志文件 7 | logs 8 | # 忽略打包文件 9 | output 10 | build 11 | dist 12 | *.spec 13 | 14 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | # 项目根目录下的 .editorconfig 文件 3 | root = true 4 | 5 | # 适用于所有类型的文件 6 | [*] 7 | end_of_line = lf 8 | charset = utf-8 -------------------------------------------------------------------------------- /config/headers.py: -------------------------------------------------------------------------------- 1 | # config/headers.py 2 | DEFAULT_COOKIE2 = "Hm_lvt_2667d29c8e792e6fa9182c20a3013175=1716438629; csrf_session_id=cb69e6cf3b1af43a88a56157e7795f2e;novel_web_id=7372047678422058532; s_v_web_id=verify_lwir8sbl_HcMwpu3M_DoJp_4RKG_BcMo_izZ4lEmNBlEQ; Hm_lpvt_2667d29c8e792e6fa9182c20a3013175=1716454389; ttwid=1%7CRpx4a-wFaDG9-ogRfl7wXC7k61DQkWYwkb_Q2THEqb4%7C1716454388%7Cb80bb1f8f2ccd546e6a1ccd1b1abb9151e31bbf5d48e3224451a90b7ca5d534c; msToken=-9U5-TOe5X2axgeeY4G28F-tp-R7o8gDaOF5p2fPPvcNdZYLXWU9JiPv_tOU81HeXCDT52o4UtGOLCZmuDMN2I8yulNK-8hIUpNSHiEVK3ke5aEeGJ4wDhk_cQgJ3g==" 3 | DEFAULT_COOKIE = "s_v_web_id=verify_mbpvqb23_9IwN2XEF_YCdn_4MYT_9Wj0_6DZZdWayTbKT; x-web-secsdk-uid=06c78635-50c1-4e8c-8c5f-3a7f49c47ad7; Hm_lvt_2667d29c8e792e6fa9182c20a3013175=1749521256; Hm_lpvt_2667d29c8e792e6fa9182c20a3013175=1749521256; HMACCOUNT=2651439F468D52A8; csrf_session_id=7ca93e5192705e728a8ee2cd14943457" 4 | 5 | def get_default_headers(cookie=None): 6 | if cookie is None: 7 | cookie = DEFAULT_COOKIE 8 | headers = { 9 | "User-Agent": ( 10 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " 11 | "AppleWebKit/537.36 (KHTML, like Gecko) " 12 | "Chrome/114.0.0.0 Safari/537.36" 13 | ), 14 | "Cookie": cookie 15 | } 16 | return headers 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # fanqienovel-decryptor 2 | 3 | > 本工具基于 [RChow](https://www.cnblogs.com/ruichow/p/18209338) 大佬的博客内容,在其思路基础上进行了优化和扩展,适配更多场景,提升了使用体验。 4 | 5 | ## 🧿 说明 6 | 7 | 该项目已完成字体解密工作,但由于番茄小说网站的限制(验证码、无法阅读全文)等原因,无法下载全部章节,拥有番茄SVIP除外。这也是为什么大多数相关工具需要API的原因。 8 | 9 | 关于后续扩展,考虑去抓取番茄小说APP的API,通过手机端获得小说内容,尽情期待。 10 | 11 | ## 📘 项目简介 12 | 13 | `fanqienovel-decryptor` 是一个用于**解密并下载番茄小说内容**的 Python 工具。 14 | 通过逆向番茄小说的字体加密机制,提取真实章节文本,并支持通过小说 ID 批量下载为 `.txt` 格式。 15 | 16 | --- 17 | 18 | ## 🔧 功能特点 19 | 20 | - ✅ 自动解析并解密字体映射(反反爬机制) 21 | - ✅ 支持通过输入小说章节选择要下载的内容 22 | - ✅ 输出为纯文本 `.txt` 文件 23 | - ⬜ 通过API聚合输出 24 | 25 | --- 26 | 27 | ## 📥 使用方式 28 | 29 | ### ✨ 项目结构 30 | 31 | ```python 32 | fanqie_novel_spider/ 33 | │ 34 | ├── .gitignore # git忽略文件 35 | ├── README.md # 项目说明文档 36 | ├── requirements.txt # 依赖列表 37 | ├── run.py # 主运行脚本 38 | │ 39 | ├── config/ # 配置文件 40 | │ └── headers.py # 请求头、Cookie 等配置 41 | │ 42 | ├── dicts/ # 存放映射字典文件 43 | │ └── font_map.py # 解密字体映射字典 44 | │ 45 | └── utils/ 46 | └── common_tools.py # 公共的通用方法 47 | ``` 48 | 49 | 50 | 51 | --- 52 | 53 | ## 🙏 致谢 54 | 55 | 特别感谢 [RChow](https://www.cnblogs.com/ruichow/p/18209338) 的技术分享,为本项目的实现提供了关键思路。 56 | 57 | --- -------------------------------------------------------------------------------- /utils/common_tools.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import time 3 | from config.headers import get_default_headers 4 | from dicts.font_map import FONT_MAP 5 | # 全局定义请求头 6 | HEADERS=get_default_headers() 7 | 8 | """通用 HTML 请求函数,支持自动重试。""" 9 | def get_html(url, retries=3, timeout=10, verbose=True): 10 | for attempt in range(1, retries + 1): 11 | try: 12 | response = requests.get(url, headers=HEADERS, timeout=timeout) 13 | if response.status_code == 200: 14 | return response.text 15 | else: 16 | if verbose: 17 | print(f"[!] 第 {attempt} 次请求返回状态码: {response.status_code}") 18 | except requests.RequestException as e: 19 | if verbose: 20 | print(f"[!] 第 {attempt} 次请求异常:{e}") 21 | time.sleep(1) 22 | if verbose: 23 | print(f"[x] 请求失败:共重试 {retries} 次,未成功获取 {url}") 24 | return None 25 | 26 | """解密章节文本""" 27 | def decrypt_text(content): 28 | decrypted_chars = [] 29 | for char in content: 30 | try: 31 | unicode_code = str(ord(char)) # 将字符转换为十进制的 Unicode 编码(字符串) 32 | real_char = FONT_MAP.get(unicode_code, char) # 如果查不到,保留原字符 33 | except Exception: 34 | real_char = char # 极少数异常字符安全兜底 35 | decrypted_chars.append(real_char) 36 | return ''.join(decrypted_chars) -------------------------------------------------------------------------------- /run.py: -------------------------------------------------------------------------------- 1 | import os 2 | import parsel 3 | from utils.common_tools import get_html, decrypt_text 4 | 5 | """解析小说主页,提取基本信息和章节目录""" 6 | def parse_main_page(url): 7 | html = get_html(url) 8 | if not html: 9 | print("[x] 主页面请求失败") 10 | return None, [], [] 11 | selector = parsel.Selector(html) 12 | # 提取基本信息 13 | book_title = selector.css('.info-name h1::text').get(default='未知标题').strip() 14 | author_name = selector.css('.author-name-text::text').get(default='未知作者').strip() 15 | chapter_count = selector.css('.page-directory-header h3::text').get(default='0').strip() 16 | # word_count_info = selector.css('.info-count-word span::text').getall() # 小说字数 17 | # book_description = selector.css('.page-abstract-content p::text').get(default='').strip() # 小说简介 18 | tags = selector.css('.info-label span::text').getall() 19 | # 提取章节信息 20 | chapter_titles = selector.css('.chapter-item-title::text').getall() 21 | chapter_hrefs = selector.css('.chapter-item-title::attr(href)').getall() 22 | # 提取最近更新信息 23 | last_update_title = selector.css('.info-last-title::text').getall()[1] 24 | last_update_time = selector.css('.info-last-time::text').get(default='').strip() 25 | # 输出摘要信息 26 | print(f"📘 小说:《{book_title}》 by {author_name}") 27 | print(f"📖 共 {chapter_count} 章;标签:{'、'.join(tags)}") 28 | print(f"🕘 最近更新:{last_update_title} · {last_update_time}") 29 | return book_title, chapter_titles, chapter_hrefs[1:] # 可选跳过第一个(如为引导/目录) 30 | 31 | 32 | """下载并解密章节""" 33 | def download_chapters(book_title, titles, urls): 34 | output_dir = "output" 35 | os.makedirs(output_dir, exist_ok=True) # 确保输出目录存在 36 | file_path = os.path.join(output_dir, f"{book_title}.txt") 37 | print(f"🎁 开始下载小说《{book_title}》") 38 | with open(file_path, "w", encoding="utf-8") as f: 39 | for title, link in zip(titles, urls): 40 | full_url = 'https://fanqienovel.com' + link 41 | html = get_html(full_url) 42 | if not html: 43 | print(f"[x] 章节《{title}》请求失败,已跳过") 44 | continue 45 | selector = parsel.Selector(html) 46 | print(selector) 47 | print(full_url) 48 | content_list = selector.css('.muye-reader-content-16 p::text').getall() 49 | raw_text = '\n'.join(content_list) 50 | decrypted_text = decrypt_text(raw_text) 51 | f.write(f"\n\n{title}\n\n") 52 | f.write(decrypted_text) 53 | print(f"✅ 已下载:{title}") 54 | print(f"🎉 已保存至:{file_path}") 55 | 56 | 57 | if __name__ == "__main__": 58 | book_id= input("请输入小说ID:").strip() 59 | # ✅ 设置小说主页面 URL 60 | novel_url = f"https://fanqienovel.com/page/{book_id}" 61 | # ✅ 解析主页面,提取章节信息 62 | result = parse_main_page(novel_url) 63 | # 判断小说页面是否解析成功 64 | if not result: 65 | print("[x] 小说页面解析失败,程序终止。") 66 | else: 67 | book_title, chapter_titles, chapter_urls = result 68 | for i, (title, url) in enumerate(zip(chapter_titles, chapter_urls), start=1): 69 | print(f"{i}. {title} - {url}") 70 | while True: 71 | user_input = input("请输入要下载的章节范围(如 1-220 或 all):").strip().lower() 72 | if user_input == "all": 73 | download_chapters(book_title, chapter_titles, chapter_urls) 74 | break 75 | elif "-" in user_input: 76 | try: 77 | start_str, end_str = user_input.split("-") 78 | start_idx = int(start_str) - 1 # 转换为列表下标 79 | end_idx = int(end_str) # 包含该章节 80 | 81 | if 0 <= start_idx < end_idx <= len(chapter_urls): 82 | selected_titles = chapter_titles[start_idx:end_idx] 83 | selected_urls = chapter_urls[start_idx:end_idx] 84 | download_chapters(book_title, selected_titles, selected_urls) 85 | break 86 | else: 87 | print(f"请输入有效范围(1-{len(chapter_urls)})") 88 | except ValueError: 89 | print("格式错误,请输入类似 '1-220' 的范围") 90 | else: 91 | print("输入无效,请输入 '1-220' 或 'all'") 92 | 93 | input("按任意键结束...") 94 | -------------------------------------------------------------------------------- /番茄小说APP抓包分享.md: -------------------------------------------------------------------------------- 1 | ## 说明 2 | 3 | 本文档简要的说明`番茄小说APP`如何进行抓包,以及部分的API;但由于技术原因,API无法实现通用性,即无法通过更改`book_id`就实现小说内容抓取,往往需要同时修改其他字段信息。 4 | 5 | ## 部分API 6 | 7 | ### 1.获取书籍详情(听书) 8 | 9 | ```python 10 | import requests 11 | params = { 12 | 'book_id': '6982529841564224526', # 更改此处可更改小说 13 | 'source': '5', 14 | 'aid': '1967', 15 | } 16 | 17 | response = requests.get('https://api5-normal-sinfonlineb.fqnovel.com/reading/reader/book/recommend_data_plan/v',params=params) 18 | print(response.json()) 19 | ``` 20 | 21 | ### 2.获取小说的目录信息 22 | 23 | ```python 24 | import requests 25 | 26 | url = "https://api5-normal-sinfonlineb.fqnovel.com/reading/bookapi/directory/all_items/v?book_type=0&item_data_list_md5&catalog_data_md5&book_id=7087872099557051400&book_info_md5&need_version=true&iid=1408906374261642&device_id=1408906374257546&ac=wifi&channel=49786187a&aid=1967&app_name=novelapp&version_code=67532&version_name=6.7.5.32&device_platform=android&os=android&ssmix=a&device_type=ASUS_I005DA&device_brand=Asus&language=zh&os_api=28&os_version=9&manifest_version_code=67532&resolution=800*1280&dpi=240&update_version_code=67532&_rticket=1749715124712&host_abi=arm64-v8a&dragon_device_type=pad&pv_player=67532&compliance_status=4&need_personal_recommend=0&player_so_load=1&is_android_pad_screen=1&rom_version=Asus-user+9.0.0+20171130.276299+release-keys&cdid=56ab0923-ba18-450b-87ff-b6ca7589ac68" 27 | 28 | headers = { 29 | 'x-tt-store-region': 'cn-yn', 30 | 'x-argus': 's4hKaA==', 31 | 'x-helios': 'boLxPagH896HUmgApcg/oqBUQP4IZUFD94+m6qvcR28qJobn', 32 | 'x-medusa': 't4hKaKHnyh1VDfheC2POopFDCYAe2AABL5uWra9ZAQQhGqke2zLbtqSzV7+eipB7M5jvjP5xA6rYJXrpZK7Waf8mQCcVbxtES3sh5WRDRCueHYgp0i5swggGz7GZT2YhizKmihiVxpw2v/tY5XUV0Zsqd8b/2UBYjsD1UTmS+C/HV7RZLRjDz2v1qW+tLvq69adOuzns+X/yRQQyqoip7sgJePdZmLU8dMdpJb+RUHV83wUY+baaJZDMfZeKVhfvBl+qb/CKM7Bgj7sp58dI3pDcESuG4iCQbu3GvlBvPmHSJiSMxbvMp823GU4dsE9zqqD8druNZ1dTk3wBomEuyzLnN3+PpIx3k6dlD8dcP9TnbBgAVCg2W0JiSplHyMAR+7o2NlQNgBym6NfaRjgvDjmgfd0KuG+DHw+kh5roFk+mFF920DRiqkpwYrpjGHxOQGWEtuqvQZBUHv+HHNdXvZLci62BH2/uQgaNEYLdAjacVotEsNLwM7RLBCfeyl9KCN6VPI88tyIGdlnn+sTqOwojILJYCLI+8H735XGmYBLfdQhuNjdZJIr3ApgEEIMxDfzdX/RIVW2eRFc1/poHCW0s0b8Gf+IPh146qo5GN5cuw2Mo+QdB0A0XLV1Pvh0XxBOR8I5XKe2Xwqr+4QyjNu9MDiGz8q58rpQDHTdczK2OvIPuab3tR+VL5FCJFIUPBBRQyk4rRz54W8+i0oHisyQB+DXtoi4CmpV+UgvC5fQrDVIsbgV+657CkUI6UCBB+awtSujSQHO2u1P2P0F8AQTIwpcv9wCUyPobv5EslZp2rG3N6UPv7HZUjbUYKGJTMQPKGhPikxZnkxSMSJkcIFEPjJSIdHwSCzc3Wgmaff1Dzbqsez5LgpiSqtMQVqprUt7k/ctkefVh+gCOnEnubhkz0i5X/RlsvCEyOGmkt+mQ2OgS9oihsljjhxILG5UAhE0+QdCYyHmAnxqDrjImu/PRoCGhI1WZG8SFsRn6B01VQlRQSG9w/CxT4plj6XFfL/NL8HiacGlfPf/6vz3/+r+obw==', 33 | } 34 | 35 | response = requests.get(url, headers=headers) 36 | # 将 response.text 写入文件 37 | with open('番茄小说抓包测试/py_目录抓包.txt', 'w', encoding='utf-8') as file: 38 | file.write(response.text) 39 | ``` 40 | 41 | ### 3.获取小说内容信息 42 | 43 | ```python 44 | import requests 45 | 46 | url = "https://api5-normal-sinfonlineb.fqnovel.com/reading/bookapi/detail/v?without_video=false&book_id=7087872099557051400&iid=1408906374261642&device_id=1408906374257546&ac=wifi&channel=49786187a&aid=1967&app_name=novelapp&version_code=67532&version_name=6.7.5.32&device_platform=android&os=android&ssmix=a&device_type=ASUS_I005DA&device_brand=Asus&language=zh&os_api=28&os_version=9&manifest_version_code=67532&resolution=800*1280&dpi=240&update_version_code=67532&_rticket=1749715124701&host_abi=arm64-v8a&dragon_device_type=pad&pv_player=67532&compliance_status=4&need_personal_recommend=0&player_so_load=1&is_android_pad_screen=1&rom_version=Asus-user+9.0.0+20171130.276299+release-keys&cdid=56ab0923-ba18-450b-87ff-b6ca7589ac68" 47 | 48 | headers = { 49 | 'Host': 'api5-normal-sinfonlineb.fqnovel.com', 50 | 'accept-encoding': 'gzip', 51 | 'accept': 'application/json; charset=utf-8,application/x-protobuf', 52 | 'x-xs-from-web': '0', 53 | 'x-ss-req-ticket': '1749715124705', 54 | 'x-reading-request': '1749715124705-2019704209', 55 | 'x-vc-bdturing-sdk-version': '3.7.2.cn', 56 | 'lc': '101', 57 | 'sdk-version': '2', 58 | 'passport-sdk-version': '50564', 59 | 'x-tt-store-region': 'cn-yn', 60 | 'x-tt-store-region-src': 'did', 61 | 'user-agent': 'com.dragon.read/67532 (Linux; U; Android 9; zh_CN; ASUS_I005DA; Build/PI;tt-ok/3.12.13.4-tiktok)', 62 | 'x-ladon': 'aEqIsw==', 63 | 'x-khronos': '1749715123', 64 | 'x-soter': 'AAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 65 | 'x-argus': 's4hKaA==', 66 | 'x-gorgon': '8404c05b00006604d8aafcf7928eff884d13b2f8e8102f89ef67', 67 | 'x-helios': 'mR6bAP/kc8SiVagw03Lx3fvOpHfk3gdRCR1oIri407ptY7m2', 68 | 'x-medusa': 't4hKaKHnyh1VDfheC2POopFDCYAqHAABNJlNk+UxAU8tGPd2PiMU/bG5G1s1XYsRU2g1cMYKbsCG9XI1lg8dQkwMWQdFSWd/xgNCLSUDuiqCL35qkONQ83qVCgttMDXcl0NER6iVQR48Wp3Pm6c12L8gfnz/o9qc3Zkn5NrsJkHpyVtLBkHcbPHqXvzizJwtX5eg3Z/Rz8k5/tLAmlmtQ7QbPrG/N2JpXuc8kwDSs3KIxOgVjzohqlTKmtW7+2X9xEVT3ty81vakofUT6mfy1KrNGFJwtjDT681JxKi/SFniGM5WwheIf/MDo4jV9SHx0HGTW/EAf4jVG1fZEz4ys71QVBZSN5PE8AfiNb3wHoL8rbZRk02tnUdfJXpI+oCy2I+/Augafq2GUbH9JyrM0CQrTRJFGTs7Q3gGIBlb3zMdOOYZgl4U6D36ohRJha+AXJK8HCSVST2jgQdCTwKN4WN8NO7gHSg2g6PK504eprVWDqi0WbNHgw4h9jYz8WQr8W1KbFcE5yw6UsscK2+ndYFcuzRMALgqhcjOvDpLS+prGcIHTUdPf+eqzgIDaCEAnMJkv65oOrUIM8moUVSh3X1dk3nPmep3NjRtTVoJtd/A8w+HisGyhhzE/S0d8sCBcal2SqfKfzP1UA0uJSwIj5EfE5+aTIX0wQ7DMh8IlsiVggwSRNU+Bhwe9qfDo5xx+44iNqe7G0uPLEgElOboBWQG/+6p+Z6BSs1jl1cXxlX0x0alYL7DrEkgSpCqnc1QXOez48bBoGfgUqHB+d4WEHFJ8upapH2ZQTYtUXaDAcGqUI1vGXT76AKy2bK9FqDs9Jmtj8QbvQkBQc2f+MesqKGh4C7JHpk8fwOPDuNLDwvElm7UrKoRHzdfzqDovueG4zXXSvHar+ru1rXCov4bkd5TVX3+Z22ePziiS2bPstXgHLWzWlinAVO13y2a/D3P8DAuKcM6w3BAx5Nzcf5AMwERUe0WwNidKXpPuk17ohzudbO8bIDjvC3cVq7ZG3SW+FvACGg4V4krbv/4F27/+Bf9aw==', 69 | 'cookie': 'store-region=cn-yn; store-region-src=did; install_id=1408906374261642; ttreq=1$2a0bde343119a958ac8c99709f728953b499ccea; odin_tt=f693e06644c6018656c87642668ed589769ad96574a56b8d1a10df97f6cf337faa77eca258dd8d9a4bbe81e462434e2c43202d8eaad98c5493cfd4fb4797533fd672f40ec14c293e394529efe3b7ac52; passport_csrf_token=40ef3528b447c66518506eb19a38f25d; passport_csrf_token_default=40ef3528b447c66518506eb19a38f25d', 70 | 71 | } 72 | 73 | response = requests.get(url, headers=headers) 74 | print(response.text) 75 | # # 将 response.text 写入文件 76 | # with open('番茄小说抓包测试/py_目录抓包.txt', 'w', encoding='utf-8') as file: 77 | # file.write(response.text) 78 | ``` 79 | 80 | ### 抓包思路 81 | 82 | > Android抓包工具:[HTTPCanary(小黄鸟)](https://blog.csdn.net/weixin_53891182/article/details/124739048) Android模块安装:[逍遥模拟器安装Magisk和EDXPosed教程](https://www.duokaiya.com/1443.html) Android模块:[解除抓包无网络限制-TrustMeAlready模块](https://www.bilibili.com/video/BV1wD421p74N/?vd_source=24008413d06e0afa2b9aacaae9bdb6dc) 83 | > 84 | > 下载所有工具:[蓝奏云-密码: romcere](https://wwvh.lanzouu.com/b00l20lbfc) 85 | 86 | ​ 安卓抓包首要条件是选择抓包工具,常用的有`Fiddler`、`Wireshark`、`BurpSuite`、`r0capture`、`HTTPCanary`。其中[`r0capture`](https://github.com/r0ysue/r0capture)也非常推荐,它抓包很简单,无需root及配置模块,但分析日志具有一定难度([r0capture使用教程](https://blog.csdn.net/yi_rui_jie/article/details/122667368))。我这里使用的是`HTTPCanary`,需要root,推荐模拟器运行。 87 | 88 | ​ 下载完`HTTPCanary`后,根据[逍遥模拟器安装Magisk和EDXPosed教程](https://www.duokaiya.com/1443.html)安装模块工具,接着安装[解除抓包无网络限制-TrustMeAlready模块](https://www.bilibili.com/video/BV1wD421p74N/?vd_source=24008413d06e0afa2b9aacaae9bdb6dc)即可进行抓包。 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /dicts/font_map.py: -------------------------------------------------------------------------------- 1 | # dicts/font_map.py 2 | FONT_MAP = { 3 | '58670': '0', 4 | '58413': '1', 5 | '58678': '2', 6 | '58371': '3', 7 | '58353': '4', 8 | '58480': '5', 9 | '58359': '6', 10 | '58449': '7', 11 | '58540': '8', 12 | '58692': '9', 13 | '58712': 'a', 14 | '58542': 'b', 15 | '58575': 'c', 16 | '58626': 'd', 17 | '58691': 'e', 18 | '58561': 'f', 19 | '58362': 'g', 20 | '58619': 'h', 21 | '58430': 'i', 22 | '58531': 'j', 23 | '58588': 'k', 24 | '58440': 'l', 25 | '58681': 'm', 26 | '58631': 'n', 27 | '58376': 'o', 28 | '58429': 'p', 29 | '58555': 'q', 30 | '58498': 'r', 31 | '58518': 's', 32 | '58453': 't', 33 | '58397': 'u', 34 | '58356': 'v', 35 | '58435': 'w', 36 | '58514': 'x', 37 | '58482': 'y', 38 | '58529': 'z', 39 | '58515': 'A', 40 | '58688': 'B', 41 | '58709': 'C', 42 | '58344': 'D', 43 | '58656': 'E', 44 | '58381': 'F', 45 | '58576': 'G', 46 | '58516': 'H', 47 | '58463': 'I', 48 | '58649': 'J', 49 | '58571': 'K', 50 | '58558': 'L', 51 | '58433': 'M', 52 | '58517': 'N', 53 | '58387': 'O', 54 | '58687': 'P', 55 | '58537': 'Q', 56 | '58541': 'R', 57 | '58458': 'S', 58 | '58390': 'T', 59 | '58466': 'U', 60 | '58386': 'V', 61 | '58697': 'W', 62 | '58519': 'X', 63 | '58511': 'Y', 64 | '58634': 'Z', 65 | '58611': '的', 66 | '58590': '一', 67 | '58398': '是', 68 | '58422': '了', 69 | '58657': '我', 70 | '58666': '不', 71 | '58562': '人', 72 | '58345': '在', 73 | '58510': '他', 74 | '58496': '有', 75 | '58654': '这', 76 | '58441': '个', 77 | '58493': '上', 78 | '58714': '们', 79 | '58618': '来', 80 | '58528': '到', 81 | '58620': '时', 82 | '58403': '大', 83 | '58461': '地', 84 | '58481': '为', 85 | '58700': '子', 86 | '58708': '中', 87 | '58503': '你', 88 | '58442': '说', 89 | '58639': '生', 90 | '58506': '国', 91 | '58663': '年', 92 | '58436': '着', 93 | '58563': '就', 94 | '58391': '那', 95 | '58357': '和', 96 | '58354': '要', 97 | '58695': '她', 98 | '58372': '出', 99 | '58696': '也', 100 | '58551': '得', 101 | '58445': '里', 102 | '58408': '后', 103 | '58599': '自', 104 | '58424': '以', 105 | '58394': '会', 106 | '58348': '家', 107 | '58426': '可', 108 | '58673': '下', 109 | '58417': '而', 110 | '58556': '过', 111 | '58603': '天', 112 | '58565': '去', 113 | '58604': '能', 114 | '58522': '对', 115 | '58632': '小', 116 | '58622': '多', 117 | '58350': '然', 118 | '58605': '于', 119 | '58617': '心', 120 | '58401': '学', 121 | '58637': '么', 122 | '58684': '之', 123 | '58382': '都', 124 | '58464': '好', 125 | '58487': '看', 126 | '58693': '起', 127 | '58608': '发', 128 | '58392': '当', 129 | '58474': '没', 130 | '58601': '成', 131 | '58355': '只', 132 | '58573': '如', 133 | '58499': '事', 134 | '58469': '把', 135 | '58361': '还', 136 | '58698': '用', 137 | '58489': '第', 138 | '58711': '样', 139 | '58457': '道', 140 | '58635': '想', 141 | '58492': '作', 142 | '58647': '种', 143 | '58623': '开', 144 | '58521': '美', 145 | '58609': '总', 146 | '58530': '从', 147 | '58665': '无', 148 | '58652': '情', 149 | '58676': '己', 150 | '58456': '面', 151 | '58581': '最', 152 | '58509': '女', 153 | '58488': '但', 154 | '58363': '现', 155 | '58685': '前', 156 | '58396': '些', 157 | '58523': '所', 158 | '58471': '同', 159 | '58485': '日', 160 | '58613': '手', 161 | '58533': '又', 162 | '58589': '行', 163 | '58527': '意', 164 | '58593': '动', 165 | '58699': '方', 166 | '58707': '期', 167 | '58414': '它', 168 | '58596': '头', 169 | '58570': '经', 170 | '58660': '长', 171 | '58364': '儿', 172 | '58526': '回', 173 | '58501': '位', 174 | '58638': '分', 175 | '58404': '爱', 176 | '58677': '老', 177 | '58535': '因', 178 | '58629': '很', 179 | '58577': '给', 180 | '58606': '名', 181 | '58497': '法', 182 | '58662': '间', 183 | '58479': '斯', 184 | '58532': '知', 185 | '58380': '世', 186 | '58385': '什', 187 | '58405': '两', 188 | '58644': '次', 189 | '58578': '使', 190 | '58505': '身', 191 | '58564': '者', 192 | '58412': '被', 193 | '58686': '高', 194 | '58624': '已', 195 | '58667': '亲', 196 | '58607': '其', 197 | '58616': '进', 198 | '58368': '此', 199 | '58427': '话', 200 | '58423': '常', 201 | '58633': '与', 202 | '58525': '活', 203 | '58543': '正', 204 | '58418': '感', 205 | '58597': '见', 206 | '58683': '明', 207 | '58507': '问', 208 | '58621': '力', 209 | '58703': '理', 210 | '58438': '尔', 211 | '58536': '点', 212 | '58384': '文', 213 | '58484': '几', 214 | '58539': '定', 215 | '58554': '本', 216 | '58421': '公', 217 | '58347': '特', 218 | '58569': '做', 219 | '58710': '外', 220 | '58574': '孩', 221 | '58375': '相', 222 | '58645': '西', 223 | '58592': '果', 224 | '58572': '走', 225 | '58388': '将', 226 | '58370': '月', 227 | '58399': '十', 228 | '58651': '实', 229 | '58546': '向', 230 | '58504': '声', 231 | '58419': '车', 232 | '58407': '全', 233 | '58672': '信', 234 | '58675': '重', 235 | '58538': '三', 236 | '58465': '机', 237 | '58374': '工', 238 | '58579': '物', 239 | '58402': '气', 240 | '58702': '每', 241 | '58553': '并', 242 | '58360': '别', 243 | '58389': '真', 244 | '58560': '打', 245 | '58690': '太', 246 | '58473': '新', 247 | '58512': '比', 248 | '58653': '才', 249 | '58704': '便', 250 | '58545': '夫', 251 | '58641': '再', 252 | '58475': '书', 253 | '58583': '部', 254 | '58472': '水', 255 | '58478': '像', 256 | '58664': '眼', 257 | '58586': '等', 258 | '58568': '体', 259 | '58674': '却', 260 | '58490': '加', 261 | '58476': '电', 262 | '58346': '主', 263 | '58630': '界', 264 | '58595': '门', 265 | '58502': '利', 266 | '58713': '海', 267 | '58587': '受', 268 | '58548': '听', 269 | '58351': '表', 270 | '58547': '德', 271 | '58443': '少', 272 | '58460': '克', 273 | '58636': '代', 274 | '58585': '员', 275 | '58625': '许', 276 | '58694': '稜', 277 | '58428': '先', 278 | '58640': '口', 279 | '58628': '由', 280 | '58612': '死', 281 | '58446': '安', 282 | '58468': '写', 283 | '58410': '性', 284 | '58508': '马', 285 | '58594': '光', 286 | '58483': '白', 287 | '58544': '或', 288 | '58495': '住', 289 | '58450': '难', 290 | '58643': '望', 291 | '58486': '教', 292 | '58406': '命', 293 | '58447': '花', 294 | '58669': '结', 295 | '58415': '乐', 296 | '58444': '色', 297 | '58549': '更', 298 | '58494': '拉', 299 | '58409': '东', 300 | '58658': '神', 301 | '58557': '记', 302 | '58602': '处', 303 | '58559': '让', 304 | '58610': '母', 305 | '58513': '父', 306 | '58500': '应', 307 | '58378': '直', 308 | '58680': '字', 309 | '58352': '场', 310 | '58383': '平', 311 | '58454': '报', 312 | '58671': '友', 313 | '58668': '关', 314 | '58452': '放', 315 | '58627': '至', 316 | '58400': '张', 317 | '58455': '认', 318 | '58416': '接', 319 | '58552': '告', 320 | '58614': '入', 321 | '58582': '笑', 322 | '58534': '内', 323 | '58701': '英', 324 | '58349': '军', 325 | '58491': '候', 326 | '58467': '民', 327 | '58365': '岁', 328 | '58598': '往', 329 | '58425': '何', 330 | '58462': '度', 331 | '58420': '山', 332 | '58661': '觉', 333 | '58615': '路', 334 | '58648': '带', 335 | '58470': '万', 336 | '58377': '男', 337 | '58520': '边', 338 | '58646': '风', 339 | '58600': '解', 340 | '58431': '叫', 341 | '58715': '任', 342 | '58524': '金', 343 | '58439': '快', 344 | '58566': '原', 345 | '58477': '吃', 346 | '58642': '妈', 347 | '58437': '变', 348 | '58411': '通', 349 | '58451': '师', 350 | '58395': '立', 351 | '58369': '象', 352 | '58706': '数', 353 | '58705': '四', 354 | '58379': '失', 355 | '58567': '满', 356 | '58373': '战', 357 | '58448': '远', 358 | '58659': '格', 359 | '58434': '士', 360 | '58679': '音', 361 | '58432': '轻', 362 | '58689': '目', 363 | '58591': '条', 364 | '58682': '呢' 365 | } --------------------------------------------------------------------------------