• Stars
    star
    232
  • Rank 172,847 (Top 4 %)
  • Language
    Python
  • License
    GNU General Publi...
  • Created almost 6 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A Pythonic interface to the Gmail API.

EZGmail

A Pythonic interface to the Gmail API that actually works as of October 2022.

The official Gmail API quickstart doesn't actually seem to work on Python 3 without some adjustments, and the entire documentation is a bit much for someone who just wants to read and send emails from their Gmail account. I created EZGmail as a simple module that just works.

You can find additional information about the Gmail API documentation by Google at https://developers.google.com/gmail/api/ and the quickstart guide is at https://developers.google.com/gmail/api/quickstart/python You don't need to review these documents to use EZGmail.

Installation and Setup

To install with pip, run:

pip install ezgmail

For your Python script to use EZGmail to access Gmail account, you need a credentials JSON file and a token JSON file. This requires a one-time set up on Google Cloud services using your Gmail account. If you have a Gmail account, you can do this and it is free (unless you are making large use of the Gmail API by sending out thousands of emails every day.) There's several steps to this, detailed in the following sections. These instructions were last updated September 2022.

Create a new Google Cloud Project

First, you need to set up a Google Cloud project. In your browser, go to https://console.cloud.google.com and sign in to you Google account with your username and password. (Your app can connect to any Gmail account, but this Google account will be one that manages the Google API access for EZGmail.) You will be taken to a Getting Started page. At the top of the page, click on "Select a project". In the pop-up window that appears, click "New Project".

Navigate to new project

This takes to a new project page. A Project Name like "My Project 23135" will be generated for you. There is also a Project ID like "macro-nuance-362516" randomly generated for you. These names won't be visible to users of your Python scripts and you can use whatever name you want. You can change the Project Name later but not the Project ID. I just use the default names that are generated for me. The Location can be left as "No organization". Note that at the free tier, you can only create 12 projects (as of September 2022) but you only need one for all the Python scripts that you want to create. Click the blue "CREATE" button to create the project.

Create a new project

Free Google accounts can have up to 10 projects.

Click on "Select a project" at the top of the page again, and select the project you just created. You will be taken to the dashboard page for this Google Cloud Project. Next, you need to enable the Gmail API for your project.

Enable the Gmail API for Your Project

On the https://console.cloud.google.com page, click on the Navigation button in the upper left (the icon is three horizontal stripes, often called the "hamburger" icon.) Navigate to "APIs & Services" and then "Library" to go to the API Library page. There are many Google APIs for Gmail, Google Maps, Google Cloud Storage, and other Google services. We need to allow our project to use the Gmail API.

Navigate to library

Scroll down and find the "Gmail API" and click it, or enter "Gmail API" into the search bar to find it. This takes you to the Gmail API page. Click the blue "ENABLE" button to enable your Google Cloud project to use the Gmail API. You'll be redirected to the "APIs & Services > Enabled APIs & Services" page where you can find information about how often your Python scripts are using this API. (You might want to go back to the "APIs & Services > Library" page to enable the Google Sheets API and Google Drive API if you want to use the ezsheets Python module to edit Google Sheets spreadsheets from Python scripts too, while you're here.)

Enable Gmail API

Next, you need to configure your project's OAuth Consent Screen.

Configure the OAuth Consent Screen for Your Project

Click on the Navigation button in the upper left and then navigate to "APIs & Services" and then "OAuth Consent Screen." The consent screen will appear the first time when you or users of your Python script use ezgmail. With a free Gmail account that is not set up as a Google Workspace user, you'll have to select the External User Type option instead of Internal User Type. These are further explained on Google's Setting up your OAuth consent screen help page.

On Step 1 "OAuth consent screen", select External and click the blue "CREATE" button. You'll be taken to a page where you set up what the OAuth consent screen looks like. This screen appears to the user when they first import the ezgmail module. Pick a name for App Name (I use something generic like Python Gmail Script) and enter your email address for the User Support Email and Developer Contact Information. Then click "SAVE AND CONTINUE."

Step 2 "Scopes" involves adding your projects' scopes, which is a term Google chose for "permissions." Click the "ADD OR REMOVE SCOPES" button, and in the new panel that appears, go through the table and check the checkboxes for the scopes https://mail.google.com/ and click the blue "UPDATE" button. Then click "SAVE AND CONTINUE."

Step 3 "Test users" requires you to add the Gmail email addresses your Python script will interact with. Without going through Google's app approval process, your scripts will be limited to interacting with the email addresses you provide in this step. Click the "+ ADD USERS" button and in the new panel that appears, enter the Gmail addresses and click the blue "ADD" button. Then click "SAVE AND CONTINUE."

Step 4 "Summary" provides a summary of the previous steps. If all the information looks right, click the "BACK TO DASHBOARD" button. The next step is to create credentials for your project.

Create Credentials for Your Project

From the Navigation sidebar menu, click on "APIs & Services" and then "Credentials" to go to the Credentials page. Click the "+ CREATE CREDENTIALS" link at the top of the page. A submenu will open asking what kind of credentials you want to create: "API key", "OAuth client ID", or "Service account". Click on "OAuth client ID".

Create credentials

On the new page that appears, select "Desktop app" for the "Application type" and leave "Name" as the default "Desktop client 1." (You can change this to a different name if you want, it doesn't appear to the users of your Python script.) Click the blue "CREATE" button.

The pop up that appears shows your , click "DOWNLOAD JSON" to download the credentials file. This file will have a name like client_secret_282792235794-p2o9gfcub4htibfg2u207gcomco9nqm7.apps.googleusercontent.com.json. Rename it to credentials.json and place it in the same folder that your Python script will be in.

Log In with the Credentials File

Run the Python interactive shell from the same folder that the credentials.json file is in and run import ezgmail. Or, place a .py Python program in this folder and have it run import ezgmail. EZGmail will load and automatically check this folder for a credentials.json file and, if found, launches your web browser to the OAuth consent screen. Sign in with the Gmail account you want to access from your Python script. This must be the same email address that you gave for the "test user" when configuring the Google Cloud project's OAuth consent screen.

You will get a warning message that reads "Google hasn’t verified this app," but that's fine because this is the app (or project) that you've just created yourself. Click the Continue link. You'll come to another page that says "Python Gmail Script wants access to your Google Account" (or whatever name you gave in the OAuth consent screen setup.) Click Continue.

You'll come to a plain web page that says, "The authentication flow has completed." You can now close the browser window. In the same folder as your credentials.json file, you'll now see a token.json file. Do not share these files: they can be used to log in and access your Gmail account.

Quickstart Guide

After you've set up your credentials and token files, you can import EZGmail with import ezgmail. To see what email address you are sending from, examine ezgmail.EMAIL_ADDRESS (this is configured by the token-gmail.json file you're using, and you must first call ezgmail.init() or some other ezgmail function first):

>>> import ezgmail
>>> ezgmail.EMAIL_ADDRESS
'[email protected]'

To send an email from your "[email protected]" account:

>>> import ezgmail
>>> ezgmail.send('[email protected]', 'Subject line', 'Body of the email', ['attachment1.jpg', 'attachment2.mp3'])

The attachments argument is optional, and if you only have one attachment you can just specify the filename string. Also note that Gmail will most likely filter any emails that contain .exe, .zip, or any other suspicious attachments.

The cc and bcc fields are also optional keyword arguments:

>>> import ezgmail
>>> ezgmail.send('[email protected]', 'Subject line', 'Body of the email', cc='[email protected]', bcc='[email protected],[email protected]')

The main classes in ezgmail are GmailThread and GmailMessage. A GmailThread is a chain of emails replying to one another, while a GmailMessage is an individual email in a thread.

To retrieve unread emails:

>>> import ezgmail
>>> unreadThreads = ezgmail.unread()  # Returns a list of GmailThread objects.

The summary() function is an easy way to print out info on a list of thread or message objects:

>>> ezgmail.summary(unreadThreads)
Jon, Al - Remember that old website Hamsterdance? LOL - Dec 09
Al - This is a test email about gerbils. - Dec 09

If you want this info as a data structure, pass printInfo=False to summary():

>>> ezgmail.summary(unreadThreads, printInfo=False)
[(['Jon Smith <[email protected]>', 'Al Sweigart <[email protected]>'], 'Remember that old website Hamsterdance? LOL', datetime.datetime(2018, 12, 9, 13, 29, 17)), (['Al Sweigart <[email protected]>'], 'This is a test email about gerbils.', datetime.datetime(2018, 12, 9, 13, 25, 58))]

The GmailMessage objects of a thread are in the messages list attribute:

>>> ezgmail.summary(unreadThreads[0].messages)
Jon - Remember that old website Hamsterdance? LOL - Dec 09
Al - Haha that&#39;s awesome! On Sun, Dec 9, 2018 at 1:28 PM Jon Smith &lt;[email protected]&gt; wrote: Remember that old website Hamsterdance? LOL - Dec 09

The GmailMessage objects have sender, recipient, subject, body, and timestamp attribues:

>>> msg = unreadThreads[0].messages[0]
>>> msg.sender
'Jon Smith <[email protected]>'
>>> msg.recipient
'Al Sweigart <[email protected]>'
>>> msg.subject
'Hamsterdance'
>>> msg.body
'Remember that old website Hamsterdance? LOL\r\n'
>>> msg.timestamp
datetime.datetime(2018, 12, 9, 13, 28, 48)

You can also call the recent() function to get recent email threads:

>>> import ezgmail
>>> recentThreads = ezgmail.recent()
>>> len(recentThreads)
22

The recent() and unread() functions are just convenient wrappers around search(), which you can pass a query to (just like the query text field in the Gmail.com website):

>>> import ezgmail
>>> threads = ezgmail.search('mancala')
>>> len(threads)
1
>>> ezgmail.summary(threads[0])
Al, Jon - Zanzibar &gt; <b>Mancala</b> is one of the oldest known games to still be widely played today. &gt; <b>Mancala</b> is a generic name for a - Dec 08

The trash() method deletes the message or messages in a GmailMessage or GmailThread object:

>>> import ezgmail
>>> threads = ezgmail.search('mancala')
>>> threads[0].trash()  # Move the entire first thread to the Trash folder.

The search() function can accept search operators just like the query text field:

More are described at https://support.google.com/mail/answer/7190?hl=en

The search(), recent(), and unread() can also accept a maxResults keyword argument that is set to 25 by default. This sets an upper limit on how many threads/messages will be returned. API usage quotas are posted at https://developers.google.com/gmail/api/v1/reference/quota (roughly one million requests a day (and 25 per second) for the free tier).

By default, EZGmail sends messages as plaintext. You can send HTML emails by passing 'html' for the mimeSubtype parameter in send(). (By default, this parameter is set to 'plain'.) This email has "Hello" appear in bold and "body" appear italicized:

>>> ezgmail.send('[email protected]', 'Subject Line', '<strong>Hello</strong>, this is the <em>body</em> of the message.', mimeSubtype='html')

Accessing an email or thread doesn't mark it as unread automatically. You must do that yourself by calling the markAsRead() method of the GmailThread or GmailMessage object. (There is also a corresponding markAsUnread() function.) You can also call ezgmail.markAsRead() and pass it a list of GmailThread or GmailMessage objects.

>>> import ezgmail
>>> unreadThreads = ezgmail.unread()
>>> ezgmail.markAsRead(unreadThreads) # Marks all the GmailThread objects in the unreadThreads list as read.
>>> # Or you can do:
>>> for unreadThread in unreadThreads:
...     unreadThread.markAsRead() # Mark the individual GmailThread objects as read.

These two functions make add/remove the 'UNREAD' label using EZGmail's addLabel() and removeLabel() functions:

>>> import ezgmail
>>> unreadThreads = ezgmail.unread()
>>> ezgmail.removeLabel(unreadThreads, 'UNREAD') # Also marks threads as read.
>>> ezgmail.addLabel(unreadThreads, 'UNREAD') # Marks them as unread again.
>>> # Or you can do:
>>> for unreadThread in unreadThreads:
...     unreadThread.removeLabel(unreadThreads, 'UNREAD') # Mark the individual GmailThread objects as read.

(Currently EZGmail doesn't have functions for adding/deleting/managing custom labels.)

To view the attachments of an email, look at the GmailMessage object's attachments dictionary. The keys are the filenames of the attachments. You can either call the downloadAttachment() or downloadAllAttachments() methods:

>>> import ezgmail
>>> threads = ezgmail.search('See the attached files')
>>> threads[0].messages[0].attachments
>>> import pprint
>>> pprint.pprint(threads[0].messages[0].attachments)
{'a.png': {'id': 'ANGjdJ8eLDbjBpFTfvpuQ2HfR_iwp59XLUIl-IHW8eJcexMsxBYoPCZAXcX16rnqcbJZTknF5r3GmnM1W9n4vAE1oiVgUa4S4zBmNs7rd5PzFwLjO2vU3hp3_9SEZv-KBqVxi9nuNjarxhFqp3mxw6E5mqEYmFOYtT7Gx6CZbLaJuUox9GaWu-W9B4-XPDjwKkEfCdJ21FlOl-CsC6isZgD2Vh-ghh1haZN_2sifccznLv61ZW_KmqPKFcV1j7cXMQVqWU7bkgdH8do4Msc3QsG2ly_PNRid4-7gihsXaLI1ko_j3LSvsoLHFP3edhxh6YKQ2OdMhyZh5lqjmfT1TXgSo7hY16P_ScDO5MnWvmKscf_Hm5y5D4DHfwOq4--Otivoq2WVkVucVUJBkAoB',
           'size': 833609},
 'b.png': {'id': 'ANGjdJ_WYMmPmy2Dd2VBgvVoLAd1p3ARxGXKIzVfKqAiLhvKSBmEowYqFCdHbMJYlDZy4IWBGLg0eQCllMI0icqamM7vfMxBW2irJVogLM6SUT9cIcJFMSF7UhzU2I26bho086J7NjnX5u4kqYj_LHchowO56vTdKLRRsaJ2gfW0esz3cDFZzvthdR4wyBKEIeCJv7OJmFiaJIRf9f1KmFfKPLo9GZSyD2RMXdd6Qa2M3uN9pgT6sZ-OQx3e6aNDAKWh5GCeSiuIt_Z7GsDCdzVJjakMJx5FRFhp5zIck0p04AHnYhKfy1BipWmf7G-DAKzgJHAhFimBVUIBeFsHrqEGxDlevD7lK4ZBeb8cluSmYyEsRkSPSMYMlp-x1GVw25gqMnMVkGMKPfwj38iB',
	       'size': 335911}}
>>> threads[0].messages[0].downloadAttachment('a.png') # Download to current working directory.
>>> threads[0].messages[0].downloadAttachment('b.png', '/path/to/save/in')
>>> threads[0].messages[0].downloadAllAttachments() # Easier way to save all attachments.

Limitations

Currently, EZGmail cannot do the following:

  • Read or set labels. (Including marking emails as read.)
  • Sending emails with cc and bcc fields.
  • A lot of other basic features. This package is just a start!

Contribute

If you'd like to contribute to EZGmail, check out https://github.com/asweigart/ezgmail or email [email protected]

Support

If you find this project helpful and would like to support its development, consider donating to its creator on Patreon.

More Repositories

1

pyperclip

Python module for cross-platform clipboard functions.
Python
1,450
star
2

PythonStdioGames

A collection of text-based games written in Python 3 that only use "standard i/o".
Python
863
star
3

my_first_tic_tac_toe

My first Tic Tac Toe program. I welcome any code reviews and pull requests!
Python
604
star
4

humre

A human-readable regular expression module for Python.
Python
392
star
5

codebreaker

"Hacking Secret Ciphers with Python" programs
Python
330
star
6

PyGetWindow

A simple, cross-platform module for obtaining GUI information on applications' windows.
Python
284
star
7

pyscreeze

PyScreeze is a simple, cross-platform screenshot module for Python 2 and 3.
Python
158
star
8

sushigoroundbot

A bot that plays the Sushi Go Round flash game using PyAutoGUI.
Python
139
star
9

nicewin

A nicely-documented, pure-Python wrapper for the Windows API for Python 2 and 3.
Python
124
star
10

simple-turtle-tutorial-for-python

A simple tutorial for Python's turtle.py. This tutorial is meant to be easily translated into languages besides English.
Python
122
star
11

pytweening

A set of tweening / easing functions implemented in Python.
Jupyter Notebook
97
star
12

pyinputplus

The input() and raw_input() functions with added validation features for text-based programs.
Python
92
star
13

gamesbyexample

A collection of text-based games in Python and other languages.
Python
83
star
14

automatetheboringstuffwithpythondotcom

Source for the AutomateTheBoringStuff.com website.
HTML
72
star
15

ezsheets

A Pythonic interface to the Google Sheets API.
Python
63
star
16

inventwithpython3rded

Source text for "Invent Your Own Computer Games with Python, 3rd Edition"
Python
62
star
17

recursion_examples

Random source code files of recursive algorithms.
Python
60
star
18

PyMsgBox

Simple, cross-platform, pure Python module to display message boxes, and just message boxes.
Python
56
star
19

threadworms

A multithreaded programming demonstration in Python & Pygame using a "Nibbles" clone.
Python
55
star
20

idle-reimagined

IDLE Reimagined is the code name for a redesign for Python's default IDLE editor with focus as an educational tool.
HTML
54
star
21

zombiedice

A Python simulator for the dice game Zombie Dice that can run bot AI players.
Python
53
star
22

nes_zelda_map_data

A project to derive the map data for the original NES Legend of Zelda game so that it can be used in hobbyist projects.
Python
51
star
23

READAL

A readme for Al's GitHub repos. (Resume supplement)
49
star
24

making-games-with-python-and-pygame

The source code for the game programs for the book, "Making Games with Python & Pygame"
Python
49
star
25

art-of-turtle-programming

Various turtle drawing programs in Python
Python
46
star
26

textadventuredemo

Text Adventure Demo
Python
44
star
27

automateboringstuff

This package installs the modules used in "Automate the Boring Stuff with Python", 2nd Edition.
Python
35
star
28

pwinput

A cross-platform Python module that displays **** for password input. Works on Windows, unlike getpass. Formerly called stdiomask.
Python
35
star
29

imgur-hosted-reddit-posted-downloader

A Python script that checks Reddit for Imgur posts and downloads the corresponding images.
Python
30
star
30

pyganim

Sprite animation module for Pygame
Python
29
star
31

the-big-book-of-small-python-projects

The source code for the programs in "The Big Book of Small Python Projects"
Python
28
star
32

whatismyip

Fetch your public IP address from external sources with Python.
Python
28
star
33

mouseinfo

An application to display XY position and RGB color information for the pixel currently under the mouse. Works on Python 2 and 3.
Python
27
star
34

cookiecutter-basicpythonproject

A cookiecutter template for basic Python projects.
Python
26
star
35

stdiomask

A cross-platform Python module for entering passwords and displaying a **** mask, which getpass cannot do.
Python
23
star
36

moosegesture

Python 8-direction mouse gesture recognition library
Python
23
star
37

the-recursive-book-of-recursion

Source code for the programs in The Recursive Book of Recursion
Python
19
star
38

bext

A cross-platform Python 2/3 module for colorful, text-based terminal programs.
Python
18
star
39

pyaudacity

A Python module to control a running instance of Audacity through its macro system.
Python
18
star
40

pydidyoumean

A module to improve "file/command not found" error messages with "did you mean" suggestions.
Python
17
star
41

inventwithpythondotcom

The InventWithPython.com website source
HTML
16
star
42

basicsudoku

A simple, basic Sudoku class in Python. Suitable for programming tutorials or experimentation.
Python
15
star
43

mapitpy

Opens a browser window to maps.google.com based on your clipboard contents.
Python
15
star
44

bigbookpython

A module to install the dependencies for the projects in The Big Book of Small Python Projects
Python
14
star
45

PyKeyMouse

A simple, cross-platform Python 2/3 module to detect mouse and keyboard input.
Python
14
star
46

scrollart

A collection of "scroll art" computer animation programs in several languages, suitable for teaching/learning to code.
Python
13
star
47

pygbutton

A simple Button UI class for Pygame
Python
12
star
48

automateboringstuff3rdedition

This package installs the modules used in “Automate the Boring Stuff with Python”, 3rd Edition.
Python
11
star
49

automateboringstuff6thedition

This package installs the modules used in "Automate the Boring Stuff with Python", 6th Edition.
Python
10
star
50

hobson

A GUI toolkit with simple features, take it or leave it. Cross-platform, text-based, pure Python 3.
Python
10
star
51

PyTextCanvas

A simple way to draw text and ascii art to a 2D grid "canvas" in Python.
Python
10
star
52

shelltut

A tutorial system for learning the shell/command line. For Windows and macOS/Linux.
10
star
53

pipfromrepl

Run pip to install packages from the Python interactive shell aka REPL.
Python
10
star
54

automateboringstuff2ndedition

This package installs the modules used in “Automate the Boring Stuff with Python”, 2nd Edition.
Python
9
star
55

PyRect

PyRect is a simple module with a Rect class for Pygame-like rectangular areas.
Python
9
star
56

pysimplevalidate

A simple collection of validation functions that work on strings, suitable for use in other applications.
Python
9
star
57

asciiartjsondb

A collection of ASCII art, stored in a single JSON file.
Python
9
star
58

fluffygoggles

A Python app for taking a screenshot, reading the text with OCR, and copying the text to the clipboard. And it's free.
8
star
59

programmedpatterns

Practice exercises in pattern recognition, ideal for beginner and intermediate programmers.
Python
8
star
60

fractalartmaker

A module for creating fractal art in Python's turtle module.
Python
8
star
61

wordletools

A set of tools (written in Python) for solving Wordle puzzles.
Python
7
star
62

source_code_makeover

The "Invent with Python" Blog's Source Code Makeover project.
Python
7
star
63

gorillapy

Gorilla.py is a Python & Pygame remake of the classic QBasic game, gorilla.bas
7
star
64

ezdrive

A Pythonic interface to the Google Drive API.
Python
7
star
65

showcallstack

Shows a simplified view of the call stack.
Python
7
star
66

searchpolluter

A program that Googles random things to pollute your search history with nonsense.
7
star
67

capslockmorsecode

A silly module to control the keyboard LEDs of the CapsLock, NumLock, and ScrollLock keys to flash Morse Code on Windows, macOS, and Linux.
6
star
68

shortstr

A Python module to generate unambiguous strings for URL shortners or similar services.
Python
6
star
69

automateboringstuff1stedition

This package installs the modules used in “Automate the Boring Stuff with Python”, 1st Edition.
Python
6
star
70

automatepracticeprojects

Example implementations of the practice projects in Automate the Boring Stuff with Python
5
star
71

visualpatterns

Programming practice exercises in pattern recognition, written in Python. Ideal for beginner programmers.
Python
5
star
72

recursionbook

The programs used in Al Sweigart's book, "The Recursive Book of Recursion"
Python
5
star
73

showeval

A Python module to show the steps in evaluating an expression.
JavaScript
5
star
74

traceytext

JavaScript & HTML teaching tool to visualize single-stepping through source code.
Python
5
star
75

racistnotxenophobic

A Chrome extension which replaces the euphemistic word "xenophobic" with the more accurate "racist".
JavaScript
5
star
76

PyFuzzyBool

Additional boolean values: KindaTrue, KindaFalse, VeryTrue, and VeryFalse. (This is a joke project.)
Python
5
star
77

al-computercraft

Al's various Lua scripts for the Minecraft mod, ComputerCraft.
Lua
5
star
78

clear

A cross-platform Python module that provides a clear() function which clears the terminal. That's all.
Python
5
star
79

fpstimer

A clock timer that provides sleep()-like features for maintaining a certain "frames per second" (FPS) framerate in Python 2 and 3.
Python
5
star
80

pybresenham

A Python module of generators that generate x, y coordinates for various vector shapes such as lines, rectangles, etc. Named after Bresenham of line-algorithm fame.
Python
5
star
81

cliprec

A cross-platform clipboard monitoring and recording tool. Only works for text.
Python
5
star
82

ccwd

Windows command line executable to copy the current working directory to the clipboard.
C++
4
star
83

50AndroidHacksProjects

Android Studio projects that implement the 50 hacks in Carlos Sessa's "50 Android Hacks" book published by Manning.
Java
4
star
84

blankeditor

Code used in the Blank Editor screencast
Python
4
star
85

wizcoin

A Python module to represent the galleon, sickle, and knut coins of wizard currency.
Python
4
star
86

tortuga

Une mise en œuvre espagnole du module de turtle.py de Python.
Python
4
star
87

quicksort

An optimized implementation of the Quicksort algorithm in Python.
Python
4
star
88

drostedraw

A Python module for making recursive drawings (aka Droste effect) with the built-in turtle module.
Python
4
star
89

automateboringstuff3

4
star
90

whatismywifipassword

A Python 2 and 3 module that displays the password of your current wifi connection (and other features). Written for easy auditability.
4
star
91

mondrian_art_generator

A Python script that generates Mondrian-style art.
Python
3
star
92

simongesture

Python game using Pygame where the player must mimic patterns with mouse gestures. Uses the MooseGesture module.
Python
3
star
93

AlDoesProjectEuler

A record of my Project Euler solutions. Elegance Not Guaranteed.
Python
3
star
94

gridsandhexes

A Python module for producing PNG and PDF files of customized graph paper.
Python
3
star
95

bextjs

A boring text in-browser console, written in JavaScript.
HTML
3
star
96

sevseg

A simple Python module that produces ASCII art of seven-segment display numbers.
3
star
97

safefs

A Python module for safely working the file system in a safe, auditable way.
Python
3
star
98

pressplay

Cross-platform Python module to play mp3, wav, opus, and ogg audio sound files, built on Pygame.
3
star
99

boxstr

A Python module for text-based drawing using DOS "box-drawing" characters.
3
star
100

pygamereadthedocs

Pygame documentation for ReadTheDocs.org
Python
3
star