Exif.in is a webservice that reads EXIF data from an image and returns it in JSON-y goodness. Request a /strip and you'll get back an exact copy with all EXIF information removed.
See a sample HTTP request and the quickstart guide below.
Exif.in requires each image to be reachable via HTTP GET. You'll need to Base64 encode the URI (path) of the image file before passing it to Exif.in
import base64
base64.b64encode('http://www.findexif.com/client/samples/swiss_view.jpg')
>> 'aHR0cDovL3...lldy5qcGc='
GET Some JSONFire off a HTTP GET request to http://exif.in/exif/your-base64-string. Exif.in will raise an appropriate status code if there's a hiccup (see HTTP Responses, below). Otherwise you'll receive the EXIF data in a JSON payload.
import requests
req = requests.get('http://exif.in/exif/aHR0cDovL3...lldy5qcGc=')
req.status_code
>> 200
req.json
>> {...u'ISOSpeedRatings': u'80', u'Model':u'DSC-H5',...
Keeping A Low Profile?Append /strip to your HTTP GET request and you'll get back a URI to an exact copy of the image with its EXIF data removed. This copy is ephemeral and deleted from S3 after twenty-four hours. Download - not link! - please.
import requests
req = requests.get('http://exif.in/exif/aHR0cDovL3...lldy5qcGc=/strip')
req.text
>> u'https://s3.amazonaws.com/exifin/39f6ecbeb73c.jpg'
No problems at the moment.
If you rely on Exif.in for a pet project or two, you may want to subscribe to the Exif.in newsletter - for rare, critical service updates only. Sign up here.
This service is provided as-is, without any warranty. Please do not use this service for commercial use. I'm not responsible for image content, corruption or data loss. Please use responsibly. Thanks to the low cost of bandwidth and storage, there is no fee to use Exif.in and no registration is required. If the service is abused or experiences usage beyond what I'm capable of supporting, this may change.
If you've received an HTTP status code that is > 200, these clues may help.