34
Post to Reddit using its API

This post is for day 2 of my #100DaysOfCode. In this post I'll be discussing how to programmatically post to Reddit using NodeJS and Typescript.
Getting an authentication token for Reddit is complicated.
If you have a business and plan on this token generating income, follow this form.
For personal use, navigate to your Reddit apps and scroll to the bottom of the page. You should see a grey button that says "create another app...". Click the button and fill out the form. Successfully submitting this form should generate

Make sure you have NodeJS installed
I prefer yarn, but you can use npm instead if you prefer
Copy this
package.json
file and run yarn install
to install the dependencies.{
"name": "reddit-post",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"scripts": {
"dev": "ts-node index.ts"
},
"devDependencies": {
"ts-node": "^10.1.0",
"typescript": "^4.3.5"
},
"dependencies": {
"dotenv": "^10.0.0",
"snoowrap": "^1.23.0"
}
}
.env files are used as a best practice to keep secret keys (such as our authentication tokens) off of GitHub. Make sure to have a
.gitignore
file and add .env
to it.The
.env
file should look like this:username = '<REDDIT USERNAME>'
password = '<REDDIT PASSWORD>'
clientId = 'CLIENT_ID'
clientSecret = 'CLIENT SECRET'
Just make sure you replace the
<>
text with the tokens Twitter provided you.Make sure you do not commit your .env file to Github or any other version control systems. These tokens are very important, and should not be shared with anyone!
const snoowrap = require('snoowrap')
require('dotenv').config()
const config = {
username: process.env.username,
password: process.env.password,
clientId: process.env.clientId,
clientSecret: process.env.clientSecret,
}
/api/submit
with the title, link, and subreddit parameters.
function postLink(title: string, link: string, subreddit: string) {
const r = new snoowrap({
userAgent: 'Whatever',
clientId: config.clientId,
clientSecret: config.clientSecret,
username: config.username,
password: config.password,
})
r.getSubreddit(subreddit).submitLink({
title: title,
url: link,
sendReplies: true,
})
}
const r = new snoowrap({
userAgent: 'Whatever',
clientId: config.clientId,
clientSecret: config.clientSecret,
username: config.username,
password: config.password,
})
This snippet of code is creating a new
snoowrap
instance that connects to the Reddit service.r.getSubreddit(subreddit).submitLink({
title: title,
url: link,
sendReplies: true,
})
submitLink
: Creates a new link submission on this subreddit with the title provided, url of the link, and any other options that the snoowrap api allows, such as the sendReplies
option that allows replies to the post to send replies to the authenticated user's inbox.Now add
postLink(
'Post to Reddit with NodeJS and Typescript',
'https://codybontecou.com/post-to-reddit-with-nodejs-and-typescript.html',
'webdev'
)
with the parameters you want to use at the bottom of
index.ts
.Once you are ready, type
yarn dev
into your projects terminal. If all is good, you should be able to see your post is now on Reddit!Make this more dynamic by iterating over multiple subreddits within an array:
const url =
'https://codybontecou.com/post-to-reddit-with-nodejs-and-typescript.html'
const title = 'Post to Reddit using its API'
const subreddits = ['webdev', 'learnjavascript', 'typescript', 'programming']
subreddits.forEach(subreddit => postLink(title, url, subreddit))
I hope this article was helpful, let me know if you have any questions, comments, or suggestions on Twitter @codybontecou