掘金自动发布文章的实现

2,445 阅读4分钟

背景介绍

六月份的更文挑战已经告一段落了。一个月的时间虽然很漫长却也过的很快,写作的过程也是快乐的。然而从第一天打卡的开始,一颗自动发布文章的种子就悄悄的种下了。期间看了许多自动发布的文章,虽说功能都可以完成,但是总有那么些不够完善的地方。伴随着登录功能的实现 掘金自动登录的实现 ,那自动发布的功能就轻而易举了。

阅读此文建议优先阅读 掘金自动登录的实现

技术背景

关于本文用到技术的简介

自动发布

本文的内容需要建立在掘金登录成功之后,如需了解掘金的登录可以查看我另外两篇文章。

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 请求封装

image.png

这里封装的前提是掘金的接口返回有统一的格式:

  • 统一的 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. 发布文章

终于到了激动人心的时刻了。我们终于可以用程序发布文章了。直接上代码

注意 注意 注意 文章一定是一个准备发送的状态才可以发送,必填字段 分类、添加标签、摘要 都要符合要求才能正常发布。

image.png

# 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. 发送成功

打开掘金我的主页可以发现一篇文章已经通过我们的程序发送成功 😭😭😭

image.png

项目部署

先来本次代码的一个全家福

├── 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 仓库

这里就不详细介绍如何新建仓库以及上传代码了,直接看结果

image.png

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掘金昵称西红柿蛋炒饭判断登录是否成功

image.png

4. 查看执行结果

结果可以在 Github Action 中查看

image.png

我的执行结果为: image.png

写在最后

您正在阅读的文章就是自动发布的文章,很感谢你的到来。

项目目前在持续迭代更新中,欢迎给出你宝贵的意见。

如果你觉得我的项目对你有帮助,欢迎一键三连❤️❤️❤️

此项目所有代码见 我的GitHub仓库 ,欢迎 star fork。