由於工作需要,經常需要向多個微信群聊群發訊息。本來指望能透過微信自帶的“群發助手”實現,但是經實踐發現“群發助手”只能向個人好友群發訊息,並不能實現向微信群群發訊息。經思考發現兩種解決方式:1、建立一個訂閱號(個人無法建立服務號,服務號推送功能更為強大),讓他人關注,推送訊息;2、最近有點入魔Python,乾脆編寫一個向群發工具吧。
透過Python來實現微信的相關功能,都得感謝itchat專案(專案簡介 - itchat),提供了很多使用簡單卻功能強大的函式,各位小夥伴可以自主學習,一點python基礎就可以,上手難度小。
迴歸正題,本人工作實際場景中,群發的微信群基本固定且是指定的,更新次數較少,所以首先構思了一個獲取微信群聊列表且能根據自己選擇生成一個儲存群聊列表本地檔案。下面貼程式碼
1、微信群資訊獲取
https://
pan。baidu。com/s/1o8Cn2M
WPFxemN81wtifsLQ
打包好的exe檔案
#用於向指定群傳送訊息
# coding:utf-8
#v1。1 支援獲取群列表並選擇需要儲存的群列表寫入本地檔案中
import
itchat
import
wx
from
threading
import
Thread
from
wx。lib。pubsub
import
pub
import
time
import
os
class
Threadacquire
(
Thread
):
“”“Test Worker Thread Class。”“”
#————————————————————————————————————
def
__init__
(
self
):
“”“Init Worker Thread Class。”“”
Thread
。
__init__
(
self
)
self
。
start
()
# start the thread
def
run
(
self
):
global
chatroomlist
chatroomlist
=
{}
notice
=
“請掃碼或手機確認登入”
wx
。
CallAfter
(
pub
。
sendMessage
,
‘update’
,
re_msg
=
notice
)
itchat
。
auto_login
(
hotReload
=
True
)
notice
=
“登入成功”
wx
。
CallAfter
(
pub
。
sendMessage
,
‘update’
,
re_msg
=
notice
)
chatlist
=
itchat
。
get_chatrooms
(
update
=
True
)
if
chatlist
!=
[]:
wx
。
CallAfter
(
pub
。
sendMessage
,
‘update’
,
re_msg
=
“以下為群列表
\n\n
”
)
time
。
sleep
(
1
)
for
chatroom
in
chatlist
:
chatroomNickname
=
chatroom
[
“NickName”
]
chatlistUsername
=
chatroom
[
‘UserName’
]
chatdict
=
{
chatroomNickname
:
chatlistUsername
}
chatroomlist
。
update
(
chatdict
)
(
chatroomNickname
)
wx
。
CallAfter
(
pub
。
sendMessage
,
‘update’
,
re_msg
=
chatroomNickname
)
else
:
(
“通訊錄無群聊”
)
wx
。
CallAfter
(
pub
。
sendMessage
,
‘update’
,
re_msg
=
“通訊錄無群聊”
)
itchat
。
run
()
#介面
class
MyForm
(
wx
。
Frame
):
#——————————————————————————————————-
#set the window layout
def
__init__
(
self
):
wx
。
Frame
。
__init__
(
self
,
None
,
wx
。
ID_ANY
,
“微信撤回訊息檢視”
,
size
=
(
500
,
410
))
global
nickname
,
contents
,
acquireButton
,
saveButton
bkg
=
wx
。
Panel
(
self
,
wx
。
ID_ANY
)
#bkg。SetBackgroundColour(“Grey”)
acquireButton
=
wx
。
Button
(
bkg
,
label
=
‘獲取群資訊’
)
acquireButton
。
Bind
(
wx
。
EVT_BUTTON
,
self
。
acquire
)
saveButton
=
wx
。
Button
(
bkg
,
label
=
‘儲存需要群發的群列表’
)
saveButton
。
Disable
()
saveButton
。
Bind
(
wx
。
EVT_BUTTON
,
self
。
save
)
#nickname=wx。TextCtrl(bkg)
contents
=
wx
。
TextCtrl
(
bkg
,
style
=
wx
。
TE_MULTILINE
|
wx
。
HSCROLL
)
#contents。SetStyle(410,335,wx。TextAttr(“RED”,“YELLOW”))
hbox
=
wx
。
BoxSizer
()
#hbox。Add(nickname,1,wx。EXPAND)
hbox
。
Add
(
acquireButton
,
0
,
wx
。
LEFT
,
5
)
hbox
。
Add
(
saveButton
,
0
,
wx
。
LEFT
,
5
)
vbox
=
wx
。
BoxSizer
(
wx
。
VERTICAL
)
vbox
。
Add
(
hbox
,
0
,
wx
。
EXPAND
|
wx
。
ALL
,
5
)
vbox
。
Add
(
contents
,
1
,
wx
。
EXPAND
|
wx
。
LEFT
|
wx
。
BOTTOM
|
wx
。
RIGHT
,
5
)
bkg
。
SetSizer
(
vbox
)
#建立一個pub接收器
pub
。
subscribe
(
self
。
updatedispaly
,
‘update’
)
#設定訊息傳送的物件,預設為傳送到登入微信的檔案助手
def
acquire
(
self
,
event
):
Threadacquire
()
acqbtn
=
event
。
GetEventObject
()
acqbtn
。
Disable
()
saveButton
。
Enable
()
#儲存使用者選擇的群聊列表,並轉化為字串寫入本地檔案
def
save
(
self
,
event
):
savechatlist
=
[]
linenum
=
contents
。
GetNumberOfLines
()
for
i
in
range
(
1
,
linenum
):
chatassign
=
contents
。
GetLineText
(
i
)
if
chatroomlist
。
get
(
chatassign
)
is
not
None
:
#savedict={chatassign:chatroomlist。get(chatassign)}
savechatlist
。
append
(
chatassign
)
#將撤回訊息寫入檔案
with
open
(
r
‘chatroomlist。txt’
,
‘w’
,
encoding
=
“utf8”
)
as
chatroomfile
:
chatroomfile
。
write
(
str
(
savechatlist
))
#os。getcwd()
(
“儲存成功”
)
contents
。
AppendText
(
“儲存成功
\n
儲存目錄為:
%s
\n
”
%
os
。
getcwd
())
itchat
。
logout
()
contents
。
AppendText
(
“已退出登入
\n
”
)
saveButton
。
Disable
()
acquireButton
。
Enable
()
#透過多行文字框顯示提示和記錄的資訊
def
updatedispaly
(
self
,
re_msg
):
displaymessage
=
re_msg
contents
。
AppendText
(
displaymessage
+
‘
\n\n
’
)
# Main
if
__name__
==
“__main__”
:
app
=
wx
。
App
()
frame
=
MyForm
()
frame
。
Show
()
app
。
MainLoop
()
該工具是一個GUI程式,首先需要點選“獲取群資訊”獲取登入微信中的群列表(一般是儲存在通訊錄的群聊才能被搜尋到,但是登入時有更新訊息的群聊也會被搜尋到)
點選登入會呼叫itchat。auto_login()方法,首次登入會生成微信登入二維碼自動由系統預設圖片開啟軟體開啟。如果沒有開啟,請點選右邊的按鈕退出微信再重新登入獲取。如果多次登入都不能彈出微信二維碼,請看程式所在目錄有沒有生成二維碼檔案,開啟掃描,如果還不行,可嘗試設定下系統預設圖片(png格式)開啟檔案。
由於登入時會生成登入資訊檔案
itchat.pkl
儲存在程式所在目錄,所以下次登入會直接讀取,不需要生成二維碼,直接手機確認登入就好。如果把
這個檔案刪掉了
,就需要程式就會重新生成二維碼了。
獲取到群列表後刪除不需要群發的群聊,然後點選“儲存需要群發的群列表”就可以將群列表儲存在本地檔案中,該檔案在程式所在目錄。
該群列表檔案包含的群列表暱稱資訊是後面介紹的群發工具必要資訊。
2、群發工具(向微信群)
https://
pan。baidu。com/s/1fjVjfu
Ts8CHjpCVA1qh51w
程式碼下載
https://
pan。baidu。com/s/1NRLxKq
X4J5_Tp7NK35O40A
已經打包好的exe檔案
# 由於字數限制,只能作為檔案附件了
由於wxPython學的很淺,目前我所寫的工具只能將就都用一套GUI模板,只能將就用了。
使用步驟:
1、點選“選擇群列表檔案”選擇由群列表獲取的群列表檔案
2、點選“登入”微信,跟前面的微信群資訊獲取工具功能一致,過程也一致。
3、選擇需要群發的檔案(包含圖片,影片,其他檔案)或直接輸入資訊
選擇傳送的檔案
直接輸入需要群發的訊息
請注意:這裡是透過輸入框(上圖示紅)內容來判斷你想群發的是檔案(圖片、影片和檔案等)還只是文字資訊的。如果輸入框裡面是檔案路徑,則意味你要群發的是檔案;如果輸入框不是檔案路徑,則程式會認為你要群發的是文字資訊。
如果自己打包程式碼,發現無法傳送含中文名稱的檔案,請參考一下方法,再打包
課外知識:打包成exe可執行檔案的簡單方法
打包方法,將圖示ico檔案和程式碼檔案(py檔案)放在一個資料夾,然後透過“cd \d “指令切換到該目錄。執行
pyinstaller -F -w ——icon=ico圖示檔名 python程式碼檔案
就可打包出exe可執行檔案
https://
pan。baidu。com/s/1m0Y3ov
2nsdHyesBtZl85Cg
自己做的幾個ico圖示檔案
python(py2exe)打包成exe執行檔案,vista/win7下icon圖示顯示問題的解決方案 - CSDN部落格(參考該文章可以動手做ico圖示)