webmention-implementation-guide

Sending Webmentions
The beauty of simple protocols is that you can do most of this manually very easily.  curl -i -s $target | grep 'rel="webmention"'
 * Given a target to which you want to send a webmention, you need to first discover its webmention endpoint:
 * Note: this is only an approximation, your implementation MUST accept a "webmention" value among the space separated set of terms in the 'rel' attribute. Older implementations may use  and some may use both:   neither of which are discovered by the grep above. Some may use single quotes (or no quotes at all) to surround the   rel value. Still others may only support discovery with an HTTP Link header (e.g. Taproot). Compliant implementations must check the HTTP Link headers for the rel value first, and if not found then parse for the rel value on a   or   element in the   per the HTML specification on parsing rel values.

curl -i -d "source=$your_url&target=$target_url" $targets_webmention_endpoint
 * Now to send the webmention:

One-liner webmentions
This will send the webmention in a single command: curl -i -d "source=$your_url&target=$target_url" `curl -i -s $target_url | grep 'rel="http://webmention.org/"' | sed 's/rel="webmention"//' | grep -o -E 'https?://[^ ">]+' | sort | uniq`

See also this gist for sending pingbacks manually: https://gist.github.com/aaronpk/5744879

Endpoint Discovery in PHP
The following code is a set of simple short & flat functions for doing discovery of webmentions in PHP.

Automatic discovery could be implemented in PHP by: $w = 0; $c = curl_init($url); curl_setopt($c, CURLOPT_FOLLOWLOCATION, true); curl_setopt($c, CURLOPT_RETURNTRANSFER, true); $s = curl_exec($c);
 * look for a link header using a HTTP request library to get the rels
 * link_rel_parser.php :
 * use  to curl a HEAD request and from the return value info get back HTTP info["status"] and info["rels"] as a rels array if any.
 * if you already have the raw HTTP header, use  to get a rels array
 * and then lookup rels["webmention"] for webmention endpoints
 * if no Link: for webmention found AND info["type"] == "text/html" or "application/xhtml+xml" then
 * use PHP DOMDocument to search the retrieved document for the first element (or first that matches selector:  ) e.g.:

$dom = new DOMDocument; $dom->loadHTML($s); $domx = new DOMXPath($dom); $ws = $domx->query(xphasrel('webmention')); // except with link instead of * if ($ws) { $w = $ws->item(0)->getAttribute('href'); } // if ($w!=0) then it has a webmention endpoint. // this code could be changed into a html_webmention_rel($url) function, // to be called only if head_http_rels($url) returns no "rels" array //  or has no "webmention" item(s) in said array

Alternatively see mention-client-php for an object-oriented implementation.

Accepting Webmentions
Currently the easiest way to test consuming webmentions is to implement sending them, then send yourself mentions.

Once you’re ready to test integration with another site, you can either ask someone in IRC to send you a comment, or mention your page in IRC and send a webmention from IRC log URL for that line to your URL.

For example this IRC line links to http://caseorganic.com/notes/2014/02/18/1/. Pasting the URL for the IRC line into the indiewebify.me webmention sender will send webmentions for all the links on the page. Then you can check your page or your server logs to see if the webmention was successful — in this case the comment successfully showed up on the target page.

checkmention
Checkmention lets you test your webmention implementation on your indieweb site, and whether it robustly detects certain types of XSS attacks. It also allows you to test for authorship spoofing.

node-webmention-testpinger
node-webmention-testpinger is a tool to ping your site with a variety of webmentions markup. Contains copies of a couple of real world examples of mentions that it enables you to ping locally to a development copy of your site.

node-webmention-testendpoint
node-webmention-testendpoint is tool to test your webmentions client. Generates a demo-post and a demo-endpoint to test if your client parses the webmention-endpoint correctly and to check if the ping body is transmitted correctly.

webmention.rocks
https://webmention.rocks is a test suite that you can use to make sure your Webmention implementation can handle a variety of inputs.