基于wxpy库的微信定时发布天气预报

来自日常划水的野鸡icctw

定时用爬虫抓取天气预报并发送至指定对象微信(好友/群)

减轻了生活委员的工作量......

代码如下:写的烂凑合着看,注意点都写在注释里了

 
 
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# -*- auther @icctw -*-

#tip: 该api  'https://www.sojson.com/open/api/weather/json.shtml?city=' 免费用户每天最多调用2000次,调用过多会报错
#     建议在树莓派或者服务器上跑

import time
import random
import requests
from wxpy import *

def get_html(url,data=None):
    #模拟浏览器来获取网页的html代码
    header={
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.8',
        'Connection': 'keep-alive',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.235'
    }
    #设定超时时间,防止被网站认为是爬虫
    timeout=random.choice(range(80,180))
    while True:
        try:
            rep=requests.get(url,headers=header,timeout=timeout)
            rep.encoding="utf-8"
            if rep.text[2] != 's':#该api调用时有失败的可能,一个简单的判断调用是否成功
                break
        except socket.timeout as e:
            print("3:",e)
            time.sleep(random.choice(range(8,15)))

        except socket.error as e:
            print("4:",e)
            time.sleep(random.choice(range(20,60)))
        except http.client.BadStatusLine as e:
            print("5:",e)
            time.sleep(random.choice(range(30,80)))

        except http.client.IncompleteRead as e:
            print("6:",e)
            time.sleep(random.choice(range(5,15)))


    result=''
    temp=rep.text
    print (rep.text)
    index1 = temp.find('forecast')
    index_sunrise = temp.find('sunrise', index1)
    index_sunset = temp.find('sunset', index1)
    index_high = temp.find('high', index1)
    index_low = temp.find('low', index1)
    index_city = temp.find('city')
    index_count = temp.find('count')
    index_type = temp.find('type', index1)
    index_notice = temp.find('notice', index1)

    result = result+ '今日天气预报' + '\n' + '日期:' + temp[index1 + 20:index_sunrise - 3] \
             + '城市:' + temp[index_city + 7:index_count - 3] + '\n' \
             + '最高温度:' + temp[index_high + 9:index_low - 3] + ' 最低温度:' + temp[index_low + 9:index_sunset - 3] + '\n' \
             + '日出时间:' + temp[index_sunrise + 10:index_high - 3] + ' 日落时间:' + temp[index_sunset + 9:index_sunset + 14] + '\n' \
             + '天气类型:' + temp[index_type + 7:index_notice - 3] + '\n' \
             + temp[index_notice + 9:temp.find('}', index_notice) - 1]

    # print(datetime.datetime.now())
    # print('今日天气预报')
    # print('日期:' + temp[index1 + 20:index_sunrise - 3])
    # print('城市:' + temp[index_city + 7:index_count - 3])
    # print('最高温度:' + temp[index_high + 9:index_low - 3] + ' 最低温度:' + temp[index_low + 9:index_sunset - 3])
    # print('日出时间:' + temp[index_sunrise + 10:index_high - 3] + ' 日落时间:' + temp[index_sunset + 9:index_sunset + 14])
    # print('天气类型:' + temp[index_type + 7:index_notice - 3])
    # print(temp[index_notice + 9:temp.find('}', index_notice) - 1])

    return result

def auto_send(): #unix时间戳设定为每天早上7:30分自动发送消息
    while True:
        time_now = int(time.time())
        if (time_now - 1527204600) % 86400 == 0:
            url = 'https://www.sojson.com/open/api/weather/json.shtml?city=%E6%9D%AD%E5%B7%9E'  # 杭州的天气
            html = get_html(url)
            print(html)
            bot.self.send(html) #选择对象发送消息
            time.sleep(86000)


if __name__ == "__main__":

    # url ='https://www.sojson.com/open/api/weather/json.shtml?city=%E6%9D%AD%E5%B7%9E' #杭州的天气
    # html = get_html(url)
    # print (html)
    tuling = Tuling(api_key='')
    bot = Bot(cache_path=True)
    myself = bot.self
    bot.enable_puid('wxpy_puid.pkl')
    auto_send()

    bot.join()
    #print (':D')

效果如下:




猜你喜欢

转载自blog.csdn.net/GUINEW/article/details/80447393