[开发日志] 用 Python 实现诸葛神数作者:阿尔的代码屋 项目地址:ZhuGeHorary
本文内容旨在使用 Python 实现一个很简单的诸葛神数卜筮的小脚本。当然这个卜筮结果希望大家不必过分当真,明显从步骤和卦签上能感受到,这不是一个严肃正经的占卜,权当练习吧。
偶然在微信读书上被推送了《秘本诸葛神数》 ,大致阅读了一下,发现步骤挺简单的,就简单写了个脚本模拟了一下。
0x00 算法步骤原文凡占卦者。必先报字。报字不拘何字。必先以三字为度。不可报四字。亦不可报二字,简单概括一下,就是这是一个用字测算的方法,需要报三个字来进行测算。 原文第一字作百数。第二字作十数。第三字作个数。: 拿到所报的字后,将第一个字来算百位数字,第二个字来算十位数,第三个字来算个位数。 原文凡字笔画。在九笔以内者照算。在十笔以外者。减十笔算。(二十笔同)若恰在十笔或二十笔。俱照零笔计算。: 用对应字的笔画数模 10,即除以 10 取余 原文此书照大易三百八十四爻。作为三百八十四签。所报之字笔画以三百八十四为度。: 一共 384 条签文,组成的 3 位数字模 384,将其对应到每一条签文中。 原文数已计定。即可查签。,通过得到的数字,在签文中找到对应签文查询签文 0x01 爬取签文由于微信读书上的签文不全,检索之后在这里 找到了完整的签文,写一个脚本将其爬取下来保存 Auspicious 文件夹中以待读取.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import requestsimport refrom pathlib import Pathdef get_auspicious (number: int ): url = f"https://www.ttlingqian.com/zhuge/{number} .html" response = requests.get(url=url) content = response.content.decode("utf-8" ) pattern = r"<meta name=\"description\" content=\"(.*)\" />" auspicious = re.findall(pattern=pattern, string=content)[0 ] file = Path(f"Auspicious/auspicious_{number} .txt" ) with open (file=file, encoding="utf-8" , mode="w" ) as f: print (f"第{number} 卦:\t{auspicious} " ) f.write(auspicious)
0x02 获取汉字笔画在 unihan 数据库中下载下来包含汉字笔画信息的数据文件,Unihan 下载地址 , 编写脚本读取出每个汉字的笔画信息以 json 格式保存下来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 file = Path("Stroke/Unihan_IRGSources.txt" ) output = Path("Stroke/unicode2stroke.json" ) stroke_dict = dict () with open (file,mode="r" ) as f: for line in f: raw_line = line.strip() pattern = r"(U\+.*)\skTotalStrokes.*\s(\d+)" result = re.findall(pattern=pattern, string=raw_line) if len (result) == 0 : continue unicode_key = result[0 ][0 ] unicode_stroke = result[0 ][1 ] print (f"{unicode_key} : {unicode_stroke} " ) stroke_dict[unicode_key] = unicode_stroke with open (file=output, mode="w" , encoding="utf-8" ) as f: json.dump(stroke_dict,f, ensure_ascii=False , indent=4 )
0x03 编写签号计算按照算法步骤编写出签好的计算代码,非常简单直接,就不做过多介绍了.直接看代码就好
1 2 3 4 5 6 7 8 9 10 11 def get_character_stroke_count (char: str ): unicode = "U+" + str (hex (ord (char)))[2 :].upper() return int (unicode2stroke[unicode]) def get_number (first: str , second: str , third: str ): hundreds = get_character_stroke_count(first) % 10 tens = get_character_stroke_count(second) % 10 ones = get_character_stroke_count(third) % 10 number = (hundreds * 100 + tens * 10 + ones) % 384 return number
0x04 封装部署导入streamlit库,简单地做三个字符输入,再将对应签文显示出来。
1 2 3 4 5 6 7 8 9 10 11 if "__main__" == __name__: import streamlit as st st.title(f"诸葛秘数解签(仅供娱乐,切勿当真)" ) first = st.text_input(f"首字" ) second = st.text_input(f"中字" ) third = st.text_input(f"尾字" ) if st.button("求卦" ): number = get_number(first=first, second=second, third=third) result = get_auspicious(number=number) st.write("签语:" , result)
以公共仓库上传到 Github,然后直接在Streamlit Share 进行部署
当然也可以通过 https://zhugehorary.streamlit.app/ 直接访问进行模拟