Python微信庫:itchat

在論壇上看到了用Python登陸微信並實現自動簽到,才瞭解到一個新的Python庫: itchatpython

庫文檔說明連接在這: itchatlinux

我存個檔在我網站(主要是我打開很慢),以便之後閱讀。nginx

0x01 Start

最簡單的回覆web

經過以下代碼,能夠完成回覆全部文本信息(包括羣聊)。api

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()

經常使用消息的配置bash

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'@%s\u2005I received: %s' % (msg['ActualNickName'], msg['Content']), msg['FromUserName']) itchat.auto_login(True) itchat.run()

固然這裏不須要深究爲何這些東西能夠這麼寫,我在這裏放出了示例程序只是爲了給你一個該sdk相關代碼大概樣子的概念。less

有了大概的模式的瞭解以後咱們就能夠進入下一部分的介紹。ide

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'])

消息類型

向註冊方法傳入的msg包含微信返回的字典的全部內容。

本api增長Text、Type(也就是參數)鍵值,方便操做。

itchat.content中包含全部的消息類型參數,內容以下表所示:

好比你須要存儲發送給你的附件:

@itchat.msg_register(ATTACHMENT)
def download_files(msg): msg['Text'](msg['FileName'])

值得注意的是,羣消息增長了三個鍵值: isAt: 判斷是否@本號 ActualNickName: 實際NickName * Content: 實際Content

能夠經過本程序測試:

import itchat
from itchat.content import TEXT @itchat.msg_register(TEXT, isGroupChat = True) def text_reply(msg): print(msg['isAt']) print(msg['ActualNickName']) print(msg['Content']) itchat.auto_login() itchat.run()

註冊消息的優先級

優先級分別爲:後註冊消息先於先註冊消息,帶參數消息先於不帶參數消息。

如下面的兩個程序爲例:

import itchat
from itchat.content import * itchat.auto_login() @itchat.msg_register(TEXT) def text_reply(msg): return 'This is the old register' @itchat.msg_register(TEXT) def text_reply(msg): return 'This is a new one' itchat.run()

在私聊發送文本時將會回覆This is a new one。

import itchat
from itchat.content import * itchat.auto_login() @itchat.msg_register def general_reply(msg): return 'I received a %s' % msg['Type'] @itchat.msg_register(TEXT) def text_reply(msg): return 'You said to me one to one: %s' % msg['Text'] itchat.run()

僅在私聊發送文本時將會回覆You said to me one to one,其他狀況將會回覆I received a ...。

動態註冊消息

動態註冊時能夠選擇將 itchat.run() 放入另外一線程或使用 configured_reply() 方法處理消息。

兩種方法分別是:

# 使用另外一線程,但注意不要讓程序運行終止
import thread thread.start_new_thread(itchat.run, ()) # 使用configured_reply方法 while 1: itchat.configured_reply() # some other functions time.sleep(1)

如下給出一個動態註冊的例子:

#coding=utf8
import thread import itchat from itchat.content import * replyToGroupChat = True functionStatus = False def change_function(): if replyToGroupChat != functionStatus: if replyToGroupChat:  @itchat.msg_register(TEXT, isGroupChat = True) def group_text_reply(msg): if u'關閉' in msg['Text']: replyToGroupChat = False return u'已關閉' elif u'開啓' in msg['Text']: return u'已經在運行' return u'輸入"關閉"或者"開啓"測試功能' else:  @itchat.msg_register(TEXT, isGroupChat = True) def group_text_reply(msg): if u'開啓' in msg['Text']: replyToGroupChat = True return u'從新開啓成功' functionStatus = replyToGroupChat thread.start_new_thread(itchat.run, ()) while 1: change_function() time.sleep(.1)

0x04 Reply

回覆

itchat提供五種回覆方法,建議直接使用send方法。

send方法

  • 方法:

    send(msg='Text Message', toUserName=None)

  • 所需值:

    1.msg:消息內容
     2.'@fil@文件地址'將會被識別爲傳送文件,'@img@圖片地址'將會被識別爲傳送圖片,'@vid@視頻地址'將會被識別爲小視頻 3.toUserName:發送對象,若是留空將會發送給本身
  • 返回值:發送成功->True, 失敗->False

#coding=utf8
import itchat itchat.auto_login() itchat.send('Hello world!') # 請確保該程序目錄下存在:gz.gif以及xlsx.xlsx itchat.send('@img@%s' % 'gz.gif') itchat.send('@fil@%s' % 'xlsx.xlsx') itchat.send('@vid@%s' % 'demo.mp4')

send_msg方法

  • 方法:

    send_msg(msg='Text Message', toUserName=None)

  • 所需值:

    msg:消息內容
     toUserName:發送對象,若是留空將會發送給本身
  • 返回值:發送成功->True, 失敗->False

  • 程序示例:

    import itchat

    itchat.auto_login()

    itchat.send_msg('Hello world')

send_file方法

  • 方法:

    send_file(fileDir, toUserName=None)

  • 所需值:

    fileDir:文件路徑(不存在該文件時將打印無此文件的提醒)
     toUserName:發送對象,若是留空將會發送給本身
  • 返回值:發送成功->True, 失敗->False

    #coding=utf8

    import itchat

    itchat.auto_login()

    #請確保該程序目錄下存在:xlsx.xlsx

    itchat.send_file('xlsx.xlsx')

send_img方法

  • 方法:

    send_img(fileDir, toUserName=None)

  • 所需值:

    fileDir:文件路徑(不存在該文件時將打印無此文件的提醒)
     toUserName:發送對象,若是留空將會發送給本身
  • 返回值:發送成功->True, 失敗->False

#coding=utf8
import itchat itchat.auto_login() # 請確保該程序目錄下存在:gz.gif itchat.send_img('gz.gif')

send_video方法

  • 方法:

    send_video(fileDir, toUserName=None)

  • 所需值:

    fileDir:文件路徑(不存在該文件時將打印無此文件的提醒)
     toUserName:發送對象,若是留空將會發送給本身
  • 返回值:發送成功->True, 失敗->False

    須要保證發送的視頻爲一個實質的mp4文件

    #coding=utf8

    import itchat

    itchat.auto_login()

    #請確保該程序目錄下存在:demo.mp4

    itchat.send_file('demo.mp4')

0x05 Memmber stuff

在使用我的微信的過程中主要有三種帳號須要獲取,分別爲: 好友 公衆號 * 羣聊

itchat爲這三種帳號都提供了總體獲取方法與搜索方法。

而羣聊多出獲取用戶列表方法以及建立羣聊、增長、刪除用戶的方法。

這裏咱們分這三種分別介紹如何使用。

好友

好友的獲取方法爲 get_friends ,將會返回完整的好友列表。 其中每一個好友爲一個字典 列表的第一項爲本人的帳號信息 * 傳入update鍵爲True將能夠更新好友列表並返回

好友的搜索方法爲 search_friends ,有四種搜索方式: 1. 僅獲取本身的用戶信息 2. 獲取特定UserName 的用戶信息 3. 獲取備註、微信號、暱稱中的任何一項等於 name 鍵值的用戶 4. 獲取備註、微信號、暱稱分別等於相應鍵值的用戶

其中3、四項能夠一同使用,下面是示例程序:

# 獲取本身的用戶信息,返回本身的屬性字典
itchat.search_friends() # 獲取特定UserName的用戶信息 itchat.search_friends(userName='@abcdefg1234567') # 獲取任何一項等於name鍵值的用戶 itchat.search_friends(name='littlecodersh') # 獲取分別對應相應鍵值的用戶 itchat.search_friends(wechatAccount='littlecodersh') # 3、四項功能能夠一同使用 itchat.search_friends(name='LittleCoder機器人', wechatAccount='littlecodersh')

公衆號

公衆號的獲取方法爲 get_mps ,將會返回完整的公衆號列表。 其中每一個公衆號爲一個字典 傳入update鍵爲True將能夠更新公衆號列表並返回

公衆號的搜索方法爲 search_mps ,有兩種搜索方法: 1. 獲取特定 UserName 的公衆號 2. 獲取名字中含有特定字符的公衆號

若是兩項都作了特定,將會僅返回特定 UserName 的公衆號,下面是示例程序:

# 獲取特定UserName的公衆號,返回值爲一個字典
itchat.search_mps(userName='@abcdefg1234567') # 獲取名字中含有特定字符的公衆號,返回值爲一個字典的列表 itcaht.search_mps(name='LittleCoder') # 如下方法至關於僅特定了UserName itchat.search_mps(userName='@abcdefg1234567', name='LittleCoder')

羣聊

羣聊的獲取方法爲 get_chatrooms ,將會返回完整的羣聊列表。 其中每一個羣聊爲一個字典 傳入update鍵爲True將能夠更新羣聊列表並返回

羣聊的搜索方法爲 search_chatrooms ,有兩種搜索方法: 1. 獲取特定UserName的羣聊 2. 獲取名字中含有特定字符的羣聊

若是兩項都作了特定,將會僅返回特定UserName的羣聊,下面是示例程序:

# 獲取特定UserName的羣聊,返回值爲一個字典
itchat.search_chatrooms(userName='@abcdefg1234567') # 獲取名字中含有特定字符的羣聊,返回值爲一個字典的列表 itcaht.search_chatrooms(name='LittleCoder') # 如下方法至關於僅特定了UserName itchat.search_chatrooms(userName='@abcdefg1234567', name='LittleCoder')

羣聊用戶列表的獲取方法爲 update_chatroom 。 羣聊在首次獲取中不會獲取羣聊的用戶列表,因此須要調用該命令才能獲取羣聊的成員 該方法須要傳入羣聊的UserName,返回特定羣聊的用戶列表

memberList = itchat.update_chatroom('@abcdefg1234567')

建立羣聊、增長、刪除羣聊用戶的方法以下所示: 因爲以前經過羣聊檢測是否被好友拉黑的程序,目前這三個方法都被嚴格限制了使用頻率 刪除羣聊須要本帳號爲羣管理員,不然會失敗

memberList = itchat.get_friends()[1:]
# 建立羣聊,topic鍵值爲羣聊名
chatroomUserName = itchat.create_chatroom(memberList, 'test chatroom')
# 刪除羣聊內的用戶 itchat.delete_member_from_chatroom(chatroomUserName, memberList[0]) # 增長用戶進入羣聊 itchat.add_member_into_chatroom(chatroomUserName, memberList[0])

0x06 QAQ

Q: 爲何我在設定了itchat.auto_login()的enableCmdQR爲True後仍是沒有辦法在命令行顯示二維碼?

A: 這是因爲沒有安裝可選的包 pillow ,可使用右邊的命令安裝: pip install pillow

0x07 Eg

def signin(): # 查找公衆號,進行簽到 user = itchat.search_mps(name='Nulll.me') UserName = user[0]['UserName'] itchat.send(msg=u'3', toUserName=UserName) itchat.dump_login_status() pickleDumps('flag', localDay) # 若是執行成功寫入標緻文件 exit() if __name__ == '__main__': # 若是不是在登錄狀態,就循環登錄 while not itchat.load_login_status(): sendMail() itchat.auto_login(hotReload=True) itchat.dump_login_status() signin() # 簽到 time.sleep(3600) signin() # 簽到

Thank you for read

End!

相關文章
相關標籤/搜索