You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

189 lines
7.3 KiB

8 years ago
8 years ago
8 years ago
8 years ago
  1. XRay
  2. ====
  3. ## Discovering Content
  4. The contents of the URL is checked in the following order:
  5. * A silo URL from one of the following websites:
  6. ** Instagram
  7. ** Twitter
  8. ** (more coming soon)
  9. * h-entry, h-event, h-card
  10. * OEmbed (coming soon)
  11. * OGP (coming soon)
  12. ## Parse API
  13. To parse a page and return structured data for the contents of the page, simply pass a url to the parse route.
  14. ```
  15. GET /parse?url=https://aaronparecki.com/2016/01/16/11/
  16. ```
  17. To conditionally parse the page after first checking if it contains a link to a target URL, also include the target URL as a parameter. This is useful if using XRay to verify an incoming webmention.
  18. ```
  19. GET /parse?url=https://aaronparecki.com/2016/01/16/11/&target=http://example.com
  20. ```
  21. In both cases, the response will be a JSON object containing a key of "type". If there was an error, "type" will be set to the string "error", otherwise it will refer to the kind of content that was found at the URL, most often "entry".
  22. You can also make a POST request with the same parameter names.
  23. ### Authentication
  24. If the URL you are fetching requires authentication, include the access token in the parameter "token", and it will be included in an "Authorization" header when fetching the URL. (It is recommended to use a POST request in this case, to avoid the access token potentially being logged as part of the query string.)
  25. ```
  26. POST /parse
  27. url=https://aaronparecki.com/2016/01/16/11/
  28. &target=http://example.com
  29. &token=12341234123412341234
  30. ```
  31. ### Twitter Authentication
  32. XRay uses the Twitter API to fetch posts, and the Twitter API requires authentication. In order to keep XRay stateless, it is required that you pass in Twitter credentials to the parse call. You can register an application on the Twitter developer website, and generate an access token for your account without writing any code, and then use those credentials when making an API request to XRay.
  33. You should only send Twitter credentials when the URL you are trying to parse is a Twitter URL, so you'll want to check for whether the hostname is `twitter.com` before you include credentials in this call.
  34. * twitter_api_key - Your application's API key
  35. * twitter_api_secret - Your application's API secret
  36. * twitter_access_token - Your Twitter access token
  37. * twitter_access_token_secret - Your Twitter secret access token
  38. ### Error Response
  39. ```json
  40. {
  41. "error": "not_found",
  42. "error_description": "The URL provided was not found"
  43. }
  44. ```
  45. Possible errors are listed below:
  46. * `not_found`: The URL provided was not found. (Returned 404 when fetching)
  47. * `ssl_cert_error`: There was an error validating the SSL certificate. This may happen if the SSL certificate has expired.
  48. * `ssl_unsupported_cipher`: The web server does not support any of the SSL ciphers known by the service.
  49. * `timeout`: The service timed out trying to connect to the URL.
  50. * `invalid_content`: The content at the URL was not valid. For example, providing a URL to an image will return this error.
  51. * `no_link_found`: The target link was not found on the page. When a target parameter is provided, this is the error that will be returned if the target could not be found on the page.
  52. * `no_content`: No usable content could be found at the given URL.
  53. * `unauthorized`: The URL returned HTTP 401 Unauthorized.
  54. * `forbidden`: The URL returned HTTP 403 Forbidden.
  55. ### Response Format
  56. ```json
  57. {
  58. "data": {
  59. "type": "entry",
  60. "author": {
  61. "type": "card",
  62. "name": "Aaron Parecki",
  63. "photo": "https://aaronparecki.com/images/aaronpk-256.jpg",
  64. "url": "https://aaronparecki.com/"
  65. },
  66. "url": "https://aaronparecki.com/2016/01/16/11/",
  67. "published": "2016-01-16T16:26:43-08:00",
  68. "photo": [
  69. "https://aaronparecki.com/2016/01/16/11/photo.png"
  70. ],
  71. "syndication": [
  72. "https://twitter.com/aaronpk/status/688518372170977280"
  73. ],
  74. "summary": "Now that @MozillaPersona is shutting down, the only good way to do email-based login is how @poetica does it.",
  75. "content": {
  76. "html": "Now that <a href=\"https://twitter.com/MozillaPersona\">@MozillaPersona</a> is shutting down, the only good way to do email-based login is how <a href=\"https://twitter.com/poetica\">@poetica</a> does it.",
  77. "text": "Now that @MozillaPersona is shutting down, the only good way to do email-based login is how @poetica does it."
  78. },
  79. }
  80. }
  81. ```
  82. If a property supports multiple values, it will always be returned as an array. The following properties support multiple values:
  83. * in-reply-to
  84. * syndication
  85. * photo (of entry, not of a card)
  86. The content will be an object that always contains a "text" property and may contain an "html" property if the source documented published HTML content. The "text" property must always be HTML escaped before displaying it as HTML, as it may include unescaped characters such as `<` and `>`.
  87. The author will always be set in the entry if available. The service follows the [authorship discovery](http://indiewebcamp.com/authorship) algorithm to try to find the author information elsewhere on the page if it is not inside the entry in the source document.
  88. All URLs provided in the output are absolute URLs. If the source document contains a relative URL, it will be resolved first.
  89. In a future version, replies, likes, reposts, etc. of this post will be included if they are listed on the page.
  90. ```json
  91. {
  92. "data": {
  93. "type": "entry",
  94. ...
  95. "like": [
  96. {
  97. "type": "cite",
  98. "author": {
  99. "type": "card",
  100. "name": "Thomas Dunlap",
  101. "photo": "https://s3-us-west-2.amazonaws.com/aaronparecki.com/twitter.com/9055c458a67762637c0071006b16c78f25cb610b224dbc98f48961d772faff4d.jpeg",
  102. "url": "https://twitter.com/spladow"
  103. },
  104. "url": "https://twitter.com/aaronpk/status/688518372170977280#favorited-by-16467582"
  105. }
  106. ],
  107. "comment": [
  108. {
  109. "type": "cite",
  110. "author": {
  111. "type": "card",
  112. "name": "Poetica",
  113. "photo": "https://s3-us-west-2.amazonaws.com/aaronparecki.com/twitter.com/192664bb706b2998ed42a50a860490b6aa1bb4926b458ba293b4578af599aa6f.png",
  114. "url": "http://poetica.com/"
  115. },
  116. "url": "https://twitter.com/poetica/status/689045331426803712",
  117. "published": "2016-01-18T03:23:03-08:00",
  118. "content": {
  119. "text": "@aaronpk @mozillapersona thanks very much! :)"
  120. }
  121. }
  122. ]
  123. }
  124. }
  125. ```
  126. ## Token API
  127. When verifying [Private Webmentions](https://indieweb.org/Private-Webmention#How_to_Receive_Private_Webmentions), you will need to exchange a code for an access token at the token endpoint specified by the source URL.
  128. XRay provides an API that will do this in one step. You can provide the source URL and code you got from the webmention, and XRay will discover the token endpoint, and then return you an access token.
  129. ```
  130. POST /token
  131. source=http://example.com/private-post
  132. &code=1234567812345678
  133. ```
  134. The response will be the response from the token endpoint, which will include an `access_token` property, and possibly an `expires_in` property.
  135. ```
  136. {
  137. "access_token": "eyJ0eXAXBlIjoI6Imh0dHB8idGFyZ2V0IjoraW0uZGV2bb-ZO6MV-DIqbUn_3LZs",
  138. "token_type": "bearer",
  139. "expires_in": 3600
  140. }
  141. ```
  142. If there was a problem fetching the access token, you will get one of the errors below in addition to the HTTP related errors returned by the parse API:
  143. * `no_token_endpoint` - Unable to find an HTTP header specifying the token endpoint.