Code Monkey home page Code Monkey logo

linkbacks's Introduction

Pull Requests Welcome build status Pypi latest version License: AGPL v3

Pelican plugin implementing Linkback protocols, on the linking server side. More information in this blog article.

Protocols currently implemented:

❌ Refback: won't be implemented because it requires to retrieve the HTTP Referer header, which cannot be done by Pelican, a static blog engine

❌ TalkBack: won't be implemented because it did not gain enough popularity / traction since its birth in 2011

❌ Trackback (protocol spec): won't be implemented because it does not seem widely used, and requires to parse embedded RDF documents (enclosed in HTML comments as a fallback), which seems a poor design in an era of HTML5 / RDFa

Do not hesitate to suggest other protocols, or report your experience with this plugin, by submitting an issue.

What are linkbacks?

A linkback is a method for Web authors to obtain notifications when other authors link to one of their documents. This enables authors to keep track of who is linking to, or referring to, their articles. The four methods (Refback, Trackback, Pingback and Webmention) differ in how they accomplish this task.

I invite you to read this Wikipedia page for more information & links: Linkback

What does this plugin do?

For every hyperlink in your articles, this plugin will notify their hosting websites (just those supporting a Linkback protocol) of those references.

This plugin does not perform inclusion of Linkbacks in your articles / as comments, for every website referencing your content following a Linkback protocol, because this cannot be performed by a static website generator like Pelican.

When you enable this plugin the first time, it will process all the hyperlinks of your existing articles. It will do it only once, and then create a cache file to avoid processing those links next time. Still, because the publish step will be longer than usual the first time you enable this plugin, I recommend to use pelican -D flag to get debug logs, and hence follow the plugin progress.

Installation / setup instructions

To enable this plugin:

  1. Install the package from Pypi: pip install pelican-plugin-linkbacks
  2. Add the plugin to your publishconf.py:
PLUGINS = [..., 'linkbacks']

Cache

In order to avoid the repetitive CPU / bandwidth cost of repeatedly performing links parsing & linkback notifications, this hook only proceed to do so once, the first time an article is published.

In order to do so, it uses a very simple and small cache that contains the list of all hyperlinks already parsed, per article slug.

To remove a blog entry from cache, in order for the plugin to retry sending a linkback:

jq "del(.['$slug'])" pelican-plugin-linkbacks.json | sponge pelican-plugin-linkbacks.json

Configuration

Available options:

  • LINKBACKS_CACHEPATH (optional, default: $CACHE_PATH/pelican-plugin-linkbacks.json, where $CACHE_PATH is a Pelican setting) : the path to the JSON file containg this plugin cache (a list of URLs already processed).
  • LINKBACKS_USERAGENT (optional, default: pelican-plugin-linkbacks) : the User-Agent HTTP header to use while sending notifications.
  • LINKBACKS_CERT_VERIFY (optional, default: False) : enforce HTTPS certificates verification when sending linkbacks
  • LINKBACKS_REQUEST_TIMEOUT (optional, in seconds, default: 3) : time in seconds allowed for each HTTP linkback request before abandon

Contributing

Contributions are welcome and much appreciated. Every little bit helps. You can contribute by improving the documentation, adding missing features, and fixing bugs. You can also help out by reviewing and commenting on existing issues.

To start contributing to this plugin, review the Contributing to Pelican documentation, beginning with the Contributing Code section.

Releasing a new version

With a valid ~/.pypirc:

  1. update CHANGELOG.md
  2. bump version in pyproject.toml
  3. poetry build && poetry publish
  4. perform a release on GitGub, including the description added to CHANGELOG.md

Linter & tests

To execute them:

pylint *linkbacks.py
pytest

Integration tests

You'll find some advices & resources on indieweb.org: pingback page, webmention page.

For WebMentions specifically, the webmention.io service can be useful.

For Pingbacks, I used for my tests a Wordpress instance launched with Docker:

docker run --rm -p 80:80 -e WORDPRESS_DB_HOST=host.docker.internal -e WORDPRESS_DB_USER=... -e WORDPRESS_DB_PASSWORD=... wordpress

From my experience, you'll also have to:

  • configure a local MySQL database to accept connections from $WORDPRESS_DB_USER:$WORDPRESS_DB_PASSWORD
  • configure the xmlrpc_pingback_error Wordpress filter to be passthrough, to get useful error messages
  • configure the http_request_host_is_external Wordpress filter to always return true, so that it won't reject host.docker.internal links

Wordpress client source code related to XML-RPC pingbacks can be found there:

linkbacks's People

Contributors

justinmayer avatar lucas-c avatar pre-commit-ci[bot] avatar schtobia avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Forkers

schtobia

linkbacks's Issues

Default cache file path requires a ./cache folder to be created

After following the instructions in the README.md file and running 'make html' I got this:

CRITICAL FileNotFoundError: [Errno 2] No such file or directory: 'cache/pelican-plugin-linkbacks.json' at the end of the rendering process.

I proceeded to mkdir cache ; make html which solved the issue.

My thoughts:

  • a test is run earlier in the plugin for the config save path
  • documentation is updated to reflect the need to create the default destination folder for the json cache file
  • change the default location not to require ./cache

Thanks

Feature: change JSON cache structure to store linkbacks requests status

This would allow to easily audit which URLs have been successfully submitted, and the error responses for the ones that haven't.

Suggested new JSON structure:

{
  $article_slug: {
    $url: {
      "pingback": { // optional, no pingback support detected if field is absent
        "server_uri": "http...",
        "submission_successful": boolean,
        "error": // optional string
      },
      "webmention": { // optional, no webmention support detected if field is absent
        "server_uri": "http...",
        "submission_successful": boolean,
        "error": // optional string
      }
    },
    ...
  },
  ...
}

This schema change must be implemented so that the old JSON caches can still be parsed, but are then saved with the new structure

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.