爬虫抓取天气预报、定时发送给指定微信好友,自动回复

效果展示

  • 打包成exe文件之后的效果
    • 选择城市
    • 选择好友(可以对群组发送消息,群组需要先添加到微信通讯录中)
    • 选择发送天气预报的频率
    • 选择开启自动回复功能
      在这里插入图片描述

功能实现思路

1、爬取天气信息
  • 天气信息获取网站:中国天气网
    • http://www.weather.com.cn/ 网站后面拼接上weather/{city_code}.shtml,可以获取到指定城市的天气情况(西安 天气ID:101110101)
    • 城市天气ID获取,自己百度查找,本篇博客代码内部也有
    • 西安的天气页面完整链接:http://www.weather.com.cn/weather/101110101.shtml
      在这里插入图片描述
    • 获取到页面之后,通过xpath获取需要的天气内容(使用xpath时尽量用标签的ID获取需要的信息,防止网站样式变化,影响获取值,需要频繁修改爬虫)
    • 将爬虫获取到天气信息,组装成字符串,方便微信发送
二、微信发送信息
  • 应用模块wxpy,python操作微信的模块
    • 安装方式:pip install wxpy
    • 实例化对象,扫描登录
    • 给指定好友或者群组发送天气信息
    • 对好友或者群组设置自动回复(使用图灵机器人自动回复)
三、tkinter模块添加GUI图形化界面
  • tkinter模块使用详细资料自己百度查询,这里就不多叙述
四、打包exe文件

话不多说上代码

# -*- coding: utf-8 -*-
# @Time    : 2019/3/22 21:53
# @Author  : cd

from tkinter import ttk
import tkinter as tk
import requests
from lxml import etree
from wxpy import *

# 这里可以把天气ID字典放到别的文件中引入,这个随便都可以
weatherCode = {'北京': '101010100', '海淀': '101010200', '朝阳': '101071201', '顺义': '101010400', '怀柔': '101010500',
               '通州': '101010600', '昌平': '101010700', '延庆': '101010800', '丰台': '101010900', '石景山': '101011000',
               '大兴': '101011100', '房山': '101011200', '密云': '101011300', '门头沟': '101011400', '平谷': '101011500',
               '上海': '101020100', '闵行': '101020200', '宝山': '101020300', '嘉定': '101020500', '浦东南汇': '101020600',
               '金山': '101020700', '青浦': '101020800', '松江': '101020900', '奉贤': '101021000', '崇明': '101021100',
               '徐家汇': '101021200', '浦东': '101021300', '天津': '101030100', '武清': '101030200', '宝坻': '101030300',
               '东丽': '101030400', '西青': '101030500', '北辰': '101030600', '宁河': '101030700', '汉沽': '101030800',
               '静海': '101030900', '津南': '101031000', '塘沽': '101031100', '大港': '101031200', '蓟县': '101031400',
               '重庆': '101040100', '永川': '101040200', '合川': '101040300', '南川': '101040400', '江津': '101040500',
               '万盛': '101040600', '渝北': '101040700', '北碚': '101040800', '巴南': '101040900', '长寿': '101041000',
               '黔江': '101041100', '万州': '101041300', '涪陵': '101041400', '开县': '101041500', '城口': '101041600',
               '云阳': '101041700', '巫溪': '101041800', '奉节': '101041900', '巫山': '101042000', '潼南': '101042100',
               '垫江': '101042200', '梁平': '101042300', '忠县': '101042400', '石柱': '101042500', '大足': '101042600',
               '荣昌': '101042700', '铜梁': '101042800', '璧山': '101042900', '丰都': '101043000', '武隆': '101043100',
               '彭水': '101043200', '綦江': '101043300', '酉阳': '101043400', '秀山': '101043600', '哈尔滨': '101050101',
               '双城': '101050102', '呼兰': '101050103', '阿城': '101050104', '宾县': '101050105', '依兰': '101050106',
               '巴彦': '101050107', '通河': '101050108', '方正': '101050109', '延寿': '101050110', '尚志': '101050111',
               '五常': '101050112', '木兰': '101050113', '齐齐哈尔': '101050201', '讷河': '101050202', '龙江': '101050203',
               '甘南': '101050204', '富裕': '101050205', '依安': '101050206', '拜泉': '101050207', '克山': '101050208',
               '克东': '101050209', '泰来': '101050210', '牡丹江': '101050301', '海林': '101050302', '穆棱': '101050303',
               '林口': '101050304', '绥芬河': '101050305', '宁安': '101050306', '东宁': '101050307', '佳木斯': '101050401',
               '汤原': '101050402', '抚远': '101050403', '桦川': '101050404', '桦南': '101050405', '同江': '101050406',
               '富锦': '101050407', '绥化': '101050501', '肇东': '101050502', '安达': '101050503', '海伦': '101050504',
               '明水': '101050505', '望奎': '101050506', '兰西': '101050507', '青冈': '101050508', '庆安': '101050509',
               '绥棱': '101050510', '黑河': '101050601', '嫩江': '101050602', '孙吴': '101050603', '逊克': '101050604',
               '五大连池': '101050605', '北安': '101050606', '大兴安岭': '101050701', '塔河': '101050702', '漠河': '101050703',
               '呼玛': '101050704', '呼中': '101050705', '新林': '101050706', '加格达奇': '101050708', '伊春': '101050801',
               '乌伊岭': '101050802', '五营': '101050803', '铁力': '101050804', '嘉荫': '101050805', '大庆': '101050901',
               '林甸': '101050902', '肇州': '101050903', '肇源': '101050904', '杜尔伯特': '101050905', '七台河': '101051002',
               '勃利': '101051003', '鸡西': '101051101', '虎林': '101051102', '密山': '101051103', '鸡东': '101051104',
               '鹤岗': '101051201', '绥滨': '101051202', '萝北': '101051203', '双鸭山': '101051301', '集贤': '101051302',
               '宝清': '101051303', '饶河': '101051304', '友谊': '101051305', '长春': '101060101', '农安': '101060102',
               '德惠': '101060103', '九台': '101060104', '榆树': '101060105', '双阳': '101060106', '吉林': '101060201',
               '舒兰': '101060202', '永吉': '101060203', '蛟河': '101060204', '磐石': '101060205', '桦甸': '101060206',
               '延吉': '101060301', '敦化': '101060302', '安图': '101060303', '汪清': '101060304', '和龙': '101060305',
               '龙井': '101060307', '珲春': '101060308', '图们': '101060309', '四平': '101060401', '双辽': '101060402',
               '梨树': '101060403', '公主岭': '101060404', '伊通': '101060405', '通化': '101060501', '梅河口': '101060502',
               '柳河': '101060503', '辉南': '101060504', '集安': '101060505', '通化县': '101060506', '白城': '101060601',
               '洮南': '101060602', '大安': '101060603', '镇赉': '101060604', '通榆': '101060605', '辽源': '101060701',
               '东丰': '101060702', '东辽': '101060703', '松原': '101060801', '乾安': '101060802', '前郭': '101060803',
               '长岭': '101060804', '扶余': '101060805', '白山': '101060901', '靖宇': '101060902', '临江': '101060903',
               '东岗': '101060904', '长白': '101060905', '抚松': '101060906', '江源': '101060907', '沈阳': '101070101',
               '辽中': '101070103', '康平': '101070104', '法库': '101070105', '新民': '101070106', '大连': '101070201',
               '瓦房店': '101070202', '金州': '101070203', '普兰店': '101070204', '旅顺': '101070205', '长海': '101070206',
               '庄河': '101070207', '鞍山': '101070301', '台安': '101070302', '岫岩': '101070303', '海城': '101070304',
               '抚顺': '101070401', '新宾': '101070402', '清原': '101070403', '章党': '101070404', '本溪': '101070501',
               '本溪县': '101070502', '桓仁': '101070504', '丹东': '101070601', '凤城': '101070602', '宽甸': '101070603',
               '东港': '101070604', '锦州': '101070701', '凌海': '101070702', '义县': '101070704', '黑山': '101070705',
               '北镇': '101070706', '营口': '101070801', '大石桥': '101070802', '盖州': '101070803', '阜新': '101070901',
               '彰武': '101070902', '辽阳': '101071001', '辽阳县': '101071002', '灯塔': '101071003', '弓长岭': '101071004',
               '铁岭': '101071101', '开原': '101071102', '昌图': '101071103', '西丰': '101071104', '调兵山': '101071105',
               '凌源': '101071203', '喀左': '101071204', '北票': '101071205', '建平县': '101071207', '盘锦': '101071301',
               '大洼': '101071302', '盘山': '101071303', '葫芦岛': '101071401', '建昌': '101071402', '绥中': '101071403',
               '兴城': '101071404', '呼和浩特': '101080101', '土左旗': '101080102', '托县': '101080103', '和林': '101080104',
               '清水河': '101080105', '呼市郊区': '101080106', '武川': '101080107', '包头': '101080201', '白云鄂博': '101080202',
               '满都拉': '101080203', '土右旗': '101080204', '固阳': '101080205', '达茂旗': '101080206', '希拉穆仁': '101080207',
               '乌海': '101080301', '集宁': '101080401', '卓资': '101080402', '化德': '101080403', '商都': '101080404',
               '兴和': '101080406', '凉城': '101080407', '察右前旗': '101080408', '察右中旗': '101080409', '察右后旗': '101080410',
               '四子王旗': '101080411', '丰镇': '101080412', '通辽': '101080501', '舍伯吐': '101080502', '科左中旗': '101080503',
               '科左后旗': '101080504', '青龙山': '101080505', '开鲁': '101080506', '库伦': '101080507', '奈曼': '101080508',
               '扎鲁特': '101080509', '巴雅尔吐胡硕': '101080511', '霍林郭勒': '101081108', '赤峰': '101080601', '阿鲁旗': '101080603',
               '浩尔吐': '101080604', '巴林左旗': '101080605', '巴林右旗': '101080606', '林西': '101080607', '克什克腾': '101080608',
               '翁牛特': '101080609', '岗子': '101080610', '喀喇沁': '101080611', '八里罕': '101080612', '宁城': '101080613',
               '敖汉': '101080614', '宝国吐': '101080615', '鄂尔多斯': '101080701', '达拉特': '101080703', '准格尔': '101080704',
               '鄂前旗': '101080705', '河南': '101080706', '伊克乌素': '101080707', '鄂托克': '101080708', '杭锦旗': '101080709',
               '乌审旗': '101080710', '伊金霍洛': '101080711', '乌审召': '101080712', '东胜': '101080713', '临河': '101080801',
               '五原': '101080802', '磴口': '101080803', '乌前旗': '101080804', '大佘太': '101080805', '乌中旗': '101080806',
               '乌后旗': '101080807', '海力素': '101080808', '那仁宝力格': '101080809', '杭锦后旗': '101080810', '锡林浩特': '101080901',
               '二连浩特': '101080903', '阿巴嘎': '101080904', '苏左旗': '101080906', '苏右旗': '101080907', '朱日和': '101080908',
               '东乌旗': '101080909', '西乌旗': '101080910', '太仆寺': '101080911', '镶黄旗': '101080912', '正镶白旗': '101080913',
               '正蓝旗': '101080914', '多伦': '101080915', '博克图': '101080916', '乌拉盖': '101080917', '海拉尔': '101081001',
               '小二沟': '101081002', '阿荣旗': '101081003', '莫力达瓦': '101081004', '鄂伦春旗': '101081005', '鄂温克旗': '101081006',
               '陈旗': '101081007', '新左旗': '101081008', '新右旗': '101081009', '满洲里': '101081010', '牙克石': '101081011',
               '扎兰屯': '101081012', '额尔古纳': '101081014', '根河': '101081015', '图里河': '101081016', '高力板': '101080510',
               '乌兰浩特': '101081101', '阿尔山': '101081102', '科右中旗': '101081103', '胡尔勒': '101081104', '扎赉特': '101081105',
               '索伦': '101081106', '突泉': '101081107', '科右前旗': '101081109', '阿左旗': '101081201', '阿右旗': '101081202',
               '额济纳': '101081203', '拐子湖': '101081204', '吉兰太': '101081205', '锡林高勒': '101081206', '头道湖': '101081207',
               '中泉子': '101081208', '诺尔公': '101081209', '雅布赖': '101081210', '乌斯泰': '101081211', '孪井滩': '101081212',
               '石家庄': '101090101', '井陉': '101090102', '正定': '101090103', '栾城': '101090104', '行唐': '101090105',
               '灵寿': '101090106', '高邑': '101090107', '深泽': '101090108', '赞皇': '101090109', '无极': '101090110',
               '平山': '101090111', '元氏': '101090112', '赵县': '101090113', '辛集': '101090114', '藁城': '101090115',
               '晋州': '101090116', '新乐': '101090117', '鹿泉': '101090118', '保定': '101090201', '满城': '101090202',
               '阜平': '101090203', '徐水': '101090204', '唐县': '101090205', '高阳': '101090206', '容城': '101090207',
               '涞源': '101090209', '望都': '101090210', '安新': '101090211', '易县': '101090212', '曲阳': '101090214',
               '蠡县': '101090215', '顺平': '101090216', '雄县': '101090217', '涿州': '101090218', '定州': '101090219',
               '安国': '101090220', '高碑店': '101090221', '涞水': '101090222', '定兴': '101090223', '清苑': '101090224',
               '博野': '101090225', '张家口': '101090301', '宣化': '101090302', '张北': '101090303', '康保': '101090304',
               '沽源': '101090305', '尚义': '101090306', '蔚县': '101090307', '阳原': '101090308', '怀安': '101090309',
               '万全': '101090310', '怀来': '101090311', '涿鹿': '101090312', '赤城': '101090313', '崇礼': '101090314',
               '承德': '101090402', '承德县': '101090403', '兴隆': '101090404', '平泉': '101090405', '滦平': '101090406',
               '隆化': '101090407', '丰宁': '101090408', '宽城': '101090409', '围场': '101090410', '唐山': '101090501',
               '丰南': '101090502', '丰润': '101090503', '滦县': '101090504', '滦南': '101090505', '乐亭': '101090506',
               '迁西': '101090507', '玉田': '101090508', '唐海': '101090509', '遵化': '101090510', '迁安': '101090511',
               '曹妃甸': '101090512', '廊坊': '101090601', '固安': '101090602', '永清': '101090603', '香河': '101090604',
               '大城': '101090605', '文安': '101090606', '大厂': '101090607', '霸州': '101090608', '三河': '101090609',
               '沧州': '101090701', '青县': '101090702', '东光': '101090703', '海兴': '101090704', '盐山': '101090705',
               '肃宁': '101090706', '南皮': '101090707', '吴桥': '101090708', '献县': '101090709', '孟村': '101090710',
               '泊头': '101090711', '任丘': '101090712', '黄骅': '101090713', '河间': '101090714', '沧县': '101090716',
               '衡水': '101090801', '枣强': '101090802', '武邑': '101090803', '武强': '101090804', '饶阳': '101090805',
               '安平': '101090806', '故城': '101090807', '景县': '101090808', '阜城': '101090809', '冀州': '101090810',
               '深州': '101090811', '邢台': '101090901', '临城': '101090902', '内丘': '101090904', '柏乡': '101090905',
               '隆尧': '101090906', '南和': '101090907', '宁晋': '101090908', '巨鹿': '101090909', '新河': '101090910',
               '广宗': '101090911', '平乡': '101090912', '威县': '101090913', '清河': '101090914', '临西': '101090915',
               '南宫': '101090916', '沙河': '101090917', '任县': '101090918', '邯郸': '101091001', '峰峰': '101091002',
               '临漳': '101091003', '成安': '101091004', '大名': '101091005', '涉县': '101091006', '磁县': '101091007',
               '肥乡': '101091008', '永年': '101091009', '邱县': '101091010', '鸡泽': '101091011', '广平': '101091012',
               '馆陶': '101091013', '魏县': '101091014', '曲周': '101091015', '武安': '101091016', '秦皇岛': '101091101',
               '青龙': '101091102', '昌黎': '101091103', '抚宁': '101091104', '卢龙': '101091105', '北戴河': '101091106',
               '太原': '101100101', '清徐': '101100102', '阳曲': '101100103', '娄烦': '101100104', '古交': '101100105',
               '尖草坪区': '101100106', '小店区': '101100107', '大同': '101100201', '阳高': '101100202', '大同县': '101100203',
               '天镇': '101100204', '广灵': '101100205', '灵丘': '101100206', '浑源': '101100207', '左云': '101100208',
               '阳泉': '101100301', '盂县': '101100302', '平定': '101100303', '晋中': '101100401', '榆次': '101100402',
               '榆社': '101100403', '左权': '101100404', '和顺': '101100405', '昔阳': '101100406', '寿阳': '101100407',
               '太谷': '101100408', '祁县': '101100409', '平遥': '101100410', '灵石': '101100411', '介休': '101100412',
               '长治': '101100501', '黎城': '101100502', '屯留': '101100503', '潞城': '101100504', '襄垣': '101100505',
               '平顺': '101100506', '武乡': '101100507', '沁县': '101100508', '长子': '101100509', '沁源': '101100510',
               '壶关': '101100511', '晋城': '101100601', '沁水': '101100602', '阳城': '101100603', '陵川': '101100604',
               '高平': '101100605', '泽州': '101100606', '临汾': '101100701', '曲沃': '101100702', '永和': '101100703',
               '隰县': '101100704', '大宁': '101100705', '吉县': '101100706', '襄汾': '101100707', '蒲县': '101100708',
               '汾西': '101100709', '洪洞': '101100710', '霍州': '101100711', '乡宁': '101100712', '翼城': '101100713',
               '侯马': '101100714', '浮山': '101100715', '安泽': '101100716', '古县': '101100717', '运城': '101100801',
               '临猗': '101100802', '稷山': '101100803', '万荣': '101100804', '河津': '101100805', '新绛': '101100806',
               '绛县': '101100807', '闻喜': '101100808', '垣曲': '101100809', '永济': '101100810', '芮城': '101100811',
               '夏县': '101100812', '平陆': '101100813', '朔州': '101100901', '平鲁': '101100902', '山阴': '101100903',
               '右玉': '101100904', '应县': '101100905', '怀仁': '101100906', '忻州': '101101001', '定襄': '101101002',
               '五台县': '101101003', '河曲': '101101004', '偏关': '101101005', '神池': '101101006', '宁武': '101101007',
               '代县': '101101008', '繁峙': '101101009', '五台山': '101101010', '保德': '101101011', '静乐': '101101012',
               '岢岚': '101101013', '五寨': '101101014', '原平': '101101015', '吕梁': '101101100', '离石': '101101101',
               '临县': '101101102', '兴县': '101101103', '岚县': '101101104', '柳林': '101101105', '石楼': '101101106',
               '方山': '101101107', '交口': '101101108', '中阳': '101101109', '孝义': '101101110', '汾阳': '101101111',
               '文水': '101101112', '交城': '101101113', '西安': '101110101', '长安': '101110102', '临潼': '101110103',
               '蓝田': '101110104', '周至': '101110105', '户县': '101110106', '高陵': '101110107', '咸阳': '101110200',
               '三原': '101110201', '礼泉': '101110202', '永寿': '101110203', '淳化': '101110204', '泾阳': '101110205',
               '武功': '101110206', '乾县': '101110207', '彬县': '101110208', '长武': '101110209', '旬邑': '101110210',
               '兴平': '101110211', '延安': '101110300', '延长': '101110301', '延川': '101110302', '子长': '101110303',
               '宜川': '101110304', '富县': '101110305', '志丹': '101110306', '安塞': '101110307', '甘泉': '101110308',
               '洛川': '101110309', '黄陵': '101110310', '黄龙': '101110311', '吴起': '101110312', '榆林': '101110401',
               '府谷': '101110402', '神木': '101110403', '佳县': '101110404', '定边': '101110405', '靖边': '101110406',
               '横山': '101110407', '米脂': '101110408', '子洲': '101110409', '绥德': '101110410', '吴堡': '101110411',
               '清涧': '101110412', '榆阳': '101110413', '渭南': '101110501', '华县': '101110502', '潼关': '101110503',
               '大荔': '101110504', '白水': '101110505', '富平': '101110506', '蒲城': '101110507', '澄城': '101110508',
               '合阳': '101110509', '韩城': '101110510', '华阴': '101110511', '商洛': '101110601', '洛南': '101110602',
               '柞水': '101110603', '商州': '101110604', '镇安': '101110605', '丹凤': '101110606', '商南': '101110607',
               '山阳': '101110608', '安康': '101110701', '紫阳': '101110702', '石泉': '101110703', '汉阴': '101110704',
               '旬阳': '101110705', '岚皋': '101110706', '平利': '101110707', '白河': '101110708', '镇坪': '101110709',
               '宁陕': '101110710', '汉中': '101110801', '略阳': '101110802', '勉县': '101110803', '留坝': '101110804',
               '洋县': '101110805', '城固': '101110806', '西乡': '101110807', '佛坪': '101110808', '宁强': '101110809',
               '南郑': '101110810', '镇巴': '101110811', '宝鸡': '101110901', '千阳': '101110903', '麟游': '101110904',
               '岐山': '101110905', '凤翔': '101110906', '扶风': '101110907', '眉县': '101110908', '太白': '101110909',
               '凤县': '101110910', '陇县': '101110911', '陈仓': '101110912', '铜川': '101111001', '耀县': '101111002',
               '宜君': '101111003', '耀州': '101111004', '杨凌': '101111101', '济南': '101120101', '长清': '101120102',
               '商河': '101120103', '章丘': '101120104', '平阴': '101120105', '济阳': '101120106', '青岛': '101120201',
               '崂山': '101120202', '即墨': '101120204', '胶州': '101120205', '胶南': '101120206', '莱西': '101120207',
               '平度': '101120208', '淄博': '101120301', '淄川': '101120302', '博山': '101120303', '高青': '101120304',
               '周村': '101120305', '沂源': '101120306', '桓台': '101120307', '临淄': '101120308', '德州': '101120401',
               '武城': '101120402', '临邑': '101120403', '陵县': '101120404', '齐河': '101120405', '乐陵': '101120406',
               '庆云': '101120407', '平原': '101120408', '宁津': '101120409', '夏津': '101120410', '禹城': '101120411',
               '烟台': '101120501', '莱州': '101120502', '长岛': '101120503', '蓬莱': '101120504', '龙口': '101120505',
               '招远': '101120506', '栖霞': '101120507', '福山': '101120508', '牟平': '101120509', '莱阳': '101120510',
               '海阳': '101120511', '潍坊': '101120601', '青州': '101120602', '寿光': '101120603', '临朐': '101120604',
               '昌乐': '101120605', '昌邑': '101120606', '安丘': '101120607', '高密': '101120608', '诸城': '101120609',
               '济宁': '101120701', '嘉祥': '101120702', '微山': '101120703', '鱼台': '101120704', '兖州': '101120705',
               '金乡': '101120706', '汶上': '101120707', '泗水': '101120708', '梁山': '101120709', '曲阜': '101120710',
               '邹城': '101120711', '泰安': '101120801', '新泰': '101120802', '肥城': '101120804', '东平': '101120805',
               '宁阳': '101120806', '临沂': '101120901', '莒南': '101120902', '沂南': '101120903', '苍山': '101120904',
               '临沭': '101120905', '郯城': '101120906', '蒙阴': '101120907', '平邑': '101120908', '费县': '101120909',
               '沂水': '101120910', '菏泽': '101121001', '鄄城': '101121002', '郓城': '101121003', '东明': '101121004',
               '定陶': '101121005', '巨野': '101121006', '曹县': '101121007', '成武': '101121008', '单县': '101121009',
               '滨州': '101121101', '博兴': '101121102', '无棣': '101121103', '阳信': '101121104', '惠民': '101121105',
               '沾化': '101121106', '邹平': '101121107', '东营': '101121201', '河口': '101121202', '垦利': '101121203',
               '利津': '101121204', '广饶': '101121205', '威海': '101121301', '文登': '101121302', '荣成': '101121303',
               '乳山': '101121304', '成山头': '101121305', '石岛': '101121306', '枣庄': '101121401', '薛城': '101121402',
               '峄城': '101121403', '台儿庄': '101121404', '滕州': '101121405', '日照': '101121501', '五莲': '101121502',
               '莒县': '101121503', '莱芜': '101121601', '聊城': '101121701', '冠县': '101121702', '阳谷': '101121703',
               '高唐': '101121704', '茌平': '101121705', '东阿': '101121706', '临清': '101121707', '莘县': '101121709',
               '乌鲁木齐': '101130101', '小渠子': '101130103', '达坂城': '101130105', '乌鲁木齐牧试站': '101130108', '天池': '101130109',
               '白杨沟': '101130110', '克拉玛依': '101130201', '乌尔禾': '101130202', '白碱滩': '101130203', '石河子': '101130301',
               '炮台': '101130302', '莫索湾': '101130303', '昌吉': '101130401', '呼图壁': '101130402', '米泉': '101130403',
               '阜康': '101130404', '吉木萨尔': '101130405', '奇台': '101130406', '玛纳斯': '101130407', '木垒': '101130408',
               '蔡家湖': '101130409', '吐鲁番': '101130501', '托克逊': '101130502', '鄯善': '101130504', '库尔勒': '101130601',
               '轮台': '101130602'}

# 实例化,微信扫描登录
# cache_path=True 保存缓存登录信息
bot = Bot(cache_path='wxpy.pkl', qr_path='qr.png')
# 调用图灵机器人API,发送消息并获得机器人的回复
tuling = Tuling(api_key='be43344e543d419198e4bc17c9511c5f')

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}

# 获取天气信息
def capture_weather(city_code):
    url_weather = f'http://www.weather.com.cn/weather/{city_code}.shtml'
    weather_info = dict()

    response = requests.get(url=url_weather, headers=headers)
    # 数据清洗
    et = etree.HTML(response.content.decode('utf-8'))
    # 日期
    today = et.xpath('//div[@id="7d"]/ul/li[1]/h1/text()')[0]
    weather_info['日期'] = today
    # 天气
    weather = et.xpath('//div[@id="7d"]/ul/li[1]/p/text()')[0]
    weather_info['天气'] = weather
    # 温度
    temperature = et.xpath('//div[@id="7d"]/ul/li[1]/p[2]/i/text()')[0]
    weather_info['温度'] = temperature
    # 风级
    wind = et.xpath('//div[@id="7d"]/ul/li[1]/p[3]/i/text()')[0]
    weather_info['风级'] = wind
    # 风向
    wind_direction = et.xpath('//div[@id="7d"]/ul/li[1]/p[3]/em/span/@title')[0]
    weather_info['风向'] = wind_direction
    # 穿衣
    dress = et.xpath('//li[@id="chuanyi"]/a/p/text()')[0]
    weather_info['温馨提示'] = dress

    return weather_info

# 爬取的天气信息重新组装
def process_info(weather_info):
    info = ''''''
    for key, value in weather_info.items():
        one = key + ':' + value + '\n'
        info += one

    return info

# 发送消息给好友
def reply_friend(info, friendName):
    # 扫描登录
    # cache_path=True 保存缓存登录信息
    # bot = Bot(cache_path='wxpy.pkl',qr_path='qr.png')
    # 获取好友
    girl_friend = bot.search(friendName)[0]
    # 发送消息
    girl_friend.send(info)


# 西安 101110101
# 获取城市信息
def search_city():
    city = entry.get()
    global city_code
    city_code = weatherCode[city]
    text.insert(tk.END, "{} 天气ID:{}".format(city, city_code))
    text.see(tk.END)
    text.update()


def search_friends():
    # 获取好友昵称
    global friendName
    friendName = entry2.get()
    text.insert(tk.END, "好友昵称:{}".format(friendName))
    text.see(tk.END)
    text.update()

    # 获取天气信息
    weather_info = capture_weather(city_code)
    global info
    info = process_info(weather_info)

    text.insert(tk.END, "天气信息:{}".format(info))
    text.see(tk.END)
    text.update()


def auto_reply():
    # 开始运行
    girl_friend = bot.search(friendName)[0]

    # 回复指定好友
    @bot.register(girl_friend)
    def auto_reply_all(msg):
        tuling.do_reply(msg)

    text.insert(tk.END, "对好友:{}, 自动回复功能已开启!".format(friendName))
    text.see(tk.END)
    text.update()

    bot.join()


def affirm_time():
    global time_num
    time_task = timer.get()
    # ("1小时", "1天", "1秒", "5秒")
    if time_task == "1小时":
        time_num = 1000 * 3600
    if time_task == "1天":
        time_num = 1000 * 3600 * 24
    if time_task == "1秒":
        time_num = 1000
    if time_task == "5秒":
        time_num = 1000 * 5

    text.insert(tk.END, "定时时间已设置:{}!".format(time_task))
    text.see(tk.END)
    text.update()

    text.insert(tk.END, "确认无误请点击 发送天气!")
    text.see(tk.END)
    text.update()


def sent_weather():
    reply_friend(info, friendName)

    text.insert(tk.END, "好友: {}, 天气信息已发送!".format(friendName))
    text.see(tk.END)
    text.update()
    # 添加延时任务,tkinter自动的延时函数after()
    root.after(time_num, sent_weather)


# 创建界面
root = tk.Tk()
# 添加标题
root.title('WeChat')
# 设置窗口大小 x 小写x连,不能用乘号 后面两位是x,y坐标,固定初始位置
root.geometry('545x460+400+150')
# 固定大小
root.resizable(height=False, width=False)

# 城市 标签控件
label = tk.Label(root, text='请输入城市名:', font=('华文行楷', 15))
# 标签定位 grid 网格式定位
label.grid(row=0, column=0, sticky=tk.W)  # 默认 row=0,column=0
# 输入框
entry = tk.Entry(root, font=('隶书', 15), width=38)
# 定位 第0行 第1列
entry.grid(row=0, column=1, sticky=tk.W)
# command 点击触发方法  搜索歌曲
button5 = tk.Button(root, text='搜索城市', font=('隶书', 15), fg='green', command=search_city)
# 定位 sticky 对齐方式 W E N S  东南西北
button5.grid(row=0, column=1, sticky=tk.E)

# 好友 标签控件
label2 = tk.Label(root, text='请输入好友昵称:', font=('华文行楷', 15))
# 标签定位 grid 网格式定位
label2.grid(row=1, column=0, sticky=tk.W)  # 默认 row=0,column=0
# 输入框
entry2 = tk.Entry(root, font=('隶书', 15), width=38)
# 定位 第0行 第1列
entry2.grid(row=1, column=1, sticky=tk.W)
# command 点击触发方法  搜索歌曲
button2 = tk.Button(root, text='搜索好友', font=('隶书', 15), fg='green', command=search_friends)
# 定位 sticky 对齐方式 W E N S  东南西北
button2.grid(row=1, column=1, sticky=tk.E)

# 列表框
text = tk.Listbox(root, font=('楷书', 12), width=68, heigh=18)
# 定位 columnspan 组件横跨的列数
text.grid(row=2, columnspan=2)

# 标签控件
label1 = tk.Label(root, text='设置定时时间:', font=('华文行楷', 15))
# 标签定位 grid 网格式定位
label1.grid(row=3, column=0, sticky=tk.W)  # 默认 row=0,column=0

# 定时任务下拉框
# 窗体自带的文本,新建一个值
timer = tk.StringVar()
comboxlist = ttk.Combobox(root, width=12, textvariable=timer)  # 初始化
comboxlist["values"] = ("1小时", "1天", "1秒", "5秒")
comboxlist.grid(column=1, row=3, sticky=tk.W)
comboxlist.current(0)  # 选择第一个

# 点击按钮
button = tk.Button(root, text='确认时间', font=('隶书', 15), fg='red', command=affirm_time)
# 定位 sticky 对齐方式 W E N S  东南西北
button.grid(row=3, column=1, sticky=tk.E)

# 点击按钮
button = tk.Button(root, text='自动回复', font=('隶书', 15), fg='blue', command=auto_reply)
# 定位 sticky 对齐方式 W E N S  东南西北
button.grid(row=4, column=0, sticky=tk.W)

# command 点击触发方法
button1 = tk.Button(root, text='发送天气', font=('隶书', 15), fg='blue', command=sent_weather)
# 定位 sticky 对齐方式 W E N S  东南西北
button1.grid(row=4, column=1, sticky=tk.E)

# 显示界面
root.mainloop()

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值