How to Publish an Article to Medium Using Python and the Medium API

Introduction

As someone who uses Obsidian to write articles, I often find myself needing to copy and format my content manually when publishing to Medium. This process can be time-consuming and repetitive, especially when dealing with Markdown files. To streamline my workflow, I decided to develop a Python script that automates the publication of Markdown files directly to Medium. In this article, I’m excited to share with you how to programmatically publish articles using the Medium API, making the process faster and more efficient.

Setting Up the Medium API

To interact with Medium’s API, you first need to generate an integration token. This token will allow your Python script to authenticate and perform actions on your behalf.

Steps to Generate an Integration Token:

  1. Go to your Medium Security and apps.
  2. Scroll down to the “Integration tokens” section.
  3. Click on “Get integration token.”
  4. Copy the generated token and keep it safe; you’ll need it for your script.

With the token in hand, you’re ready to start coding.

Getting user’s details and publications

Here’s the Python code you’ll be using to interact with the Medium API:

<span>import</span> <span>requests</span>
<span># Replace these with your actual Medium integration token and file path </span><span>MEDIUM_TOKEN</span> <span>=</span> <span>'</span><span>your_medium_integration_token</span><span>'</span>
<span>headers</span> <span>=</span> <span>{</span>
<span>'</span><span>Authorization</span><span>'</span><span>:</span> <span>f</span><span>'</span><span>Bearer </span><span>{</span><span>MEDIUM_TOKEN</span><span>}</span><span>'</span><span>,</span>
<span>'</span><span>Content-Type</span><span>'</span><span>:</span> <span>'</span><span>application/json</span><span>'</span><span>,</span>
<span>'</span><span>Accept</span><span>'</span><span>:</span> <span>'</span><span>application/json</span><span>'</span><span>,</span>
<span>'</span><span>host</span><span>'</span><span>:</span> <span>'</span><span>api.medium.com</span><span>'</span><span>,</span>
<span>'</span><span>Accept-Charset</span><span>'</span><span>:</span> <span>'</span><span>utf-8</span><span>'</span>
<span>}</span>
<span>url</span> <span>=</span> <span>'''</span><span>https://api.medium.com/v1/me</span><span>'''</span>
<span>response</span> <span>=</span> <span>requests</span><span>.</span><span>get</span><span>(</span><span>url</span><span>=</span><span>url</span><span>,</span> <span>headers</span><span>=</span><span>headers</span><span>)</span>
<span>print</span><span>(</span><span>'</span><span>status_code is: </span><span>'</span><span>,</span><span>response</span><span>.</span><span>status_code</span><span>)</span>
<span>print</span><span>(</span><span>'</span><span>response text:</span><span>'</span><span>,</span> <span>response</span><span>.</span><span>json</span><span>())</span>
<span>print</span><span>(</span><span>'</span><span>userId:</span><span>'</span><span>,</span> <span>response</span><span>.</span><span>json</span><span>()[</span><span>'</span><span>data</span><span>'</span><span>][</span><span>'</span><span>id</span><span>'</span><span>])</span>
<span>import</span> <span>requests</span>  

<span># Replace these with your actual Medium integration token and file path </span><span>MEDIUM_TOKEN</span> <span>=</span> <span>'</span><span>your_medium_integration_token</span><span>'</span>

<span>headers</span> <span>=</span> <span>{</span>  
    <span>'</span><span>Authorization</span><span>'</span><span>:</span> <span>f</span><span>'</span><span>Bearer </span><span>{</span><span>MEDIUM_TOKEN</span><span>}</span><span>'</span><span>,</span>  
    <span>'</span><span>Content-Type</span><span>'</span><span>:</span> <span>'</span><span>application/json</span><span>'</span><span>,</span>  
    <span>'</span><span>Accept</span><span>'</span><span>:</span> <span>'</span><span>application/json</span><span>'</span><span>,</span>  
    <span>'</span><span>host</span><span>'</span><span>:</span> <span>'</span><span>api.medium.com</span><span>'</span><span>,</span>  
    <span>'</span><span>Accept-Charset</span><span>'</span><span>:</span> <span>'</span><span>utf-8</span><span>'</span>  
<span>}</span>  
<span>url</span> <span>=</span> <span>'''</span><span>https://api.medium.com/v1/me</span><span>'''</span>  
<span>response</span> <span>=</span> <span>requests</span><span>.</span><span>get</span><span>(</span><span>url</span><span>=</span><span>url</span><span>,</span> <span>headers</span><span>=</span><span>headers</span><span>)</span>  

<span>print</span><span>(</span><span>'</span><span>status_code is: </span><span>'</span><span>,</span><span>response</span><span>.</span><span>status_code</span><span>)</span>  
<span>print</span><span>(</span><span>'</span><span>response text:</span><span>'</span><span>,</span> <span>response</span><span>.</span><span>json</span><span>())</span>  
<span>print</span><span>(</span><span>'</span><span>userId:</span><span>'</span><span>,</span> <span>response</span><span>.</span><span>json</span><span>()[</span><span>'</span><span>data</span><span>'</span><span>][</span><span>'</span><span>id</span><span>'</span><span>])</span>
import requests # Replace these with your actual Medium integration token and file path MEDIUM_TOKEN = 'your_medium_integration_token' headers = { 'Authorization': f'Bearer {MEDIUM_TOKEN}', 'Content-Type': 'application/json', 'Accept': 'application/json', 'host': 'api.medium.com', 'Accept-Charset': 'utf-8' } url = '''https://api.medium.com/v1/me''' response = requests.get(url=url, headers=headers) print('status_code is: ',response.status_code) print('response text:', response.json()) print('userId:', response.json()['data']['id'])

Enter fullscreen mode Exit fullscreen mode

Fetching User Information
When you run the script, it sends a request to Medium’s API to fetch your user information. The response includes details like your user ID, which is required to publish content.

Publishing an Article

Now that you’ve successfully retrieved your user ID from the Medium API, you can move on to publishing an article. The process involves sending a POST request to Medium’s API with the article content and some metadata.

<span>import</span> <span>requests</span>
<span>import</span> <span>json</span>
<span># Replace with your actual Medium integration token and user ID </span><span>MEDIUM_TOKEN</span> <span>=</span> <span>'</span><span>your_medium_integration_token</span><span>'</span>
<span>USER_ID</span> <span>=</span> <span>'</span><span>your_user_id</span><span>'</span>
<span>headers</span> <span>=</span> <span>{</span>
<span>'</span><span>Authorization</span><span>'</span><span>:</span> <span>f</span><span>'</span><span>Bearer </span><span>{</span><span>MEDIUM_TOKEN</span><span>}</span><span>'</span><span>,</span>
<span>'</span><span>Content-Type</span><span>'</span><span>:</span> <span>'</span><span>application/json</span><span>'</span><span>,</span>
<span>'</span><span>Accept</span><span>'</span><span>:</span> <span>'</span><span>application/json</span><span>'</span><span>,</span>
<span>'</span><span>host</span><span>'</span><span>:</span> <span>'</span><span>api.medium.com</span><span>'</span><span>,</span>
<span>'</span><span>Accept-Charset</span><span>'</span><span>:</span> <span>'</span><span>utf-8</span><span>'</span>
<span>}</span>
<span>url</span> <span>=</span> <span>f</span><span>'</span><span>https://api.medium.com/v1/users/</span><span>{</span><span>USER_ID</span><span>}</span><span>/posts</span><span>'</span>
<span># Article content and metadata </span><span>data</span> <span>=</span> <span>{</span>
<span>"</span><span>title</span><span>"</span><span>:</span> <span>"</span><span>Your Article Title</span><span>"</span><span>,</span>
<span>"</span><span>contentFormat</span><span>"</span><span>:</span> <span>"</span><span>markdown</span><span>"</span><span>,</span> <span># Choose 'html', 'markdown', or 'plain' </span> <span>"</span><span>content</span><span>"</span><span>:</span> <span>"</span><span># Hello World!</span><span>\n</span><span>This is my first article using the Medium API.</span><span>"</span><span>,</span>
<span>"</span><span>tags</span><span>"</span><span>:</span> <span>[</span><span>"</span><span>python</span><span>"</span><span>,</span> <span>"</span><span>api</span><span>"</span><span>,</span> <span>"</span><span>medium</span><span>"</span><span>],</span>
<span>"</span><span>publishStatus</span><span>"</span><span>:</span> <span>"</span><span>draft</span><span>"</span> <span># Choose 'public' or 'draft' </span><span>}</span>
<span># Sending the POST request </span><span>response</span> <span>=</span> <span>requests</span><span>.</span><span>post</span><span>(</span><span>url</span><span>=</span><span>url</span><span>,</span> <span>headers</span><span>=</span><span>headers</span><span>,</span> <span>data</span><span>=</span><span>json</span><span>.</span><span>dumps</span><span>(</span><span>data</span><span>))</span>
<span>print</span><span>(</span><span>'</span><span>Status code:</span><span>'</span><span>,</span> <span>response</span><span>.</span><span>status_code</span><span>)</span>
<span>print</span><span>(</span><span>'</span><span>Response:</span><span>'</span><span>,</span> <span>response</span><span>.</span><span>json</span><span>())</span>
<span>import</span> <span>requests</span>
<span>import</span> <span>json</span>

<span># Replace with your actual Medium integration token and user ID </span><span>MEDIUM_TOKEN</span> <span>=</span> <span>'</span><span>your_medium_integration_token</span><span>'</span>
<span>USER_ID</span> <span>=</span> <span>'</span><span>your_user_id</span><span>'</span>

<span>headers</span> <span>=</span> <span>{</span>
    <span>'</span><span>Authorization</span><span>'</span><span>:</span> <span>f</span><span>'</span><span>Bearer </span><span>{</span><span>MEDIUM_TOKEN</span><span>}</span><span>'</span><span>,</span>
    <span>'</span><span>Content-Type</span><span>'</span><span>:</span> <span>'</span><span>application/json</span><span>'</span><span>,</span>
    <span>'</span><span>Accept</span><span>'</span><span>:</span> <span>'</span><span>application/json</span><span>'</span><span>,</span>
    <span>'</span><span>host</span><span>'</span><span>:</span> <span>'</span><span>api.medium.com</span><span>'</span><span>,</span>
    <span>'</span><span>Accept-Charset</span><span>'</span><span>:</span> <span>'</span><span>utf-8</span><span>'</span>
<span>}</span>

<span>url</span> <span>=</span> <span>f</span><span>'</span><span>https://api.medium.com/v1/users/</span><span>{</span><span>USER_ID</span><span>}</span><span>/posts</span><span>'</span>

<span># Article content and metadata </span><span>data</span> <span>=</span> <span>{</span>
    <span>"</span><span>title</span><span>"</span><span>:</span> <span>"</span><span>Your Article Title</span><span>"</span><span>,</span>
    <span>"</span><span>contentFormat</span><span>"</span><span>:</span> <span>"</span><span>markdown</span><span>"</span><span>,</span>  <span># Choose 'html', 'markdown', or 'plain' </span>    <span>"</span><span>content</span><span>"</span><span>:</span> <span>"</span><span># Hello World!</span><span>\n</span><span>This is my first article using the Medium API.</span><span>"</span><span>,</span>
    <span>"</span><span>tags</span><span>"</span><span>:</span> <span>[</span><span>"</span><span>python</span><span>"</span><span>,</span> <span>"</span><span>api</span><span>"</span><span>,</span> <span>"</span><span>medium</span><span>"</span><span>],</span>
    <span>"</span><span>publishStatus</span><span>"</span><span>:</span> <span>"</span><span>draft</span><span>"</span>  <span># Choose 'public' or 'draft' </span><span>}</span>

<span># Sending the POST request </span><span>response</span> <span>=</span> <span>requests</span><span>.</span><span>post</span><span>(</span><span>url</span><span>=</span><span>url</span><span>,</span> <span>headers</span><span>=</span><span>headers</span><span>,</span> <span>data</span><span>=</span><span>json</span><span>.</span><span>dumps</span><span>(</span><span>data</span><span>))</span>

<span>print</span><span>(</span><span>'</span><span>Status code:</span><span>'</span><span>,</span> <span>response</span><span>.</span><span>status_code</span><span>)</span>
<span>print</span><span>(</span><span>'</span><span>Response:</span><span>'</span><span>,</span> <span>response</span><span>.</span><span>json</span><span>())</span>
import requests import json # Replace with your actual Medium integration token and user ID MEDIUM_TOKEN = 'your_medium_integration_token' USER_ID = 'your_user_id' headers = { 'Authorization': f'Bearer {MEDIUM_TOKEN}', 'Content-Type': 'application/json', 'Accept': 'application/json', 'host': 'api.medium.com', 'Accept-Charset': 'utf-8' } url = f'https://api.medium.com/v1/users/{USER_ID}/posts' # Article content and metadata data = { "title": "Your Article Title", "contentFormat": "markdown", # Choose 'html', 'markdown', or 'plain' "content": "# Hello World!\nThis is my first article using the Medium API.", "tags": ["python", "api", "medium"], "publishStatus": "draft" # Choose 'public' or 'draft' } # Sending the POST request response = requests.post(url=url, headers=headers, data=json.dumps(data)) print('Status code:', response.status_code) print('Response:', response.json())

Enter fullscreen mode Exit fullscreen mode

Now you can head over to Medium to check your latest draft. Once you’ve confirmed that everything is formatted correctly, you can go ahead and publish it directly!


Explore more

Luca LiuFollow

Hello there! I’m Luca, a Business Intelligence Developer with passion for all things data. Proficient in Python, SQL, Power BI, Tableau, SAP Business Objects.

Thank you for taking the time to explore data-related insights with me. I appreciate your engagement.

Connect with me on LinkedIn

原文链接:How to Publish an Article to Medium Using Python and the Medium API

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
Life is like a cup of tea. It won't be bitter for a lifetime but for a short while anyway.
人生就像一杯茶,不会苦一辈子,但总会苦一阵子
评论 抢沙发

请登录后发表评论

    暂无评论内容