前言:本人python菜鸟一枚,所以原理不难,也很粗糙,欢迎大佬指点,下文除了有代码内容还有我实现这个想法的阶段
最近刚处了个对象,身为大学程序猿的我也不懂制造浪漫,于是一个远古想法重新浮现了出来——在我小时候非常迷恋钢铁侠,对于他的Jarvis系统更是无比羡慕,早上睁开眼睛,自动播报天气预报,窗帘缓缓打开,播放音乐,这是多么令人向往的生活。不过,理想很丰满,现实很骨感,很显然我没那个能耐写出个Jarvis出来,但是一个天气预报还是可以的。
首先我的第一个想法是,微信,据我所知,在我刚接触python的时候,有个很好用的微信库叫wxpy,里面的功能很丰富,没记错的话除了能发消息还能看有谁单删了你之类的,不过这都有一个大前提,就是这个库依赖于网页版微信,但很遗憾的是现在腾讯已经封掉了网页版微信
目前也未知原因,这就导致了wxpy这个库彻底没用了,同时也包括itchat(其实我还在知乎看到了解决方法以及替代品,只是由于有点复杂,就没用了,有兴趣的大佬可以尝试一下,原文链接
后面我还有另一个想法,就是自动发短信,为此我也尝试了不少网站,像twilio以及一些国内的验证码平台,但这些都几乎有一个共同特点,不仅收费而且短信都会带上网站的前缀名字,twilio是我第一个尝试的也是网上推荐最多的,但是它有一个缺点是收发验证码的双方手机号都必须是在该网站注册过的才可以,还要注册这么麻烦就没有惊喜可言了嘛,当然我也想过直接用自己手机发,但是我甚至还不会如何在手机执行python程序。。。因此也否掉了,那是不是就没有其他方法了?
后来我突然想起来,在我以前学爬虫的时候有一个案例,就是自动发微信qq的,但是当初试验的时候,有太多的不方便和漏洞了,首先会有无法发送的情况,原因可能是鼠标光标定位问题,其次是这个方法有点笨拙,因为必须得打开到微信的个人聊条框,才可以执行,但是事已至此,这貌似也是目前最简单最可行的方法了
最终我在万能的csdn上找到了一个实现这个操作的代码再加以修改,终于实现了自动发微信的效果(由于年代久远,我找不到原文章了,但是这个代码也是我自己优化过的,如果原作者看到了可以联系我)
代码如下:
import win32api, win32gui, win32con
import win32clipboard as clipboard
# 查找微信窗口,如果最小化则还原(需要固定位置)
title_name = '文件传输助手' # 单独打开,好友名称
win = win32gui.FindWindow('ChatWnd', title_name)
print("找到句柄:%x" % win)
if win != 0:
left, top, right, bottom = win32gui.GetWindowRect(win)
print(left, top, right, bottom) # 最小化为负数
#
# 最小化时点击还原,下面为单个窗口
if top < 0:
# 鼠标点击,还原窗口
win32api.SetCursorPos([190, 1040]) # 鼠标定位到(190,1040)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
######点击完成一次
time.sleep(0.5)
left, top, right, bottom = win32gui.GetWindowRect(win) # 取数
#
# 最小时点击还原窗口,下面一节为多个窗口,依次点击打开。
k = 1040 # 最小化后的纵坐标,横坐标约为190
while top < 0 and k > 800: # 并设定最多6次,防止死循环
time.sleep(1)
win32api.SetCursorPos([180, k - 40]) # 鼠标定位菜单第一个
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
######点击完成一次
time.sleep(1) # 等待窗口出现
left, top, right, bottom = win32gui.GetWindowRect(win) # 取数
if top > 0: # 判断是否还原
break
else:
k -= 40 # 菜单上移一格
win32api.SetCursorPos([190, 1040]) # 重新打开菜单
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
win32gui.SetForegroundWindow(win) # 获取控制
time.sleep(0.5)
else:
print('找不到【%s】这个人(或群),请打开聊天框' % title_name)
这里以“文件传输助手”作为例子,以上为消息发送的原理部分,包含了定位窗口及鼠标操作,下面是消息粘贴部分
def send_m():
# 以下为“CTRL+V”组合键,回车发送,(方法一)
win32api.keybd_event(17, 0, 0, 0) # 有效,按下CTRL
time.sleep(1) # 延时
win32gui.SendMessage(win, win32con.WM_KEYDOWN, 86, 0) # V
win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0) # 放开CTRL
time.sleep(1) # 缓冲时间
win32gui.SendMessage(win, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0) # 回车发送
return
def txt_ctrl_v(txt_str):
# 定义文本信息,将信息缓存入剪贴板
clipboard.OpenClipboard()
clipboard.EmptyClipboard()
clipboard.SetClipboardData(win32con.CF_UNICODETEXT, txt_str)
clipboard.CloseClipboard()
return
至于发送内容,使用到的是百度天气的一个api,但是由于返回的值里面内容不是特别丰富,于是手动添加了一些词汇,当然这个功能还是很局限的,所以目前仅展示天气数据的收集部分,后面的穿衣建议可以由大家手动添加或者寻找其他api
import requests
class Weather(object):
def weather_data(self):
city_id = 330100 #查询地区编码请前往https://blog.csdn.net/Madman_long/article/details/83374400
ak = 'HELaVmuS91N8z1IjE9i3m2uAVFWGMVBU' #你的ak
url = 'http://api.map.baidu.com/weather/v1/?district_id=%d&data_type=all&ak=%s'%(city_id,ak)
result = requests.get(url).json()['result']['forecasts'][0]
date = result['date'] #当天日期
text_day = result['text_day'] #白天天气
text_night = result['text_night'] #晚上天气
high_temp = result['high'] #当天最高温度℃
low_temp = result['low'] #当天最低温度℃
wc_day = result['wc_day'] #风力
wd_day = result['wd_day'] #风
# suggest = result['index']
data = [date, text_day, text_night, high_temp, low_temp, wc_day, wd_day]
return data
最后就是消息内容的整合和内容发送模块啦,由于这是给对象发的,所以我还在前面添加了纪念日模块,记录我们是在一起的多少天
def count_day():
pre = datetime(2021, 11, 18) # 年月日时分秒 微秒
now = datetime.now()
dst = now - pre
day = str(dst).split(' ')
return day[0]
def read_sen():
with open('love.txt', 'r', encoding='utf-8') as file:
contents = file.readlines()
day = count_day()
wt = Weather()
suggest = wt.suggest()
date = (str(datetime.now()).split(' ')[0]).split('-')
content = f'早上好!今天是{date[0]}年{date[1]}月{date[2]}日,是我们在一起的第 {day} 天~\n\n' + suggest + '\n\n' + contents[random.randint(0, 82)]
txt_ctrl_v(content)
send_m()
print(content)
至于定时发送,也是困扰了我很久的问题,由于我打算设定的时间是每天早上七点,如果我才用python内置的sched模块,那意味着我需要整晚开启电脑,这多少还是有点不方便的,对电脑也不好,于是我采用的是windows自带的任务计划程序和python的sched相结合的方式(事实上不需要sched的,但是为了避免我这台电脑偶尔的抽风,比如连接WiFi的时间过长,所以才添加的)下面是windows任务计划程序使用的教程
一、右击win,找到计算机管理
二、打开后找到系统工具➡任务计划程序➡任务计划程序库
三、在右边“操作”那一栏找到创建基本任务
。。。。。
不好意思,懒得写了,参考这篇文章吧
注意使用的是休眠,如果是重启的话微信界面就会没了的,因此这也是这个程序弱智的地方,在休眠之前必须得把聊天窗口挂在最前面
然后重复这个任务计划程序的方法,计划执行python主程序,就可以啦
最后演示一遍这套程序的最终效果以及流程
首先在睡前将需要发送的人的窗口打开,最好放置在最前面
然后直接休眠,最后的效果长这样
最后的话:这是csdn小白第一次写文章,可能写的不够详细,有些当初遇到的问题也由于时代久远不太记得了,所以有什么问题可以私信我,多多担待多多支持呀~