后台登录微信并定时发送消息,消息包括农历、阴历、天气;自动监测是否断线,支持邮箱发送二维码登录;适合于挂在服务器上运行
时间:2022-07-23
本文章向大家介绍后台登录微信并定时发送消息,消息包括农历、阴历、天气;自动监测是否断线,支持邮箱发送二维码登录;适合于挂在服务器上运行,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
#coding:utf-8
import requests
from bs4 import BeautifulSoup
import time
import threading
from wxpy import *
import sxtwl
global bot, group
import schedule
import os
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
import smtplib
def youxiang(path_pic, content=''):
msg_from = '2580833660@qq.com' # 发送方邮箱
passwd = '' # 填入发送方邮箱的授权码
receiver = ['1061700625@qq.com'] # 收件人邮箱
subject = "请扫码登录微信" # 主题
msg = MIMEMultipart('related')
msg['Subject'] = subject
msg['From'] = msg_from
msg['To'] = ";".join(receiver)# 收件人为多个收件人,通过join将列表转换为以;为间隔的字符串
msgAlternative = MIMEMultipart('alternative')
msg.attach(msgAlternative)
mail_msg = content + 'rn' + """<p><img src="cid:image1"></p>"""
msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))
fp = open(path_pic, 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
# 定义图片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', '<image1>')
msg.attach(msgImage)
s = smtplib.SMTP_SSL(host='smtp.qq.com', port=465) # 邮件服务器及端口号
try:
s.login(msg_from, passwd)
s.sendmail(msg_from, receiver, msg.as_string())
print("邮件已发送成功!")
time.sleep(5)
except smtplib.SMTPException:
print("Error")
finally:
s.quit()
def login_callback():
print("登录成功")
def logout_callback():
print("退出登录")
startBot()
def qr_callback(uuid, status, qrcode):
picDir = os.path.join(os.getcwd(), 'QRcode.png')
with open(picDir, 'wb') as f:
f.write(qrcode)
youxiang(picDir)
def sendMsg(strings):
global bot, group
group.send(strings)
time.sleep(5)
def startBot():
global bot, group
bot = Bot(cache_path=True, login_callback=login_callback, logout_callback=logout_callback, qr_callback=qr_callback)
group = bot.groups().search('麻将组')[0]
# group = bot.friends().search('静守时光,以待流年')[0]
print(group)
bot.join()
def rili():
# 日历中文索引
ymc = [u"十一", u"十二", u"正", u"二", u"三", u"四", u"五", u"六", u"七", u"八", u"九", u"十"]
rmc = [u"初一", u"初二", u"初三", u"初四", u"初五", u"初六", u"初七", u"初八", u"初九", u"初十",
u"十一", u"十二", u"十三", u"十四", u"十五", u"十六", u"十七", u"十八", u"十九",
u"二十", u"廿一", u"廿二", u"廿三", u"廿四", u"廿五", u"廿六", u"廿七", u"廿八", u"廿九", u"三十", u"卅一"]
numCn = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"]
lunar = sxtwl.Lunar() # 实例化日历库
gongli = time.strftime("%Y-%m-%d", time.localtime()).split('-')
day = lunar.getDayBySolar(int(gongli[0]), int(gongli[1]), int(gongli[2]))
week = numCn[day.week]
if day.Lleap:
nongli = "[润]%s月%s" % (ymc[day.Lmc], rmc[day.Ldi])
else:
nongli = "%s月%s" % (ymc[day.Lmc], rmc[day.Ldi])
return gongli, nongli, week
def weather():
url = r'http://tianqi.2345.com/zhejiang-zhichengzhen/13222.htm'
html = requests.get(url)
html.encoding = 'gb2312'
soup = BeautifulSoup(html.text, 'lxml')
weather_only = soup.find('span', class_='data only').get_text().strip()
wind_force = soup.find('div', class_='wea-about').find('ul', class_='clearfix').find_all('li')[1].get_text().strip()
emoticon = soup.find('div', class_='emoticon').get_text().strip()
return weather_only, wind_force, emoticon
def process():
try:
gongli, nongli, week = rili()
weather_only, wind_force, emoticon = weather()
strings = "【今天】:<%s年%s月%s日,星期%s>rn【农历】:<%s>rn【天气】:%srn%srn【生活小贴士】:%s" %
(gongli[0], gongli[1], gongli[2], week, nongli, weather_only, wind_force, emoticon)
sendMsg(strings)
print(strings)
print("发送完成!")
except Exception as e:
print(e)
def prosch():
schedule.every().day.at("08:00").do(process)
while True:
schedule.run_pending()
time.sleep(5)
def main():
thread_Bot = threading.Thread(target=startBot)
thread_prosch = threading.Thread(target=prosch)
thread_Bot.start()
thread_prosch.start()
thread_Bot.join()
thread_prosch.join()
if __name__ == '__main__':
main()
- Javascript 装饰器极速指南
- daterangepicker日历插件使用参数注意问题
- 学习zepto.js(对象方法)[5]
- js 停止事件冒泡 阻止浏览器的默认行为
- vue-cli生成的项目配置开发和生产环境不同的接口
- 【52ABP实战教程】0.1-- Devops如何用VSTS持续集成到Github仓库!
- 学习zepto.js(对象方法)[4]
- 事件绑定的几种常见方式
- vue的iview列表table render函数设置DOM属性值的方法
- js焦点轮播图
- vue父组件中获取子组件中的数据
- 学习zepto.js(对象方法)[3]
- bootstrap 标签页tab切换js(含报错原因)
- 学习zepto.js(对象方法)[2]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 实习第九周
- GET 和 POST 区别
- 实习第十周
- Linux下文件系统技巧 | 统计个数 | 只见文件或目录
- 有赞线上拨测系统实践(一)
- Node Schedule文档翻译
- 基于 Generator 和 Iterator 的惰性列表
- 【Centos8】安装docker的坎坷历程
- 你不知道的Virtual DOM(一):Virtual Dom介绍
- Under the Hood: NaN of JS
- 带上问题来学redis,看到不吃亏(什么是redis?缓存问题、数据一致性、redis配置文件汉化版)
- 基于weex的有赞无线开发框架
- 搭建简易的物联网服务端和客户端-第四次增补(二十六)
- 实习第十一周,第十二周
- Cordova安装