Différences entre versions de « PESOS »

De Mi caja de notas

(Page créée avec « {{wp}} »)
 
 
Ligne 1 : Ligne 1 :
{{wp}}
+
{{iwc}}

Version actuelle datée du 8 février 2019 à 06:04

PESOS icon
PESOS icon

PESOS is an acronym for Publish Elsewhere, Syndicate (to your) Own Site. It's a syndication model where publishing starts by posting to a 3rd party service, then using infrastructure (e.g. feeds, Micropub, webhooks) to create an archive copy on your site.

The opposite (and preferable) approach is POSSE, whereby a user publishes original content to their own site, and then syndicates copies to 3rd party services, preferably with perma(short)links back to the originals on their own site.

Implementations

IndieWeb Examples

HU, Pili

Pulls content from multiple silos and present them in his own sites (currently only in form of an RSS feed) using SNSAPI https://github.com/hupili/snsapi

  • Facebook
  • Twitter
  • Renren, the large OSN in China. It's a Facebook like model: http://www.renren.com/
  • SinaWeibo, ("weibo" in Chinese means "micro-blog"). It's a twitter like model: http://weibo.com/
  • TecentWeibo. It's another micro-blogging service in China. Due to the broad production line of Tecent, TecentWeibo has some unique access point (e.g. WeChat from a mobile device). http://t.qq.com/
  • The aggregated status update from those silos: http://hupili.net/feeds/all.xml . It's currently a mix of all materials. I'll separate the English and Chinese messages later.

danlyke

  • Used Twitter export to back-patch Twitter IDs into posts originally syndicated out to Twitter but for which the Twitter ID wasn't originally recovered from the API.
  • Uses the Google calendar export to backup calendar data in his own repository

Zoyander


==== Add yourself here… (see this for more details)

  • Add yourself and a list of the silos you PESOS from

Software

Micropub

When creating posts via Micropub, set the syndication property to the post's original URL. This defines the new post as canonical (original) version of the post.

If you see the new post as the copy of the silo URL, then syndication is the wrong property - better would be to repost.

Advantages

  • more API options: difference in restrictions in APIs for content creation and content retrieval: sometimes it's possible to pull data which can't be pushed, eg. Facebook comments
  • native interactions: the native interfaces are sometimes quite well done for silos
  • prevents you from oversharing the same content to every network (no, that is not good, usually different networks attract different audience and not every content should be shared with everyone)
  • implementations will be async:

Disadvantages

PESOS is considered less robust and inferior to POSSE for the following reasons:

  • Possible loss or restriction of ownership. By posting first on a silo, you are subject to that silo's TOS, both with entering the data and later getting it out. You calling their API or feeds to extract your own data may still shackle your data with some rights to them (e.g. "database copyright" for content contributed to silo collections like Foursquare venues). You have a dependent ownership chain for your content (from creation, to syndication/re-use, to consumption), where the silo is an intermediate dependent party that you can never be rid of.
    • Twitter Developer Rules of the Road appears to prohibit export to your site:

      Exporting Twitter Content to a datastore as a service or other cloud based service, however, is not permitted.[1]

      Discovered via [2].
  • Less reliable. Your site relies on 3rd Party Services to post any content
  • Non-canonical. Copes archived to your domain are not a canonical copy
  • Lower quality. Pulling in from 3rd Party Services can reduce the quality of content, e.g.
    • character limits (e.g. 140 character Twitter posts, 200 character Foursquare shouts/tips).
      • this is completely silo-dependent; if your post was intended for a certain silo, there is no quality difference - 2017-06-08 Peter Molnar
    • link-wrapping (e.g. Twitter hides all links behind their t.co link-wrapper)
      • links can be followed and extracted, but that requires extra work - 2017-06-08 Peter Molnar

Background


See Also

  • Relevant session from 2011: Publish_Then_Syndicate_and_Replicate
  • syndication-models
  • Matt Maldre has one post where he's PESOSed all of his Facebook Likes in one collection (albeit without links): https://www.spudart.org/blog/all-the-facebook-pages-i-liked/
  • ROOTS
  • I’m bringing everything back to my website
  • Swarm crossposting to Mastodon and Bluesky - could readily be extended to Micropub https://shkspr.mobi/blog/2026/06/using-foursquares-api-to-post-location-checkins-to-social-media/
    • "Using FourSquare's API to post location checkins to social media
      https://shkspr.mobi/blog/2026/06/using-foursquares-api-to-post-location-checkins-to-social-media/

      What is this, 2016?I like sharing my location with my pocket friends sometimes. If I'm in a cool bar that they know, perhaps they can recommend a drink. If they live nearby, maybe they want to come for dinner. Not everyone has FourSquare's SwarmApp, so it is handy to automatically share its updates with other people.Of course, Swarm doesn't cross-post to social media because walled-gardens are the most profitable. This is my attempt to open it back up again.Here's what they look like on BlueSky and Mastodon:Checked in to Hamburger Fischmarkt, Große Elbstr. 9 (Fischmarkt), Germany

      Probably a *bit* early for a breakfast beer.
      See on Swarm

      [image or embed]— Terence Eden (@edent.tel) 24 May 2026 at 07:45 Post by @Edent@mastodon.social View on Mastodon tl;drYou can get the SwarmToSocial code from my GitLab.At the moment, developers get 10,000 API calls for free each month. That's probably more than enough for most personal uses.DocumentationI was pleasantly surprised that FourSquare's CheckIn documentation was fairly easy to use and understand.Once you've signed up for a developer account you can create an OAuth app. That will generate a Client ID (ABC123), Client Secret (XYZ789), and you supply a Project URL.Once done you can follow the Authentication documentation. Or just visit: https://foursquare.com/oauth2/authenticate?
      client_id=ABC123
      &response_type=code
      &redirect_uri=https://example.com/
      Sign in with your FourSquare account. It will redirect you to:https://example.com/?code=456QWEUse that code to construct the final URl: https://foursquare.com/oauth2/access_token?
      client_id=ABC123
      &client_secret=XYZ789
      &grant_type=authorization_code
      &redirect_uri=http://example.com/
      &code=456QWE
      That will respond with the Access Token: JSON{
      "access_token":"asdfghjkl123456"}Hurrah! Posting a new checkin is relatively simple. POST to this URl with a header of accept: application/json https://api.foursquare.com/v2/checkins/add?
      v=20260223
      &venueId=13600425
      &shout=This%20is%20a%20test
      &oauth_token=asdfghjkl123456
      v is, rather confusingly, a date. The versioning documentation has more details but, basically, set it to the date you deployed your app.venuId you'll need to find yourself (more on that later).shout is up to 140 characters (!) of URl encoded text.That will send back rather a lot of JSON. Here are the important bits: JSON{
      "meta": {
      "code": 200,
      "requestId": "123456789"
      },
      "response": {
      "checkin": {
      "id": "987654321",
      "createdAt": 1771843820,
      "type": "checkin",
      "visibility": "closeFriends",
      "shout": "This is a test of the API",
      "timeZoneOffset": -300,
      "editableUntil": 1771930220000,
      "user": {
      "id": "56367",
      "firstName": "Terence",
      "lastName": "Eden",
      "relationship": "self",
      "displayName": "Terence Eden"
      },
      "venue": {
      "id": "QWERTYUIOP",
      "name": "My Birthday Party!",
      "contact": {},
      "location": {
      "isFuzzed": true,
      "lat": 39.123456789,
      "lng": -84.987654321,
      "cc": "US",
      "city": "Cincinnati",
      "state": "KY",
      "country": "United States",
      "formattedAddress": [
      "Cincinnati, KY",
      "United States"
      ]
      }
      },
      "checkinShortUrl": "https://swarmapp.com/user/56367/checkin/987654321?s=wRZ7ByNfCW1DNrOIpsRcytPZelE"
      }
      }}For my purposes, the shout and checkinShortUrl are the most important. You can view a sample check in:https://swarmapp.com/user/56367/checkin/699c34b55bad6b7fb1695544?s=LA7jCaAtH-s9CwSpgQrQdHrP5-8Venue IDIf you're already using a service like Untappd you might be able to get the venue ID from that.If not, FourSquare provides 100 million points of interest for free - although with questionable data quality.Alternatively, you can search by location: curl --request GET \
      --url 'https://places-api.foursquare.com/places/search?ll=51.123%2C0.123&radius=1000&sort=POPULARITY' \
      --header 'X-Places-Api-Version: 2025-06-17' \
      --header 'accept: application/json' \
      --header 'authorization: Bearer ABC123'
      As far as I can see, the Bearer Token only exists on the documentation page. I couldn't find it in my developer console. Weird!That gets you back: JSON{
      "results": [
      {
      "fsq_place_id": "4be584ed2457a593ad8cab15",
      "latitude": 51.11783041264215,
      "longitude": 0.11219274871133413,
      "categories": [
      {
      "fsq_category_id": "4bf58dd8d48988d1fa941735",
      "name": "Farmers Market",
      "short_name": "Farmers Market",
      "plural_name": "Farmers Markets",
      "icon": {
      "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_",
      "suffix": ".png"
      }
      }
      ],
      "date_created": "2010-05-08",
      "date_refreshed": "2025-11-01",
      "distance": 970,
      "extended_location": {},
      "link": "/places/4be584ed2457a593ad8cab15",
      "location": {
      "address": "",
      "locality": "Hartfield",
      "region": "East Sussex",
      "postcode": "",
      "admin_region": "England",
      "country": "GB",
      "formatted_address": "Hartfield, East Sussex"
      },
      "name": "Perryhill Farm Shop",
      "placemaker_url": "https://foursquare.com/placemakers/review-place/4be584ed2457a593ad8cab15",
      "related_places": {},
      "social_media": {
      "twitter": ""
      },
      "tel": "",
      "website": "http://www.perryhillorchards.co.uk/index.php?sec=4"
      },
      {
      "fsq_place_id": "8896f77565e54a658585301d",
      "latitude": 51.11649,
      "longitude": 0.13131,
      "categories": [],
      "date_created": "2021-12-06",
      "date_refreshed": "2021-12-06",
      "distance": 909,
      "extended_location": {},
      "link": "/places/8896f77565e54a658585301d",
      "location": {
      "address": "Priory Park, Beech Green Lane",
      "locality": "Withyham",
      "region": "East Sussex",
      "postcode": "TN7 4DB",
      "admin_region": "England",
      "post_town": "Hartfield",
      "country": "GB",
      "formatted_address": "Priory Park, Beech Green Lane, Withyham, East Sussex, TN7 4DB"
      },
      "name": "Spectra Studios",
      "placemaker_url": "https://foursquare.com/placemakers/review-place/8896f77565e54a658585301d",
      "related_places": {},
      "social_media": {},
      "tel": "01892 487149"
      },
      ],
      "context": {
      "geo_bounds": {
      "circle": {
      "center": {
      "latitude": 51.123,
      "longitude": 0.1234
      },
      "radius": 1000
      }
      }
      }}You can manually check a place using the Placemaker site: https://foursquare.com/placemakers/review-place/64eca80f0398c97ab52298ecGetting Existing CheckinsWhat if you've checked in to a place using the official Swarm app? How do you get your own recent checkin data?Again, there is documentation on getting user checkins. Bashcurl --request GET \
      --url 'https://api.foursquare.com/v2/users/self/checkins?v=20260223&limit=2&offset=0&oauth_token=asdfghjkl123456' \
      --header 'accept: application/json'
      Where it says oauth_token it actually means the access_token.The JSON that is returned is a bit verbose, so I've simplified it here: JSON{
      "meta": {
      "code": 200,
      "requestId": "699c6505b488565a31e315e3"
      },
      "response": {
      "checkins": {
      "count": 2344,
      "items": [
      {
      "id": "699c34b55bad6b7fb1695544",
      "createdAt": 1771844789,
      "type": "checkin",
      "visibility": "closeFriends",
      "entities": [],
      "shout": "Testing the API using an Untappd FourSquare ID.",
      "timeZoneOffset": 0,
      "editableUntil": 1771931189000,
      "venue": {
      "id": "64eca80f0398c97ab52298ec",
      "name": "Abbey Wood Fossil Pit",
      "contact": {},
      "location": {
      "lat": 51.487514,
      "lng": 0.13048041,
      "postalCode": "SE2 0AX",
      "cc": "GB",
      "country": "United Kingdom",
      "formattedAddress": [
      "SE2 0AX"
      ]
      },
      "createdAt": 1693231119
      },
      },
      Annoyingly, there's no checkinShortUrl which means it can't easily be shared.For that, you'll need to use the get-checkin-details API: Bashcurl --request GET \
      --url 'https://api.foursquare.com/v2/checkins/699c34b55bad6b7fb1695544?v=20250202&oauth_token=asdfghjkl123456' \
      --header 'accept: application/json'
      Which will return this (truncated for brevity): JSON{
      "meta": {
      "code": 200,
      "requestId": "699c67de5f5c0a0e8ab234db"
      },
      "response": {
      "checkin": {
      "id": "699c34b55bad6b7fb1695544",
      "createdAt": 1771844789,
      "type": "checkin",
      "shout": "Testing the API using an Untappd FourSquare ID.",
      "timeZoneOffset": 0,
      "checkinShortUrl": "https://swarmapp.com/user/56367/checkin/699c34b55bad6b7fb1695544?s=LA7jCaAtH-s9CwSpgQrQdHrP5-8",
      PhotosIf there's a photo with the checkin, it will be return in the JSON like this: JSON{
      "response": {
      "checkin": {
      "photos": {
      "count": 1,
      "items": [
      {
      "id": "699f3a9f96799c05c0f16c9c",
      "createdAt": 1772042911,
      "prefix": "https://fastly.4sqi.net/img/general/",
      "suffix": "/56367_5VYox4Y-hs66wURVsYc1NLgOokfwBfcWhtKQrOlMdD8.jpg",
      "width": 1008,
      "height": 1344,
      The URl for the image is prefix width x height suffix - in this case https://fastly.4sqi.net/img/general/1008x1344/56367_5VYox4Y-hs66wURVsYc1NLgOokfwBfcWhtKQrOlMdD8.jpgYou can adjust the width and height if you want a thumbnail or some other resolution.If there's no photo, the count will be 0.Putting it all togetherEvery 15 minutes, the SwarmToSocial code does the following:Get the most recent checkin.Read a local file to get the previously seen checkin ID.If the checkin ID hasn't been seen before:

      Get the checkin details.Get the photo if it existsPost the checkin (plus photo) to Mastodon & BlueSky.Save the checkin ID to a file.Enjoy!

      #api #BlueSky #FourSquare #geolocation #MastodonAPI" @blog June 2, 2026

Related


<footer>source iwc:PESOS</footer>

<footer>