FreeDNS update script
Python includes logging in the standard library; rather than write your own, why not use it? You can specify an output file, and handle different levels of logging according to the situation.



Per the style guide, the identifiers of constants like freedns_domains should be UPPERCASE_WITH_UNDERSCORES. Also, any import statements should be at the top of the script.



Your docstring isn't quite formatted correctly, it should look like:

def log(message):
    """Appends a string to the logfile (hardcoded as log.txt).

    :param message: The message to be appended. Linebreaks are your responsibility.

    """


Also, I think that the Google style with sphinx-napoleon is much more readable, but YMMV.



Rather than have virtually the whole script running at the top level of the file, it is conventional to encapsulate it into a single entry point function (sometimes called main) then call it like:

if __name__ == '__main__':
    main()


This makes it much easier to reuse the functionality you've developed by importing it elsewhere without actually running anything.



Rather than using + to concatenate strings, I would generally use str.format, e.g.:

"\n\n" + str(now) + ": Script executing,"


would become:

"\n\n{!s}: Script executing,".format(now)




Improvements are a bit outside the usual scope of CR.SE, but as you've asked:


Yes, reading in the appropriate domains from a file would be a good idea. You could use e.g. a regular expression to validate them, or just try: to access them and deal with any exceptions.
Adding a command line interface (see e.g. argparse) would potentially make this more useful.