记得十几年前笔者刚刚和现在的老婆认识时我还在大洋彼岸的美国工作,由于当时通讯工具并不方便,而且美国和中国的时相关甚远,每天能够聊天的时间很少,所以只能想办法做个自动聊天机器人,缓解思念。

     记得当时我还是CSDN的WINDOWS MOBILE区的版主,而且当时微信还没有被张小龙做出来,我们使用最多的聊天工具还是MSN或者使用移动的飞信,而且当时移动操作系统的霸主诺基亚的Symbian还不能支持破解注入。所以当时这个机器人只能使用WINDOWS MOBILE中某些支持可以支持钩子(HOOK)的机型才能完成,在那个智能手机并不流行的年代,其难度可以说是非常之大的,我至今还记得当时WINDOWS MOBILE版内的众位版友群策群力,一同帮我完成聊天机器人的场景。不过可惜的是当年的论坛的贴子已经找不到了,留下来的是我在CSDN的第一篇博客《windows mobile安装至存储卡》(https://blog.csdn.net/BEYONDMA/article/details/3281386)和第五篇博客《WINCE的钩子》(https://blog.csdn.net/BEYONDMA/article/details/3281437)些许记录下了当时的一些回忆。

     而这篇将是我在CSDN写下的第100篇博客,正在我为选题动脑筋的时候,突然发现了Github上Python榜首项目examples-of-web-crawlershttps://github.com/shengqiangzhang/examples-of-web-crawlers)这是一个多种爬虫的示例,其中恰好就有一个模块是《每天不同时间段通过微信发消息提醒女友》,虽然目前使用Python来做个简单的聊天机器人比之前WINDOWS MOBILE要来的简单的多,不过做为第100篇博客,本文来介绍一下这个Github上的Python的聊天机器人,来纪念一下往日的青春吧。

     运行聊天机器人前的准备

1.首先使用以下命令来安装wxpy和requests,命令如下

pip install wxpy
pip install requests

   2.下载相关源代码及文件

到以github上将以下网址中项目的全部文件下载的本地https://github.com/shengqiangzhang/examples-of-web-crawlers/tree/master/4.%E6%AF%8F%E5%A4%A9%E4%B8%8D%E5%90%8C%E6%97%B6%E9%97%B4%E6%AE%B5%E9%80%9A%E8%BF%87%E5%BE%AE%E4%BF%A1%E5%8F%91%E6%B6%88%E6%81%AF%E6%8F%90%E9%86%92%E5%A5%B3%E5%8F%8B

3.修改配置文件

 修改下载本地的config.ini文件

第1095行:

 <td id="LC10" class="blob-code blob-code-inner js-file-line"><span class="pl-k">birthday_month</span> = 女友的生日月份注意补全两位,如3月要配置为03</td>

第1121行:

 <td id="LC10" class="blob-code blob-code-inner js-file-line"><span class="pl-k">birthday_month</span> = 女友的生日月份注意补全两位,如3月要配置为03</td>

    第1129行:  

<td id="LC12" class="blob-code blob-code-inner js-file-line"><span class="pl-k">birthday_day</span> = 女友的生日日期注意补全两位,如8号要配置为08</td>

4.修改代码:

如果是在windows环境下使用pycharm则需要将say_to_lady.py的146行前的注释去爬虫。

#chdir(sys.path[0])

5.友情揭示:

聊天机器人的话术全部来自新浪微博,话风是这样的,还请各位程序员多多学习,避免与日常亲自聊天的风格相关太远,造成其它问题。

我发现了一个不得了的秘密,天冷的时候冷得不想起床,天暖的时候又睁不开眼皮〒_〒你这是肿么了,是不是该起来晒晒太阳了~
尊敬的起床困难户:您此次起床共用了11分钟,您已击败了全国%10的用户。寝室还有***同学起床失败,正在重启 、隔壁宿舍全部用户已死机。
饿是起床的动力!😓
每天早晨起床感谢老天又赐予你美好的一天。
赖床,是你每天的必修。

聊天机器人代码浅析

这个聊天机器人的基本工作流程是读取配置文件-》启动wxpy的Bot机器人-》定时发送信息-》监听女友发送的消息连同情感分析值一同发送给你。其代码非常简单,而且注释已经非常完备了,具体如下:

def send_message(your_message):
    try:
        # 对方的微信名称
        my_friend = bot.friends().search(my_lady_wechat_name)[0]

        # 发送消息给对方
        my_friend.send(your_message)
    except:

        # 出问题时,发送信息到文件传输助手
        bot.file_helper.send(u"守护女友出问题了,赶紧去看看咋回事~")


# 在规定时间内进行关心她操作
def start_care():
    # 待发送的内容,先置为空
    message = ""

    # 来个死循环,24小时关心她
    while (True):

        # 提示
        print("守护中,时间:%s" % time.ctime())

        # 每天定时问候,早上起床,中午吃饭,晚上吃饭,晚上睡觉
        # 获取时间,只获取时和分,对应的位置为倒数第13位到倒数第8位
        now_time = time.ctime()[-13:-8]
        if (now_time == say_good_morning):
            # 随机取一句问候语
            message = choice(str_list_good_morning)

            # 是否加上随机表情
            if (flag_wx_emoj):
                message = message + choice(str_list_emoj)

            send_message(message)
            print("提醒女友早上起床:%s" % time.ctime())

        elif (now_time == say_good_lunch):
            message = choice(str_list_good_lunch)

            # 是否加上随机表情
            if (flag_wx_emoj):
                message = message + choice(str_list_emoj)

            send_message(message)
            print("提醒女友中午吃饭:%s" % time.ctime())

        elif (now_time == say_good_dinner):
            message = choice(str_list_good_dinner)

            # 是否加上随机表情
            if (flag_wx_emoj):
                message = message + choice(str_list_emoj)

            send_message(message)
            print("提醒女友晚上吃饭:%s" % time.ctime())

        elif (now_time == say_good_dream):

            # 是否在结尾加上每日学英语
            if (flag_learn_english):
                note, content = get_message()
                message = choice(str_list_good_dream) + "\n\n" + "顺便一起来学英语哦:\n" + "原文: " + content + "\n\n翻译: " + note
            else:
                message = choice(str_list_good_dream)

            # 是否加上随机表情
            if (flag_wx_emoj):
                message = message + choice(str_list_emoj)

            send_message(message)
            print("提醒女友晚上睡觉:%s" % time.ctime())

        # 节日问候语
        festival_month = time.strftime('%m', time.localtime())
        festival_day = time.strftime('%d', time.localtime())

        if (festival_month == '02' and festival_day == '14' and now_time == "08:00"):
            send_message(str_Valentine)
            print("发送情人节祝福:%s" % time.ctime())

        elif (festival_month == '03' and festival_day == '08' and now_time == "08:00"):
            send_message(str_Women)
            print("发送三八妇女节祝福:%s" % time.ctime())

        elif (festival_month == '12' and festival_day == '24' and now_time == "00:00"):
            send_message(str_Christmas_Eve)
            print("发送平安夜祝福:%s" % time.ctime())

        elif (festival_month == '12' and festival_day == '25' and now_time == "00:00"):
            send_message(str_Christmas)
            print("发送圣诞节祝福:%s" % time.ctime())

        # 生日问候语
        if (festival_month == birthday_month and festival_day == birthday_day and now_time == "00:00"):
            send_message(str_birthday)
            print("发送生日祝福:%s" % time.ctime())

        # 每60秒检测一次
        time.sleep(60)


if __name__ == "__main__":



    # 启动微信机器人,自动根据操作系统执行不同的指令
    # windows系统或macOS Sierra系统使用bot = Bot()
    # linux系统或macOS Terminal系统使用bot = Bot(console_qr=2)
    if ('Windows' in system()):
        # Windows
        bot = Bot()
    elif ('Darwin' in system()):
        # MacOSX
        bot = Bot()
    elif ('Linux' in system()):
        # Linux
        bot = Bot(console_qr=2, cache_path=True)
    else:
        # 自行确定
        print("无法识别你的操作系统类型,请自己设置")

    # 读取配置文件
    cf = configparser.ConfigParser()
    cf.read("./config.ini", encoding='UTF-8')

    # 设置女友的微信名称,记住,不是微信ID也不是微信备注
    # 你女友的微信名称,记住,不是微信ID也不是微信备注
    my_lady_wechat_name = cf.get("configuration", "my_lady_wechat_name")

    # 设置早上起床时间,中午吃饭时间,下午吃饭时间,晚上睡觉时间
    say_good_morning = cf.get("configuration", "say_good_morning")
    say_good_lunch = cf.get("configuration", "say_good_lunch")
    say_good_dinner = cf.get("configuration", "say_good_dinner")
    say_good_dream = cf.get("configuration", "say_good_dream")

    # 设置女友生日信息
    # 几月,注意补全数字,为两位数,比如6月必须写成06
    birthday_month = cf.get("configuration", "birthday_month")
    # 几号,注意补全数字,为两位数,比如6号必须写成08
    birthday_day = cf.get("configuration", "birthday_day")

    # 读取早上起床时间,中午吃饭时间,下午吃饭时间,晚上睡觉时间的随机提示语
    # 一般这里的代码不要改动,需要增加提示语可以自己打开对应的文件修改
    # 早上起床问候语列表,数据来源于新浪微博
    str_list_good_morning = ''
    with open("./remind_sentence/sentence_good_morning.txt", "r", encoding='UTF-8') as f:
        str_list_good_morning = f.readlines()
    print(str_list_good_morning)

    # 中午吃饭问候语列表,数据来源于新浪微博
    str_list_good_lunch = ''
    with open("./remind_sentence/sentence_good_lunch.txt", "r", encoding='UTF-8') as f:
        str_list_good_lunch = f.readlines()
    print(str_list_good_lunch)

    # 晚上吃饭问候语列表,数据来源于新浪微博
    str_list_good_dinner = ''
    with open("./remind_sentence/sentence_good_dinner.txt", "r", encoding='UTF-8') as f:
        str_list_good_dinner = f.readlines()
    print(str_list_good_dinner)

    # 晚上睡觉问候语列表,数据来源于新浪微博
    str_list_good_dream = ''
    with open("./remind_sentence/sentence_good_dream.txt", "r", encoding='UTF-8') as f:
        str_list_good_dream = f.readlines()
    print(str_list_good_dream)

    # 设置晚上睡觉问候语是否在原来的基础上再加上每日学英语精句
    # False表示否 True表示是

    if ((cf.get("configuration", "flag_learn_english")) == '1'):
        flag_learn_english = True
    else:
        flag_learn_english = False
    print(flag_learn_english)

    # 设置所有问候语结束是否加上表情符号
    # False表示否 True表示是
    str_emoj = "(•‾̑⌣‾̑•)✧˖°----(๑´ڡ`๑)----(๑¯ิε ¯ิ๑)----(๑•́ ₃ •̀๑)----( ∙̆ .̯ ∙̆ )----(๑˘ ˘๑)----(●′ω`●)----(●・̆⍛・̆●)----ಥ_ಥ----_(:qゝ∠)----(´;ω;`)----( `)3')----Σ((( つ•̀ω•́)つ----╰(*´︶`*)╯----( ´´ิ∀´ิ` )----(´∩`。)----( ื▿ ื)----(。ŏ_ŏ)----( •ิ _ •ิ )----ヽ(*΄◞ิ౪◟ิ‵ *)----( ˘ ³˘)----(; ´_ゝ`)----(*ˉ﹃ˉ)----(◍'౪`◍)ノ゙----(。◝‿◜。)----(ಠ .̫.̫ ಠ)----(´◞⊖◟`)----(。≖ˇェˇ≖。)----(◕ܫ◕)----(`◕‸◕´+)----(▼ _ ▼)----( ◉ืൠ◉ื)----ㄟ(◑‿◐ )ㄏ----(●'◡'●)ノ♥----(。◕ˇ∀ˇ◕)----( ◔ ڼ ◔ )----( ´◔ ‸◔`)----(☍﹏⁰)----(♥◠‿◠)----ლ(╹◡╹ლ )----(๑꒪◞౪◟꒪๑)"
    str_list_emoj = str_emoj.split('----')
    if ((cf.get("configuration", "flag_wx_emoj")) == '1'):
        flag_wx_emoj = True
    else:
        flag_wx_emoj = False
    print(str_list_emoj)

    # 设置节日祝福语
    # 情人节祝福语
    str_Valentine = cf.get("configuration", "str_Valentine")
    print(str_Valentine)

    # 三八妇女节祝福语
    str_Women = cf.get("configuration", "str_Women")
    print(str_Women)

    # 平安夜祝福语
    str_Christmas_Eve = cf.get("configuration", "str_Christmas_Eve")
    print(str_Christmas_Eve)

    # 圣诞节祝福语
    str_Christmas = cf.get("configuration", "str_Christmas")
    print(str_Christmas)

    # 她生日的时候的祝福语
    str_birthday = cf.get("configuration", "str_birthday")
    print(str_birthday)

    # 开始守护女友
    t = Thread(target=start_care, name='start_care')
    t.start()

# 接收女友消息监听器

# 女友微信名
my_girl_friend = bot.friends().search(my_lady_wechat_name)[0]


@bot.register(chats=my_girl_friend, except_self=False)
def print_others(msg):
    # 输出聊天内容
    print(msg.text)

    # 可采用snownlp或者jieba等进行分词、情感分析,由于打包后文件体积太大,故暂时不采用这种方式
    # 仅仅是直接调用网络接口

    # 做极其简单的情感分析
    # 结果仅供参考,请勿完全相信
    postData = {'data': msg.text}
    response = post('https://bosonnlp.com/analysis/sentiment?analysisType=', data=postData)
    data = response.text

    # 情感评分指数(越接近1表示心情越好,越接近0表示心情越差)
    now_mod_rank = (data.split(',')[0]).replace('[[', '')
    print("来自女友的消息:%s\n当前情感得分:%s\n越接近1表示心情越好,越接近0表示心情越差,情感结果仅供参考,请勿完全相信!\n\n" % (msg.text, now_mod_rank))

    # 发送信息到文件传输助手
    mood_message = u"来自女友的消息:" + msg.text + "\n当前情感得分:" + now_mod_rank + "\n越接近1表示心情越好,越接近0表示心情越差,情感结果仅供参考,请勿完全相信!\n\n"
    bot.file_helper.send(mood_message)

启动聊天机器人 

使用读者自己的PythonIDE启动程序即可,一开始会有一个二维码需要扫描,扫描授权登陆后即可使用机器人,并且Python会有以下输出,

Getting uuid of QR code.
Downloading QR code.
Please scan the QR code to log in.
Please press confirm on your phone.
Loading the contact, this may take a little while.
Login successfully as beyondma

不过这里各位读者也要注意,由于腾讯对于wxpy有专门的封杀机制,所以这个程序笔者只有第一次尝试获得了成功,后面再启动就都报错“pass_ticket”为了避免微信使用出现问题,请读者们尝试一次即可,如果不成功就不要在短时间内多次反复尝试了。

 

08-19 19:53