User:Eleanorg/1.2/Thematic/integrated assessment

From XPUB & Lens-Based wiki

Displaying Image

#!/usr/bin/python
#-*- coding:utf-8 -*-

import cgi, glob
import cgitb; cgitb.enable()

#-------- ascertain latest image filename -------------#

images = glob.glob('../../forbiddenPixels/images/*')
number = len(images)				# counts number of files in images folder
latest = '%05d' % number			# converts to 5 digits. note: this changes type from int to str
#print number
#print latest

image = "../../forbiddenPixels/images/" + latest + ".png"  	


#-------- print html doc with image ------------------#
htmlHeader = """<!DOCTYPE html>
<html>
  <head>
    <title>A Censored Image</title>
        <link <link rel="stylesheet" href="../../pixels.css">
  </head>
  <body>"""


print "Content-Type: text/html"
print 
print htmlHeader
print """
      <div class="container img">
      <img src=" """ + image + """ " alt="Sorry, image not currently available" />
      </div>
      <div class="centred">
      This image has been censored. Help to bring it back online, one pixel at a time:<br /><br /> <a href="inputForm.cgi"><button>adopt a pixel</button></a>
      </div>
       """

print """
   </body>
</html>"""

URL Input Form

#!/usr/bin/python
#-*- coding:utf-8 -*-

import cgi, random
import cgitb; cgitb.enable()

# prints out the URL input form, giving the user a random pixel string (for testing).

htmlHeader = """<!DOCTYPE html>
<html>
  <head>
    <title>Adopt a Pixel</title>
        <link <link rel="stylesheet" href="../../pixels.css">
  </head>
  <body>"""


print "Content-Type: text/html"
print 
print htmlHeader
print """
<div class="centred" style="margin-top:50px;">
Below is the unique identifier for your pixel.
Copy and paste it somewhere public on the internet, exactly as it appears:
</div>
<div class="container txt">

<span class="pixelString">
Pixel position:""" + str(random.randint(100,500)) + "." + str(random.randint(100,300)) + "; Color:rgba(" + str(random.randint(100,255)) + "," + str(random.randint(100,255)) + "," + str(random.randint(100,255)) + """,1)
</span>
</div>
<div class="centred" style="margin-top:50px;">
Then tell us the URL of the page where you pasted it:
</div>
<div class="container txt">
  <form action="saveUrl.cgi" name="inputForm">  
    <span class="containerText">Paste url: </span>
    <input name="url">
    <input type="submit" value="OK">
  </form>
</div>
<div class="centred">
Your pixel will appear in the image for as long as the text remains at this URL.
</div>

</body>
</html>"""

Saving the URL

#!/usr/bin/python
#-*- coding:utf-8 -*-

import cgi, os, subprocess
import cgitb; cgitb.enable()

 
# recieves url from inputForm.html and saves the submitted url as a new line in urls.txt
 

#------------- get URL from input form -------------------#

form = cgi.FieldStorage()			# Grabs whatever input comes from form
url = form.getvalue("url", "http://ox4.org/~nor/trials/hostedString.html")  # assigns form's input to var 'url'. url on the right is a default value that will be printed for testing if nothing is recieved from the form

#------------- save url to a text file --------------------#

f = open("data/urls.txt", 'a')  		# opens text file in write mode
f.write(url + '\n')				# write url then newline
f.close()

#-----------run scrapeNdraw script and pipe to bash--------#

command = "./scrapeDraw.cgi | bash"		# script called here must be executable!
os.popen(command, 'r').read()


#------------- print acknowledgement ----------------------#
 

htmlHeader = """<!DOCTYPE html>
<html>
  <head>
    <title>A form talking to a python script</title>
        <link <link rel="stylesheet" href="../../pixels.css">
  </head>
  <body>"""


print "Content-Type: text/html"
print 
print htmlHeader
print """
      <div class="container txt" style="margin-top:100px;">
      Thanks, url submitted.
      <br />
      <a href="showImage.cgi"><< Back to the image</a>
      </div>
       """

print """
   </body>
</html>"""

Composing the Image

#!/usr/bin/python
#-*- coding:utf-8 -*-

import cgi, re, urllib2, glob
import cgitb; cgitb.enable()

# reads submitted urls from the text file where they're stored, scraping each one and adding a corresponding pixel to the image.
# prints bash commands - pipe to bash to run


# open image to be edited
print "convert ../../forbiddenPixels/images/00001.png \\"  	# opens the original, blank image. This means img is made fresh each time, so strings that have disappeared from the web will also disappear from the image.

# open urls file
f = open("data/urls.txt")

# for each line in file, add a pixel
for line in f:
   url = line
   if url == "\n":				# skips over any blank entries in the text file. TODO: change to 'any invalid url'
       continue					
   text = urllib2.urlopen(url).read()		# reads page at the specified URL
   pat = r"Pixel position:(\d\d\d).(\d\d\d)\;\ Color:(rgba\(.*\))"

   if not re.search(pat, text):			# if pattern 'pat' isn't matched within 'text'
       print " "				# TODO: Change to 'do nothing/skip'
   else:
       for m in re.finditer(pat, text):		# for each match in text...
           #string = m.group(0)                 # m.group() lets you access data within the match object
	   xPos = int(m.group(1))		# note: m.group(1) is first capture () - m.group(0) is always whole string
	   yPos = int(m.group(2))
	   color = m.group(3)
	   
           print "-fill ' " + color + " ' \\"  	# this part adds a pixel to the image
           print "-draw 'point %d,%d' \\" %(xPos,yPos)
                


# count how many images are in the 'images' folder

images = glob.glob('../../forbiddenPixels/images/*')
number = len(images)				# counts number of files in images folder
latest = '%05d' % number			# converts to 5 digits. note: this changes type from int to str


#save new version of the image, adding 1 to previous filename
newNumber = '%05d' % (number + 1)
newImage = "../../forbiddenPixels/images/" + newNumber + ".png"		# saves with new filename
print newImage
		
f.close()