前言
前段时间写了一个皮皮虾无水印解析的帖子,但是想了想局限性太大了,因为是用python写出来的,就算编译成EXE文件,现在大多数人都是用手机,做APP么,也不会,更不用提IOS的APP了,突然想到在IOS上有捷径,于是就有了以下的想法:自己做一个网页的API,在后面跟上特定的参数实现无水印解析,前面校验链接的事情交给捷径,后面获取数据主要用API来完成,于是就想到了Python的Flask框架,简单说下Flask框架是什么:大致我们就可看成是一个集成了web服务器的应用程序,通过规定的语法,让我们用平时只能在有python环境的机器上运行的结果,能在网页上做出来,我说的有点乱,大概意思就是用python来做一个简易的网站(我这里做的是一个简单的API)。
0x01:准备工作
家里有一台吃灰的树莓派,就打算在这上面搭建这个API服务了,如果自己有合适的服务器的也可以根据实际情况进行部署,配置这服务器的过程特别繁琐我就挑几个点讲一下:如果是linux的系统最好开启SSH登录,配置文件在/etc/ssh/sshd_config下,记住要安装pip和python环境,因为我装的镜像是buster,几乎就是最小的安装包了,连vim我都是自己装的,其次准备nginx,用来配置反向代{过}{滤}理,让机器的80端口和flask➕gunicorn部署的服务通过nginx来进行代{过}{滤}理,最后就是要准备flask和gunicorn了,前一个用pip安装后一个用apt安装就可以了,nginx也是用apt安装,准备工作就这些,细节后面我会再提到。
0x02:实践开发
因为是要准备一个api,所以前面判断是不是特定链接交给捷径来完成。
首先要熟悉flask的文档:http://docs.jinkan.org/docs/flask/
从上面可以看到官方给的最小的例子就是一个主页面,所以自己可以先写一个试试看(flask中可以用requests等模块,注意其只能返回str dict tuple 等类型信息 如果是Unicode或者response信息就会出现报错)
首先我们先去写一个函数,就是皮皮虾的无水印解析函数,让他对传入来的链接进行分析最后给出下载链接
第一句话中WApplication里面传入的__name__是必须的,后面的static_url_path=""参数的意思是,当在当前页面中需要引用某些文件会从当前目录下的static目录中去寻找,而且static是作为资源根目录来使用的,也就是说加上了这个参数就不需要写上完整路径了,比如<audio src="111.mp3"></audio>,如果不加那个参数就要把路径写完整,类似static/111.mp3。
然后我们可以看到这段代码,设置路由,比如我的内网IP是192.168.3.51,这段代码意思就是,当用户访问了192.168.3.51的时候,就会开始获取其中的get请求里面的url参数,如果没有url参数的话会返回最下面的一个简单主页,其他错误代码意思是啥我忘记了,总之如果url传入正确,便会返回无水印解析的结果。
接下来考虑到用户有时候会访问一个不存在的页面 比如/xxx,这个页面我是没有定义的,这时候页面便会反馈错误,所以加入一个处理404错误的函数,如果发生了404错误,那么在3秒后返回主页面
最后一个路由是自己写的一个html文件,用其函数渲染,如果细讲实在是很麻烦,所以建议去看flask官方文档,我只是做一个简单的流程和思路
大致结构:
这时候我们用python直接运行可以在本地实现调试,但是这不适于正式投入使用,所以接下来要部署,然后正式发布出去。
0x03:部署
个人综合比较下来觉得还是nginx+flask+gunicorn实现部署是最简单,快捷的方式了
首先写好flask应用之后,来配置nginx
cd /etc/nginx/conf.d/
vim default.conf
写入以下内容:
server_name那里填入自己的域名或者内网和公网ip,用空格分开
最后
systemctl restart nginx
这样就算配置好了
然后用gunciron来开启服务
-w参数表示几条线程运行这个服务
-b表示绑定的地址 这里要和在nginx中的proxy_pass值一致
最后Webmain表示文件名称
WApplication表示在文件中实例化flask的名称
可以配合screen来一起使用
最后需要让公网也可以访问了 这里根据大家实际情况 因为我家路由器自带NAT转发
所以需要配置的有两个 把内网的80端口映射到公网的5000端口上去(因为封了所有带80的端口)
把22端口也映射出去,方便远程管理(大家在这里可以试着用网络唤醒结合,快要到家的时候把电脑远程启动,我目前就是这么做的)
我把代码也给大家看一下吧(MAC代表自己电脑的MAC,把-去除拼在一起就可以了):
[Python] 纯文本查看 复制代码 import socket,binascii
mac = "3085A9997334"
magic_data = 'FF'*6 + mac *16
send_data = binascii.unhexlify(magic_data)
address='255.255.255.255'
port=9
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
s.sendto(send_data,(address,port))
print("send success")
实在是不会排版大家将就看吧,还请大佬手下留情,我还在努力,目前还很菜,不要喷我,感谢。 |