浅尝python遇到的各种奇葩问题

        观前提醒,本教程不包含任何干货,纯记流水账,不喜欢就别看了哦。

        眼馋群里wq大佬联合派蒙主人制作的Petpet插件很久了,但是无奈我框架不同。依稀记得刚开始学的时候就有看到wq大佬写的这个合成,羡慕死了,问了好几次都跟我说用不了,不是一个框架。

        然后我这两天就和wq商量了,得到了修改给自己用的许可。呀,他平时在群里都不说话的,能要到许可我其实是没想到的,还以为很不好说话呢。

        于是我把项目拿过来就动工了,但是我这种纯python萌新来说,真的搞着还挺折磨的。。。

        首先,我的思路是,既然我没办法把Nonebot插件拿来用,我就要把图片合成的部分代码加入或者内嵌到我的框架中。可是python的插件环境配置麻烦,需要http-api,我也不会写python,需要的学习周期可能会很长。而我以前实现图片合成都是通过api,所以我选择将pet改成webapi实现的接口。

        而后,我选择使用flask框架。为什么不用姜狗?大概就是因为flask这个名字看着比较舒服吧。而且真的很方便啊!

from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_world(): # put application's code here
return 'Hello World!'


if __name__ == '__main__':
app.run()

        这就是flask的helloworld了,超级简洁好用,而且一眼就能看明白。于是乎接下来,就把petpet中,有关于图片合成的部分给提取了出来,不需要的全部删除,然后放进了flask里。至于pet原项目的话,用到的是poetry虚拟环境,我用到网上的方法,在powershell中使用命令安装了它,然后Pycharm里面选择使用,却一直报错,我不理解,而且网上都没有和我一样的错误,有的就说重装解决环境问题,但我电脑上一堆复杂环境,并不想重新来一次,于是最后还是用的venv,对照这poetry的配置文件进行了软件包的安装。如果大家遇到这种死活环境弄不上的情况,还是及早这样做吧。虽然笨,也不失为一种速度快的解决方式哈哈哈。

        很快我的代码就能用了,但是有个很愚蠢的实现方式,让我很是心里难受:os.path.join可以把各种文件,包括图片读入为str类型。而petpet生成的是BytesIO类型,直接以bytes return是无法发送的,我所知道的发送方法是make_file(str),来发送,所以需要把bytes转为str。可是bytes转str就是用bytes.decode,必须指定gbk和utf8之类的文字编码,而文字编码无法编码图片,因为图片不在范围内。

        所以,没有办法,我就只能生成shortUUID作为文件名,发送后开启线程删除文件,这也太蠢了!不可能没有别的办法的,然后我加了一些python大群,一个都没人回答我,还有人看了就想装逼,非说我这代码和思路很牛逼,懂得实在是非常多。。。我人都麻了,而后放下面子,去问公司的同事。人三句话让我佩服了三年,虽然这才不过三天的事情哈哈哈。

from flask import Response
resp = Response(bytes, mimetype="image/gif")
瞬间完美解决了,通过bytes构造了response并指定为imgage/gif
而且听说那个IO本身就有bytes和str两种构造方式,是我了解太少才导致不会用,而且到这里还不算完
大哥他过了一会突然跟我说,我传入链接的那里,如果有&符号就会导致使用失败。

使用encodeURIComponent编码方式,会对特殊符号编码。py这边处理就是

from urllib.parse import unquote

url = unquote(url)

而java一类的语言其实也有很多方法,也可以模拟或者实现这个js函数。这里就不多赘述,而我出现了中文乱码,也就用java那边urlencode一下而已,这边python甚至不需要处理,估计是flask自己处理了吧。

至此我代码减少了很多行很多函数,也不用独写文件了。后面就是写一个请求api的插件进行请求而已,很容易的把这个表情包合成全部的搬运了过来。

部署到linux的时候,出现我一直担心的东西了。flask直接运行你会看到environment:development什么的,反正就是开发模式,做出这样的区分一定会在部署的时候出现问题,果然出问题了,说是不要在生产环境下使用,并且虽然报错也能运行,但除了本地以外无法访问,肯定是没有设置0.0.0.0的原因。

于是乎百度了一下,改成:

from gevent import pywsgi
server = pywsgi.WSGIServer(('0.0.0.0', 5000), app)
server.serve_forever()
就可以咯,还挺方便呢!

但毕竟是别人的东西,无论我做的这个有多好用,我都不能放GitHub咯,甚至也不会公开,有需要大家可以自己去拿来修改使用。