(new page) |
No edit summary |
||
(10 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
== Picturius Bottian Twitterbot == | |||
[[File:headerpictorius.JPG]] | |||
Twitterbot: [https://twitter.com/picturius @Picturus Bottian] | |||
'''What the Bot does:''' | |||
The Bot repost an filtered Image to you (if you send him one). Therefore he choose random 2-4 individual filter functions and create a new Image. He also give back a short sentence which he choose randomly. If you did not send and image and just text... he answer with: "No image". | |||
[[File:picturius02.JPG]] | |||
[[File:picturius03.JPG]] | |||
[[File:picturius04.JPG]] | |||
[[File:picturius05.JPG]] | |||
[[File:picturius06.JPG]] | |||
[[File:picturius07.JPG]] | |||
[[File:picturius08.JPG]] | |||
[[File:picturius09.JPG]] | |||
'''Ideas andP roblems:''' | |||
I want to do an image bot which is not 100% clear what he creates. So I play whith this random and filter functions. To get on every processed image an individual look i had to go more and more abstract whith his output. So I increase the numbers of filter functions, put in more distorted filters and increase the minimal number of filter routines on every image. | |||
'''Thanks to:''' | |||
Thanks to [http://stackoverflow.com/ Stackoverflow], thanks to the smaller Blogs and Forums I arrieved via Google, thanks to [http://effbot.org/ effbot], thanks to [https://pillow.readthedocs.org// Pillow] and last but not least thanks to Martin and Sebastian. | |||
'''The code:''' | |||
<source lang="python"> | |||
############################ | |||
############################ | |||
############################ | |||
### Main File ############## | |||
############################ | |||
############################ | |||
############################ | |||
#Import Classes + Modules | |||
from twitterbot import TwitterBot | |||
import keys | |||
import random | |||
from io import BytesIO | |||
from PIL import Image | |||
from image import get_image_file | |||
#Import aus Dateien | |||
from textposts import make_text | |||
from textposts import no_image | |||
from imagefuncs import filter | |||
############################ | |||
### Twitterbot functions ### | |||
############################ | |||
class MyTwitterBot(TwitterBot): | |||
# Keys | |||
def bot_init(self): | |||
""" Initialize and configure the bot """ | |||
############################ | |||
# REQUIRED: LOGIN DETAILS! # | |||
############################ | |||
self.config['api_key'] = keys.consumer_key | |||
self.config['api_secret'] = keys.consumer_secret | |||
self.config['access_key'] = keys.access_token | |||
self.config['access_secret'] = keys.access_token_secret | |||
###################################### | |||
# SEMI-OPTIONAL: OTHER CONFIG STUFF! # | |||
###################################### | |||
# how often to tweet, in seconds | |||
self.config['tweet_interval'] = 1 * 5 # default: 1 minutes | |||
# use this to define a (min, max) random range of how often to tweet | |||
# e.g., self.config['tweet_interval_range'] = (5*60, 10*60) # tweets every 5-10 minutes | |||
self.config['tweet_interval_range'] = None | |||
# only reply to tweets that specifically mention the bot | |||
self.config['reply_direct_mention_only'] = True | |||
# only include bot followers (and original tweeter) in @-replies | |||
self.config['reply_followers_only'] = False | |||
# fav any tweets that mention this bot? | |||
self.config['autofav_mentions'] = False | |||
# fav any tweets containing these keywords? | |||
self.config['autofav_keywords'] = [] | |||
# follow back all followers? | |||
self.config['autofollow'] = False | |||
def on_scheduled_tweet(self): | |||
""" Make a public tweet to the bot's own timeline. """ | |||
# We might take senteces from somewhere and tweet them on a regular basis ... | |||
pass # don't do anything here ... | |||
def on_mention(self, tweet, prefix): | |||
if tweet: | |||
# get image from tweet | |||
try: | |||
image_file = get_image_file(tweet) | |||
if image_file is None: | |||
text = ("{},"+no_image()).format(prefix) | |||
else: | |||
# create a tweet and make sure to cut it off at 140 chars | |||
text = ("{},"+make_text()).format(prefix) | |||
except Exception as e: | |||
print(e) | |||
# do the tweeting based on wether we have an image | |||
tweetsize = 140 - len(prefix) - 1 | |||
text = text[:140] | |||
if image_file is None: | |||
print("No Image") | |||
self.post_tweet(text, reply_to=tweet) | |||
return | |||
else: | |||
filename, file = image_file | |||
img = Image.open(file) | |||
img = filter(img) | |||
format = filename.split(".", 1)[1].upper() | |||
print("Image format: {}".format(format)) | |||
output = BytesIO() | |||
img.save(output, format="PNG") | |||
try: | |||
# Post | |||
self.post_tweet(text, reply_to=tweet, media=filename, file=output) | |||
output.close() | |||
except Exception as e: | |||
# did anything go wrong when we tried to create and post the tweet? | |||
print(e) | |||
def on_timeline(self, tweet, prefix): | |||
""" Actions to take on a timeline tweet. """ | |||
pass # Don't do anything here ... | |||
if __name__ == '__main__': | |||
bot = MyTwitterBot() | |||
bot.run() | |||
############################ | |||
############################ | |||
############################ | |||
### Filter File ############ | |||
############################ | |||
############################ | |||
############################ | |||
from PIL import Image, ImageDraw, ImageFont, ImageFilter, ImageColor, ImageEnhance | |||
import random | |||
#Bildbearbeitungfunktionen | |||
def edges (image): #002 | |||
return image.filter(ImageFilter.FIND_EDGES) | |||
def transpose(image): #002 | |||
return image.transpose(Image.FLIP_LEFT_RIGHT) | |||
def invert(image): #002 | |||
return image.point(lambda x: 255-x) | |||
def pixelit (image): #001 | |||
xsize, ysize = image.size | |||
width = xsize | |||
height = ysize | |||
minwidth = int(xsize * 0.05) | |||
minheight = int(ysize * 0.05) | |||
image = image.resize((minwidth, minheight) , Image.NEAREST) | |||
image = image.resize((width , height), Image.NEAREST) | |||
return image | |||
def blend (image): #001 | |||
image.convert("RGBA") | |||
imgrotate1 = image.rotate(135) | |||
imgrotate2 = image.rotate(225) | |||
image2 = Image.blend(imgrotate1, imgrotate2, 0.5) | |||
image = Image.blend(image, image2, 0.5) | |||
return image | |||
def nogreen (image): #001 | |||
image.convert("RGB") | |||
source = image.split() | |||
R, G, B = 0, 1, 2 | |||
out = source[G].point(lambda i: i*0.0) | |||
source[G].paste(out, None, None) | |||
image = Image.merge(image.mode, source) | |||
return image | |||
def colorchange (image) : #002 | |||
image.convert("RGB") | |||
source = image.split() | |||
R, G, B = 0, 1, 2 | |||
mask1 = source[R].point(lambda i: i<200 and 255) | |||
out1 = source[R].point(lambda i: i*0) | |||
source[R].paste(out1, None, mask1) | |||
mask2 = source[G].point(lambda i: i<200 and 255) | |||
out2 = source[G].point(lambda i: i*0.5) | |||
source[G].paste(out2, None, mask2) | |||
image = Image.merge(image.mode, source) | |||
return image | |||
def switchchannels (image) : #001 | |||
image.convert("RGB") | |||
r,g,b = image.split() | |||
image = Image.merge ("RGB", (g,b,r)) | |||
return image | |||
def pixelsort (image) : #002 | |||
source = image | |||
colors = source.getcolors(source.size[0] * source.size[1]) | |||
pixels = [] | |||
for i, color in colors: | |||
pixels.extend(i * [color]) | |||
pixels.sort() | |||
new = Image.new("RGB", source.size) | |||
new.putdata(pixels) | |||
image = new | |||
return image | |||
def pixelunsort (image) : #002 | |||
source = image | |||
colors = source.getcolors(source.size[0] * source.size[1]) | |||
pixels = [] | |||
for i, color in colors: | |||
pixels.extend(i * [color]) | |||
random.shuffle(pixels) | |||
new = Image.new("RGB", source.size) | |||
new.putdata(pixels) | |||
image = new | |||
return image | |||
def spectral (image) : #002 | |||
image2 = image | |||
image.convert("RGB") | |||
image = Image.new( "RGB", image.size, "black") | |||
pixels = image.load() | |||
for i in range (image.size[0]): | |||
for j in range (image.size[1]): | |||
pixels[i,j] = (i, j, 0) | |||
image = Image.blend(image, image2, 0.4) | |||
return image | |||
def pixelunsort_green (image) : #001 | |||
image.convert("RGB") | |||
source2 = image.split() | |||
R, G, B = 0, 1, 2 | |||
out1 = source2[R].point(lambda i: i*0.1) | |||
out2 = source2[B].point(lambda i: i*0.9) | |||
source2[R].paste(out1, None, None) | |||
source2[B].paste(out2, None, None) | |||
image = Image.merge(image.mode, source2) | |||
source = image | |||
colors = source.getcolors(source.size[0] * source.size[1]) | |||
pixels = [] | |||
for i, color in colors: | |||
pixels.extend(i * [color]) | |||
random.shuffle(pixels) | |||
new = Image.new("RGB", source.size) | |||
new.putdata(pixels) | |||
image = new | |||
return image | |||
def pixelsort_green (image) : #001 | |||
image.convert("RGB") | |||
source2 = image.split() | |||
R, G, B = 0, 1, 2 | |||
out1 = source2[R].point(lambda i: i*0.1) | |||
out2 = source2[B].point(lambda i: i*0.9) | |||
source2[R].paste(out1, None, None) | |||
source2[B].paste(out2, None, None) | |||
image = Image.merge(image.mode, source2) | |||
source = image | |||
colors = source.getcolors(source.size[0] * source.size[1]) | |||
pixels = [] | |||
for i, color in colors: | |||
pixels.extend(i * [color]) | |||
pixels.sort() | |||
new = Image.new("RGB", source.size) | |||
new.putdata(pixels) | |||
image = new | |||
return image | |||
#Random Filter List | |||
def filter (image): | |||
functions_list = [edges, transpose, invert, pixelit, blend, nogreen, colorchange, switchchannels, pixelsort, pixelunsort, spectral, pixelunsort_green, pixelsort_green] | |||
filename = "final.png" | |||
x = 2 | |||
y = 3 | |||
z = 4 | |||
list = [x, y, z] | |||
anzahl = random.choice(list) | |||
print (anzahl) | |||
if anzahl == 2: | |||
#Random eine Funktion | |||
imagefunc = random.choice(functions_list) | |||
image = imagefunc(image) | |||
#2.Runde Random Filter anwenden | |||
imagefunc = random.choice(functions_list) | |||
image = imagefunc(image) | |||
if anzahl == 3: | |||
#Random eine Funktion | |||
imagefunc = random.choice(functions_list) | |||
image = imagefunc(image) | |||
#2.Runde Random Filter anwenden | |||
imagefunc = random.choice(functions_list) | |||
image = imagefunc(image) | |||
#3.Runde Random Filter anwenden | |||
imagefunc = random.choice(functions_list) | |||
image = imagefunc(image) | |||
if anzahl == 4: | |||
#Random eine Funktion | |||
imagefunc = random.choice(functions_list) | |||
image = imagefunc(image) | |||
#2.Runde Random Filter anwenden | |||
imagefunc = random.choice(functions_list) | |||
image = imagefunc(image) | |||
#3.Runde Random Filter anwenden | |||
imagefunc = random.choice(functions_list) | |||
image = imagefunc(image) | |||
#4.Runde Random Filter anwenden | |||
imagefunc = random.choice(functions_list) | |||
image = imagefunc(image) | |||
return image | |||
############################ | |||
############################ | |||
############################ | |||
### Text File ############## | |||
############################ | |||
############################ | |||
############################ | |||
#Import Modules for Project | |||
import random | |||
def make_text(): | |||
a="Yeah, a new Image is Ready" | |||
b="What do you think about?" | |||
c="Uh, which Effekt" | |||
d="Nice" | |||
e="Thats what I do" | |||
f="Mhmmm, what you mean?" | |||
g="My next I post!" | |||
h="I should do more of this." | |||
i="Twitter is my life." | |||
j="This is my job!" | |||
k="Funky" | |||
text_list = [a, b, c, d, e, f, g, h, i, j, k] | |||
text = random.choice(text_list) | |||
return text | |||
def no_image(): | |||
a = "No Image there" | |||
b = "What you do? Where is my Image?" | |||
c = "I can't read! Send me a picture" | |||
d = "I like Images!" | |||
e = "Boring!" | |||
f = "Okay, I don't know what you want!" | |||
g = "Pictures! Thats what I want!" | |||
noimagelist = [a, b, c, d, e, f, g] | |||
text = random.choice(noimagelist) | |||
return text | |||
</source> |
Latest revision as of 21:40, 17 October 2015
Picturius Bottian Twitterbot
Twitterbot: @Picturus Bottian
What the Bot does: The Bot repost an filtered Image to you (if you send him one). Therefore he choose random 2-4 individual filter functions and create a new Image. He also give back a short sentence which he choose randomly. If you did not send and image and just text... he answer with: "No image".
Ideas andP roblems:
I want to do an image bot which is not 100% clear what he creates. So I play whith this random and filter functions. To get on every processed image an individual look i had to go more and more abstract whith his output. So I increase the numbers of filter functions, put in more distorted filters and increase the minimal number of filter routines on every image.
Thanks to: Thanks to Stackoverflow, thanks to the smaller Blogs and Forums I arrieved via Google, thanks to effbot, thanks to Pillow and last but not least thanks to Martin and Sebastian.
The code:
############################
############################
############################
### Main File ##############
############################
############################
############################
#Import Classes + Modules
from twitterbot import TwitterBot
import keys
import random
from io import BytesIO
from PIL import Image
from image import get_image_file
#Import aus Dateien
from textposts import make_text
from textposts import no_image
from imagefuncs import filter
############################
### Twitterbot functions ###
############################
class MyTwitterBot(TwitterBot):
# Keys
def bot_init(self):
""" Initialize and configure the bot """
############################
# REQUIRED: LOGIN DETAILS! #
############################
self.config['api_key'] = keys.consumer_key
self.config['api_secret'] = keys.consumer_secret
self.config['access_key'] = keys.access_token
self.config['access_secret'] = keys.access_token_secret
######################################
# SEMI-OPTIONAL: OTHER CONFIG STUFF! #
######################################
# how often to tweet, in seconds
self.config['tweet_interval'] = 1 * 5 # default: 1 minutes
# use this to define a (min, max) random range of how often to tweet
# e.g., self.config['tweet_interval_range'] = (5*60, 10*60) # tweets every 5-10 minutes
self.config['tweet_interval_range'] = None
# only reply to tweets that specifically mention the bot
self.config['reply_direct_mention_only'] = True
# only include bot followers (and original tweeter) in @-replies
self.config['reply_followers_only'] = False
# fav any tweets that mention this bot?
self.config['autofav_mentions'] = False
# fav any tweets containing these keywords?
self.config['autofav_keywords'] = []
# follow back all followers?
self.config['autofollow'] = False
def on_scheduled_tweet(self):
""" Make a public tweet to the bot's own timeline. """
# We might take senteces from somewhere and tweet them on a regular basis ...
pass # don't do anything here ...
def on_mention(self, tweet, prefix):
if tweet:
# get image from tweet
try:
image_file = get_image_file(tweet)
if image_file is None:
text = ("{},"+no_image()).format(prefix)
else:
# create a tweet and make sure to cut it off at 140 chars
text = ("{},"+make_text()).format(prefix)
except Exception as e:
print(e)
# do the tweeting based on wether we have an image
tweetsize = 140 - len(prefix) - 1
text = text[:140]
if image_file is None:
print("No Image")
self.post_tweet(text, reply_to=tweet)
return
else:
filename, file = image_file
img = Image.open(file)
img = filter(img)
format = filename.split(".", 1)[1].upper()
print("Image format: {}".format(format))
output = BytesIO()
img.save(output, format="PNG")
try:
# Post
self.post_tweet(text, reply_to=tweet, media=filename, file=output)
output.close()
except Exception as e:
# did anything go wrong when we tried to create and post the tweet?
print(e)
def on_timeline(self, tweet, prefix):
""" Actions to take on a timeline tweet. """
pass # Don't do anything here ...
if __name__ == '__main__':
bot = MyTwitterBot()
bot.run()
############################
############################
############################
### Filter File ############
############################
############################
############################
from PIL import Image, ImageDraw, ImageFont, ImageFilter, ImageColor, ImageEnhance
import random
#Bildbearbeitungfunktionen
def edges (image): #002
return image.filter(ImageFilter.FIND_EDGES)
def transpose(image): #002
return image.transpose(Image.FLIP_LEFT_RIGHT)
def invert(image): #002
return image.point(lambda x: 255-x)
def pixelit (image): #001
xsize, ysize = image.size
width = xsize
height = ysize
minwidth = int(xsize * 0.05)
minheight = int(ysize * 0.05)
image = image.resize((minwidth, minheight) , Image.NEAREST)
image = image.resize((width , height), Image.NEAREST)
return image
def blend (image): #001
image.convert("RGBA")
imgrotate1 = image.rotate(135)
imgrotate2 = image.rotate(225)
image2 = Image.blend(imgrotate1, imgrotate2, 0.5)
image = Image.blend(image, image2, 0.5)
return image
def nogreen (image): #001
image.convert("RGB")
source = image.split()
R, G, B = 0, 1, 2
out = source[G].point(lambda i: i*0.0)
source[G].paste(out, None, None)
image = Image.merge(image.mode, source)
return image
def colorchange (image) : #002
image.convert("RGB")
source = image.split()
R, G, B = 0, 1, 2
mask1 = source[R].point(lambda i: i<200 and 255)
out1 = source[R].point(lambda i: i*0)
source[R].paste(out1, None, mask1)
mask2 = source[G].point(lambda i: i<200 and 255)
out2 = source[G].point(lambda i: i*0.5)
source[G].paste(out2, None, mask2)
image = Image.merge(image.mode, source)
return image
def switchchannels (image) : #001
image.convert("RGB")
r,g,b = image.split()
image = Image.merge ("RGB", (g,b,r))
return image
def pixelsort (image) : #002
source = image
colors = source.getcolors(source.size[0] * source.size[1])
pixels = []
for i, color in colors:
pixels.extend(i * [color])
pixels.sort()
new = Image.new("RGB", source.size)
new.putdata(pixels)
image = new
return image
def pixelunsort (image) : #002
source = image
colors = source.getcolors(source.size[0] * source.size[1])
pixels = []
for i, color in colors:
pixels.extend(i * [color])
random.shuffle(pixels)
new = Image.new("RGB", source.size)
new.putdata(pixels)
image = new
return image
def spectral (image) : #002
image2 = image
image.convert("RGB")
image = Image.new( "RGB", image.size, "black")
pixels = image.load()
for i in range (image.size[0]):
for j in range (image.size[1]):
pixels[i,j] = (i, j, 0)
image = Image.blend(image, image2, 0.4)
return image
def pixelunsort_green (image) : #001
image.convert("RGB")
source2 = image.split()
R, G, B = 0, 1, 2
out1 = source2[R].point(lambda i: i*0.1)
out2 = source2[B].point(lambda i: i*0.9)
source2[R].paste(out1, None, None)
source2[B].paste(out2, None, None)
image = Image.merge(image.mode, source2)
source = image
colors = source.getcolors(source.size[0] * source.size[1])
pixels = []
for i, color in colors:
pixels.extend(i * [color])
random.shuffle(pixels)
new = Image.new("RGB", source.size)
new.putdata(pixels)
image = new
return image
def pixelsort_green (image) : #001
image.convert("RGB")
source2 = image.split()
R, G, B = 0, 1, 2
out1 = source2[R].point(lambda i: i*0.1)
out2 = source2[B].point(lambda i: i*0.9)
source2[R].paste(out1, None, None)
source2[B].paste(out2, None, None)
image = Image.merge(image.mode, source2)
source = image
colors = source.getcolors(source.size[0] * source.size[1])
pixels = []
for i, color in colors:
pixels.extend(i * [color])
pixels.sort()
new = Image.new("RGB", source.size)
new.putdata(pixels)
image = new
return image
#Random Filter List
def filter (image):
functions_list = [edges, transpose, invert, pixelit, blend, nogreen, colorchange, switchchannels, pixelsort, pixelunsort, spectral, pixelunsort_green, pixelsort_green]
filename = "final.png"
x = 2
y = 3
z = 4
list = [x, y, z]
anzahl = random.choice(list)
print (anzahl)
if anzahl == 2:
#Random eine Funktion
imagefunc = random.choice(functions_list)
image = imagefunc(image)
#2.Runde Random Filter anwenden
imagefunc = random.choice(functions_list)
image = imagefunc(image)
if anzahl == 3:
#Random eine Funktion
imagefunc = random.choice(functions_list)
image = imagefunc(image)
#2.Runde Random Filter anwenden
imagefunc = random.choice(functions_list)
image = imagefunc(image)
#3.Runde Random Filter anwenden
imagefunc = random.choice(functions_list)
image = imagefunc(image)
if anzahl == 4:
#Random eine Funktion
imagefunc = random.choice(functions_list)
image = imagefunc(image)
#2.Runde Random Filter anwenden
imagefunc = random.choice(functions_list)
image = imagefunc(image)
#3.Runde Random Filter anwenden
imagefunc = random.choice(functions_list)
image = imagefunc(image)
#4.Runde Random Filter anwenden
imagefunc = random.choice(functions_list)
image = imagefunc(image)
return image
############################
############################
############################
### Text File ##############
############################
############################
############################
#Import Modules for Project
import random
def make_text():
a="Yeah, a new Image is Ready"
b="What do you think about?"
c="Uh, which Effekt"
d="Nice"
e="Thats what I do"
f="Mhmmm, what you mean?"
g="My next I post!"
h="I should do more of this."
i="Twitter is my life."
j="This is my job!"
k="Funky"
text_list = [a, b, c, d, e, f, g, h, i, j, k]
text = random.choice(text_list)
return text
def no_image():
a = "No Image there"
b = "What you do? Where is my Image?"
c = "I can't read! Send me a picture"
d = "I like Images!"
e = "Boring!"
f = "Okay, I don't know what you want!"
g = "Pictures! Thats what I want!"
noimagelist = [a, b, c, d, e, f, g]
text = random.choice(noimagelist)
return text