(Robot Image embet)  | 
				No edit summary  | 
				||
| (9 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]  | |||
[[File:  | '''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