zoukankan      html  css  js  c++  java
  • Python微信库:itchat的用法详解

    本篇文章主要介绍了Python微信库:itchat的用法详解,现在分享给大家,也给大家做个参考。一起过来看看吧

     

    在论坛上看到了用Python登录微信并实现自动签到,才了解到一个新的Python库: itchat

    库文档说明链接在这: itchat

    我存个档在我网站(主要是我打开很慢),以便以后阅读。

    0x01 Start

    最简单的回复

    通过如下代码,可以完成回复所有文本信息(包括群聊)。

    import itchat
    from itchat.content import TEXT
     
    @itchat.msg_register
    def simple_reply(msg):
      if msg['Type'] == TEXT:
        return 'I received: %s' % msg['Content']
     
    itchat.auto_login()
    itchat.run()

    常用消息的配置

    itchat支持所有的消息类型与群聊,下面的示例中演示了对于这些消息类型简单的配置。

    #coding=utf8
    import itchat
    from itchat.content import *
     
    @itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
    def text_reply(msg):
      itchat.send('%s: %s' % (msg['Type'], msg['Text']), msg['FromUserName'])
     
    # 以下四类的消息的Text键下存放了用于下载消息内容的方法,传入文件地址即可
    @itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
    def download_files(msg):
      msg['Text'](msg['FileName'])
      return '@%s@%s' % ({'Picture': 'img', 'Video': 'vid'}.get(msg['Type'], 'fil'), msg['FileName'])
     
    # 收到好友邀请自动添加好友
    @itchat.msg_register(FRIENDS)
    def add_friend(msg):
      itchat.add_friend(**msg['Text']) # 该操作会自动将新好友的消息录入,不需要重载通讯录
      itchat.send_msg('Nice to meet you!', msg['RecommendInfo']['UserName'])
     
    # 在注册时增加isGroupChat=True将判定为群聊回复
    @itchat.msg_register(TEXT, isGroupChat = True)
    def groupchat_reply(msg):
      if msg['isAt']:
        itchat.send(u'@%su2005I received: %s' % (msg['ActualNickName'], msg['Content']), msg['FromUserName'])
     
    itchat.auto_login(True)
    itchat.run()

    当然这里不需要深究为什么这些东西可以这么写,我在这里放出了示例程序只是为了给你一个该sdk相关代码大概样子的概念。

    有了大概的模式的了解之后我们就可以进入下一部分的介绍。

    0x02 Login

    在上一部分中你看到了基本的注册与登陆,而显然登陆使用的是itchat提供了auto_login方法,调用即可完成登录。

    一般而言,我们都会在完成消息的注册后登陆。

    当然这里需要特别强调的是三点,分别是短时间关闭重连、命令行二维码与自定义登陆内容。 itchat提供了登陆状态暂存,关闭程序后一定时间内不需要扫码即可登录。 为了方便在无图形界面使用itchat,程序内置了命令行二维码的显示。 * 如果你需要就登录状态就一些修改(例如更改提示语、二维码出现后邮件发送等)。

    **0x01-1 短时间关闭程序后重连**

    这样即使程序关闭,一定时间内重新开启也可以不用重新扫码。

    最简单的用法就是给 auto_login 方法传入值为真的 hotReload 。

    该方法会生成一个静态文件 itchat.pkl ,用于存储登陆的状态。

    import itchat
    from itchat.content import TEXT
     
    @itchat.msg_register(TEXT)
    def simple_reply(msg):
      print(msg['Text'])
     
    itchat.auto_login(hotReload=True)
    itchat.run()
    itchat.dump_login_status()

    通过设置statusStorageDir可以将静态文件指定为其他的值。

    这一内置选项其实就相当于使用了以下两个函数的这一段程序:

    import itchat
    from itchat.content import TEXT
     
    if itchat.load_login_status():
      @itchat.msg_register(TEXT)
      def simple_reply(msg):
        print(msg['Text'])
      itchat.run()
      itchat.dump_login_status()
    else:
      itchat.auto_login()
      itchat.dump_login_status()
      print('Config stored, so exit.')

    其中load_login_status与dump_login_status分别对应读取与导出设置。

    通过设置传入的fileDir的值可以设定导入导出的文件。

    **0x01-2 命令行二维码显示**

    通过以下命令可以在登陆的时候使用命令行显示二维码:

     

    itchat.auto_login(enableCmdQR=True) 

     

    部分系统可能字幅宽度有出入,可以通过将enableCmdQR赋值为特定的倍数进行调整:

     

     

    # 如部分的linux系统,块字符的宽度为一个字符(正常应为两字符),故赋值为2
    itchat.auto_login(enableCmdQR=2) 

     

    默认控制台背景色为暗色(黑色),若背景色为浅色(白色),可以将enableCmdQR赋值为负值:

    itchat.auto_login(enableCmdQR=-1) 

     

    **0x01-2 自定义登录过程**

    如果需要控制登录的过程,可以阅读下面的内容。

    同时itchat也提供了登陆所需的每一步的方法,登陆的过程按顺序为: 获取二维码uuid->获取二维码->判断是否已经登陆成功->获取初始化数据->更新微信相关信息(通讯录、手机登陆状态)->循环扫描新信息(开启心跳)

    获取二维码uuid

    获取生成二维码所需的uuid,并返回。

    方法名称: get_QRuuid
    所需值:无
    返回值:成功->uuid,失败->None

    获取二维码

    根据uuid获取二维码并打开,返回是否成功。

    方法名称: get_QR
    所需值:uuid
    返回值:成功->True,失败->False

    判断是否已经登陆成功

    判断是否已经登陆成功,返回扫描的状态码。

    方法名称: check_login
    所需值:uuid
    返回值:登陆成功->'200',已扫描二维码->'201',二维码失效->'408',未获取到信息->'0'

    获取初始化数据

    获取微信用户信息以及心跳所需要的数据。

    方法名称: web_init
    所需值:无
    返回值:存储登录微信用户信息的字典

    获取微信通讯录

    获取微信的所有好友信息并更新。

    方法名称: get_contract
    所需值:无
    返回值:存储好友信息的列表

    更新微信手机登陆状态

    在手机上显示登录状态。

    方法名称: show_mobile_login
    所需值:无
    返回值:无

    循环扫描新信息(开启心跳)

    循环扫描是否有新的消息,开启心跳包。

    方法名称: start_receiving
    所需值:无
    返回值:无

    EG:

    一个登录例子:

    import itchat, time, sys
     
    def output_info(msg):
     print('[INFO] %s' % msg)
     
    def open_QR():
     for get_count in range(10):
     output_info('Getting uuid')
     uuid = itchat.get_QRuuid()
     while uuid is None: uuid = itchat.get_QRuuid();time.sleep(1)
     output_info('Getting QR Code')
     if itchat.get_QR(uuid): break
     elif get_count >= 9:
     output_info('Failed to get QR Code, please restart the program')
     sys.exit()
     output_info('Please scan the QR Code')
     return uuid
     
    uuid = open_QR()
    waitForConfirm = False
    while 1:
     status = itchat.check_login(uuid)
     if status == '200':
     break
     elif status == '201':
     if waitForConfirm:
     output_info('Please press confirm')
     waitForConfirm = True
     elif status == '408':
     output_info('Reloading QR Code')
     uuid = open_QR()
     waitForConfirm = False
    userInfo = itchat.web_init()
    itchat.show_mobile_login()
    itchat.get_contract()
    output_info('Login successfully as %s'%userInfo['NickName'])
    itchat.start_receiving()
     
    # Start auto-replying
    @itchat.msg_register
    def simple_reply(msg):
     if msg['Type'] == 'Text':
     return 'I received: %s' % msg['Content']
    itchat.run() 

    0x03 Register

    注册消息方法

    itchat将根据接收到的消息类型寻找对应的已经注册的方法。

    如果一个消息类型没有对应的注册方法,该消息将会被舍弃。

    在运行过程当中也可以动态注册方法,注册方式与结果不变。

    注册

    你可以通过两种方式注册消息方法

    import itchat
    from itchat.content import *
     
    # 不带参数注册,所有消息类型都将调用该方法(包括群消息)
    @itchat.msg_register
    def simple_reply(msg):
      if msg['Type'] == 'Text':
        return 'I received: %s' % msg['Text']
     
    # 带参数注册,该类消息类型将调用该方法
    @itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
    def text_reply(msg):
      itchat.send('%s: %s' % (msg['Type'], msg['Text']), msg['FromUserName'])

    想要了解python或学习Python的可直接点击链接即可领取相关学习福利包:

    python高薪就业(视频、学习路线、免费获取)​www.jianshu.com图标

    是安全网站放心,继续访问就可以领取了哦

  • 相关阅读:
    第9章 线程编程(7)_线程同步4:信号量
    第9章 线程编程(6)_线程同步3:条件变量
    第9章 线程编程(5)_线程同步2:读写锁
    第9章 线程编程(4)_线程同步1:互斥锁
    第9章 线程编程(3)_线程清理和控制函数
    第9章 线程编程(2)_线程创建和终止
    第9章 线程编程(1)_线程概念和线程标识
    第8章 信号(6)_贯穿案例2:mini shell(3)
    第8章 信号(5)_信号集和信号屏蔽
    第8章 信号(4)_中断的系统调用和函数可重入性
  • 原文地址:https://www.cnblogs.com/nanhe/p/12745896.html
Copyright © 2011-2022 走看看