使用Python实现微信群发每日一句

我在自己教学的四个班里建了三个微信群,每个群大约有50-90人。我计划每天给学生双送双语每日一句,既让学生坚持学习英语,也传递给他们正能量,在后疫情时代保持积极向上、奋发有为的状态。然而,从拷贝金山词霸或者海词的每日一句,再到打开微信,找到三个群,把信息逐一复制进去,过程相当的费时费力。于时,我就想借助于强大的Python实现每日一句的在线抓取,在微信中找到发送的对象,然后逐个发送。

一、编程原理介绍

功能:微信群发金山或者海词上的每日一句到指定微信群或者个人

  1. tkinter 来设计程序界面
  2. 用requests和BeautifulSoup来获取金山词霸和海词的每日一句
  3. 用控制微信的专属包:wxauto 来操作群发

二、软件界面说明

使用Python实现微信群发每日一句_第1张图片

  1. 把发送对象的名称存在当前目录下的names.txt中,每行一个,前后不要有空格,这个对象名可能是群的自定义名称。
  2. 设置金山词霸和海词的复选框,选中一个后,点击获取句子,可以得到每日一句。如果二者都选中,就会得到两个平台的每日一句,显示在文本框中。
  3. 点击发送,可以把文本框里的内容批量发送到names.txt中的对象中。

需要注意时,运行程序时,微信需要打开,并最小化,不然可能无法自动打开界面。

三、实现代码

from tkinter import Entry,Button,END,Label,Text,Checkbutton,Tk,StringVar,IntVar
from tkinter import messagebox
from wxauto import WxUtils,WeChat
from tkinter.filedialog import askopenfilename
import requests
from bs4 import BeautifulSoup

root = Tk()
# 设置窗口前段显示
root.wm_attributes('-topmost',1)
#设置居中显示
screenwidth = root.winfo_screenwidth()
screenheight = root.winfo_screenheight()
width = 730
height = 420
#size = "%dx%d+%d+%d" % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)
size = "%dx%d+%d+%d" % (width, height, 350, 230)
root.geometry(size)
# 设置窗口标题及大小
root.title('每日一句发送器1.0|By Gordon')
#设置接受UI界面中Label和它的位置
var = StringVar()
var.set('Tip:请先选择要发送的微信对象')
url_input=Label(root,textvariable=var,width=32,height=1,font=("微软雅黑",12))
url_input.grid(row=0,column=0,columnspan=5)
# 设置搜索框
t_url = Entry(root,width=50,font=("微软雅黑",12))
t_url.insert(0,"请把发送对象微信名称输入到names.txt, 然后点击打开文件..")
t_url.grid(row=1,column=0,columnspan=4,padx=5)
t_read = Text(root,width=50,height=10,font=("微软雅黑",12))
t_read.grid(row=3,column=0,columnspan=4,padx=5)
checkVar1 = IntVar()
checkVar2 = IntVar()
c1 = Checkbutton(root, text = "金山词霸", font=("微软雅黑",11), variable = checkVar1, onvalue = 1, offvalue = 0, height=1,width = 8) 
c1.grid(row=2,column=0)
c2 = Checkbutton(root, text = "海词", font=("微软雅黑",11), variable = checkVar2, onvalue = 1, offvalue = 0, height=1,width = 8) 
c2.grid(row=2,column=1)
def main():
    def get_txt(filepath): #获取发送对象
        ls=[]
        try:
            with open(filepath,"r",encoding="utf-8") as f:
                ls=[line.strip() for line in f.readlines() if line.strip()!=""]
        except Exception as exc:
            messagebox.showwarning('Warning', f'{exc}')
            t_url.delete(0,END)
        return ls
    
    def b1_prog(event=None): #打开names.txt文件,并显示在Text文本框中
        t_url.delete(0,END)
        t_read.delete("1.0", "end")
        file_path=askopenfilename(title='选择文件',filetypes=[('TXT文件','*.txt')])
        text_list=get_txt(file_path)
        t_url.insert("insert",file_path)
        for i in text_list:
            t_read.insert("insert",i+"\n")
        var.set("以下是您要发送的对象,请核对信息!")
        return file_path
    b1 = Button(root,text="选择对象",width=8,height=1,font=("微软雅黑",12),command=b1_prog)
    b1.grid(row=1,column=4)

    def jinshan():#获取金山词霸每日一句
        url = 'http://open.iciba.com/dsapi/'
        res = requests.get(url)
        content = res.json()['content'] + res.json()['note']
        return content
    def haici():#获取海词每日一句
        url2=r"http://dict.cn"
        resp = requests.get(url2)
        soup = BeautifulSoup(resp.text,"html.parser")
        htm=soup.find("div",class_="daily_sentence")
        sen=htm.text.strip().split("\t\t\t")[2] #split("\n\t")[2].strip()
        return sen
    def get_sentence():# 获取每日一句信息
        msg="每日一句:"
        if checkVar1.get() ==1 and checkVar2.get() ==1:
            t_read.delete("1.0", "end")
            msg=msg+jinshan()+"\n"+haici()
        elif checkVar1.get() ==1 and checkVar2.get() ==0:
            t_read.delete("1.0", "end")
            msg=msg+jinshan()
        elif checkVar1.get() ==0 and checkVar2.get() ==1:
            t_read.delete("1.0", "end")
            msg=msg+haici()
        else:
            messagebox.showwarning("错误信息","请选中金山词霸或者海词")
        return msg
    def b2_prog():# 显示每日一句信息,校对并准备发送。
        msgs=get_sentence()
        for m in msgs:
            t_read.insert('insert',m)
        var.set("以下是您要发送的每日一句,请核对信息!")
    b2 = Button(root,text="获取句子",width=8,height=1,font=("微软雅黑",12),command=b2_prog)
    b2.grid(row=2,column=4)
    def wechat(who,msg):#查询发送对象
        wx = WeChat()
        # 获取会话列表
        wx.GetSessionList()
        for w in who:
            wx.ChatWith(w)  # 打开`文件传输助手`聊天窗口
            wx.SendMsg(msg)  # 向`文件传输助手`发送消息:你好~
    def send_txt(): # 发送信息
        filepath=t_url.get()
        if not filepath.endswith(".txt"):
            messagebox.showwarning("错误信息","请先打开文件!")
        else:
            who=get_txt(filepath)
            msgs=get_sentence()
            t_read.delete("1.0", "end")
            wechat(who,msgs)
            messagebox.showwarning("成功信息","您的信息已经发送成功!")
    b3 = Button(root,text="开始发送",width=8,height=1,font=("微软雅黑",12),command=send_txt)
    b3.grid(row=3,column=4,pady=20)
    root.mainloop()
main()

四、演示视频

Python操作微信实现信息群发

Python实现英语每日一句微信群发

五、未来努力方向

未来实现文本信息、文件、视频、音频等多个文件的批量微信群发功能,进一步优化流量,提升工作效率。

大家如果有什么好的建议也欢迎提出来。

关注我,一个喜欢Python编程和英语翻译的文科生,带给你不一样的学习体验。

 

你可能感兴趣的:(python小项目,python,开发语言,后端)