撸了个LeetCode题解仓库自动生成与发布的工具

本文首发在我的个人博客:https://jlice.top/p/7odvq/。欢迎大家前去参观,么么哒~

前言

看到有不少人在GitHub展示自己的LeetCode题解。其实我自己也在GitHub记录了自己的LeetCode题解,但是,从做题到整理,需要很多时间。本来刷题就需要时间,也够累的,还要整理,再写出来,一道题得花上好久。

最近在LeetCode上刷了上百道题目,当然,不少是Easy难度的。如果让我手动去整理,我觉得太费时间了。我一直贯彻一种理念,简单不麻烦的事容易坚持。于是,我就想着,是否能用程序来去做这些呢?

以前在刷题的时候没注意到右侧的Notes,后来偶尔注意到了,突发灵感,这个不正好可以用来写解题思路吗?于是,我就希望有个工具能整理我刷过的题目和我的解答,还有Notes。但是,找了一圈,没发现合适的,所以,干脆就自己花了大概一天半的时间撸了一个:leetcode-publisher

说一下这个工具和别的类似的工具的不同点吧。在GitHub上看到有人做过类似的工具,但是是基于headless的浏览器做的,我觉得这种方式不够优雅。其实LeetCode的请求构造并没有很麻烦,主要是csrftoken,在cookies里有,在请求头要传x-csrftokenreferer。另外,类似的LeetCode题解仓库其实放的主要是程序源代码,这并不是我想要的。因为Markdown格式可以很方便插入代码,而且,刷题的代码并不长,放在Markdown里,和题目与笔记一起,更为合适。

当然,关于这个工具更具体的信息还是到GitHub去看吧~

jlice/leetcode-publisher: Automatically generate and publish LeetCode solution repository(LeetCode题解仓库自动生成与发布)

总结

简单总结下做这个小项目的过程中遇到的一些困难与解决方案。

csrftoken

CSRF是跨站请求伪造,因为server不能给其它domain设置cookies,所以可以在请求时带上一个随机token来验证是否跨域。LeetCode要求请求头要有x-csrftokenreferer

unicode字符串

在获取提交的代码时,是通过正则表达式提取网页实现的,网页里用的unicode编码。比如,换行符是\u000A,但是,通过正则表达式提取,会被视为字符串\\u000A。问题是,如何把形如\\u000A的字符串转换成对应unicode字符(\n)。一开始我是想的替换和eval,结果各种试还是不行。最终想到的方法是:

>>> s = '\\u000A'
>>> s
'\\u000A'
>>> s = s.encode('utf-8').decode('unicode-escape')
>>> s
'\n'

其它

当然,还遇到了其它的一些问题,不过相对比较好解决。

比如说,HTTP 429。HTTP 429表示一定时间内请求太多。这个容易处理,捕获HTTPError,出错时等待一段时间再试即可。

另外,用subprocess调用Shell命令cd切换目录时在下一条命令并不生效,因为每条命令其实是相对独立的!要用os.chdir来切换工作目录!

为了让这个项目更有范,写英文README也是费了心思,毕竟英语写作太差了,最后还是借助Google翻译,唔。。。

你可能感兴趣的:(博客)