diff --git a/README.md b/README.md index 87113b018b5fcdc35415187fe4e65a33e9e586db..f84f38f439540d11bf50dfd71b9b55df6418193e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,132 @@ -# netease-cloud-fastplay -网易云音乐快速听歌,个性化纠正账号的偏好 +# 网易云音乐个性化纠正工具 + +简单来说就是可以快速增加指定歌曲的播放次数。 + +

+ Author + PHP + +

+ + + +[📷 效果演示](#效果演示) + +[🎁 下载地址](#下载地址) + +[🔔 注意事项](#注意事项) + +[🎨 项目结构](#项目结构) + +[👻 免责声明](#免责声明) + + + +------ + + + +# 效果演示 + +使用前可以看到两首歌分别是**92**次和**41**次 + +![使用前](https://s1.ax1x.com/2020/07/08/UZyQv8.png) + +使用后两首各自涨了**300**首 + +![使用后](https://s1.ax1x.com/2020/07/08/UZyUCq.png) + +有人可能会问上面那个累计播放次数**2218**首没有变化,那是因为总数的累计播放只计算不重复的歌曲。 + +调用的API地址是(这个API可以自己搭建): + +![](https://s1.ax1x.com/2020/07/08/UZ6geg.png) + +打开软件填好账号密码(**MD5**)和**API**就可以开始执行任务了 + +软件的截图是这样 + +![](https://s1.ax1x.com/2020/07/10/UuoCMF.png) + +这个歌单的`id`为`5101628912`,一共有三首歌,播放次数填写为`2`,点击开始执行后等待几秒钟便可以在软件下方的状态栏看到反馈。 + +# 下载地址 + +软件地址:[https://zaincheung.lanzous.com/iNYixehamha](https://zaincheung.lanzous.com/iNYixehamha) + +软件项目地址:[https://github.com/ZainCheung/netease-cloud-fastplay](https://github.com/ZainCheung/netease-cloud-fastplay) + +api接口项目地址:[https://github.com/ZainCheung/netease-cloud-api](https://github.com/ZainCheung/netease-cloud-api) + +api的Demo演示地址:[https://netease-cloud-api.glitch.me](https://netease-cloud-api.glitch.me) + +------ + + + +# 注意事项 + +### 1. API + +API最好自己搭建,使用默认的API将会因为使用的人数较多导致**非常慢甚至进不去**,这个软件使用的API依旧是上次的API,只不过项目新增了接口,如果之前你搭建过就不需要重新搭建了,只需要复制项目的`index.php`文件的全部内容,然后粘贴到你的api项目里的`index.php`里面去,重启项目即可。 + +API项目最新地址:[https://github.com/ZainCheung/netease-cloud-api](https://github.com/ZainCheung/netease-cloud-api) + +### 2. 密码 + +**密码必须自己前往MD5加密网站进行转换!!制作时选择32位小写!!!** + +本软件不会将你的原文密码上传到服务器,请放心使用 + +在线“制作”MD5:[https://tool.chinaz.com/tools/md5.aspx](https://tool.chinaz.com/tools/md5.aspx) + +### 3. 听歌次数 + +注意:播放次数不建议设置太大,可以先设置几十试试。 + +### 4. 初衷 + +这款软件的开发初衷是为了帮助使用过网易云音乐自动升级的用户,在系统推送不够精准的情况下进行自我纠正,通过增加某几首歌的播放次数可以告知系统你的听歌偏好,以便系统为你推荐你喜欢的歌单以及歌曲。 + +### 5. 其他 + +点击执行任务之前请不要打开或者删除日志文件和配置文件! + +------ + +# 项目结构 + +``` +|-- 项目文件夹 + |-- LICENSE + |-- README.md + |-- init.config + |-- main.py + |-- ui.py + |-- api.py + |-- requirements.txt + |-- run.log +``` + +`LICENSE`:开源许可证 + +`README.md`:项目自述文件 + +`init.config`:配置文件 + +`main.py`:主程序 + +`ui.py`:界面模块 + +`api.py`:接口模块 + +`requirements.txt`:依赖清单 + +`run.log`:运行日志 + +# 免责声明 + +本项目的所有脚本、API以及软件仅用于个人学习开发测试,所有`网易云`相关字样版权属于网易公司,勿用于商业及非法用途,如产生法律纠纷与本人无关。 + +------ + diff --git a/api.py b/api.py new file mode 100644 index 0000000000000000000000000000000000000000..86b63d15247701f385f98fc5936f1380f71c8ec9 --- /dev/null +++ b/api.py @@ -0,0 +1,126 @@ +#coding:utf-8 +''' +@author: ZainCheung +@LastEditors: ZainCheung +@description:api模块 +@Date: 2020-07-09 +@LastEditTime: 2020-07-10 +''' +from configparser import ConfigParser +import json +import logging +import os +import requests + +current_path = os.getcwd() +path_log = current_path + '\\run.log' +path_config = current_path + '\\init.config' +logFile = open(path_log, encoding="utf-8", mode="a") +logging.basicConfig(stream=logFile, format="%(asctime)s %(name)s:%(levelname)s:%(message)s", datefmt="%Y-%m-%d %H:%M:%S", level=logging.INFO) + +class Task(object): + ''' + 对象的构造函数 + ''' + def __init__(self, conf): + self.uin = conf['uin'] + self.pwd = conf['pwd'] + self.api = conf['api'] + self.id = conf['id'] + self.time = conf['time'] + + def get_response(self, url, post_json): + ''' + 带上用户的cookie去发送数据 + url:完整的URL路径 + postJson:要以post方式发送的数据 + 返回response + ''' + response = requests.post(url, data=post_json, headers={ + 'Content-Type':'application/x-www-form-urlencoded'}, cookies=self.cookies) + return response + + def login(self): + ''' + 登陆函数 + ''' + data = {"uin":self.uin,"pwd":self.pwd} + if '@' in self.uin: + url = self.api + '?do=email' + else: + url = self.api + '?do=login' + try: + response = requests.post(url, data=data, headers={'Content-Type':'application/x-www-form-urlencoded'}) + except: + logging.error("服务器连接失败,请检查API以及当前网络环境") + return '服务器连接失败,请检查API以及当前网络环境' + else: + code = json.loads(response.text)['code'] + if code==200: + self.name = json.loads(response.text)['profile']['nickname'] + self.uid = json.loads(response.text)['account']['id'] + self.cookies = response.cookies.get_dict() + self.error = self.name + '登陆成功!' + self.state = True + logging.info(self.name + '登陆成功!') + else: + self.state = False + self.error = '登陆失败,请检查账号密码是否正确' + logging.error("登陆失败,请检查账号密码是否正确") + return self.error + + + ''' + 听歌 + ''' + def listen(self): + url = self.api + '?do=listen' + data = {"id":self.id, "time":self.time} + try: + response = self.get_response(url, data) + data = json.loads(response.text) + self.count = data['count'] + except: + logging.error("听歌失败,请检查API是否为最新版本!") + return '听歌失败,请检查API是否为最新版本!' + else: + logging.info("听歌成功,共听" + str(self.count) + "首") + return '听歌成功,共听' + str(self.count) + '首' + +''' +初始化:读取配置,配置文件为init.config +返回字典类型的配置对象 +''' +def init(): + config = ConfigParser() + config.read(path_config, encoding='UTF-8-sig') + uin = config.get('token', 'account') + pwd = config.get('token', 'password') + api = config.get('setting', 'api') + id = config.get('setting', 'id') + time = config.get('setting', 'time') + conf = { + 'uin': uin, + 'pwd': pwd, + 'api': api, + 'id': id, + 'time': time + } + return conf + +def save(conf): + ''' + 数据持久化 + ''' + config = ConfigParser() + config.read(path_config, encoding='UTF-8-sig') + config.set("token", "account", conf['uin']) + config.set("token", "password", conf['pwd']) + config.set("setting", "api", conf['api']) + config.set("setting", "id", conf['id']) + config.set("setting", "time", conf['time']) + try: + with open("init.config", "w+") as f: + config.write(f) + except ImportError: + pass diff --git a/init.config b/init.config new file mode 100644 index 0000000000000000000000000000000000000000..71f4bfc1d42ae191cc9ac519b5632e92ca3081b8 --- /dev/null +++ b/init.config @@ -0,0 +1,9 @@ +[token] +account = +password = + +[setting] +api = https://netease-cloud-api.glitch.me +id = 5101628912 +time = 20 + diff --git a/main.py b/main.py new file mode 100644 index 0000000000000000000000000000000000000000..fb5695b384cf7e5b08623341719995497955ba5e --- /dev/null +++ b/main.py @@ -0,0 +1,177 @@ +# -*- coding: utf-8 -*- +''' +@author: ZainCheung +@LastEditors: ZainCheung +@description:网易云音乐刷单曲播放次数 +@Date: 2020-07-09 +@LastEditTime: 2020-07-10 +''' + +import webbrowser +from threading import Timer +import re +import wx +import os + +#导入ui.py,api.py中内容 +import ui +import api + + + +class mainWin(ui.MainFrame): + ''' + 创建mainWin类并传入main.MyFrame作为父类 + ''' + def start(self, event): + ''' + 事件函数:开始执行按钮 + ''' + conf = { + 'uin': self.Ctrl_account.GetValue(), + 'pwd': self.Ctrl_password.GetValue(), + 'api': self.Ctrl_api.GetValue(), + 'id': self.Ctrl_id.GetValue(), + 'time': self.Ctrl_time.GetValue() + } + if self.check() is True: + api.save(conf) + self.conf = conf + self.button_start.SetLabel("正在执行中...") + self.button_start.Enable( False ) + Timer(0, self.taskPool, ()).start() + else: + pass + + def Event_openlog( self, event ): + ''' + 事件函数:菜单-查看日志 + ''' + os.system('notepad ' + api.path_log) + + def Event_openconfig( self, event ): + ''' + 事件函数:菜单-查看配置 + ''' + os.system('notepad ' + api.path_config) + + def Event_getApi( self, event ): + ''' + 事件函数:菜单-获取api + ''' + webbrowser.open('https://github.com/ZainCheung/netease-cloud-api') + + def Event_autoUp( self, event ): + ''' + 事件函数:菜单-自动升级 + ''' + webbrowser.open('https://www.52pojie.cn/thread-1208644-1-1.html') + + def Event_about( self, event ): + ''' + 事件函数:菜单-关于软件 + ''' + panel_about = ui.Dialog_about(None).Show() + + def Event_readme( self, event ): + ''' + 事件函数:菜单-使用帮助 + ''' + panel_readme = ui.Dialog_readme(None).Show() + + def Event_feedback( self, event ): + ''' + 事件函数:菜单-反馈问题 + ''' + webbrowser.open('https://github.com/ZainCheung/netease-cloud-fastplay/issues/new') + + def initData(self): + ''' + 初始化界面数据 + ''' + conf = api.init() + return conf + + + def check(self): + ''' + 检验输入数据的合法性 + ''' + account = self.Ctrl_account.GetValue() + password = self.Ctrl_password.GetValue() + api = self.Ctrl_api.GetValue() + id = self.Ctrl_id.GetValue() + time = self.Ctrl_time.GetValue() + + state_account = False + state_password = False + state_api = False + state_id = False + state_time = False + + com_phone = r'[1]+[\d]{10}$' + com_email = r'^[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+){0,4}@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+){0,4}$' + com_password = r'[abcdef\d]{32}$' + com_id = r'[\d]{10}$' + com_time = r'[\d]{1,5}$' + + if(account == ''): + self.Tipmsgbox('账号不能为空') + elif ('@' not in account): + if not re.match(com_phone, account): + self.Tipmsgbox('手机号格式不正确') + else: + state_account = True + elif not re.match(com_email, account): + self.Tipmsgbox('邮箱格式不正确') + else: + state_account = True + + if not re.match(com_password, password): + self.Tipmsgbox('密码格式不正确,请将你的密码转换为32位小写的MD5') + else: + state_password = True + + if api.startswith('https://') or api.startswith('http://'): + state_api = True + else: + self.Tipmsgbox('API格式不正确,应该以"https://"或者"http://"开头') + + if not re.match(com_id, id): + self.Tipmsgbox('歌单id格式不正确,应为10位数字,请前往网易云网站查看歌单ID') + else: + state_id = True + + if not re.match(com_time, time): + self.Tipmsgbox('播放格式不正确,应为1至99999之间的整数数字') + else: + state_time = True + + if state_account and state_password and state_api and state_id and state_time: + return True + else: + return False + + + def taskPool(self): + ''' + 任务池 + ''' + task = api.Task(self.conf) + self.statusBar.SetStatusText(task.login()) + try: + if task.state is True: + self.statusBar.SetStatusText(task.listen()) + except: + pass + self.button_start.SetLabel("执行完毕") + self.button_start.Enable( True ) + +''' +程序主入口 +''' +if __name__ == '__main__': + app = wx.App() + main_win = mainWin(None) + main_win.Show() + app.MainLoop() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..39fdc2dbebd1a2728e6d1daa536b51808fb95437 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +wxPython==4.1.0 +requests==2.20.0 diff --git a/run.log b/run.log new file mode 100644 index 0000000000000000000000000000000000000000..0545e88cd939943065243e7c30348f2bbd330cdc --- /dev/null +++ b/run.log @@ -0,0 +1 @@ +日志文件 diff --git a/ui.py b/ui.py new file mode 100644 index 0000000000000000000000000000000000000000..2f57156d11bf2eed2d46c2d68c6da549b513880b --- /dev/null +++ b/ui.py @@ -0,0 +1,246 @@ +# -*- coding: utf-8 -*- + +import wx +import wx.xrc + +########################################################################### +## Class MainFrame +########################################################################### + +class MainFrame ( wx.Frame ): + + def __init__( self, parent ): + wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"网易云音乐个性化纠正工具", pos = wx.DefaultPosition, size = wx.Size( 500,600 ), style = wx.CAPTION|wx.CLOSE_BOX|wx.MINIMIZE|wx.MINIMIZE_BOX|wx.SYSTEM_MENU|wx.TAB_TRAVERSAL ) + + conf = self.initData() + self.SetSizeHints( wx.DefaultSize, wx.DefaultSize ) + self.SetBackgroundColour( wx.Colour( 240, 240, 240 ) ) + + gbSizer1 = wx.GridBagSizer( 0, 0 ) + gbSizer1.SetFlexibleDirection( wx.BOTH ) + gbSizer1.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.Text_account = wx.StaticText( self, wx.ID_ANY, u"账号", wx.Point( -1,-1 ), wx.Size( 50,-1 ), 0 ) + self.Text_account.Wrap( -1 ) + self.Text_account.SetFont( wx.Font( 12, 70, 90, 92, False, "微软雅黑" ) ) + + gbSizer1.Add( self.Text_account, wx.GBPosition( 0, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 20 ) + + self.Ctrl_account = wx.TextCtrl( self, wx.ID_ANY, conf['uin'], wx.DefaultPosition, wx.Size( 300,-1 ), 0 ) + self.Ctrl_account.SetToolTip( u"手机号或者邮箱" ) + self.Ctrl_account.SetFont( wx.Font( 12, 70, 90, 92, False, "微软雅黑" ) ) + gbSizer1.Add( self.Ctrl_account, wx.GBPosition( 0, 1 ), wx.GBSpan( 1, 1 ), wx.ALL, 20 ) + + self.Text_api = wx.StaticText( self, wx.ID_ANY, u"API", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.Text_api.Wrap( -1 ) + self.Text_api.SetFont( wx.Font( 12, 70, 90, 92, False, "微软雅黑" ) ) + gbSizer1.Add( self.Text_api, wx.GBPosition( 2, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 20 ) + + self.Ctrl_api = wx.TextCtrl( self, wx.ID_ANY, conf['api'], wx.DefaultPosition, wx.Size( 300,-1 ), 0 ) + self.Ctrl_api.SetFont( wx.Font( 12, 70, 90, 92, False, "微软雅黑" ) ) + gbSizer1.Add( self.Ctrl_api, wx.GBPosition( 2, 1 ), wx.GBSpan( 1, 1 ), wx.ALL, 20 ) + + self.Text_id = wx.StaticText( self, wx.ID_ANY, u"歌单ID", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.Text_id.Wrap( -1 ) + self.Text_id.SetFont( wx.Font( 12, 70, 90, 92, False, "微软雅黑" ) ) + gbSizer1.Add( self.Text_id, wx.GBPosition( 3, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 20 ) + + self.Ctrl_id = wx.TextCtrl( self, wx.ID_ANY, conf['id'], wx.DefaultPosition, wx.Size( 300,-1 ), 0 ) + self.Ctrl_id.SetFont( wx.Font( 12, 70, 90, 92, False, "微软雅黑" ) ) + gbSizer1.Add( self.Ctrl_id, wx.GBPosition( 3, 1 ), wx.GBSpan( 1, 1 ), wx.ALL, 20 ) + + self.Text_time = wx.StaticText( self, wx.ID_ANY, u"播放次数", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.Text_time.Wrap( -1 ) + self.Text_time.SetFont( wx.Font( 12, 70, 90, 92, False, "微软雅黑" ) ) + gbSizer1.Add( self.Text_time, wx.GBPosition( 4, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 20 ) + + self.Ctrl_time = wx.TextCtrl( self, wx.ID_ANY, conf['time'], wx.DefaultPosition, wx.Size( 300,-1 ), 0 ) + self.Ctrl_time.SetFont( wx.Font( 12, 70, 90, 92, False, "微软雅黑" ) ) + gbSizer1.Add( self.Ctrl_time, wx.GBPosition( 4, 1 ), wx.GBSpan( 1, 1 ), wx.ALL, 20 ) + + self.button_start = wx.Button( self, wx.ID_ANY, u"开始执行", wx.DefaultPosition, wx.Size( 300,50 ), 0 ) + self.button_start.SetFont( wx.Font( 12, 70, 90, 92, False, "微软雅黑" ) ) + self.button_start.SetBackgroundColour( wx.Colour( 0, 181, 46 ) ) + + gbSizer1.Add( self.button_start, wx.GBPosition( 5, 1 ), wx.GBSpan( 1, 1 ), wx.ALL, 20 ) + + self.Text_password = wx.StaticText( self, wx.ID_ANY, u"密码", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.Text_password.Wrap( -1 ) + self.Text_password.SetFont( wx.Font( 12, 70, 90, 92, False, "微软雅黑" ) ) + gbSizer1.Add( self.Text_password, wx.GBPosition( 1, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 20 ) + + self.Ctrl_password = wx.TextCtrl( self, wx.ID_ANY, conf['pwd'], wx.DefaultPosition, wx.Size( 300,-1 ), wx.TE_PASSWORD ) + self.Ctrl_password.SetFont( wx.Font( 12, 70, 90, 92, False, "微软雅黑" ) ) + self.Ctrl_password.SetToolTip( u"必须填写MD5" ) + + gbSizer1.Add( self.Ctrl_password, wx.GBPosition( 1, 1 ), wx.GBSpan( 1, 1 ), wx.ALL, 20 ) + + + self.SetSizer( gbSizer1 ) + self.Layout() + self.statusBar = self.CreateStatusBar( 1, 0, wx.ID_ANY ) + self.statusBar.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_INFOBK ) ) + + self.menubar = wx.MenuBar( 0 ) + self.menu_file = wx.Menu() + self.menuItem_openlog = wx.MenuItem( self.menu_file, wx.ID_ANY, u"查看日志", wx.EmptyString, wx.ITEM_NORMAL ) + self.menu_file.Append( self.menuItem_openlog ) + + self.menuItem_openconfig = wx.MenuItem( self.menu_file, wx.ID_ANY, u"查看配置", wx.EmptyString, wx.ITEM_NORMAL ) + self.menu_file.Append( self.menuItem_openconfig ) + + self.menubar.Append( self.menu_file, u"文件" ) + + self.menu_function = wx.Menu() + self.menuItem_getApi = wx.MenuItem( self.menu_function, wx.ID_ANY, u"获取API", wx.EmptyString, wx.ITEM_NORMAL ) + self.menu_function.Append( self.menuItem_getApi ) + + self.menuItem_autoUp = wx.MenuItem( self.menu_function, wx.ID_ANY, u"自动升级", wx.EmptyString, wx.ITEM_NORMAL ) + self.menu_function.Append( self.menuItem_autoUp ) + + self.menubar.Append( self.menu_function, u"功能" ) + + self.menu_help = wx.Menu() + self.menuItem_about = wx.MenuItem( self.menu_help, wx.ID_ANY, u"关于软件", wx.EmptyString, wx.ITEM_NORMAL ) + self.menu_help.Append( self.menuItem_about ) + + self.menuItem_readme = wx.MenuItem( self.menu_help, wx.ID_ANY, u"使用说明", wx.EmptyString, wx.ITEM_NORMAL ) + self.menu_help.Append( self.menuItem_readme ) + + self.menu_help.AppendSeparator() + + self.menuItem_feedback = wx.MenuItem( self.menu_help, wx.ID_ANY, u"反馈问题", wx.EmptyString, wx.ITEM_NORMAL ) + self.menu_help.Append( self.menuItem_feedback ) + + self.menubar.Append( self.menu_help, u"帮助" ) + + self.SetMenuBar( self.menubar ) + + + self.Centre( wx.BOTH ) + + # Connect Events + self.button_start.Bind( wx.EVT_LEFT_DOWN, self.start ) + self.Bind( wx.EVT_MENU, self.Event_openlog, id = self.menuItem_openlog.GetId() ) + self.Bind( wx.EVT_MENU, self.Event_openconfig, id = self.menuItem_openconfig.GetId() ) + self.Bind( wx.EVT_MENU, self.Event_getApi, id = self.menuItem_getApi.GetId() ) + self.Bind( wx.EVT_MENU, self.Event_autoUp, id = self.menuItem_autoUp.GetId() ) + self.Bind( wx.EVT_MENU, self.Event_about, id = self.menuItem_about.GetId() ) + self.Bind( wx.EVT_MENU, self.Event_readme, id = self.menuItem_readme.GetId() ) + self.Bind( wx.EVT_MENU, self.Event_feedback, id = self.menuItem_feedback.GetId() ) + + def initData( self ): + conf = { + 'uin': '测试账号', + 'pwd': '', + 'api': '', + 'id': '', + 'time': '' + } + return conf + + def __del__( self ): + pass + + def Tipmsgbox(self, content): + wx.MessageBox(content, "提示" ,wx.OK | wx.ICON_INFORMATION) + + # Virtual event handlers, overide them in your derived class + def start( self, event ): + event.Skip() + + def Event_openlog( self, event ): + event.Skip() + + def Event_openconfig( self, event ): + event.Skip() + + def Event_getApi( self, event ): + event.Skip() + + def Event_autoUp( self, event ): + event.Skip() + + def Event_about( self, event ): + event.Skip() + + def Event_readme( self, event ): + event.Skip() + + def Event_feedback( self, event ): + event.Skip() + +class Dialog_about ( wx.Dialog ): + + def __init__( self, parent ): + wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = u"关于软件", pos = wx.DefaultPosition, size = wx.Size( 500,500 ), style = wx.DEFAULT_DIALOG_STYLE ) + + self.SetSizeHints( wx.DefaultSize, wx.DefaultSize ) + + gbSizer2 = wx.GridBagSizer( 0, 0 ) + gbSizer2.SetFlexibleDirection( wx.BOTH ) + gbSizer2.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.Text_aboutSoft = wx.StaticText( self, wx.ID_ANY, u"本软件开源免费,请勿二次售卖!\n首发:吾爱破解论坛\n作者:ZainCheung(superBoyJack)\n\n声明:本软件仅用于个人学习开发测试,\n所有网易云相关字样版权属于网易公司,\n勿用于商业及非法用途!\n\n如您使用该软件即你已了解并同意该声明!", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.Text_aboutSoft.Wrap( -1 ) + self.Text_aboutSoft.SetFont( wx.Font( 15, 70, 90, 90, False, "微软雅黑" ) ) + + gbSizer2.Add( self.Text_aboutSoft, wx.GBPosition( 1, 1 ), wx.GBSpan( 1, 1 ), wx.ALL, 30 ) + + self.button_about_know = wx.Button( self, wx.ID_ANY, u"我已了解", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.button_about_know.SetFont( wx.Font( 15, 70, 90, 90, False, "微软雅黑" ) ) + + gbSizer2.Add( self.button_about_know, wx.GBPosition( 2, 1 ), wx.GBSpan( 1, 1 ), wx.ALIGN_CENTER|wx.ALL, 30 ) + + + self.SetSizer( gbSizer2 ) + self.Layout() + + self.Centre( wx.BOTH ) + + # Connect Events + self.button_about_know.Bind( wx.EVT_BUTTON, self.Event_know ) + + def __del__( self ): + pass + + + # Virtual event handlers, overide them in your derived class + def Event_know( self, event ): + self.Destroy() + +class Dialog_readme ( wx.Dialog ): + + def __init__( self, parent ): + wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = u"使用帮助", pos = wx.DefaultPosition, size = wx.Size( 500,500 ), style = wx.DEFAULT_DIALOG_STYLE ) + + self.SetSizeHints( wx.DefaultSize, wx.DefaultSize ) + + gbSizer3 = wx.GridBagSizer( 0, 0 ) + gbSizer3.SetFlexibleDirection( wx.BOTH ) + gbSizer3.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.staticline_readme = wx.StaticLine( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL ) + gbSizer3.Add( self.staticline_readme, wx.GBPosition( 1, 0 ), wx.GBSpan( 1, 1 ), wx.EXPAND |wx.ALL, 5 ) + + self.Text_readme_alert = wx.StaticText( self, wx.ID_ANY, u"功能介绍:填入账号密码与API,输入歌单ID和播放次数\n程序会登陆该账号将该歌单播放你指定的次数\n\n提示:播放完成速度取决于你的API速度\n建议播放次数不要太大,效果请到网易云个人主页查看\n\n注意:密码必须自己前往MD5加密网站进行转换\n本软件不会将你的原文密码上传到服务器,请放心使用\n如果API不可用或者速度非常慢请更换\n执行任务之前请不要打开或者删除日志文件和配置文件\n", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.Text_readme_alert.Wrap( -1 ) + self.Text_readme_alert.SetFont( wx.Font( 12, 70, 90, 90, False, "微软雅黑" ) ) + + gbSizer3.Add( self.Text_readme_alert, wx.GBPosition( 2, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 30 ) + + self.Text_readme_read = wx.StaticText( self, wx.ID_ANY, u"这款软件的开发初衷是为了帮助使用过网易云自动升级的用户\n在系统推送不够精准的情况下进行自我纠正\n通过增加某几首歌的播放次数可以告知系统你的听歌偏好\n以便系统为你推荐你喜欢的歌单以及歌曲", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.Text_readme_read.Wrap( -1 ) + self.Text_readme_read.SetFont( wx.Font( 12, 70, 90, 90, False, "微软雅黑" ) ) + + gbSizer3.Add( self.Text_readme_read, wx.GBPosition( 0, 0 ), wx.GBSpan( 1, 1 ), wx.ALIGN_CENTER|wx.ALL, 30 ) + + + self.SetSizer( gbSizer3 ) + self.Layout() + + self.Centre( wx.BOTH ) + + def __del__( self ): + pass + \ No newline at end of file