Last active
November 28, 2017 20:36
-
-
Save air/975bfc53e9380a56f8da to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import socket | |
import struct | |
import binascii | |
import time | |
import json | |
import urllib2 | |
# Use your own IFTTT key, not this fake one | |
ifttt_key = '9cn3847ntc8394tn8-ab' | |
# Set these up at https://ifttt.com/maker | |
ifttt_url_poop = 'https://maker.ifttt.com/trigger/baby_pooped/with/key/' + ifttt_key | |
ifttt_url_pee = 'https://maker.ifttt.com/trigger/baby_peed/with/key/' + ifttt_key | |
# Replace these fake MAC addresses and nicknames with your own | |
macs = { | |
'34545555e7ad' : 'chromebook', | |
'48d703450d65' : 'macbook', | |
'ec3454354536' : 'nexus6', | |
'2c3453455541' : 'apple_tv', | |
'6c7092236348' : 'airport_express', | |
'74234223434a' : 'dash_glad', | |
'7234234417c2' : 'dash_tide' | |
} | |
# Trigger a IFTTT URL. Body includes JSON with timestamp values. | |
def trigger_url(url): | |
data = '{ "value1" : "' + time.strftime("%Y-%m-%d") + '", "value2" : "' + time.strftime("%H:%M") + '" }' | |
req = urllib2.Request(url, data, {'Content-Type': 'application/json'}) | |
f = urllib2.urlopen(req) | |
response = f.read() | |
f.close() | |
return response | |
def record_poop(): | |
print 'triggering poop event, response: ' + trigger_url(ifttt_url_poop) | |
def record_pee(): | |
print 'triggering pee event, response: ' + trigger_url(ifttt_url_pee) | |
rawSocket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0003)) | |
while True: | |
packet = rawSocket.recvfrom(2048) | |
ethernet_header = packet[0][0:14] | |
ethernet_detailed = struct.unpack("!6s6s2s", ethernet_header) | |
# skip non-ARP packets | |
ethertype = ethernet_detailed[2] | |
if ethertype != '\x08\x06': | |
continue | |
# read out data | |
arp_header = packet[0][14:42] | |
arp_detailed = struct.unpack("2s2s1s1s2s6s4s6s4s", arp_header) | |
source_mac = binascii.hexlify(arp_detailed[5]) | |
source_ip = socket.inet_ntoa(arp_detailed[6]) | |
dest_ip = socket.inet_ntoa(arp_detailed[8]) | |
if source_mac in macs: | |
#print "ARP from " + macs[source_mac] + " with IP " + source_ip | |
if macs[source_mac] == 'dash_glad': | |
record_poop() | |
if macs[source_mac] == 'dash_tide': | |
record_pee() | |
else: | |
print "Unknown MAC " + source_mac + " from IP " + source_ip |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Updated to fix issue with non-ARP packets.