[python]代码库
# 这里必须用sys新建模块路径,不然下面的模块会导入不了
# import sys
# sys.path.append(r'C:\Users\zhubiping\appdata\roaming\tc\python-3.6.4\lib\site-packages')
'''
提示:
1.开头的登录直接在用户名那里输入‘1’就可以进去了
2.有一个叫‘Nominatim’的模块方法可能会没有,需要导入(其他模块也是一样)
'''
import random
import re
import os
import time
import easygui as e
import tkinter as tk
from tkinter import messagebox,filedialog
from geopy.geocoders import Nominatim
import string
import socket
# 用于获取网页内容的模块和解析网页源代码的模块
import requests
from bs4 import BeautifulSoup
from urllib.parse import urlencode
import urllib.parse
names = ['mikekil']
passwords = ['123456']
title = '您的智能助手'
#Errors
cityNotFoundError = "错误:此城市不属于中国之内。\n或者系统找不到此地址,可另换输入内容或点击‘当前地址’获取"
root = tk.Tk()
root.withdraw()
#===============================工具方法===================================#
def is_all_chinese(strs): #判断是否是纯中文
for i in strs:
if not '\u4e00' <= i <= '\u9fa5':
return False
return True
def is_all_eng(strs): #判断是否是纯英文
for i in strs:
if i not in string.ascii_lowercase+string.ascii_uppercase:
return False
return True
#===============================工具方法===================================#
class Getoutofloop(Exception):
pass
def get_host_ip():
"""
查询本机ip地址
:return:
"""
try:
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.connect(('8.8.8.8',80))
ip=s.getsockname()[0]
finally:
s.close()
return ip
def SignIn():
isRun = True
content = e.multpasswordbox("请先输入用户名或密码:",title,("用户名:","密码:"),())
while isRun:
if content == None:
exit(0)
elif content[0] == "1":
isRun = False
break
if content[0] in names:
for i in range(len(names)):
if names[i] == content[0] and passwords[i] == content[1]:
e.msgbox("-登录成功-")
isRun = False
break
else:
content = e.multpasswordbox("(密码错误!)\n请先输入用户名或密码:",title,("用户名:","密码:"),())
continue
break
else:
e.msgbox("-该用户不存在-")
content = e.multpasswordbox("请先输入用户名或密码:",title,("用户名:","密码:"),())
def delete_Musics():
paths = filedialog.askopenfilenames(title = "choose a Music",
initialdir = "C:/",
filetypes=[("MP3","mp3")])
for path in paths:
os.remove(path)
def getWeatherData(cityName):
url = 'http://wthrcdn.etouch.cn/weather_mini?city=' + cityName
response = requests.get(url)
weatherDict = response.json()
print(weatherDict)
if weatherDict['desc'] == 'OK':
# 获取城市名
global city, wendu,month,forecast
city = weatherDict['data']['city']
# 获取当前温度
wendu = weatherDict['data']['wendu'] + '℃ '
month = time.strftime('%m')
forecast = weatherDict['data']['forecast']
# 获取天气类型
type = forecast[0]['type']
# 获取最高温度
high = forecast[0]['high']
# 获取最低温度
low = forecast[0]['low']
tip = weatherDict['data']['ganmao']
content = '城市:'+city+'\n当前温度:'+wendu+'\n天气:'+type+'\n最高温度:'+high+'\n最低温度:'+low+'\n注意:'+tip
else:
content = '-您的网络不佳-'
return content
def WeatherGet():
cityNames = ['北京','上海','广州','深圳','哈尔滨','辽宁','新疆','海南','重庆',
'武汉','浙江','杭州','云南','桂林','南宁']
mode = e.buttonbox("请选择城市:",title,['当前地址','选择地址','输入地址','返回'])
if mode == "选择地址":
city = e.choicebox("请选择城市:",title,cityNames)
elif mode == "输入地址":
cityPos = e.enterbox("请输入城市:",title)
if '路' or '街' or '区' or '镇' in cityPos:
try:
geolocator = Nominatim(user_agent="aaa515")
location = geolocator.geocode(cityPos)
pos = location.address
country = pos.split(', ')[::-1][0]
city = pos.split(', ')[::-1][3]
if country != '中国':
e.msgbox(cityNotFoundError,title)
return
except:
e.exceptionbox("系统没有找到您的位置,以下是系统报错信息,快上报给作者吧!","Error404 系统出错啦!")
return
else:
city = cityPos
elif mode == "返回":
return
else:
messagebox.showinfo("提示", "‘当前地址’功能尚未完善,快去试试其他功能吧")
return
# cityIP = get_host_ip()
# print(cityIP)
# city = cityIP
e.textbox("结果如下:",title,getWeatherData(city))
start_Ask()
def Get_BaiduSearch():
okBths = ['好的','嗯']
image = r"C:\Users\zhubiping\Desktop\MIKE_FILES\images\ordinary普通图片\wotomalen.gif"
content = e.enterbox("输入关键名词(直接回车可以退出):",title)
if content == None or content == "":
return
try:
# 分解问题(转换格式)
q = urllib.parse.quote(content)
# URL百度搜索地址
url = 'https://baike.baidu.com/item/'+ q
# 获取百度网页内容
html = urllib.request.urlopen(url)
# 读取百度网页内容
content = html.read().decode('utf-8')
html.close()
# 解析代码
soup = BeautifulSoup(content, "lxml")
# 抽取内容
text = soup.find('div', class_="lemma-summary").children
result = ''
# 获取内容
for x in text:
word = re.sub(re.compile(r"<(.+?)>"),'',str(x))
result += str(re.sub(re.compile(r"\[(.+?)\]"),'',word))
# 显示
e.textbox('结果如下:',title,result)
except:
e.msgbox("我的脑子有点乱>﹏<。",title,okBths[0])
start_Ask()
def IntelligentTools():
toolsList = ['返回','文字识别','车型识别','图片特效','图片上色',"人物动漫化"]
modeTop = e.choicebox('请选择您需要打开的智能工具(此功能需要百度AI还有其他文件,如有需要请告知作者)',title,choices = toolsList)
if modeTop == toolsList[0]:
return
elif modeTop == toolsList[1]:
#os.system("python index.py")
messagebox.showinfo("提示", "‘文字识别’功能尚未完善,快去试试其他功能吧")
elif modeTop == toolsList[2]:
messagebox.showinfo("提示", "‘车型识别’功能尚未完善,快去试试其他功能吧")
#os.system("python VehicleIdentification.py")
elif modeTop == toolsList[3]:
messagebox.showinfo("提示", "‘图片特效’功能尚未完善,快去试试其他功能吧")
#os.system("python PictureEffects.py")
elif modeTop == toolsList[4]:
messagebox.showinfo("提示", "‘图片上色’功能尚未完善,快去试试其他功能吧")
#os.system("python PictureColoring.py")
elif modeTop == toolsList[5]:
messagebox.showinfo("提示", "‘人物动漫化’功能尚未完善,快去试试其他功能吧")
#os.system("python -.py")
def Musics_DownLoad():
header={ # 伪造浏览器头部,不然获取不到网易云音乐的页面源代码。
'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',
}
topList = ['飙升榜','新歌榜','原创榜','热歌榜','返回']
songTop = e.choicebox('选择下载的歌榜','Music Download',choices = topList)
# 这是网易云音乐热歌榜的链接(其实是嵌套在网页里面含有歌曲数据的页面框架的真实链接)
link1 = "https://music.163.com/discover/toplist?id=3778678"
link2 = "https://music.163.com/discover/toplist?id=19723756"
link3 = "https://music.163.com/discover/toplist?id=2884035"
link4 = "https://music.163.com/discover/toplist?id=3779629"
if songTop == "" or songTop == None:
songTop = e.choicebox('选择下载的歌榜','Music Download',choices = topList)
elif songTop == topList[0]: link = link1
elif songTop == topList[1]: link = link2
elif songTop == topList[2]: link = link3
elif songTop == topList[3]: link = link4
else: return
# 通过 requests 模块的 get 方法获取网页数据
r = requests.get(link, headers=header)
# 获取网页内容
html = r.content
# 通过 BeautifulSoup 模块解析网页,具体请参考官方文档。
soup = BeautifulSoup(html, "html.parser")
# 通过分析网页源代码发现排行榜中的歌曲信息全部放在类名称为 f-hide 的 ul 中,
# 于是根据特殊的类名称查找相应 ul,然后找到里面的全部 a 标签,
# 限制数量为200,即排行榜的前 200 首歌。
songs = soup.find("ul", class_="f-hide").select("a", limit=200)
root = tk.Tk()
root.withdraw()
namelist = []
linklist = []
for s in songs: # 遍历输出数组 songs 中的内容
song_id = s['href'][9:] # 只截取歌曲链接中的 ID 部分,因为网页中链接的形式为“/song?id=496870798”,从 = 号之后的就是歌曲的 ID 号。
name = s.text # 获取 a 标签的文本内容,即歌曲的名称。
namelist.append(name)
song_down_link = "http://music.163.com/song/media/outer/url?id=" + song_id + ".mp3"
linklist.append(song_down_link)
print(namelist)
song_name = e.choicebox('选择下载的歌曲','Music Download',choices = namelist)
for i in range(len(namelist)):
if namelist[i] == song_name:
song_down_link = linklist[i]
break
response = requests.get(song_down_link, headers=header).content
path = filedialog.askdirectory()
# print(song_name)
with open(path + "/" + song_name + ".mp3", 'ab+') as f:
f.write(response)
messagebox.showinfo("提示", "下载完成")
start_Ask()
def start_Ask():
global action
list = ['EXIT','百度搜索','音乐下载',"删除音乐文件","天气查询","智慧识别"]
action = e.buttonbox("请选择您现在要做的操作:","智能助手",list)
while action != list[0]:
if action == list[0]:
break
elif action == list[1]:
Get_BaiduSearch()
action = e.buttonbox("请选择您现在要做的操作:","智能助手",list)
elif action == list[2]:
Musics_DownLoad()
action = e.buttonbox("请选择您现在要做的操作:","智能助手",list)
elif action == list[3]:
delete_Musics()
action = e.buttonbox("请选择您现在要做的操作:","智能助手",list)
elif action == list[4]:
WeatherGet()
action = e.buttonbox("请选择您现在要做的操作:","智能助手",list)
elif action == list[5]:
IntelligentTools()
action = e.buttonbox("请选择您现在要做的操作:","智能助手",list)
exit()
SignIn()
start_Ask()