.gitignore | ||
discorss.py | ||
LICENSE | ||
README.md |
DiscoRSS
What is it?
DiscoRSS is a simple Python script to send RSS feeds to Discord webhooks. It was created because existing bots that did this set limits on the number of feeds, and self-hosting stuff is easier and better anyway. To get this working, you will require the following Python libraries:
requests >= 2.4.2
feedparser
The remaining imports should all be part of the standard Python install.
Important Notes
As it currently is written, the script uses the hash of the post title to prevent sending duplicates. However, a recent change to check for the publish time was added, only because some feeds are not in reverse chronological order (latest post at top of feed, ie, entry index 0). Because of this, we do actually need to check the publish times. This still needs some testing and things might be a bit broken because of it. If you see any issues please let me know.
Logging was recently enabled. Make sure that the user running the script (especially when using systemd timers) has write access to the /var/log/discorss directory. The app will try and create the directory for you, but if your user doesn't have permissions to create directories in /var/log this will fail and this will probably crash the script as is. I will try and remember to catch that exception and exit gracefully with an error message to stdout. If you want the logs to go somewhere else, just edit the log_dir variable near the top of discorss.py. Choose a directory that makes sense. Unfortunately, as far as I know, the XDG standards don't have an equivalent to the /var/log directory in the user directory, so I wasn't sure what the best default was. In the future, we may switch to logging using systemd and journald directly, though it is nice to have a separate file.
How to setup
To configure the script, create ~/.config/discorss/discorss.conf with the following structure:
{
"feeds": [
{
"name": "Phoronix",
"siteurl": "https://www.phoronix.com/",
"url": "http://www.phoronix.com/rss.php",
"webhook": "webhook url",
"offset": -18000
},
{
"name": "Pagetable",
"siteurl": "https://pagetable.com",
"url": "https://www.pagetable.com/?feed=rss2",
"webhook": "webhook url",
"offset": -18000
}
]
}
Create a webhook for each feed (unless you want them all to show as the same webhook for whatever reason) and make sure to add it in to the config. I have it set up with a webhook for each site, each with the site's icon and name set for the webhook which makes the messages look really nice.
The offset should only be required if feeds aren't showing up. This is because feedparser, in its infinite wisdom, just ignores the timezone when converting publish dates from feeds. So most feeds end up with an epoch in UTC. The offset should be the number of seconds between your time zone and UTC. This will eventually be fixed in a future update, I just need to sit down and wrangle with feedparser and datetime some more. All fields are mandatory, if you want to have no offset for example, set it to 0. The name and siteurl are used to create the "author" field in the Discord embed.
Automation
To automate feed posting, create a systemd service and timer to execute the script.
Use the command systemctl --user edit --full --force discorss.service
and then paste in something like this:
[Unit]
Description=Discord RSS feeder
Wants=discorss.timer
[Service]
Type=oneshot
ExecStart=/path/to/discorss.py
[Install]
WantedBy=default.target
Make sure to edit the ExecStart to point to the correct location. Then we need a systemd timer to automatically fire the script. Run systemctl --user edit --full --force discorss.timer
and then paste in this:
[Unit]
Description=Timer for DiscoRSS
Requires=discorss.service
[Timer]
Unit=discorss.service
OnCalendar=*-*-* *:00,15,30,45:30
AccuracySec=10s
[Install]
WantedBy=timers.target
To change how often this fires, edit the OnCalendar parameter. The config above has it firing every 15 minutes at half past the minute. Look at the systemd timer man pages for help if you want to tweak it.
Contributing
Want to fix something or make a suggestion? Feel free! If you want to send a pull request, you must run the Python black
formatter on the source code before committing. I have this set up in my editor to automatically run every time I save the file, but you could have it run as part of a git hook or something. For non-format stuff, please just follow the code style as best you can. For Python code, I separate multi-word variable names with underscores. So it should be feed_time
, not feedTime
or FeedTime
or feed-time
. Don't ask me why, but I use camelCase for other languages... but in Python I've switched to underscores.
If you know how and are able to, please sign your commits with the -S
option to git commit
. This shows that you are the author, especially if others have signed your keys.