#!/usr/bin/env python
# PREFACE
# If you want to keep a copy of your data, request it here (takes a few days):
# https://www.reddit.com/settings/data-request
# with this, you can delete ALL your comments by putting comments.csv from the request
# into the directory with the script. Warning: it does NOT ask you.
# Without the file, the script edits 100 comments to voice the protest and
# propagate itself, then deletes what it can (~1000 comments).
# SETUP
# Save this script as `unreddit.py`
# Install Python, any version 3.7+.
# Run `pip install praw` in terminal--this package accesses Reddit API.
# Go to https://www.reddit.com/prefs/apps to create an app.
# Name: anything, I called it "unexister" as it can't contain "reddit".
# Type: `script`. Redirect url: `http://localhost`.
# After creation, you will find:
# CLIENTID under "personal use script", and
# CLIENTSECRET by "secret".
# REDDITUSERNAME and REDDITPASSWORD you already know.
# Input them all in the variables below these instructions.
# EXECUTION
# Execute this file with `python unreddit.py` on any platform.
# On Linux (e.g. RasPi), you may want to use `nohup python unreddit.py > unreddit.log &`
# to let it run in the background until finished, as it can take a LONG while.
CLIENTID = ''
CLIENTSECRET = ''
REDDITUSERNAME = ''
REDDITPASSWORD = ''
COMMENTSCSV = 'comments.csv'
################### here be dragons ###################
import os
import praw
from datetime import datetime
USERAGENTNAME = f'void:unexister:1 (by u/{REDDITUSERNAME})'
myreddit = praw.Reddit(
client_id = CLIENTID,
client_secret = CLIENTSECRET,
user_agent = USERAGENTNAME,
username = REDDITUSERNAME,
password = REDDITPASSWORD
)
myreddit.validate_on_submit = True
user = myreddit.redditor(REDDITUSERNAME)
# we'll replace comments with this text.
replace_with = """#!> This comment has been edited in protest to reddit's decision to bully 3rd party apps into closure.
If you want to do the same, you can find instructions here:
https://rentry.co/unreddit
"""
# delete ALL comments from the csv file
if COMMENTSCSV and os.path.exists(COMMENTSCSV):
import csv
with open(COMMENTSCSV, 'r', encoding='utf-8-sig') as f:
reader = csv.reader(f)
headers = next(reader)
content = []
for row in reader:
content.append(dict(zip(headers, row)))
for c in content:
# print some info about the comment
text = f"{c['subreddit']} {c['body']}"[:60].replace('\n', '|')
print('\n', c['date'], c['id'], text, end='')
# there's no fast way (w/o fetching) to check if already gone,
# so don't restart this. leave it churning until it's done
myreddit.comment(id=c['id']).delete()
print(" — deleted", end='')
# otherwise just do your best
else:
count = 0
for comment in user.comments.new(limit=None):
count +=1
# print some info about the comment
time = datetime.fromtimestamp(comment.created_utc).isoformat()
text = f"{comment.subreddit.display_name} {comment.body}"[:60].replace('\n', '|')
print('\n', time, comment.id, text, end='')
# if we've already edited this comment, move to the next one
if "#!>" in comment.body:
continue
# edit 100 comments, delete the rest
if count >= 100:
comment.delete()
print(" — deleted", end='')
else:
comment.edit(replace_with)
print(" — edited", end='')