Various and sundry additional pieces of software I've written to incorporate into my exocortex.
Python Shell HTML
Switch branches/tags
Nothing to show
Clone or download
virtadpt Finally wrote a README for
Signed-off-by: The Doctor <>
Latest commit 5760cbc Jul 8, 2018
Failed to load latest commit information.
beta_fork Deleted some broken directory references from scripts, which a… Oct 10, 2017
card_catalogue Fixed a long-standing bug in the XMPP bridge that kept it from workin… Jul 1, 2018
command_line_messager Initial commit of a crappy README file. May 30, 2017
copy_bot Figured out how to handle single and multiple file copies. Jun 26, 2017
download_bot Got "download just the audio" addition to working. May 28, 2018
exocortex_gps_mapper Added checks to the 'coordinates' class (/coordinates) to make sure the Jul 10, 2015
exocortex_sip_client Forgot that I could add a description in the online help text of Apr 23, 2018
exocortex_xmpp_bridge Worked on the file for the XMPP bridge because it was out o… Jul 8, 2018
gps_api_server Initial commit of For now, all it does is offer the May 24, 2018
hmac_a_tron Updated the feeble file. Jun 10, 2018
irc_bot Removed references to Dixie getting erased, because that kinda puts a… Oct 2, 2016
paywall_breaker Made it possible to specify the version of the Etherpad-Lite REST API… Apr 21, 2018
smtp_bridge Fixed a bug in which whatever loglevel was specified was overwritten … Nov 27, 2017
system_bot Finally wrote a README for Jul 8, 2018
test_bot Apr 30, 2017
web_index_bot Added a few more verbs (store, archive, get) to to m… Oct 1, 2017
web_search_bot Added code that lets the user run searches on specific engines through Oct 2, 2017 Added a new file, which I need to add stuff to. Sep 26, 2016
LICENSE Initial commit Jan 27, 2015 First crach at an EBNF (Extended Backus-Naur Form) grammar for Jan 23, 2017 Added a code of conduct. Dec 3, 2017


Various and sundry additional pieces of software I've written to incorporate into my exocortex that extend the functionality of Huginn ( You never know what you're going to find in here because I do a lot of idiosyncratic stuff and as I get ideas for functionality to incorporate new things will appear in here. Not all of them will make sense. I've tried to use as few external modules as possible; in general, if a particular module comes with a default Python v2.7 install I prefer it over somebody else's. I'm developing on Arch Linux and Ubuntu Server v14.04 LTS (both 64-bit). For times where a module isn't included by default (or available in the default package repositories) I've included a requirements.txt file, suitable for use with virtualenv and pip.


A more generic implementation of irc_bot/. Again, there is a REST API server which maintains a Markov brain; hypothetically speaking, you could swap out the Markov engine for any other kind of conversation engine you want. This simplifies writing other kinds of bots (IRC, Slack, XMPP, Twitter, et cetera) by breaking out the chat part. Right now only a proof-of-concept bot (an IRC bot) exists; it should serve as an example of writing other kinds of chatbots that plug into it. This is, again, in the experimental stage and doesn't have a lot of features (like databases of stuff to monitor channels for) yet.


A relatively simple web application that uses ( to implement a REST API. An application running on a smartphone periodically pings an endpoint with its current GPS coordinates. Contacting the web app throws up a Google Map with the GPS coordinates. It's far from complete because I don't know JavaScript but right now it's enough for my purposes.


A command line application that can be used to place calls into the PSTN through a Voice-Over-IP provider and play a .wav file as the call. I designed it to work as part of a larger toolkit of utilities. Requires PJSIP ( (but NOT PJSUA) to implement SIP functionality.

Special thanks to The Test Call for providing the default phone number for debugging. I got kind of tired of rickrolling myself...


A daemon that logs into an arbitrary XMPP server on one side and implements a dynamic message queue internally. The idea is that you should be able to send chat messages to the XMPP address the daemon logs into (it checks to see if they are from the bot's registered owner) and puts them into its internal message queues. The other side is a REST API service that other agents and bots can poll for commands. If you write a bot and you want to send it commands via XMPP, this is one way of going about it. I've tried to make the REST endpoints as self-documenting (wget and curl are enough to poke at it) and as extensible as possible (as long as you know what kind of JSON you want to get out of it, you should be able to do whatever you want). There is nothing preventing a single Exocortex from running multiple instances of this daemon on multiple hosts under different accounts; in fact, I strongly recommend doing so.


A bot that logs into an arbitrary IRC server and joins one (right now) or more channels (or it will, anyway), and listens to what gets posted. The bot has a Markov engine (and will eventually have a Dissociated Press engine) for occasionally responding to things that are said in the channel. The bot will also have a keyword detector that maintains a user-supplied list of interesting things to monitor for, picks up on them, and will report them to the user when they're said. Eventually, this bot will log into an XMPP server using a unique account and report that way; in addition the user will be able to "speak through" the bot into the channel to respond. I haven't gotten to the point where I

I used this as the basis for the bot:

This bot is still in the experimental stage, I only threw it in here when I did so that someone else could easily look at the code. It's really undeveloped so don't expect anything from it just yet. It'll probably be rewritten using a real IRC protocol implementation of some kind.


This bot was designed out of frustration with sites that throw up paywalls on articles which have critical information (such as specifics of vulnerabilities that involve remove code execution). The bot takes URLs from an exocortex_xmpp_bridge/ instance and downloads the page by spoofing the user agent of a search engine's spider (configurable). The page is parsed into text and copied into a new page in an instance of Etherpad-Lite where it can be read later. When the page is archived the configured user will receive an e-mail with a direct link to the Etherpad page. The new page will undoubtedly need some editing to clean it up but most of the time you'll get the content you're after. I highly recommend requiring authentication in front of your Etherpad-Lite instance to minimize the possibility that someone might abuse it. Here are the Etherpad-Lite plugins that I find very useful:

  • ep_list_pads
  • ep_public_view
  • ep_push2delete
  • ep_set_title_on_pad
  • ep_simpletextsearch


A bot that sends URLs given to it to the web indexing and archival sites listed in its configuration file. The examples I've provided are a local YaCy server, Gigablast, the Wayback Machine, and Webcitation. My original use case was the first one (YaCy) but I figured that it should be extensible so people could find other uses for it.


A bot that periodically polls a REST API service implementing its message queue (exocortex_xmpp_bridge/) looking for search requests. It carries out those web search requests by relaying them to a copy of Searx, extracts the search results, and sends them to an arbitrary e-mail address. For a good while this bot had a list of search engines and ways to parse out links to responses but it got to be too big a hassle to maintain so I opted to make it compatible with the Searx API. This means that one can, in theory, point it any Searx instance out there and get useful results.

Setting everything up

Get an account on an XMPP server

First, you need a dedicated XMPP (Jabber) account for the XMPP bridge. You could use a public one like, a friend's Jabber server (you'll need at least two XMPP accounts, one for yourself and one for each instance of the XMPP bridge), or you can set up your own on a VPS (they're pretty easy to set up and a more than usable VPS will cost $5-10us per month); again, you'll need at least two accounts on the XMPP server.

Check out this Git repository.

Clone this repo onto a Linux box you control. You could use a VPS running at a hosting provider, a Linux box at home, a RaspberryPi, or a full-sized machine someplace.

Set up exocortex_XMPP_bridge

  • cd exocortex-halo/exocortex_xmpp_bridge/
  • Set up a Python virtualenv to install the XMPP bridge's dependencies into.
  • virtualenv2 env
  • Wait...
  • Activate the virtualenv
  • . env/bin/activate
  • The command line prompt will change - it will start with "(env) "
  • Install the dependencies
  • pip install -r requirements.txt
  • Copy exocortex_xmpp_bridge.conf.example to exocortex_xmpp_bridge.conf and customize it for your environment. The XMPP username and password you set up for the XMPP bridge need to go in here. The 'real' names of the bots you plan to associate with this bridge need to go in the 'agents' list at the very end as shown.
  • You'll need one instance of for each server you have. I have multiple instances on different machines, all running different bots.
  • Start the XMPP bridge.
  • python2 ./

Log into your admin XMPP account and test the XMPP bridge.

Configure an XMPP client (I kinda like Profanity) to log into your personal (admin) XMPP account on the same server the XMPP bridge uses. Send an IM to your copy of the XMPP bridge and ask it for a status report:

Robots, report.

You should get a response something like this:

16:53 - me: Robots, report.
16:53 - Bridge : Contents of message queues are as follows:

        Agent Alice: []
        Agent Bob: []

This means that the XMPP bridge is up, running, and has set up message queues for the bots you told it to in the configuration file.