56
edits
| No edit summary | No edit summary | ||
| Line 1: | Line 1: | ||
| ==  | == Picturius Bottian Twitterbot == | ||
| [[File:headerpictorius.JPG]] | |||
| Twitterbot: [https://twitter.com/picturius @Picturus Bottian] | 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 | #Import Classes + Modules | ||
| Line 134: | Line 153: | ||
|      bot.run() |      bot.run() | ||
| ############################ | |||
| ############################ | |||
| ############################ | |||
| ### Filter File ############ | |||
| ############################ | |||
| ############################ | |||
| ############################ | |||
| from PIL import Image, ImageDraw, ImageFont, ImageFilter, ImageColor, ImageEnhance | from PIL import Image, ImageDraw, ImageFont, ImageFilter, ImageColor, ImageEnhance | ||
| Line 146: | Line 166: | ||
| # | #Bildbearbeitungfunktionen | ||
| def edges (image): #002 | |||
| def edges (image): | |||
|      return image.filter(ImageFilter.FIND_EDGES) |      return image.filter(ImageFilter.FIND_EDGES) | ||
| def transpose(image): | def transpose(image): #002 | ||
|      return image.transpose(Image.FLIP_LEFT_RIGHT) |      return image.transpose(Image.FLIP_LEFT_RIGHT) | ||
| def invert(image): | def invert(image): #002 | ||
|      return image.point(lambda x: 255-x) |      return image.point(lambda x: 255-x) | ||
| def pixelit (image): | def pixelit (image): #001 | ||
|      xsize, ysize = image.size |      xsize, ysize = image.size | ||
|      width = xsize |      width = xsize | ||
| Line 173: | Line 187: | ||
|      return image |      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): | def filter (image): | ||
|      functions_list = [ |      functions_list = [edges, transpose, invert, pixelit, blend, nogreen, colorchange, switchchannels, pixelsort, pixelunsort, spectral, pixelunsort_green, pixelsort_green] | ||
|      filename = "final.png" |      filename = "final.png" | ||
|      x =  |      x = 2 | ||
|      y =  |      y = 3 | ||
|      z =  |      z = 4 | ||
|      list = [x, y, z] |      list = [x, y, z] | ||
|      anzahl = random.choice(list) |      anzahl = random.choice(list) | ||
|      print (anzahl) |      print (anzahl) | ||
|      if anzahl ==  |      if anzahl == 2: | ||
|          #Random eine Funktion |          #Random eine Funktion | ||
|         imagefunc = random.choice(functions_list) | |||
|         image = imagefunc(image) | |||
|         #2.Runde Random Filter anwenden | |||
|          imagefunc = random.choice(functions_list) |          imagefunc = random.choice(functions_list) | ||
|          image = imagefunc(image) |          image = imagefunc(image) | ||
|      if anzahl ==  |      if anzahl == 3: | ||
|          #Random eine Funktion |          #Random eine Funktion | ||
|          imagefunc = random.choice(functions_list) |          imagefunc = random.choice(functions_list) | ||
|          image = imagefunc(image) |          image = imagefunc(image) | ||
|          #2.Runde Random Filter anwenden |          #2.Runde Random Filter anwenden | ||
|         imagefunc = random.choice(functions_list) | |||
|         image = imagefunc(image) | |||
|         #3.Runde Random Filter anwenden | |||
|          imagefunc = random.choice(functions_list) |          imagefunc = random.choice(functions_list) | ||
|          image = imagefunc(image) |          image = imagefunc(image) | ||
|      if anzahl ==  |      if anzahl == 4: | ||
|          #Random eine Funktion |          #Random eine Funktion | ||
|          imagefunc = random.choice(functions_list) |          imagefunc = random.choice(functions_list) | ||
| Line 210: | Line 340: | ||
|          image = imagefunc(image) |          image = imagefunc(image) | ||
|          #3.Runde Random Filter anwenden |          #3.Runde Random Filter anwenden | ||
|         imagefunc = random.choice(functions_list) | |||
|         image = imagefunc(image) | |||
|         #4.Runde Random Filter anwenden | |||
|          imagefunc = random.choice(functions_list) |          imagefunc = random.choice(functions_list) | ||
|          image = imagefunc(image) |          image = imagefunc(image) | ||
| Line 215: | Line 348: | ||
|      return image |      return image | ||
| ############################ | |||
| ############################ | |||
| ############################ | |||
| ### Text File ############## | |||
| ############################ | |||
| ############################ | |||
| ############################ | |||
| #Import Modules for Project | #Import Modules for Project | ||
| Line 259: | Line 393: | ||
|      return text |      return text | ||
| </source> | |||
| === Source Code: === | |||
| < | ==== Mainbot ==== | ||
| <pre style="font-size:smaller" > | |||
| #mainbot.py | |||
| #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() | |||
| </pre> | </pre> | ||
| ====  | ==== Bildfunktionen + Random Auswahl ==== | ||
| <pre style="font-size:smaller" > | <pre style="font-size:smaller" > | ||
| imagefuncs.py | |||
| from PIL import Image, ImageDraw, ImageFont, ImageFilter, ImageColor, ImageEnhance | |||
| import random | |||
| # | #verschiedene Bildbearbeitungfunktionen | ||
| def blur (image): | |||
|     return image.filter(ImageFilter.BLUR) | |||
| def emboss (image): | |||
|     return image.filter(ImageFilter.EMBOSS) | |||
| def edges (image): | |||
|     return image.filter(ImageFilter.FIND_EDGES) | |||
| def transpose(image): | |||
|     return image.transpose(Image.FLIP_LEFT_RIGHT) | |||
| def invert(image): | |||
|     return image.point(lambda x: 255-x) | |||
| def pixelit (image): | |||
|     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 | |||
| # | #Random Filter List | ||
| def filter (image): | |||
|     functions_list = [blur, emboss, edges, invert, transpose, pixelit] | |||
|     filename = "final.png" | |||
|      x = 1 | |||
|     y = 2 | |||
|      z = 3 | |||
|     list = [x, y, z] | |||
|     anzahl = random.choice(list) | |||
|      print (anzahl) | |||
|      #2.Runde Random Filter anwenden |      if anzahl == 1: | ||
|      #Random eine Funktion  |         #Random eine Funktion | ||
|         imagefunc = random.choice(functions_list) | |||
|         image = imagefunc(image) | |||
|     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) | |||
|      return image | |||
| </pre> | </pre> | ||
| ==== Textfunktion ==== | |||
| <pre style="font-size:smaller" > | <pre style="font-size:smaller" > | ||
| textposts.py | |||
| #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 | |||
| </pre> | </pre> | ||
| === Bilder des Bots: === | |||
| [[File:Bot01.JPG]] | |||
| [[File:Bot02.JPG]] | |||
| [[File:Bot03.JPG]] | |||
| [[File:Bot04.JPG]] | |||
| [[File:Bot05.JPG]] | |||
| [[File:Bot06.JPG]] | |||
| === Thanks for Help === | |||
| 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. | |||
edits