【感恩节的小礼物】yagmail给家人朋友来一份含有温情的关心和推送吧~Python3自动发送暖心内容邮件。

1、爬取对象:百度天气

2、天气解析

3、整理内容

4、发送对象,获取SMTP发送授权码

5、脚本完成

6、加入windows的任务计划程序,或者linux的crontab周期性任务设置

# -*- coding:utf-8 -*-

import json
import random
import re
import time

import requests
import yagmail
from bs4 import BeautifulSoup

url = 'https://weathernew.pae.baidu.com/weathernew/pc?srcid=4982&query='
s_url = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd='
user = '[email protected]'
password = 'xxxx授权码'
allProvince = ['河北', '山西', '辽宁', '吉林', '黑龙江', '江苏', '浙江', '安徽', '福建', '江西', '山东', '河南', '湖北',
               '湖南', '广东', '海南', '四川', '贵州', '云南', '陕西', '甘肃', '青海', '台湾', '内蒙古', '北京', '天津',
               '上海', '广西', '西藏', '重庆', '宁夏', '新疆', '香港', '澳门', '台湾']


# try:
#     print('请您搜索:湖北黄冈天气(省+市+天气,应省去省市后缀)!')
#     input_first = input('请输入您的城市:')
#     if input_first[:2] in allProvince or input_first[:3] in ['黑龙江', '内蒙古']:
#         input_first = input_first
#     else:
#         input_first = '湖北武穴天气'
# finally:
#     pass


def get_real_weather(new_url, num=None):
    """
    获取实时天气
    :param new_url:
    :param num:获取最近多少天的天气,后面几天的天气将从weather15DayData列表里获取
    :return:
    """
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 Chrome/103.0.0.0 Safari/537.36'
    }
    r = requests.get(new_url, headers=headers)
    soup = BeautifulSoup(r.text, 'lxml').findAll('script')

    # var_soup[5],获取当前日期具体气候状况
    global simple_text, after_weather
    weather = re.findall(r'data\["weather"]=(.+)', str(soup[5]))
    weather = json.loads(weather[0].replace(';', ''))

    base = re.findall(r'data\["base"]=(.+);', str(soup[5]))
    base = json.loads(base[0])
    date = base['date']  # 当前日期
    weekday = base['weekday']  # 当前星期几
    lunar = base['lunar']  # 农历多少
    feature = re.findall(r'data\["feature"]=(.+);', str(soup[5]))
    feature = json.loads(feature[0])
    sunriseTime = feature['sunriseTime']  # 日出时间
    sunsetTime = feature['sunsetTime']  # 日落时间

    weather15DayData = re.findall(r'data\["weather15DayData"]=(.+);', str(soup[5]))
    weather15DayData = json.loads(weather15DayData[0])
    if num and int(num) < 15:
        # 获取明后天天气字典

        after_weather = []
        for i in range(int(num)):
            w_date = weather15DayData[i + 1]['date']  # 日期
            formatWeek = weather15DayData[i + 1]['formatWeek']  # 属于哪一天:今明后
            if i + 1 == int(num):
                weatherPm25 = weather15DayData[i + 1]['weatherPm25'] + '。\n\n\n'  # pm空气质量
            else:
                weatherPm25 = weather15DayData[i + 1]['weatherPm25'] + ','  # pm空气质量
            weatherText = weather15DayData[i + 1]['weatherText']  # 天气情况
            after_weather.append(w_date + ' ' + formatWeek + '天气:' + weatherText + ' 空气质量' + weatherPm25)
    else:

        only_date = weather15DayData[1]['date']  # 日期
        only_formatWeek = weather15DayData[1]['formatWeek']  # 属于哪一天:今明后
        only_weatherPm25 = weather15DayData[1]['weatherPm25'] + '。'  # pm空气质量
        only_weatherText = weather15DayData[1]['weatherText']  # 天气情况
        simple_text = '日期' + only_date + ' ' + only_formatWeek + '天气:' + only_weatherText + ' 空气质量' + only_weatherPm25
        # print(simple_text)

    temperature_night = weather['temperature_night']  # 晚间温度
    temperature_day = weather['temperature_day']  # 白天温度
    weather_day = weather['weather_day']  # 白天天气
    wind_direction_day = weather['wind_direction_day']  # 风向趋势
    wind_power_day = weather['wind_power_day']  # 白天风力等级
    temperature = weather['temperature']  # 当前气温是多少
    real_weather = weather['weather']  # 当前天气
    wind_direction = weather['wind_direction']  # 当前风向
    wind_power = weather['wind_power']  # 当前风力
    humidity = weather['humidity']  # 空气湿度
    uv = weather['uv']  # 紫外线强弱

    todayContent = f'{locate[:-2]}\n' \
                   f'{date} {weekday} 农历:{lunar},当前气温为:{temperature}°\n' \
                   f'湿度{humidity}%,紫外线{uv},日出{sunriseTime},日落{sunsetTime}\n' \
                   f'总体来说,今天:{weather_day},{temperature_night}°~{temperature_day}℃ {wind_direction_day}{wind_power_day}\n' \
                   f'实时:{real_weather} {wind_direction}{wind_power}\n'
    return todayContent + '\n介天是:\n' + simple_text if not num else todayContent + '\n后面几天:\n' + '\n'.join(
        text for text in after_weather)  # + '。\n'
    # print(f'打印完成,内容为:\n{weather}')
    # print(weather15DayData)


def search_weather():
    res = requests.get(simple_url, headers=headers)
    print(res.text)  # No result we want.


def send_mail(weather_get):
    # 连接邮箱服务器,smtp里password输入的是授权码
    yag = yagmail.SMTP(user=user, password=password, host='smtp.qq.com')  # smtp.qq.com
    if isinstance(weather_get, list):
        weather_get.append('\n\n作者:HuZk')
    # return 'pm is shayu de shoubi.'
    # 发送带附件的邮件,最后1个参数为附件地址
    # 接收邮件的邮箱和附件地址可以为列表,即发送给多个邮箱,发送多个附件
    receive_address = ['[email protected]'] # 多个收件地址
    try:
        yag.send(receive_address, '天气定制_专属', weather_get, [r"C:\Users\Administrator\Pictures\无非动心.jpeg"])
    finally:
        pass
    return '您的心意发送完成,对方已成功接收!'

    # if True:
    #     yag.send(receive_address, '亲爱的,请收下您的天气!', contents, [r"C:\Users\Administrator\Pictures\无非动心.jpeg"])


def run():
    input_first = None  # 我的家乡:湖北黄冈天气
    global locate
    if input_first:
        locate = input_first
    else:
        locate = '广东深圳天气'

    new_url = url + locate
    # simple_url = s_url + locate

    # 控制查询地:locate →  new_url → out_content

    input_num = '3'  # 展示未来几天的天气,默认3天
    content = get_real_weather(new_url, input_num)

    # 再加个地址,展示该地址天气
    locate = '湖北武穴天气'
    another_url = url + locate
    second_content = get_real_weather(another_url, input_num)
    print(f'check ready-contents:{[content, second_content]=}')

    # 天气内容获取完毕,现在来发送邮件
    print(send_mail([content, second_content]))


run()

点击Sublime Text的插件F5调试,或者pycharm的运行,发送成功! 

以后你喜欢的、敬重的人每天都能收到你的关切和推送了!快去试一下吧!

猜你喜欢

转载自blog.csdn.net/qq_17195161/article/details/127919085