这是我参与更文挑战的第29天,活动详情查看: 更文挑战
写在前面
近日看了几篇关于自动发布掘金文章的帖子。都是后端直接调用发布文章的接口配合定时任务完成的。但是缺点就是绕过了登录掘金的步骤。通过手动获取页面的 cookie ,然后将 cookie 交给程序,完成自动发布的功能。所以今天就从技术的角度出发,一探掘金的登录时如何实现的。
正文开始
首先声明这里只探讨技术实现。
1. 问题提出的背景
在此次文章打卡的活动中,会存在写好文章存在草稿箱,但是忘了发布文章导致断更的情况发生。于是就突发奇想,能否有自动发布文章的功能,帮助我们完成一部分自动化的工作,去解决漏发布的问题。
于是就从文章发布的接口入手,我们先看掘金文章发布的逻辑;
- a. 文章新建后都会存入草稿,并且生成唯一的ID。
- b. 文章编辑不发布依旧是在草稿箱,文章ID不变。
- c. 文章发布时填写必要的标签后,即可发布成功。
- d. 文章发布完成,通过审核即会变成可读状态,即可分享于他人。
下面是发布接口具体的参数以及地址:
- 接口地址:api.juejin.cn/content_api…
- 请求方式:POST
- 请求参数:
参数 | 类型 | 说明 |
---|---|---|
draft_id | 字符串 | 文章ID |
sync_to_org | 布尔 | 是否同步 |
column_ids | 列表 | 未知 |
对于 python 处理这种事情很简单,类似这样:
# 代码为演示代码
body = {
"draft_id": "123456",
"sync_to_org": False,
"column_ids": []
}
requests.post(self.publish_url, body=body)
复制代码
很明显这么做是行不通的。因为在代码中是没有体现出任何登录的操作。下面就看一下掘金的登录实现。
2. 登录方式
目的:已知用户名密码的情况实现自动登录。
- 手机验证码登录
- 账号密码登录
手机验证码登录由于每次都需要动态的获取验证码,所以这里就不考虑;第三方登录本质上也是需要登录其他账号,这里也不考虑;所以我们只需要查看 掘金账号密码登录即可;那么我们就研究一下这个东西。
在正常输入用户名密码后会出现滑动验证码,需要手动验证才能通过。
似乎问题到这里陷入了死胡同。我的目的是为了自动登录,但是查看了几种方式后绕不开人为的介入。
3. 深入探究
经过思考登录的本质是一个 POST 请求的过程也就是发送请求就可以完成。所以继续沿着这个思路继续查看登录的接口,下图为登录时具体的接口。
如图请求的接口与请求的参数都有,但是参数明显是加密处理过后的数据。
这里继续深入了解后得知大致的登录流程,这里没有做深入了解只是根据自己的经验总结的结果。
- 滑动验证过程
- 登录过程,此过程用户名&密码加密
所以要想通过脚本的方式登录成功就需要完成两件事:
- 滑动验证码请求参数的构造
- 登录接口请求参数构造
但是努力查询掘金前端的代码,虽说能找到一些蛛丝马迹。但是终究是被前端代码的量以及动态加载的 JS 搞怕了,花出的时间可能与收获不成正比。卒,享年28岁。
PS:这里提供的破解思路是可行的,希望有能力的小伙伴研究出来之后,可以一起探讨。
总结
掘金的登录两个比较重要的功能:
- 通过滑动验证码确定操作者身份为真实用户。
- 通过前端加密后端解密的方式避免登录过程中明文传输用户信息。
两者结合就实现了比较安全的登录方式,使得大部分程序员想通过程序直接登录掘金的梦想直接破灭。
所以想实现自动发布的功能,需要另辟蹊径才能达到目的。