Skip to main content

On This Page

Solved: Automate Twitter/X Posts when a New Blog Post is Published (RSS to API)

3 min read
Share

These articles are AI-generated summaries. Please check the original sources for full details.

Automate Twitter/X Posts when a New Blog Post is Published (RSS to API)

This guide provides a custom, serverless-friendly Python solution to automate X/Twitter posts for new blog articles, eliminating manual effort and recurring SaaS costs. It leverages RSS feeds and the X/Twitter API, scheduled via cron, to automatically announce new content.

Why This Matters

Many content creators rely on social media to drive traffic to their blogs, but manually posting each new article is time-consuming and prone to errors. While existing social media management tools offer automation, they often come with subscription fees and limited customization. A custom solution, like the one described here, offers cost savings and greater control, but requires careful consideration of API rate limits and potential authentication issues, which can lead to failed posts and lost engagement.

Key Insights

  • X API Rate Limits: The X API imposes restrictions on the number of requests an application can make within a given timeframe.
  • Sagas over ACID for e-commerce: Automating social media posts introduces eventual consistency challenges, similar to those addressed by Saga patterns in distributed systems.
  • Python’s feedparser and tweepy: These libraries simplify RSS feed parsing and X/Twitter API interaction, respectively, reducing development time and complexity.

Working Example

import feedparser
import os
from datetime import datetime, timezone
import tweepy

# --- Configuration ---
RSS_FEED_URL = "https://techresolve.com/feed/"
LAST_CHECKED_FILE = "last_checked_timestamp.txt"
SECRETS_FILE = "secrets.txt"
MAX_TWEET_LENGTH = 280

def load_secrets(file_path):
    secrets = {}
    if os.path.exists(file_path):
        with open(file_path, "r") as f:
            for line in f:
                if "=" in line:
                    key, value = line.strip().split("=", 1)
                    secrets[key] = value.strip('"')
    return secrets

def get_last_checked_timestamp():
    if os.path.exists(LAST_CHECKED_FILE):
        with open(LAST_CHECKED_FILE, "r") as f:
            timestamp_str = f.read().strip()
            if timestamp_str:
                return datetime.fromisoformat(timestamp_str).replace(tzinfo=timezone.utc)
    return datetime.min.replace(tzinfo=timezone.utc)

def set_last_checked_timestamp(timestamp):
    with open(LAST_CHECKED_FILE, "w") as f:
        f.write(timestamp.isoformat())

def fetch_new_posts():
    feed = feedparser.parse(RSS_FEED_URL)
    new_posts = []
    last_checked = get_last_checked_timestamp()
    current_latest_post_timestamp = last_checked
    for entry in feed.entries:
        if 'published_parsed' in entry:
            post_date = datetime(*entry.published_parsed[:6], tzinfo=timezone.utc)
            if post_date > last_checked:
                new_posts.append({
                    "title": entry.title,
                    "link": entry.link,
                    "published": post_date
                })
            if post_date > current_latest_post_timestamp:
                current_latest_post_timestamp = post_date
    new_posts.sort(key=lambda x: x["published"])
    if new_posts:
        set_last_checked_timestamp(current_latest_post_timestamp)
        print(f"Updated last checked timestamp to: {current_latest_post_timestamp}")
    return new_posts

def post_tweet(api, tweet_text):
    try:
        api.update_status(tweet_text)
        print(f"Successfully tweeted: {tweet_text}")
    except tweepy.TweepyException as e:
        print(f"Error posting tweet: {e}")

if __name__ == "__main__":
    secrets = load_secrets(SECRETS_FILE)
    API_KEY = secrets.get("API_KEY")
    API_SECRET = secrets.get("API_SECRET")
    ACCESS_TOKEN = secrets.get("ACCESS_TOKEN")
    ACCESS_TOKEN_SECRET = secrets.get("ACCESS_TOKEN_SECRET")

    auth = tweepy.OAuth1UserHandler(API_KEY, API_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
    api = tweepy.API(auth)

    posts = fetch_new_posts()
    if posts:
        for post in posts:
            title = post['title']
            link = post['link']
            tweet_template = "New blog post published: \"{title}\" Read it here: {link} #TechResolve #DevOps #Automation"
            tweet_text = tweet_template.format(title=title, link=link)
            post_tweet(api, tweet_text)
    else:
        print("No new posts found to tweet.")

Practical Applications

  • TechResolve.blog: Automates the posting of new blog articles to X/Twitter, increasing visibility and driving traffic.
  • Pitfall: Incorrectly configured cron jobs can lead to missed posts or excessive API calls, potentially resulting in rate limiting or account suspension.

Continue reading

Next article

The Right Way to Deploy Private GitHub Repos to Your VPS

Related Content