{"id":16032732,"url":"https://github.com/voutilad/alexa-btvpython","last_synced_at":"2026-04-12T16:02:41.365Z","repository":{"id":87607149,"uuid":"78892511","full_name":"voutilad/alexa-btvpython","owner":"voutilad","description":"Example project for creating an Alexa skill","archived":false,"fork":false,"pushed_at":"2017-02-02T18:14:29.000Z","size":38,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-05T05:13:06.139Z","etag":null,"topics":["alexa","flask","heroku","lambda","python"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/voutilad.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-01-13T22:42:14.000Z","updated_at":"2018-09-12T08:12:01.000Z","dependencies_parsed_at":null,"dependency_job_id":"07b9fed9-3b55-480b-b6c5-2fd37fed45b8","html_url":"https://github.com/voutilad/alexa-btvpython","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/voutilad/alexa-btvpython","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voutilad%2Falexa-btvpython","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voutilad%2Falexa-btvpython/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voutilad%2Falexa-btvpython/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voutilad%2Falexa-btvpython/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/voutilad","download_url":"https://codeload.github.com/voutilad/alexa-btvpython/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voutilad%2Falexa-btvpython/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279445458,"owners_count":26171517,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-17T02:00:07.504Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alexa","flask","heroku","lambda","python"],"created_at":"2024-10-08T21:40:27.098Z","updated_at":"2025-10-18T00:49:04.859Z","avatar_url":"https://github.com/voutilad.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# BTVPython Alexa Skill\n\n[![Build Status](https://travis-ci.org/voutilad/alexa-btvpython.svg?branch=master)](https://travis-ci.org/voutilad/alexa-btvpython)\n\nThis is a sample project for presenting a \"How To\" related to developing custom\n[Amazon Alexa Skills](https://developer.amazon.com/alexa-skills-kit) using Python\nand [Amazon Lambda](https://aws.amazon.com/lambda/).\n\n## Background Story\n\nLet's say you want to build an Alexa skill that does something interesting like help you\nget the details on the next, upcoming\n[Burlington Python Meetup](https://www.meetup.com/btvpython/) event. Where do you begin?\n\n## Assumptions\n\nLet's assume that:\n* you at least know some basic Python\n* you have or are willing to have an Amazon account (your shopping account will do)\n\nThen you should be ready to dive in!\n\n# Navigating this Project\n\nHere's the lay of the land...\n\n## Project Overview\n\nIn general, I've built this project to use common Python conventions, specifically:\n\n* Project layout of our code being in a package ([btvpython](./btvpython)) and tests in a separate\npackage ([tests](./tests))\n* Using [pytest](http://doc.pytest.org) for a test framework\n* Storing config/credentials in [in the environment](https://12factor.net/config) leveraging\n[python-dotenv](https://github.com/theskumar/python-dotenv)\n    * We'll use this approach for storing the [Meetup API Key](https://secure.meetup.com/meetup_api/key/)\n    * This also let's us set other values that you'll see later.\n\nIf you're not familiar with the above, I recommend following the links to learn a bit more.\n\nWhat won't we be covering at this point? A few little things for now:\n* Using OAuth(1/2) for more [account linking](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/linking-an-alexa-user-with-a-user-in-your-system)\nto Meetup.\n    * _See my [other project](https://github.com/voutilad/dear-leader) for an example using Twitter_\n* More complex AWS/Lambda stuff like CloudWatch\n* Deeper Alexa topics like slots, securing your skill (like using the app id)\n\n## Git\nThe project uses git _tags_ as a way to mark different walk-through states.\n\nBy default, when you clone this project, you'll be at the latest state.\n\nTo jump between tags, use the `git checkout \u003ctag\u003e` command.\n\nI've organized this into \"chapters\", so each tag name follows the convention: `ch[0-9]`\n\nChapter 0 would be `ch0`, Chapter 4 would be `ch4`, etc.\n\n\n# Before you Begin\n\nCreate a local `.env` file that contains two things:\n* A randomly generated Flask secret key\n* A copy of your [Meetup API Key](https://secure.meetup.com/meetup_api/key/)\n\nIt should look like:\n```bash\nMEETUP_API_KEY=\"yourApiKey\"\nFLASK_SECRET_KEY=\"yourFlaskSecretKey\"\n\n```\n\n# Working Through the Chapters!\n\nEach chapter is designed to show a working \"solution\" for our use case, just in increasing\ncomplexity and functionality. As we step through, the changes we make will highlight specific\nlessons related to Lambda and Alexa.\n\n## Chapter 0 - Hello World!\n\nThe basics of a lambda function. Here we'll have enough to test a lambda function, but this\nwon't give us what we need for Alexa yet.\n\n## Chapter 1 - A Simple Lambda Solution\n\nLet's start simple: a single Lambda function that handles our core need of fetching the details\nfrom the [Meetup API](https://www.meetup.com/meetup_api/docs/).\n\n## Chapter 2 - Lambda using Packages\n\nLambda's nice and all, but up until now we've put all our code in one Python module that only\nhas access to the Python 2.7 standard library. Let's bring in the popular\n[requests](http://docs.python-requests.org/en/master/#) library and figure out how we\npackage our project for use in Lambda.\n\n## Chapter 3 - A Voice User Interface\n\nOur skill is a little weak. Sure it gets the very next event, but you can't ask any follow-up\nquestions or anything else.\n\nLet's add in another intent and change the default behavior allowing us to do more. We'll keep it simple,\nso for now let's say we want two interaction types:\n\n* general launch via _\"open burlington python\"_ followed by a prompt\n* direct intent launch via _\"ask burlington python for the next event\"_\n\n## Chapter 4 - A Flask Full of Fun\n\nOutgrow Lambda? Want to do things like data persistence and not stay in the AWS\nworld? Let's move our logic into a more elgant Flask-based app using [Flask-Ask](https://github.com/johnwheeler/flask-ask)\nand get it ready for deployment to Heroku!\n\nFor [Heroku](https://www.heroku.com), you'll need an account. The included [Procfile](./Procfile) and\n[runtime.txt](./runtime.txt) are already provided, but you'll need to [create a new app](https://dashboard.heroku.com/new?org=personal-apps).\n\n\n### Scratchpad\n\nURI for BTVPython endpoint: `https://api.meetup.com/btvpython/events?\u0026sign=true\u0026photo-host=public\u0026page=1`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoutilad%2Falexa-btvpython","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvoutilad%2Falexa-btvpython","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoutilad%2Falexa-btvpython/lists"}