Skip to content

Instantly share code, notes, and snippets.

@jbsilva
Created October 27, 2018 22:56
Show Gist options
  • Save jbsilva/e95871bc9adc9153ce9be87368d9d7eb to your computer and use it in GitHub Desktop.
Save jbsilva/e95871bc9adc9153ce9be87368d9d7eb to your computer and use it in GitHub Desktop.
Delete Tweets
#!/usr/bin/env python3
# -*-*- encoding: utf-8 -*-*-
# Created: Tue, 26 Sep 2017 20:05:39 -0300
"""
Delete old tweets
split -l $((1 + $(wc -l < tweets.csv) / 3)) tweets.csv
"""
import argparse
import sys
import csv
import time
import requests
from twython import Twython, TwythonRateLimitError
from multiprocessing.dummy import Pool
__author__ = "Julio Batista Silva"
__copyright__ = "Copyright (c) 2017, Julio Batista Silva"
__license__ = "GPL v3"
__version__ = "1.0"
__email__ = "julio@juliobs.com"
# Source:
# https://unsupervisedlearning.wordpress.com/2014/07/06/scraping-your-twitter-homepage-with-python-and-mongodb/
def handle_rate_limiting(twitter):
app_status = {'remaining': 1}
while True:
if app_status['remaining'] > 0:
status = twitter.get_application_rate_limit_status(
resources=['statuses', 'application'])
app_status = status['resources']['application']['/application/rate_limit_status']
home_status = status['resources']['statuses']['/statuses/home_timeline']
if home_status['remaining'] == 0:
wait = max(
home_status['reset'] - time.time(),
0) + 1 # addding 1 second pad
print("Sleeping {} seconds.".format(wait))
time.sleep(wait)
else:
return
else:
wait = max(app_status['reset'] - time.time(), 0) + 10
print("Sleeping for {} seconds.".format(wait))
time.sleep(wait)
# Delete old tweets
def delete_tweets(twitter, archive_csv):
with open(archive_csv) as csv_file:
read_csv = csv.reader(csv_file, delimiter=",")
for row in read_csv:
id = row[0]
# Check header.
# 404: tweet already deleted
# 302: RT
url = "https://twitter.com/USUARIO/status/" + str(id)
try:
r = requests.head(url)
if r.status_code == 200 or r.status_code == 302:
try:
handle_rate_limiting(twitter)
tweet = twitter.show_status(id=id)
favs = tweet["favorite_count"]
rts = tweet["retweet_count"]
if (rts < 2 and favs < 2) or r.status_code == 302:
print("Deleting id: {}".format(id))
twitter.destroy_status(id=id)
else:
print("Keeping id: {}".format(id))
except TwythonRateLimitError as e:
print("[Exception Raised] Rate limit exceeded")
reset = int(
twitter.get_lastfunction_header('x-rate-limit-reset'))
wait = max(reset - time.time(), 0) + \
10 # adding 10 second pad
print("Waiting {} seconds.".format(wait))
time.sleep(wait)
except Exception as e:
print("Error: {}".format(e))
continue
else:
print(r.status_code)
except requests.ConnectionError:
print("failed to connect")
def main():
# Auth and API
consumer_key = ''
consumer_secret = ''
access_token = ''
access_token_secret = ''
twitter1 = Twython(
consumer_key,
consumer_secret,
access_token,
access_token_secret)
# Auth and API 2
consumer_key = ''
consumer_secret = ''
access_token = ''
access_token_secret = ''
twitter2 = Twython(
consumer_key,
consumer_secret,
access_token,
access_token_secret)
# Auth and API 3
consumer_key = ''
consumer_secret = ''
access_token = ''
access_token_secret = ''
twitter3 = Twython(
consumer_key,
consumer_secret,
access_token,
access_token_secret)
# Auth and API 4
consumer_key = ''
consumer_secret = ''
access_token = ''
access_token_secret = ''
twitter4 = Twython(
consumer_key,
consumer_secret,
access_token,
access_token_secret)
# Auth and API 5
consumer_key = ''
consumer_secret = ''
access_token = ''
access_token_secret = ''
twitter5 = Twython(
consumer_key,
consumer_secret,
access_token,
access_token_secret)
# Threads
with Pool() as pool:
pool.starmap(delete_tweets, [(twitter1, "xaa"), (twitter2, "xab"),
(twitter3, "xac"), (twitter4, "xad"), (twitter5, "xae")])
return 0
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Delete old tweets')
parser.add_argument('--version', action='version',
version='%(prog)s v' + __version__)
# parser.add_argument("archive_csv", type=str, help="twitter archive csv file")
args = parser.parse_args()
sys.exit(main())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment