目录
前言:
微信接龙:
腾讯会议:
前言:
这是我的第一篇博客,看到一个视频,推荐写写博客来验证所学,觉得很有道理,就来写一个.
这两个脚本是我的处女作,还有很多不完善的地方,但重点是能跑.....
系统是win11
微信接龙:
我使用的wxauto库,pip install wxauto就行,不过需要注意微信版本,可以看下面链接去比对版本.wxauto:文档、社区、教程、评论|开放底座 (openbase.com)https://openbase.com/python/wxauto
首先导入wxauto库(下文关于微信的操作有个前提,就是你的微信客户端要处于打开状态,不能最小化)
from wxauto import *
创建微信对象....就跟下边写的一样,注释很清楚
wx = WeChat() # 获取微信对象wx.GetSessionList() # 获取聊天列表wx.ChatWith("草草草") # 打开指定聊天,改这里msgs = wx.GetAllMessage # 获取指定聊天框内当前显示的聊天记录
我事先给要用到的变量在文件开头都声明了一下,免得出问题,这里的循环是从先前读取的聊天记录中最新一条往前循环,因为微信接龙消息中必须要有"#接龙"的字眼,所以可以通过.find()来返回字符串下标,若不存在则返回-1,可以通过这个方法判断是否是我们想要的接龙消息.
其中的lastMessage[1]是因为wx.GetAllMessage返回的是一个元组,下标1对应的是聊天消息本身,其他两个一个是名字,另一个不记得.(我好像在哪看着有人说wxauto读取聊天记录读到拍一拍就会出问题,不过无伤大雅)
# 检测接龙
for lastMessage in msgs[::-1]:if str(lastMessage).find("#接龙") >= 0:message = lastMessage[1] # 循环抓取接龙消息break
现在拿到了字符串类型的接龙消息,目光可以对准这条消息来修改了.我一开始的思路是继续使用判断指定字符串来判断序号是否存在,从50到1循环,循环到了就可以将当前循环的数字+1,再在其后添加名字输出
不过这里出现了问题,如果接龙内容光接名字还好,但是如果会带上班级,比如2202,就寄了.
假如当前接龙只接到了15,脚本本该循环到15之后+1,输出16.某某某,但是在循环到22时检测到了名字前面的2202,那可太刺激了,直接接龙从15跳到了23,回头老师就得记你小本本.
我想了半天没想出辙来,整了个傻子招,只检测50-23的数字,成功就输出,不成功就sleep()睡上一两分钟再循环一波,倒也不是不行.
这时我的好兄弟跟我说,接龙的序号后边一定会有个.(这就是个点,前面本该出现句号的位置出现点是因为我把输入法改成了仅限英文,不想换回来就这样罢)
我精神大振,思路开了!
循环,"接龙序号."!找这个!一切问题迎刃而解!
num = 50
while True: # 循环,获取接龙的序号if message.find(str(num) + ".") > 0:nums = num + 1breakelse:num -= 1
这样,我们就得到了接龙序号,接下来只需要将我们获取的接龙消息{message},接龙序号{nums},只需要将这些内容组合起来,使用下图的第一行代码复制到剪切板上,再用第二行代码再当前聊天栏输出即可!
注:这里的nums是我把前文的num转成了str后存在了一个新的变量中
wxauto.WxUtils.SetClipboard(message + f"\n{nums}. 2202名字")wx.SendClipboard()
后来,保险起见,我又添了一个功能,先别找序号,先去找有没有咱的名,万一周末早八,都还在梦乡中,咱这冷不丁来给接个龙,那可不坏事了,所以就先判断接龙消息中是否存在咱的名,要是存在就直接别签,给我滚粗.修改后的代码如下:
# 如果出现名字则直接离开
if message.find("名字") < 0:while True: # 循环,获取接龙的序号if message.find(str(num) + ".") > 0:nums = num + 1breakelse:num -= 1
最后就是定时问题了,我起初是想用微软自带的任务计划程序来完成这个事情,但是奈何这东西我用起来不好用啊,搞不明白为什么我只要勾上图上所示的"不管用户是否登录都要运行",它就会一点反应都没有,勾别的完全没问题
"一点反应都没有"是指它既不启动也不报错,哦对,既然说到启动,那么得提一嘴,.py文件是不能直接启动的,如果想要用脚本特意去打开pycharm还会显得很弱智,所以我们需要写一个.bat来辅助打开.py,怎么写呢,
就是你新建一个txt,在里边输入"python 你的文件名.py", 保存退出, 后缀改成.bat, 然后把这.bat和它里面写的python文件塞一块就行.
说回任务计划程序,它如果不勾"不管用户是否登录都要运行" 就会只在亮屏时运行,息屏后也会照常启动,但是必须要在你输完开机密码后才能运行.那就没用了啊 !我研究了挺长时间,没玩明白, 如果能用那会省很多事,介于我不能用,所以我就干脆给脚本加了个计时,比如说要早晨八点签到,那就整一个判断是否到了8*60分钟,没到就睡三分钟循环,电脑就找了一个古董电脑,直接不关了,每天晚上挂脚本,机器永不睡眠,电脑套个纸箱放一边,好兄弟熬了大半夜废了九牛二虎之力给这32位的电脑装上了环境,
from datetime import datetime # 导入datetime用来计时
def go():# 获取了时钟分钟,并且全部转换为分钟,返回int类型的分钟hours = datetime.now().strftime("%H")minutes = datetime.now().strftime("%M")sumNumber = int(hours) * 60 + int(minutes)print(myTime(), "\t" f"hours={hours},minutes={minutes},sumNumber={sumNumber}")return int(sumNumber)
中间修修改改的次数很多,可以和上文有一定的不一,但这主要是提供一个思路,以及记录曾经的过往.最终的代码如下(import time删了就行,没用上)
# -*- coding:utf-8 -*-
import time
from pyautogui import *from wxauto import *
from datetime import datetimewx = WeChat()def myTime():"""该函数可以用于获取当前时间:return: string:当前时间"""nowTime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")return nowTimemessage = ""
nums = ""
num = 50def go():hours = datetime.now().strftime("%H")minutes = datetime.now().strftime("%M")sumNumber = int(hours) * 60 + int(minutes)print(myTime(), "\t" f"hours={hours},minutes={minutes},sumNumber={sumNumber}")return int(sumNumber)while True:sumNumber = go()if 465 <= int(sumNumber) <= 490:sumNumber = go()wx = WeChat() # 获取微信对象wx.GetSessionList() # 获取聊天列表wx.ChatWith("*******") # 打开指定聊天,改这里msgs = wx.GetAllMessage # 获取指定聊天框内当前显示的聊天记录print(f"{myTime()},get message succeed!")# 检测接龙for lastMessage in msgs[::-1]:if str(lastMessage).find("#接龙") >= 0:message = lastMessage[1] # 循环抓取接龙消息print(f"{myTime()},get #接龙 message succeed,{message}")break# 如果出现名字则直接离开if message.find("名字") < 0:while True: # 循环,获取接龙的序号if message.find(str(num) + ".") > 0:print(f"{myTime()},num = {num}, Index = {num + 1}")nums = num + 1breakelse:num -= 1wxauto.WxUtils.SetClipboard(message + f"\n{nums}. 2202名字")print(f"{myTime()},get Clipboard succeed")wx.SendClipboard()print(f"{myTime()},send succeed!")click(x=1049, y=63)time.sleep(300)
如果是纯纯纯萌新,那看了我上面的一片之后应该看这个不成问题, 如果是大佬的话,真*献丑了...
腾讯会议:
腾讯会议上网课那可太弱智了,因为我没找到什么可以直接对着腾讯会议开干的第三方库,所以干脆pyautogui操控键鼠一顿点点点(我好像看过大佬说可以使用一些什么视觉识别来搞,比较高大上,但是我不会)
pyautogui同样,在终端控制台上pip install pyautogui ,更多细节操作可以看这位大佬的文章(12条消息) pyautogui自动化控制鼠标和键盘操作_灵动的艺术的博客-CSDN博客_pyautoguihttps://blog.csdn.net/weixin_43430036/article/details/84650938
from pyautogui import *
导入之后就是使用这行代码来测鼠标位置,因为腾讯会议每次打开位置都会刷新,所以可以放心调
x, y = position()
print(x, y)
接下来的操作就是:
鼠标放在腾讯会议快捷方式上,alt + table切换回pycharm, ctrl + shift + F10运行脚本,把控制台上输出的位置记录下来,然后下一个,循环往复,
没有任何技术含量的操作,核心要点就是接下来几段代码:
# 这行代码是单击指定坐标
click(x=111,y=122)
# 这行代码是键入指定字符串,第二个参数是每个字符输入的间隔
typewrite(message="", interval=0.1)
# 这行代码是敲击键盘特定键
press("enter")
# 这行代码是睡眠(单位秒)
sleep(120)
我的建议是把这打开腾讯会议的步骤写成一个方法,主要原因还是因为**微软的任务计划程序不能用,我就还得另计时,同样改成分钟来判断,比如8:20上课就是20+8*60,当前时间大于等于这个点就开始执行方法,(方法的第一行可以把鼠标在关闭会议的地方点一个,毕竟一天不可能就只有一节课),等方法执行完就让他睡眠一堂课的时间,等睡醒再继续循环判断当前时间是否到达下一节课的时间
我也曾想过关于签到打卡之类的事,但是我真的技术有限,有能力后可以给整个可视化界面,搞成个exe造福朋友圈.
同样,源码如下,记录我和好兄弟那几日的不断奋斗(源码里有很多没用的废话,甚至我可以说它就是一坨屎,但是如果把废话全删掉....还是一坨屎,一坨没眼看的屎) :
# -*- coding=utf-8 -*-
from pyautogui import *
from datetime import datetime
from overvx import *x, y = position()
print(x, y)def sign(meetingNumber: str):"""需要给出腾讯会议的房间号作为参数:param meetingNumber: 会议号:return: 无"""click(x=1145, y=59) # 关闭会议sleep(5)click(x=762, y=408) # 确认sleep(5)# join the meeting set, position=789, 280click(x=539, y=165) # 加入会议sleep(5)click(x=828, y=62) # 最小化sleep(5)click(x=536, y=183) # 输入会议号# import meetingNumbersleep(2)typewrite(message=meetingNumber, interval=0.1)sleep(5)click(x=529, y=388) # 勾掉"入会开启麦克风"sleep(5)click(x=532, y=330) # 勾掉开启音频sleep(5)# joinpress("enter")sleep(120)# hotkey("alt", "m")weeks = datetime.now().strftime("%A")def action():hours = datetime.now().strftime("%H")minutes = datetime.now().strftime("%M")sumNumber = int(hours) * 60 + int(minutes)print(myTime(), "\t" f"hours={hours},minutes={minutes},sumNumber={sumNumber},当前的limit_of_time={limit_of_time}")return int(sumNumber)time1 = "08:18" # 498
over1 = "09:45" # 585
time2 = "09:58" # 598
over2 = "11:25" # 685
time3 = "12:58" # 778
over3 = "14:20" # 860
time4 = "14:33" # 873
over4 = "15:55" # 955
limit_of_time = 0while True:weeks = datetime.now().strftime("%A")if weeks == "Monday":limit_of_time = 0print("进入循环,周一")sumNumber = action()if 498 <= sumNumber <= 585:if limit_of_time == 0:print(myTime() + f"开始上周一上午第一节英语,limit_of_time={limit_of_time},开始睡眠,预计将在{sumNumber + 87}苏醒")sign("8786998539") # 周一上午第一节英语sleep(5220)limit_of_time += 1if 598 <= sumNumber <= 685:if limit_of_time <= 1:print(myTime() + f"开始上周一上午第二节民法,limit_of_time={limit_of_time},开始睡眠,预计将在{sumNumber + 87}苏醒")sign("73713214298") # 周一上午第二节民法sleep(5220)limit_of_time += 1if 873 <= sumNumber <= 955:if limit_of_time <= 2:print(myTime() + f"开始上周一下午第一节民法,limit_of_time={limit_of_time},开始睡眠,预计将在{sumNumber + 82}苏醒")sign("96627959698") # 周一下午第一节民法sleep(4920)limit_of_time += 1print(f"{myTime()},脱离周一循环")# sleep(120) # 单位秒elif weeks == "Tuesday":limit_of_time = 0print("进入循环,周二")sumNumber = action()if 598 <= sumNumber <= 685:if limit_of_time == 0:print(myTime() + f"开始上周二上午第二节道法,limit_of_time={limit_of_time},本节课不需要登录腾讯会议,开始睡眠,预计将在{sumNumber + 87}苏醒")# 上午第二节道法sleep(5220)limit_of_time += 1if 778 <= sumNumber <= 860:if limit_of_time <= 1:print(myTime() + f"开始上周二下午第一节视听,limit_of_time={limit_of_time},开始睡眠,预计将在{sumNumber + 82}苏醒")sign("4551453138") # 下午第一节视听sleep(4920)limit_of_time += 1print(f"{myTime()},脱离周二循环")# sleep(120)elif weeks == "Wednesday":limit_of_time = 0print("进入循环,周三")sumNumber = action()if 498 <= sumNumber <= 585:if limit_of_time == 0:print(myTime() + f"开始上周三上午第一节信息,limit_of_time={limit_of_time},本节课不需要登录腾讯会议,开始睡眠,预计将在{sumNumber + 87}苏醒")# sign("97018438") # 周一上午第一节信息sleep(5220)limit_of_time += 1if 598 <= sumNumber <= 685:if limit_of_time <= 1:print(myTime() + f"开始上周三上午第二节体育,limit_of_time={limit_of_time},本节课不需要登录腾讯会议,开始睡眠,预计将在{sumNumber + 87}苏醒")# 周一上午第二节体育sleep(5220)limit_of_time += 1if 778 <= sumNumber <= 860:if limit_of_time <= 2:print(myTime() + f"开始上周三下午第一节中华传统文化,limit_of_time={limit_of_time},开始睡眠,预计将在{sumNumber + 82}苏醒")sign("80574557409") # 下午第一节中华传统文化sleep(4920)limit_of_time += 1if 873 <= sumNumber <= 955:if limit_of_time <= 3:print(myTime() + f"开始上周三下午第二节信息,limit_of_time={limit_of_time},本节课不需要登录腾讯会议,开始睡眠,预计将在{sumNumber + 82}苏醒")# sign("97018438") # 下午第二节信息sleep(4920)limit_of_time += 1print(f"{myTime()},脱离周三循环")# sleep(120)elif weeks == "Thursday":limit_of_time = 0print("进入循环,周四")sumNumber = action()if 498 <= sumNumber <= 585:if limit_of_time == 0:print(myTime() + f"开始上周四上午第一节英语,limit_of_time={limit_of_time},开始睡眠,预计将在{sumNumber + 87}苏醒")sign("8786998539") # 周一上午第一节英语sleep(5220)limit_of_time += 1if 778 <= sumNumber <= 860:if limit_of_time <= 1:print(myTime() + f"开始上周四下午第一节视听,limit_of_time={limit_of_time},开始睡眠,预计将在{sumNumber + 82}苏醒")sign("68014439420") # 下午第一节视听sleep(4920)limit_of_time += 1print(f"{myTime()},脱离周四循环")# sleep(120)elif weeks == "Friday":limit_of_time = 0print("进入循环,周五")sumNumber = action()if 498 <= sumNumber <= 585:if limit_of_time == 0:print(myTime() + f"开始上周五上午第一节中处,limit_of_time={limit_of_time},开始睡眠,预计将在{sumNumber + 87}苏醒")sign("84965262308") # 上午第一节中处sleep(5220)limit_of_time += 1if 598 <= sumNumber <= 685:if limit_of_time <= 1:print(myTime() + f"开始上周五上午第二节道法,limit_of_time={limit_of_time},本节课不需要登录腾讯会议,开始睡眠,预计将在{sumNumber + 87}苏醒")# 上午第二节道法sleep(5220)limit_of_time += 1print(f"{myTime()},脱离周五循环")# sleep(120)sleep(120)
# Monday : 英语 08:20 - 09:45 8786998539
# 民法 10:00 - 11:25 73713214298
# 民法 14:35 - 15:55 96627959698
# Tuesday: 思想 10:00 - 11:25 无
# 视听 13:00 - 14:20 4551453138
# Wednesday: 信息 08:20 - 09:45 97018438
# 体育 10:00 - 11:25 无
# 中华 13:00 - 14:20 80574557409
# 信息 14:35 - 15:55 97018438
# Thursday 英语 08:20 - 09:45 8786998539
# 法导 13:00 - 14:20 68014439420
# Friday 中处 08:20 - 09:45 84965262308
# 道法 10:00 - 11:25 无