Created
October 27, 2018 22:56
-
-
Save jbsilva/e95871bc9adc9153ce9be87368d9d7eb to your computer and use it in GitHub Desktop.
Delete Tweets
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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__ = "[email protected]" | |
# 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