天气预报自动推送

byte76 Lv1

一、申请微信测试公众号(https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login)

  1. 获取到这四个值 appID, appSecret, openId, template_id

  2. 想让谁收消息,谁就用微信扫二维码,刷新页面后即出现在用户列表,获取微信号(openId)

  3. 新增测试模板获得 template_id(模板ID)

    天气模板:

    1
    2
    3
    4
    5
    6
    今天:{{date.DATA}}
    地区:{{region.DATA}}
    天气:{{weather.DATA}}
    气温:{{temp.DATA}}
    风向:{{wind_dir.DATA}}
    对你说的话:{{today_note.DATA}}

    课程表模板:

    1
    消息:{{message.DATA}}

二、配置代码

  1. 将上面获得的几个值填入代码这几行,启动即可

    1
    2
    3
    4
    5
    6
    7
    8
    appID = ""
    appSecret = ""
    #收信人ID即 用户列表中的微信号,见上文
    openId = ""
    # 天气预报模板ID
    weather_template_id = ""
    # 时间表模板ID
    timetable_template_id = ""
  2. 定时任务(根据需求进行修改这几行)

    1
    2
    3
    4
    5
    schedule.every().day.at("08:00").do(weather_report, "北京")
    # schedule.every().monday.at("13:30").do(timetable, "还有15分钟开始下午的课程")
    while True:
    schedule.run_pending()
    time.sleep(1)
  3. 完成代码如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    # 安装依赖 pip3 install requests html5lib bs4 schedule

    import time
    import requests
    import json
    import schedule
    from bs4 import BeautifulSoup


    # 从测试号信息获取
    appID = "wx1c904b832908e3d7"
    appSecret = "024e7a99b9bd93e4ec2ba0e61cb99869"
    #收信人ID即 用户列表中的微信号,见上文
    openId = "oLg156sEhzpHX3f6OKG6HaCTid9s"
    # 天气预报模板ID
    weather_template_id = "T00eYDomN3GOBXOTqTYhX27Nqp-vCdDO2xHKAK1ElH8"
    # 时间表模板ID
    timetable_template_id = "kg29LwRP6--uo6Xq3mm-aRyJFaF_Pe2SsnUjYq23YpA"


    def get_weather(my_city):
    urls = ["http://www.weather.com.cn/textFC/hb.shtml",
    "http://www.weather.com.cn/textFC/db.shtml",
    "http://www.weather.com.cn/textFC/hd.shtml",
    "http://www.weather.com.cn/textFC/hz.shtml",
    "http://www.weather.com.cn/textFC/hn.shtml",
    "http://www.weather.com.cn/textFC/xb.shtml",
    "http://www.weather.com.cn/textFC/xn.shtml"
    ]
    for url in urls:
    resp = requests.get(url)
    text = resp.content.decode("utf-8")
    soup = BeautifulSoup(text, 'html5lib')
    div_conMidtab = soup.find("div", class_="conMidtab")
    tables = div_conMidtab.find_all("table")
    for table in tables:
    trs = table.find_all("tr")[2:]
    for index, tr in enumerate(trs):
    tds = tr.find_all("td")
    # 这里倒着数,因为每个省会的td结构跟其他不一样
    city_td = tds[-8]
    this_city = list(city_td.stripped_strings)[0]
    if this_city == my_city:

    high_temp_td = tds[-5]
    low_temp_td = tds[-2]
    weather_type_day_td = tds[-7]
    weather_type_night_td = tds[-4]
    wind_td_day = tds[-6]
    wind_td_day_night = tds[-3]

    high_temp = list(high_temp_td.stripped_strings)[0]
    low_temp = list(low_temp_td.stripped_strings)[0]
    weather_typ_day = list(weather_type_day_td.stripped_strings)[0]
    weather_type_night = list(weather_type_night_td.stripped_strings)[0]

    wind_day = list(wind_td_day.stripped_strings)[0] + list(wind_td_day.stripped_strings)[1]
    wind_night = list(wind_td_day_night.stripped_strings)[0] + list(wind_td_day_night.stripped_strings)[1]

    # 如果没有白天的数据就使用夜间的
    temp = f"{low_temp}——{high_temp}摄氏度" if high_temp != "-" else f"{low_temp}摄氏度"
    weather_typ = weather_typ_day if weather_typ_day != "-" else weather_type_night
    wind = f"{wind_day}" if wind_day != "--" else f"{wind_night}"
    return this_city, temp, weather_typ, wind


    def get_access_token():
    # 获取access token的url
    url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}' \
    .format(appID.strip(), appSecret.strip())
    response = requests.get(url).json()
    print(response)
    access_token = response.get('access_token')
    return access_token


    def get_daily_love():
    # 每日一句情话
    url = "https://api.lovelive.tools/api/SweetNothings/Serialization/Json"
    r = requests.get(url)
    all_dict = json.loads(r.text)
    sentence = all_dict['returnObj'][0]
    daily_love = sentence
    return daily_love


    def send_weather(access_token, weather):
    # touser 就是 openID
    # template_id 就是模板ID
    # url 就是点击模板跳转的url
    # data就按这种格式写,time和text就是之前{{time.DATA}}中的那个time,value就是你要替换DATA的值

    import datetime
    today = datetime.date.today()
    today_str = today.strftime("%Y年%m月%d日")

    body = {
    "touser": openId.strip(),
    "template_id": weather_template_id.strip(),
    "url": "https://weixin.qq.com",
    "data": {
    "date": {
    "value": today_str
    },
    "region": {
    "value": weather[0]
    },
    "weather": {
    "value": weather[2]
    },
    "temp": {
    "value": weather[1]
    },
    "wind_dir": {
    "value": weather[3]
    },
    "today_note": {
    "value": get_daily_love()
    }
    }
    }
    url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={}'.format(access_token)
    print(requests.post(url, json.dumps(body)).text)


    def send_timetable(access_token, message):
    body = {
    "touser": openId,
    "template_id": timetable_template_id.strip(),
    "url": "https://weixin.qq.com",
    "data": {
    "message": {
    "value": message
    },
    }
    }
    url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={}'.format(access_token)
    print(requests.post(url, json.dumps(body)).text)


    def weather_report(city):
    # 1.获取access_token
    access_token = get_access_token()
    # 2. 获取天气
    weather = get_weather(city)
    print(f"天气信息: {weather}")
    # 3. 发送消息
    send_weather(access_token, weather)


    def timetable(message):
    # 1.获取access_token
    access_token = get_access_token()
    # 3. 发送消息
    send_timetable(access_token, message)


    if __name__ == '__main__':
    weather_report("河北")
    # timetable("第二教学楼十分钟后开始英语课")

    # schedule.every().day.at("08:00").do(weather_report, "北京")
    # schedule.every().monday.at("13:30").do(timetable, "还有15分钟开始下午的课程")
    #while True:
    # schedule.run_pending()
    # time.sleep(1)

原创文档链接:https://www.bilibili.com/read/cv28928153/

原创视频链接:
https://www.bilibili.com/video/BV1Ng4y1r7EP/?spm_id_from=333.880.my_history.page.click&vd_source=576ff0210b33e8823a0a538d3f79f11f

  • 标题: 天气预报自动推送
  • 作者: byte76
  • 创建于 : 2024-10-07 17:29:17
  • 更新于 : 2024-10-26 10:34:44
  • 链接: https://byte76.top/2024/10/07/天气预报推送/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论