当前位置 博文首页 > 早起Python:情人节,教你用Python定时给小姐姐微信发送专属问候
大家好,我是早起。
今天是大年初二,本来是可以好好在家休息,但是考虑到明天就是情人节了,加上最近后台求往期情人节/520/七夕表白文章的代码人数又多了起来,我就再给大家分享一招👇
每天早上用Python给TA的微信发送问候
大致效果如下,只要程序写好了每天早上就会自动给小姐姐发送一条问候消息。
看上去有点复杂,又要爬天气又要爬路况,但只要将思路分析清楚就能轻松搞定,本项目大致分为三块
“”
爬取相关信息(日期、时间、路况)
构建内容并推送消息至微信
每天定时执行
下面我们来逐个击破。
首先我们需要先把后面要用到的相关信息爬取并存储,先导入相关库
import?requests
import?re
from?bs4?import?BeautifulSoup
import?time
import?datetime
import?random
import?pandas?as?pd
from?urllib?import?request,?parse
import?warnings
warnings.filterwarnings("ignore")
第一步是日期和天气,那妹子所在的城市肯定需要有,之后随便找一个天气预报网站,此处以天气网为例
我们需要把图中红框部分提取,这里没什么难点,使用requests即可,因为页面很简单
甚至也不需要什么反爬措施,毕竟每天就请求一次,完整代码如下
r?=?requests.get('https://www.tianqi.com/hangzhou/')
soup?=?BeautifulSoup(r.text)
date?=?soup.find_all('dd',class_?=?'week')[0].text.strip()
date?=?re.sub(u'\u3000',?",",?date)
time_now?=?time.strftime("%H:%M:%S",?time.localtime())?
weather?=soup.select('dd?>?span')[0].text
air?=?soup.select('dd?>?h5')[0].text
time1?=?datetime.datetime.strptime(time_now,"%H:%M:%S")
time2?=?datetime.datetime.strptime('9:30:00',"%H:%M:%S")
time3?=?round((time2?-?time1).total_seconds()?/?60)
requests.ge
t请求,bs4
解析保存数据,最后用datetime模块去计算时间差即可。现在日期和天气就搞定了。
这一步需要完成的就是计算小姐姐家庭地址到公司的交通耗时、路况等信息,所以至少你要知道妹子家住哪里,公司又位于何处。
之后要做的是将地址转换为经纬度,方便代码去识别。
完成这一个需求可以使用爬虫通过在线的经纬度转换网站来实现,也可以使用一些专业的API比如百度、高德等,这里我们使用百度地图开放平台。
使用API并不是直接就能调用,首先需要去申请一个AK,打开百度地图开放平台
http://lbsyun.baidu.com/
登陆之后依次点击控制台创建应用选择服务端,按照指示创建一个地图可视化应用,以申请到AK结束
之后启动Jupyter Notebook
,只要不到十行代码就能将地址转成经纬度,直接看代码,没有什么特别需要解释的,利用地址和AK构造查询URL,之后使用requests请求并取出经纬度,代码拿走就能用👇
import?pandas?as?pd
import?requests
AK?=?"替换为你申请的AK"?
def?get_position(name,AK):
????url?=?f'http://api.map.baidu.com/geocoding/v3/?address={name}&output=json&ak={AK}'
????res?=?requests.get(url)
????val?=?res.json()
????retval?=?{'地址':name,'经度':val['result']['location']['lng'],'纬度':val['result']['location']['lat'],'地区标签':val['result']['level'],'是否精确查找':val['result']['precise']}
????longitude?=?retval['经度']
????latitude?=?retval['纬度']
????return(longitude,latitude)
我们来测试一下
可以看到,现在给它一个地址,就能返回经纬度,再返回地图验证一下经纬度,没有问题
搞定了经纬度之后,一些交通信息都可以通过百度地图API来得到。比如驾车路线与路况,只需要通过起止位置与你刚刚申请的AK就可以轻松返回
#驾车
data?=?requests.get('http://api.map.baidu.com/directionlite/v1/driving?origin=40.01116,116.339303&destination=39.936404,116.452562&ak=你的AK')
data?=?data.content.decode('unicode_escape')
data?=?json.loads(data)
distance?=?data['result']['routes'][0]['distance']/1000?#驾车距离
time_cost?=?round(data['result']['routes'][0]['duration']/60)?#驾车耗时
lukuang?=?data['result']['routes'][0]['traffic_condition']
lukuang?=?'畅通'?if?lukuang?==?1?else?'缓行'?if?lukuang?==?2?else?'拥堵'?if?lukuang?==?3?else?'严重拥堵'?#路况
类似公交地铁路线可以同样使用上方代码搞定,至于附近推荐上车点也是有API
#上车点
data2?=?requests.get('http://api.map.baidu.com/parking/search?location=120.11614538041329,30.294761455511946&coordtype=bd09ll&ak=你的AK')
num?=?len(json.loads(json.loads(json.dumps(data2.text,?ensure_ascii=False)))['recommendStops'])
data2?=json.loads(json.loads(json.dumps(data2.text,?ensure_ascii=False)))['recommendStops']
shangche?=?[]
for?i?in?range(num):
????shangche.append(data2[i]['name'])
????
shangche?=?'、'.join(shangche)
当然还有更多的查询API你可以再百度开放平台官网根据文档去使用,此处就不再一一介绍
在搞定了相关字段之后,我们先把这些信息组合成一个字符串,方便后面发送
text?=?f"""
哈喽,冰冰,早上好!
今天是{date}。
现在已经{time_now}啦,距离上班还有{time3}分钟。
外面的天气情况不是很好,{weather},{air},记得带伞哦~
根据现在的路况,路况{lukuang},总共{distance}千米,打车去公司需要{time_cost}分钟,坐公交地铁的话需要{time_cost1}分钟。
如果需要打车去公司的话,最近的上车点为{shangche}。
加油,打工人,再上一天班就放假咯!
"""
接下来就是将这段字符串推送到微信,理论上直接用你的微信发过去是最理想的。
但是由于itchat
等第三方接口目前都不能使用,所以我们只能借助一些其他工具,这里我选择的是喵提醒
其实本质上就是你将信息发送至喵提醒,喵提醒再通过它的公众号推送给指定的人。喵提醒目前支持多种提醒渠道,分别为:公众号提醒,短信提醒,语音电话提醒和 APP 提醒。
但涉及到一个很重要的字段 ID,也就是喵码,获取教程参考官方文档,傻瓜式操作即可,地址如下
https://mp.weixin.qq.com/s?__biz=MzIxNjQ1NzU2Mw==&mid=100000042&idx=6&sn=c9656c8b242972f62fe5840ddf7487db&scene=19#wechat_redirect
简单来说,不论你是忽悠她操作还是自己偷偷操作,你需要让小姐姐的微信关注喵提醒,再创建一个提醒并拿到对应的ID,这一步很重要,重要到我没法教,相信你一定有办法。
之后就可以通过这个ID给小姐姐发消息,并且官方已经给出了发送提醒的 API,所以很容易构建发送的代码如下,拿走就能用
from?urllib?import?request,?parse
import?json
class?Message(object):
????def?__init__(self,text):
????????self.text?=?text
????def?push(self):
????????#?重要,在id中填写自己绑定的id
????????page?=?request.urlopen("http://miaotixing.com/trigger?"?+?parse.urlencode({"id":?"xxxxxx",?"text":?self.text,?"type":?"json"}))
????????result?=?page.read()
????????jsonObj?=?json.loads(result)
????????if?(jsonObj["code"]?==?0):
????????????print("\nReminder?message?was?sent?successfully")
????????else:
????????????print("\nReminder?message?failed?to?be?sent,wrong?code:"?+?str(jsonObj["code"])?+?",describe:"?+?jsonObj["msg"])
text?=?'xxx'
message?=?Message(text)
message.push()?#?完成推送
可以看到,代码很简单,你在使用时,只需要替换上面的ID
为小姐姐的ID,之后替换text
为我们刚刚写好的内容,运行代码后就推送到了微信上。
最后我们需要让程序每天指定时间运行,这里用到了定时指令 schedule
,先看代码
import?schedule?
import?time
def?job():?
????print("I'm?working...")
schedule.every(10).minutes.do(job)?
schedule.every().hour.do(job)?
schedule.every().day.at("10:30").do(job)?
schedule.every(5).to(10).minutes.do(job)?
schedule.every().monday.do(job)?
schedule.every().wednesday.at("13:15").do(job)?
schedule.every().minute.at(":17").do(job)
while?True:?
????schedule.run_pending()?
????time.sleep(1)
可以看到schedule
库里的方法都非常通俗易懂,整个定时框架就是建立死循环并检测时间,在 schedule
预设的要求中运行 job()
函数。如本文的需求,用定时框架可以写作:
import?schedule?
import?time
def?job():?
????pass
schedule.every().day.at("8:00").do(job)?
while?True:?
????schedule.run_pending()?
????time.sleep(600)
只需要把上面的job方法里面的内容替换成我们在第一步爬取与构造发送文字的全部内容,并执行代码,程序就会在每天指定的时间发送一条问候至小姐姐的微信啦~
最后总结一下,其实整个过程看似复杂,但是代码部分并不难,都是十分基础的爬虫代码与解析,要我来说,最难的还是如何让妹子乖乖的把它的喵ID发给你
当然,我只是简单的想了一下,你可以根据我的代码进行修改,来发送任意你想要的内容,进一步,如果你尝试创建提醒,你会发现还有共享提醒功能
打开这个按钮,你就拥有群发功能,可以让更多的小姐姐收到你用心“写下的问候”,当然一定要注意每个人的称呼不要搞错了,万一把冰冰的发给幂幂,那麻烦就大了[逃~]
最后我也将相关代码上传到了GitHub,大家可以自己下载后替换相关Key使用
Github下载代码