How to Create Your Own Twitter Bot with Python
Tags: tutorial, python, twitter, automation
Published: 2024-03-06 01:08:30

If you have ever thought about creating a [<mark style="background-color:rgba(0, 0, 0, 0)"><em>twitter</em></mark> bot](https://twitter.com/)then you are the right place. We will be creating a [<mark style="background-color:rgba(0, 0, 0, 0)"><em>twitter</em></mark>](https://twitter.com/) bot using Python programming language and if you are in process of learning Python, this will be a fun project to polish your programming skills. In this blog post you create your own twitter bot with Python and automate your repetitive tasks.

### Setting up your Environment

The first thing is to access to [<mark style="background-color:rgba(0, 0, 0, 0)"><em>twitter</em></mark>](https://twitter.com/)‘s API and you would need Twitter Development account. Here are the steps to follow.

- Apply for a _[<mark style="background-color:rgba(0, 0, 0, 0)">Developer account here</mark>](https://developer.twitter.com/en/apply-for-access)_<mark style="background-color:rgba(0, 0, 0, 0)">.</mark> 
- Now create a new application in developers portal and keep your API keys and access tokens safe. 

### Preparing your Python Environment

You have to have python installed on your system. After that you will install `Tweepy`, a python library to interact with Twitter API. Use `pip` to install it.

<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewbox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg>
```
pip install tweepy
```

Use of Twitter API allows your bot to perform actions like tweeting, retweeting and following users etc.

## Building Twitter Bot with Python

Lets get to work now.

### Authentication 

Lets code, first we have to authenticate with Twitter’s API using Tweepy.

<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewbox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg>
```
import tweepy

# Replace these with your API keys
consumer_key = 'YOUR_CONSUMER_KEY'
consumer_secret = 'YOUR_CONSUMER_SECRET'
access_token = 'YOUR_ACCESS_TOKEN'
access_token_secret = 'YOUR_ACCESS_TOKEN_SECRET'

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)
```

### Sending Tweets

Now that authentication is taken care of, lets send a tweet

<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewbox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg>
```
api.update_status("Hello, world! This is my first tweet from my Twitter bot.")
```

You have just tweeted

### Automating Likes and Retweets

We can automate liking or retweet a tweet using tweet’s ID. Here’s how

<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewbox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg>
```
tweet_id = '1234567890'
api.create_favorite(tweet_id) # Like
api.retweet(tweet_id) # Retweet
```

### Follow/Unfollow Users

You can follow or unfollow users by their usernames.

<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewbox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg>
```
api.create_friendship('username')
api.destroy_friendship('username')
```

## Enhancements for your Twitter Bot with Python

This can be further improved if you add following enhancements.

### Directory Structure

Create a project folder `twitter_bot` and navigate into it. Here is how it should looks like.

<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewbox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg>
```
twitter_bot/
│
├── .env # Stores API keys and tokens securely
├── bot.py # Main script for your Twitter bot actions
└── requirements.txt # Python dependencies for your project
```

- Create `.env` file that hosts all your important information like API keys and access tokens. 
- Create `requirements.txt`, a text file to add dependencies for your project. 
- Create `bot.py` and this will be your main code file that contains main script. 

Here is how you `.ENV` file looks like

<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewbox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg>
```
CONSUMER_KEY=your_consumer_key_here
CONSUMER_SECRET=your_consumer_secret_here
ACCESS_TOKEN=your_access_token_here
ACCESS_TOKEN_SECRET=your_access_token_secret_here
```

and your `REQUIREMENTS.TXT` looks like this

<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewbox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg>
```
tweepy==3.10.0
python-dotenv==0.15.0
```

Now main file `BOT.PY` can have following code.

<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewbox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg>
```
import tweepy
from dotenv import load_dotenv
import os

# Load environment variables
load_dotenv()

# Set up your Twitter API credentials
consumer_key = os.getenv("CONSUMER_KEY")
consumer_secret = os.getenv("CONSUMER_SECRET")
access_token = os.getenv("ACCESS_TOKEN")
access_token_secret = os.getenv("ACCESS_TOKEN_SECRET")

# Authenticate with the Twitter API
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)

# Function to send a tweet
def tweet(message):
    api.update_status(message)
    print("Tweeted: " + message)

if __name__ == " __main__":
    tweet("Hello, world! This is a tweet from my Twitter bot.")
```

Now in order to use this, open your `terminal` and run following command.

<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewbox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg>
```
pip install -r requirements.txt
```

This will install all the requirements for the project.

Now you can run your script like this.

<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewbox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg>
```
python bot.py
```

Here is updated `bot.py` with enhanced functions like searching tweets, replying, streaming, direct messages, and automated follow backs.

<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewbox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg>
```
import tweepy
from dotenv import load_dotenv
import os

# Load environment variables
load_dotenv()

# Twitter API credentials
consumer_key = os.getenv("CONSUMER_KEY")
consumer_secret = os.getenv("CONSUMER_SECRET")
access_token = os.getenv("ACCESS_TOKEN")
access_token_secret = os.getenv("ACCESS_TOKEN_SECRET")

# Authenticate with the Twitter API
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)

# Tweet a message
def tweet(message):
    api.update_status(message)
    print("Tweeted: " + message)

# Follow a user
def follow(username):
    api.create_friendship(username)
    print(f"Followed {username}")

# Unfollow a user
def unfollow(username):
    api.destroy_friendship(username)
    print(f"Unfollowed {username}")

# Like a tweet
def like(tweet_id):
    api.create_favorite(tweet_id)
    print(f"Liked tweet {tweet_id}")

# Unlike a tweet
def unlike(tweet_id):
    api.destroy_favorite(tweet_id)
    print(f"Unliked tweet {tweet_id}")

# Retweet
def retweet(tweet_id):
    api.retweet(tweet_id)
    print(f"Retweeted {tweet_id}")

# Search tweets
def search_tweets(query, count=10):
    tweets = api.search(q=query, count=count)
    for tweet in tweets:
        print(f"{tweet.id} - {tweet.text}")

# Reply to a tweet
def reply_to_tweet(tweet_id, message):
    api.update_status(status=message, in_reply_to_status_id=tweet_id, auto_populate_reply_metadata=True)
    print(f"Replied to tweet {tweet_id}")

# Automated follow-back
def auto_follow_back():
    for follower in tweepy.Cursor(api.followers).items():
        if not follower.following:
            follower.follow()
            print(f"Followed back {follower.name}")

# Streaming class
class MyStreamListener(tweepy.StreamListener):
    def on_status(self, status):
        print(status.text)

def start_stream(keywords):
    myStreamListener = MyStreamListener()
    myStream = tweepy.Stream(auth=api.auth, listener=myStreamListener)
    myStream.filter(track=keywords)

# Send direct message
def send_direct_message(user_id, message):
    api.send_direct_message(recipient_id=user_id, text=message)
    print(f"DM sent to {user_id}")

if __name__ == " __main__":
    # Example usage (comment out what you don't need)
    tweet("Hello, Twitter World from my bot!")
    follow("username_here")
    unfollow("username_here")
    like("tweet_id_here")
    unlike("tweet_id_here")
    retweet("tweet_id_here")
    search_tweets("Python")
    reply_to_tweet("tweet_id_here", "Thanks for tweeting!")
    auto_follow_back()
    send_direct_message("user_id_here", "Hello from the bot!")
    # start_stream(["Python", "Tweepy"]) # Uncomment to start streaming

```

Now here under line #83, you will comment out the feature you are not using that API call. Lets say if you just want to send a tweet, in that case comment out everything below tweet function on line 85.

We can further improve this script by adding the option to accept command line arguments. In this case we wont have to edit the main bot file everything we have to do something. See below for updated file.

<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewbox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg>
```
import tweepy
from dotenv import load_dotenv
import os

# Load environment variables
load_dotenv()

# Twitter API credentials
consumer_key = os.getenv("CONSUMER_KEY")
consumer_secret = os.getenv("CONSUMER_SECRET")
access_token = os.getenv("ACCESS_TOKEN")
access_token_secret = os.getenv("ACCESS_TOKEN_SECRET")

# Authenticate with the Twitter API
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)

# Tweet a message
def tweet(message):
    api.update_status(message)
    print("Tweeted: " + message)

# Follow a user
def follow(username):
    api.create_friendship(username)
    print(f"Followed {username}")

# Unfollow a user
def unfollow(username):
    api.destroy_friendship(username)
    print(f"Unfollowed {username}")

# Like a tweet
def like(tweet_id):
    api.create_favorite(tweet_id)
    print(f"Liked tweet {tweet_id}")

# Unlike a tweet
def unlike(tweet_id):
    api.destroy_favorite(tweet_id)
    print(f"Unliked tweet {tweet_id}")

# Retweet
def retweet(tweet_id):
    api.retweet(tweet_id)
    print(f"Retweeted {tweet_id}")

# Search tweets
def search_tweets(query, count=10):
    tweets = api.search(q=query, count=count)
    for tweet in tweets:
        print(f"{tweet.id} - {tweet.text}")

# Reply to a tweet
def reply_to_tweet(tweet_id, message):
    api.update_status(status=message, in_reply_to_status_id=tweet_id, auto_populate_reply_metadata=True)
    print(f"Replied to tweet {tweet_id}")

# Automated follow-back
def auto_follow_back():
    for follower in tweepy.Cursor(api.followers).items():
        if not follower.following:
            follower.follow()
            print(f"Followed back {follower.name}")

# Streaming class
class MyStreamListener(tweepy.StreamListener):
    def on_status(self, status):
        print(status.text)

def start_stream(keywords):
    myStreamListener = MyStreamListener()
    myStream = tweepy.Stream(auth=api.auth, listener=myStreamListener)
    myStream.filter(track=keywords)

# Send direct message
def send_direct_message(user_id, message):
    api.send_direct_message(recipient_id=user_id, text=message)
    print(f"DM sent to {user_id}")
    
# Initialize argument parser
parser = argparse.ArgumentParser(description="Twitter Bot - Perform actions on Twitter")
parser.add_argument('--action', help='Action to perform: tweet, follow, unfollow, like, unlike, retweet, search, reply, autofollowback, senddm, stream')
parser.add_argument('--param', nargs='*', help='Additional parameters for the action: message, username, tweet_id, query, user_id, keywords')

args = parser.parse_args()

if __name__ == " __main__":
    if args.action and args.param:
        if args.action == "tweet":
            tweet(" ".join(args.param))
        elif args.action == "follow":
            follow(args.param[0])
        elif args.action == "unfollow":
            unfollow(args.param[0])
        elif args.action == "like":
            like(args.param[0])
        elif args.action == "unlike":
            unlike(args.param[0])
        elif args.action == "retweet":
            retweet(args.param[0])
        elif args.action == "search":
            search_tweets(" ".join(args.param))
        elif args.action == "reply":
            reply_to_tweet(args.param[0], " ".join(args.param[1:]))
        elif args.action == "autofollowback":
            auto_follow_back()
        elif args.action == "senddm":
            send_direct_message(args.param[0], " ".join(args.param[1:]))
        elif args.action == "stream":
            start_stream(args.param)
    else:
        print("Please specify an action and any necessary parameters.")
```

### How to Use 

With this modified script, you can now run one function at a time by specifying the action and any required parameters from the command line. Here are some examples:

#### Easier command line usage for Twitter bot with Python

Now it would be easier to send a tweet or performa any function from your terminal like this.

<svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewbox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg>
```
# Send a tweet
python bot.py --action tweet --param "This is a tweet from the command line.

# Follow someone 
python bot.py --action follow --param username_here

# Like a tweet 
python bot.py --action like --param tweet_id_here

# Search tweets
python bot.py --action search --param "Python programming"

# Reply to a Tweet
python bot.py --action reply --param tweet_id_here "Thanks for the info!"
```

This approach offers flexibility and makes it easy to integrate your Twitter bot into automated workflows or your own custom scripts.

## Conclusion

Creating a Twitter bot with Python is a fun project that introduces you to the world of APIs and automation. Next project for yout try on would be to implement the same functionality using OOP in python.

May your bot be with you.

Check out our other posts related to _[<mark style="background-color:rgba(0, 0, 0, 0)">Python programming here</mark>](https://techtales.blog/category/coding/python/)_.

The post [How to Create Your Own Twitter Bot with Python](https://techtales.blog/how-to-create-your-own-twitter-bot-with-python/) appeared first on [TechTales](https://techtales.blog).