愉快地玩耍成语接龙
1.简介
成语接龙是我国人民喜闻乐见的大众游戏之一。今天在群里玩成语接龙,没玩几轮我便败下阵来,非常不爽。因此我们想到,能不能利用机器来帮我们取胜。正好上次的文章中我们介绍了uiautomation工具,再次也权当复习一下。
2.制备成语字典
成语接龙的变成难度其实并不高,仅仅比C语言入门的猜数字游戏略微复杂一点。第一步我们需要制备一个成语字典,首先我们从网上下载一个成语文档,如图:
同时我们需要使用pypinyin工具来进行汉字到拼音的转换。值得注意的是,pypinyin是非常强大的工具,提供了有标注拼音和无标注拼音,无标注拼音是不分声调的,也正是我们玩成语接龙所需要的。
pypinyin的另一个强大之处在于,它可以在语境中判断多音字的读音。例如
>>> from pypinyin import lazy_pinyin
>>> lazy_pinyin('省')
['sheng']
>>> lazy_pinyin('发人深省')
['fa', 'ren', 'shen', 'xing']
有了这个工具,我们就可以制备成语字典了
import pickle
d = {}
with open("idiom.txt","r") as f:
for line in f:
captial_py = lazy_pinyin(line)
if captial_py[0] in d:
d[captial_py[0]].append(line.replace("\n",""))
else:
d[captial_py[0]] = [line.replace("\n","")]
pickle.dump(d, open("idiom.pk","wb"))
制备完成后我们顺便把它保存以便下次使用。
3.控制微信窗口
我们再次对照inspect.exe提供的信息,使用uiautomation查找相应的窗口和组件。首先我们定位微信窗口。
首先通过ControlType和Classname锁定微信窗口
wechat_window = auto.WindowControl(ClassName='WeChatMainWndForPC',searchDepth=1)
接着通过ControlType以及Name锁定消息列表
message_list_window = wechat_window.ListControl(Name='消息')
接下来只要循环地取消息列表的最后一个子节点值进行接龙即可
last_message = ""
while True:
if last_message != message_list_window.GetChildren()[-1].Name:
last_message = message_list_window.GetChildren()[-1].Name
last_message_pinyin = lazy_pinyin(last_message)[-1]
res = random.sample(d[last_message_pinyin],1)[0]
auto.SendKeys(res)
auto.SendKeys('{enter}')
last_message = message_list_window.GetChildren()[-1].Name
else:
time.sleep(1)
需要注意的时,我们需要用程序存储的上一条消息和当前消息列表中的最后一条消息做对比,来判断是否有新的消息,只有出现新消息的时候,才进行接龙,否则程序会不停的自己接龙。在auto.SendKeys()方法执行完毕后,实际上消息列表的最后一条消息已经发生了改变,因此在下面我们及时对程序存储的最后一条消息更新。
4.总结
要不是玩的菜,谁有愿意开挂呢。话说回来,开挂是不对的,我们要坚决抵制这种行为。在家无聊的时候,一起与朋友们愉快地玩耍成语接龙吧。
5.附录
码云链接:
https://gitee.com/RADIUMSCRIPTTANG/idiom_jielong_wechat_cheater
其中还提供了对TIM QQ的控制外挂
制作过程:
https://www.bilibili.com/video/av86319801/
推荐阅读