背景介绍
六月份的更文挑战已经告一段落了。一个月的时间虽然很漫长却也过的很快,写作的过程也是快乐的。然而从第一天打卡的开始,一颗自动发布文章的种子就悄悄的种下了。期间看了许多自动发布的文章,虽说功能都可以完成,但是总有那么些不够完善的地方。伴随着登录功能的实现 掘金自动登录的实现 ,那自动发布的功能就轻而易举了。
阅读此文建议优先阅读 掘金自动登录的实现
技术背景
关于本文用到技术的简介
- Linux 定时任务 Linux crontab 命令
- Python 网络请求 Requests: 让 HTTP 服务人类
- Github 自动化部署 Github Action 的简单使用
自动发布
本文的内容需要建立在掘金登录成功之后,如需了解掘金的登录可以查看我另外两篇文章。
1. 封装请求对象
这里将登录成功之后的 cookie 封装到 request.session 对象里面,以后每次请求会自动携带。
1.1 cookie 封装
import requests
from requests import cookies
driver_cookies = [{'domain': '.juejin.cn', 'expiry': 1632996319, 'httpOnly': False, 'name': 'MONITOR_WEB_ID', 'path': '/', 'secure': False, 'value': 'f9c24adb-a882-4189-a44a-1546a55edbd2'}]
session = requests.session()
if driver_cookies is False:
raise Exception("Cookie is Blank")
for cookie in driver_cookies:
cookie_obj = requests.cookies.create_cookie(
domain=cookie.get("domain"),
name=cookie.get("name"),
value=cookie.get("value")
)
session.cookies.set_cookie(cookie_obj)
1.2 请求封装
这里封装的前提是掘金的接口返回有统一的格式:
- 统一的
HTTP STATUS CODE
,默认 200 为成功 - 统一的数据格式 数据返回的格式统一
json
(对应python的字典类型)
# 只返回 status_code 为 200的请求,返回数据格式为字典
def request(self, *args, **kwargs):
response = session.request(*args, **kwargs)
if response.status_code != 200:
raise Exception("Request error")
return response.json()
2. 测试请求
这里使用草稿箱的列表做接口测试,返回的是草稿箱中对应的文章列表。
result = request('post', "https://api.juejin.cn/content_api/v1/article_draft/query_list")
print(result)
[{'id': '6980289137664327688',
'article_id': '0',
'user_id': '993614678985085',
'category_id': '0',
'tag_ids': [],
'link_url': '',
'cover_image': '',
'is_gfw': 0,
'title': '文章',
'brief_content': '',
'is_english': 0,
'is_original': 1,
'edit_type': 10,
'html_content': '',
'mark_content': '',
'ctime': '1625225445',
'mtime': '1625225447',
'status': 0,
'original_type': 0}]
3. 发布文章
终于到了激动人心的时刻了。我们终于可以用程序发布文章了。直接上代码
注意 注意 注意 文章一定是一个准备发送的状态才可以发送,必填字段 分类、添加标签、摘要 都要符合要求才能正常发布。
# draft_id 对应的为草稿箱内文章的 id
json = {
"draft_id": "6980289137664327688",
"sync_to_org": False,
"column_ids": []
}
result = request('post', "https://api.juejin.cn/content_api/v1/article/publish", json=json)
print(result)
# err_no 为 0 的情况下就是发送成功了
{'err_no': 0,
'err_msg': 'success',
'data': {
'article_id': '6980297603929866271',
# ......
'org_id': '0'
}
}
4. 发送成功
打开掘金我的主页可以发现一篇文章已经通过我们的程序发送成功 😭😭😭
项目部署
先来本次代码的一个全家福
├── LICENSE
├── Pipfile
├── Pipfile.lock
├── README.md
├── core
│ ├── __init__.py
│ ├── config.py
│ ├── juejin.py
│ └── track.py
├── driver
│ ├── linux
│ │ └── chromedriver
│ └── mac
│ └── chromedriver
├── main.py
├── requeirments.txt
└── temp
1. 新建 Github 仓库
这里就不详细介绍如何新建仓库以及上传代码了,直接看结果
2. 新建 Github Action 任务
直接上写好的 python 运行的配置文件。 具体的用法参见 Github Action 的简单使用
注意:这里用到了 cron cron: 00 02 * * *
每天两点执行脚本。
name: Python package
on:
push:
branches:
- master
schedule:
- cron: 00 02 * * *
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requeirments.txt
- name: execute py script
env:
JUEJIN_USERNAME: ${{ secrets.JUEJIN_USERNAME }}
JUEJIN_PASSWORD: ${{ secrets.JUEJIN_PASSWORD }}
JUEJIN_NICKNAME: ${{ secrets.JUEJIN_NICKNAME }}
run: |
python main.py
3. 新增环境变量
在 GitHub Setting 中新增环境变量
变量 | 描述 | 示例 | 用途 |
---|---|---|---|
JUEJIN_USERNAME | 掘金登录帐号 | xxx | 登录 |
JUEJIN_PASSWORD | 掘金登录密码 | xxx | 登录 |
JUEJIN_NICKNAME | 掘金昵称 | 西红柿蛋炒饭 | 判断登录是否成功 |
4. 查看执行结果
结果可以在 Github Action 中查看
我的执行结果为:
写在最后
您正在阅读的文章就是自动发布的文章,很感谢你的到来。
项目目前在持续迭代更新中,欢迎给出你宝贵的意见。
如果你觉得我的项目对你有帮助,欢迎一键三连❤️❤️❤️。
此项目所有代码见 我的GitHub仓库 ,欢迎 star fork。