{"id":370,"date":"2017-03-08T09:00:46","date_gmt":"2017-03-08T09:00:46","guid":{"rendered":"http:\/\/deberker.com\/archy\/?p=370"},"modified":"2021-11-06T15:50:47","modified_gmt":"2021-11-06T15:50:47","slug":"building-a-burns-bot-2-making-a-slackbot","status":"publish","type":"post","link":"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/","title":{"rendered":"Building a Burns bot #2: Making a Slackbot"},"content":{"rendered":"<p><em>Originally published on&nbsp;the <a href=\"http:\/\/blog.asidatascience.com\/building-a-slackbot\/\">ASI blog.<\/a><\/em><\/p>\n<p><span style=\"font-weight: 400;\">In the <\/span><a href=\"http:\/\/deberker.com\/archy\/?p=367\"><span style=\"font-weight: 400;\">previous post<\/span><\/a><span style=\"font-weight: 400;\"> we discussed using Markov chain models to generate pseudo-poetry. But data science is not just about writing algorithms which give you a warm feeling and make your grandma swallow her dentures with admiration. A good project culminates with productionalisation: packing your data science into a format which is convenient for the end user. Given the literary nature of this project, we thought a conversational interface would be a nice option for our Burns bot. You can find all the code you need to install your own version of the Burns bot in the github repository <\/span><a href=\"https:\/\/github.com\/berkerboy\/burnsbot\"><span style=\"font-weight: 400;\">here<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><b>Chatwhat?<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Chatbots are <\/span><a href=\"https:\/\/www.forbes.com\/sites\/rachelarthur\/2016\/12\/15\/chatbots-and-vr-lead-this-seasons-top-tech-trends-in-retail\/#524713b260ea\"><span style=\"font-weight: 400;\">growing<\/span><\/a><span style=\"font-weight: 400;\"> in popularity (fast). The idea is simple: chunks of code that you interact with via a messaging app such as Facebook Messenger or Slack. Currently available bots can provide financial advice, play poker with you, and send you entertaining cat GIFS. In China the bot ecosystem is considerably more mature and diverse, with the Whatsapp equivalent, WeChat, hosting bots for everything from booking flights to paying your utility bills.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Why are chatbots so attractive? For a developer, the ability to create within an existing ecosystem rather than writing interfaces from scratch saves time, whilst giving access to a large bank of potential users with very low acquisition cost. Furthermore, the result is platform agnostic; you can access it from a web browser, an iPad, or an Android phone without writing a single extra line of code. From a user\u2019s perspective, chatbots offer a familiar mode of interaction &#8211; conversation &#8211; whilst allowing them to remain within an app they have already installed. In Europe the major bot platforms are Facebook Messenger or Slack; given that ASI\u2019s internal communications are managed in the latter, we opted for a Slackbot. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">We followed<\/span><a href=\"https:\/\/www.fullstackpython.com\/blog\/build-first-slack-bot-python.html\"> <span style=\"font-weight: 400;\">this excellent blog pos<\/span><\/a><span style=\"font-weight: 400;\">t to get our bot up and running. For meaty details, head there; here I\u2019ll sketch out the concepts and describe a couple of hurdles we encountered. <\/span><\/p>\n<p><b>Ingredients for a bot<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Bots run on a server of your choice (ours is hosted on ASI\u2019s data science platform, SherlockML), and communicate with Slack via an API (Application Programmer Interface). Information about what\u2019s going on within Slack is funnelled via this API into your bot, which supplies a few verification tokens to confirm that it\u2019s a safe home for this information.<\/span><a href=\"https:\/\/api.slack.com\/bot-users\"> <span style=\"font-weight: 400;\">Options set within Slack<\/span><\/a><span style=\"font-weight: 400;\"> determine which pieces of information get sent to the bot, such that we\u2019re not indiscriminately eavesdropping on all Slack activity. We can then write some code to specify how the bot should respond to certain events &#8211; like somebody addressing the bot &#8211; and post to slack channels, again via the API. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">In our case, the bot is \u2018listening\u2019 for people to address it with the command \u2018write\u2019 and a number, which trigger it to generate a poem of that many lines and pass it back into Slack. The poem is generated using the Markov model detailed in<\/span><a href=\"http:\/\/blog.asidatascience.com\/teaching-a-computer-to-write-poetry\/\"> <span style=\"font-weight: 400;\">the last post<\/span><\/a><span style=\"font-weight: 400;\">: in fact, to save time, we\u2019ve actually saved out a pre-trained version of the model in a format called JSON, and simply read it back in when we fire up the bot.<\/span><\/p>\n<p><b>Running your bot<\/b><\/p>\n<p><span style=\"font-weight: 400;\">When you\u2019re developing your bot, you can run it from your own computer. However, if you don\u2019t want your bot to shut down every time you close your laptop, you\u2019ll need to find a server which can host your bot online.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">We initially deployed our bot via the cloud development platform<\/span><a href=\"https:\/\/heroku.com\/\"> <span style=\"font-weight: 400;\">Heroku<\/span><\/a><span style=\"font-weight: 400;\">, which is fantastic for fast prototyping. However, their free-tier servers go to sleep if you don\u2019t access them via the web for 30 minutes. This poses a bit of a problem for your Slackbot, because you\u2019re never actually going to be visiting the http address that Heroku has associated with your server. This means that your bot will doze off, rather than responding with alacrity when somebody requests an infusion of Burns. To overcome this, you can use an add-on called<\/span><a href=\"https:\/\/coderwall.com\/p\/u0x3nw\/avoid-heroku-idling-with-new-relic-pings\"> <span style=\"font-weight: 400;\">New Relic<\/span><\/a> <span style=\"font-weight: 400;\">to regularly ping your server, which will ensure your bot remains awake and eager.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">We subsequently redeployed to ASI\u2019s Data Science platform,<\/span><a href=\"https:\/\/sherlockml.com\/\"> <span style=\"font-weight: 400;\">SherlockML<\/span><\/a><span style=\"font-weight: 400;\">, which provides easy access to continuously running Amazon Web Services servers. It\u2019s also extremely simple to scale up, so if we wanted our bot to be able to respond to millions of requests for Scottish poetry, or run a more sophisticated model, we could upgrade to a bigger server with a couple of clicks.<\/span><\/p>\n<p><b>A recipe for a poetry-generating Slackbot<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Assuming you\u2019ve grabbed the code<\/span><a href=\"https:\/\/github.com\/berkerboy\/burnsbot\"><span style=\"font-weight: 400;\"> from the Github repo<\/span><\/a><span style=\"font-weight: 400;\">, how do you end up with an all-singing, all-dancing (disclaimer: this bot is actually all-poetry and nothing else) bot? Here\u2019s a rough guide:<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Process your corpus (which you should stick in the mysteriously named \u2018corpus\u2019 folder) to obtain single words and train your Markov model using the function \u2018train_markovmodel\u2019. <\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">This will save your Markov model in an accessible format (JSON)<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Go to your Slack team page and<\/span><a href=\"https:\/\/api.slack.com\/bot-users\"> <span style=\"font-weight: 400;\">create a new Bot user<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Take the SLACK_BOT_TOKEN from that page, save that as an environmental variable (on bash, type export SLACK_BOT_TOKEN=whateveryourtokenis)<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Use that token and your bot name to get the BOT_ID using the \u2018print_bot_id\u2019 function. Save that out as an environmental variable too.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Have a look in the main burnsbot function to get a feel for what\u2019s happening. It\u2019s basically listening for messages that address the bot directly, and include an instruction to write a poem of a specified number of lines.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Check that your bot works by running \u2018python burnsbot.py\u2019 from the shell and then messaging your bot in Slack<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Upload your code to a server. You\u2019ll need to re-export those environmental variables from earlier. These are called config vars if you\u2019re on Heroku. You can run the helper function \u2018getenvs\u2019 to print the SLACK_BOT_TOKEN and BOT_ID.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Run your bot code on the server: you just need to do this once, and it should run in perpetuity!<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">One can imagine lots of interesting extensions: a similar framework could be used to provide a bot modelled on any author of your choice; snippets from your favourite coding language; song lyrics; even song notes (if you could find a way of playing them in Slack).<\/span><a href=\"https:\/\/github.com\/berkerboy\/burnsbot\"> <span style=\"font-weight: 400;\">Fork away,<\/span><\/a><span style=\"font-weight: 400;\"> have fun, and let us know what you come up with.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Here we take the Markov-chain based Burn&#8217;s Bot we created in the previous post and turn it into a living, breathing Slackbot to deliver Burns on demand.<\/p>\n","protected":false},"author":1,"featured_media":649,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"hide_page_title":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[11,10],"tags":[],"class_list":["post-370","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-language","category-software"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Building a Burns bot #2: Making a Slackbot - Archy de Berker<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building a Burns bot #2: Making a Slackbot - Archy de Berker\" \/>\n<meta property=\"og:description\" content=\"Here we take the Markov-chain based Burn&#039;s Bot we created in the previous post and turn it into a living, breathing Slackbot to deliver Burns on demand.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/\" \/>\n<meta property=\"og:site_name\" content=\"Archy de Berker\" \/>\n<meta property=\"article:published_time\" content=\"2017-03-08T09:00:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-11-06T15:50:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2020\/05\/burnsbot.png?fit=3062%2C1531&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"3062\" \/>\n\t<meta property=\"og:image:height\" content=\"1531\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"archy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@archydeb\" \/>\n<meta name=\"twitter:site\" content=\"@archydeb\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"archy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/\"},\"author\":{\"name\":\"archy\",\"@id\":\"https:\/\/deberker.com\/archy\/#\/schema\/person\/01cf8dd0f94a4ba124b26eeeeb59e67d\"},\"headline\":\"Building a Burns bot #2: Making a Slackbot\",\"datePublished\":\"2017-03-08T09:00:46+00:00\",\"dateModified\":\"2021-11-06T15:50:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/\"},\"wordCount\":1087,\"publisher\":{\"@id\":\"https:\/\/deberker.com\/archy\/#\/schema\/person\/01cf8dd0f94a4ba124b26eeeeb59e67d\"},\"image\":{\"@id\":\"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2020\/05\/burnsbot.png?fit=3062%2C1531&ssl=1\",\"articleSection\":[\"Language\",\"Software\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/\",\"url\":\"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/\",\"name\":\"Building a Burns bot #2: Making a Slackbot - Archy de Berker\",\"isPartOf\":{\"@id\":\"https:\/\/deberker.com\/archy\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2020\/05\/burnsbot.png?fit=3062%2C1531&ssl=1\",\"datePublished\":\"2017-03-08T09:00:46+00:00\",\"dateModified\":\"2021-11-06T15:50:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/#primaryimage\",\"url\":\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2020\/05\/burnsbot.png?fit=3062%2C1531&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2020\/05\/burnsbot.png?fit=3062%2C1531&ssl=1\",\"width\":3062,\"height\":1531},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/deberker.com\/archy\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building a Burns bot #2: Making a Slackbot\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/deberker.com\/archy\/#website\",\"url\":\"https:\/\/deberker.com\/archy\/\",\"name\":\"Archy de Berker\",\"description\":\"Building things with data\",\"publisher\":{\"@id\":\"https:\/\/deberker.com\/archy\/#\/schema\/person\/01cf8dd0f94a4ba124b26eeeeb59e67d\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/deberker.com\/archy\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/deberker.com\/archy\/#\/schema\/person\/01cf8dd0f94a4ba124b26eeeeb59e67d\",\"name\":\"archy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/deberker.com\/archy\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/09\/freelance-logo.png?fit=359%2C311&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/09\/freelance-logo.png?fit=359%2C311&ssl=1\",\"width\":359,\"height\":311,\"caption\":\"archy\"},\"logo\":{\"@id\":\"https:\/\/deberker.com\/archy\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/archydeb\"],\"url\":\"https:\/\/deberker.com\/archy\/author\/archy\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Building a Burns bot #2: Making a Slackbot - Archy de Berker","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/","og_locale":"en_US","og_type":"article","og_title":"Building a Burns bot #2: Making a Slackbot - Archy de Berker","og_description":"Here we take the Markov-chain based Burn's Bot we created in the previous post and turn it into a living, breathing Slackbot to deliver Burns on demand.","og_url":"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/","og_site_name":"Archy de Berker","article_published_time":"2017-03-08T09:00:46+00:00","article_modified_time":"2021-11-06T15:50:47+00:00","og_image":[{"width":3062,"height":1531,"url":"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2020\/05\/burnsbot.png?fit=3062%2C1531&ssl=1","type":"image\/png"}],"author":"archy","twitter_card":"summary_large_image","twitter_creator":"@archydeb","twitter_site":"@archydeb","twitter_misc":{"Written by":"archy","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/#article","isPartOf":{"@id":"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/"},"author":{"name":"archy","@id":"https:\/\/deberker.com\/archy\/#\/schema\/person\/01cf8dd0f94a4ba124b26eeeeb59e67d"},"headline":"Building a Burns bot #2: Making a Slackbot","datePublished":"2017-03-08T09:00:46+00:00","dateModified":"2021-11-06T15:50:47+00:00","mainEntityOfPage":{"@id":"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/"},"wordCount":1087,"publisher":{"@id":"https:\/\/deberker.com\/archy\/#\/schema\/person\/01cf8dd0f94a4ba124b26eeeeb59e67d"},"image":{"@id":"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2020\/05\/burnsbot.png?fit=3062%2C1531&ssl=1","articleSection":["Language","Software"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/","url":"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/","name":"Building a Burns bot #2: Making a Slackbot - Archy de Berker","isPartOf":{"@id":"https:\/\/deberker.com\/archy\/#website"},"primaryImageOfPage":{"@id":"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/#primaryimage"},"image":{"@id":"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2020\/05\/burnsbot.png?fit=3062%2C1531&ssl=1","datePublished":"2017-03-08T09:00:46+00:00","dateModified":"2021-11-06T15:50:47+00:00","breadcrumb":{"@id":"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/#primaryimage","url":"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2020\/05\/burnsbot.png?fit=3062%2C1531&ssl=1","contentUrl":"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2020\/05\/burnsbot.png?fit=3062%2C1531&ssl=1","width":3062,"height":1531},{"@type":"BreadcrumbList","@id":"https:\/\/deberker.com\/archy\/building-a-burns-bot-2-making-a-slackbot\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/deberker.com\/archy\/"},{"@type":"ListItem","position":2,"name":"Building a Burns bot #2: Making a Slackbot"}]},{"@type":"WebSite","@id":"https:\/\/deberker.com\/archy\/#website","url":"https:\/\/deberker.com\/archy\/","name":"Archy de Berker","description":"Building things with data","publisher":{"@id":"https:\/\/deberker.com\/archy\/#\/schema\/person\/01cf8dd0f94a4ba124b26eeeeb59e67d"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/deberker.com\/archy\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/deberker.com\/archy\/#\/schema\/person\/01cf8dd0f94a4ba124b26eeeeb59e67d","name":"archy","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/deberker.com\/archy\/#\/schema\/person\/image\/","url":"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/09\/freelance-logo.png?fit=359%2C311&ssl=1","contentUrl":"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2021\/09\/freelance-logo.png?fit=359%2C311&ssl=1","width":359,"height":311,"caption":"archy"},"logo":{"@id":"https:\/\/deberker.com\/archy\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/x.com\/archydeb"],"url":"https:\/\/deberker.com\/archy\/author\/archy\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/deberker.com\/archy\/wp-content\/uploads\/2020\/05\/burnsbot.png?fit=3062%2C1531&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p4cGwe-5Y","jetpack-related-posts":[],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/posts\/370","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/comments?post=370"}],"version-history":[{"count":4,"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/posts\/370\/revisions"}],"predecessor-version":[{"id":1139,"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/posts\/370\/revisions\/1139"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/media\/649"}],"wp:attachment":[{"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/media?parent=370"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/categories?post=370"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/deberker.com\/archy\/wp-json\/wp\/v2\/tags?post=370"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}