From 785ad84f48b32355577503080e9fb2f9ed03dabb Mon Sep 17 00:00:00 2001 From: Domeniko Gentner Date: Sat, 7 Nov 2020 15:01:27 +0100 Subject: [PATCH] new version Moved twitter code to own class Added pillow Added configs for image properties Added license headers and license --- .gitignore | 2 + LICENSE.md | 21 ++++++++++ Pipfile | 1 + Pipfile.lock | 36 ++++++++++++++++- css.json | 20 ++++++++++ font/open-sans-v18-latin-regular.ttf | Bin 0 -> 27088 bytes mail/__init__.py | 8 ++++ mail/mail.py | 8 ++++ painter/__init__.py | 9 +++++ painter/painter.py | 40 +++++++++++++++++++ tw2png.py | 48 +++++++---------------- twitter/__init__.py | 9 +++++ twitter/twitter.py | 56 +++++++++++++++++++++++++++ 13 files changed, 223 insertions(+), 35 deletions(-) create mode 100644 LICENSE.md create mode 100644 css.json create mode 100644 font/open-sans-v18-latin-regular.ttf create mode 100644 painter/__init__.py create mode 100644 painter/painter.py create mode 100644 twitter/__init__.py create mode 100644 twitter/twitter.py diff --git a/.gitignore b/.gitignore index c4f9322..01188da 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ venv mail/__pycache__ bearer.json mail_credentials.json +painter/__pycache__ +test.png diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..ea88cbf --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Domeniko Gentner + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Pipfile b/Pipfile index b799f0f..b0e15d4 100644 --- a/Pipfile +++ b/Pipfile @@ -7,6 +7,7 @@ verify_ssl = true [packages] requests = "*" +pillow = "*" [requires] python_version = "3.8" diff --git a/Pipfile.lock b/Pipfile.lock index 174ca63..833945f 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "acbc8c4e7f2f98f1059b2a93d581ef43f4aa0c9741e64e6253adff8e35fbd99e" + "sha256": "d1925e0b4d1174e1ffb7d76338272b6b9aa0bf4d958c89448f76a1e35bc4007f" }, "pipfile-spec": 6, "requires": { @@ -37,6 +37,40 @@ ], "version": "==2.10" }, + "pillow": { + "hashes": [ + "sha256:006de60d7580d81f4a1a7e9f0173dc90a932e3905cc4d47ea909bc946302311a", + "sha256:0a2e8d03787ec7ad71dc18aec9367c946ef8ef50e1e78c71f743bc3a770f9fae", + "sha256:0eeeae397e5a79dc088d8297a4c2c6f901f8fb30db47795113a4a605d0f1e5ce", + "sha256:11c5c6e9b02c9dac08af04f093eb5a2f84857df70a7d4a6a6ad461aca803fb9e", + "sha256:2fb113757a369a6cdb189f8df3226e995acfed0a8919a72416626af1a0a71140", + "sha256:4b0ef2470c4979e345e4e0cc1bbac65fda11d0d7b789dbac035e4c6ce3f98adb", + "sha256:59e903ca800c8cfd1ebe482349ec7c35687b95e98cefae213e271c8c7fffa021", + "sha256:5abd653a23c35d980b332bc0431d39663b1709d64142e3652890df4c9b6970f6", + "sha256:5f9403af9c790cc18411ea398a6950ee2def2a830ad0cfe6dc9122e6d528b302", + "sha256:6b4a8fd632b4ebee28282a9fef4c341835a1aa8671e2770b6f89adc8e8c2703c", + "sha256:6c1aca8231625115104a06e4389fcd9ec88f0c9befbabd80dc206c35561be271", + "sha256:795e91a60f291e75de2e20e6bdd67770f793c8605b553cb6e4387ce0cb302e09", + "sha256:7ba0ba61252ab23052e642abdb17fd08fdcfdbbf3b74c969a30c58ac1ade7cd3", + "sha256:7c9401e68730d6c4245b8e361d3d13e1035cbc94db86b49dc7da8bec235d0015", + "sha256:81f812d8f5e8a09b246515fac141e9d10113229bc33ea073fec11403b016bcf3", + "sha256:895d54c0ddc78a478c80f9c438579ac15f3e27bf442c2a9aa74d41d0e4d12544", + "sha256:8de332053707c80963b589b22f8e0229f1be1f3ca862a932c1bcd48dafb18dd8", + "sha256:92c882b70a40c79de9f5294dc99390671e07fc0b0113d472cbea3fde15db1792", + "sha256:95edb1ed513e68bddc2aee3de66ceaf743590bf16c023fb9977adc4be15bd3f0", + "sha256:b63d4ff734263ae4ce6593798bcfee6dbfb00523c82753a3a03cbc05555a9cc3", + "sha256:bd7bf289e05470b1bc74889d1466d9ad4a56d201f24397557b6f65c24a6844b8", + "sha256:cc3ea6b23954da84dbee8025c616040d9aa5eaf34ea6895a0a762ee9d3e12e11", + "sha256:cc9ec588c6ef3a1325fa032ec14d97b7309db493782ea8c304666fb10c3bd9a7", + "sha256:d3d07c86d4efa1facdf32aa878bd508c0dc4f87c48125cc16b937baa4e5b5e11", + "sha256:d8a96747df78cda35980905bf26e72960cba6d355ace4780d4bdde3b217cdf1e", + "sha256:e38d58d9138ef972fceb7aeec4be02e3f01d383723965bfcef14d174c8ccd039", + "sha256:eb472586374dc66b31e36e14720747595c2b265ae962987261f044e5cce644b5", + "sha256:fbd922f702582cb0d71ef94442bfca57624352622d75e3be7a1e7e9360b07e72" + ], + "index": "pypi", + "version": "==8.0.1" + }, "requests": { "hashes": [ "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b", diff --git a/css.json b/css.json new file mode 100644 index 0000000..878c21f --- /dev/null +++ b/css.json @@ -0,0 +1,20 @@ +{ + "dimensions": { + "x": 600, + "y": 300 + }, + "background": { + "r": 57, + "g": 63, + "b": 77 + }, + "text": { + "font": "font/open-sans-v18-latin-regular.ttf", + "size": 18, + "color": { + "r": 255, + "g": 255, + "b": 255 + } + } +} diff --git a/font/open-sans-v18-latin-regular.ttf b/font/open-sans-v18-latin-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fb23764c10f90e8ac85a886d73628784b9ef8527 GIT binary patch literal 27088 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 literal 0 HcmV?d00001 diff --git a/mail/__init__.py b/mail/__init__.py index 21fa571..e5dee87 100644 --- a/mail/__init__.py +++ b/mail/__init__.py @@ -1 +1,9 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# /********************************************************************************** +# * _author : Domeniko Gentner +# * _mail : code@tuxstash.de +# * _repo : https://git.tuxstash.de/gothseidank/tweet2png +# * _license : This project is under MIT License +# *********************************************************************************/ from .mail import mail diff --git a/mail/mail.py b/mail/mail.py index 7a5ec3b..1405393 100644 --- a/mail/mail.py +++ b/mail/mail.py @@ -1,3 +1,11 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# /********************************************************************************** +# * _author : Domeniko Gentner +# * _mail : code@tuxstash.de +# * _repo : https://git.tuxstash.de/gothseidank/tweet2png +# * _license : This project is under MIT License +# *********************************************************************************/ from email.mime.text import MIMEText from json import load as j_load from pathlib import Path diff --git a/painter/__init__.py b/painter/__init__.py new file mode 100644 index 0000000..652350e --- /dev/null +++ b/painter/__init__.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# /********************************************************************************** +# * _author : Domeniko Gentner +# * _mail : code@tuxstash.de +# * _repo : https://git.tuxstash.de/gothseidank/tweet2png +# * _license : This project is under MIT License +# *********************************************************************************/ +from .painter import painter diff --git a/painter/painter.py b/painter/painter.py new file mode 100644 index 0000000..62f66f5 --- /dev/null +++ b/painter/painter.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# /********************************************************************************** +# * _author : Domeniko Gentner +# * _mail : code@tuxstash.de +# * _repo : https://git.tuxstash.de/gothseidank/tweet2png +# * _license : This project is under MIT License +# *********************************************************************************/ +from PIL import Image, ImageDraw, ImageFont +from pathlib import Path +from json import load as j_load + + +class painter: + + def __init__(self, twitter: str, handle: str): + # Load json + css = Path("css.json") + with css.open('r') as fp: + css = j_load(fp) + + # Size + img_size = (css['dimensions']['x'], css['dimensions']['y']) + + # Background color + background_color = (css["background"]['r'], css["background"]['g'], css["background"]['b']) + + # text options + text = css['text'] + color = (text['color']['r'], text['color']['g'], text['color']['b']) + font = text['font'] + size = text['size'] + + image = Image.new('RGB', img_size, background_color) + font = ImageFont.truetype(font) + + context = ImageDraw.Draw(image) + context.text((10, 10), handle, fill=color, font=font) + + image.save('test.png') diff --git a/tw2png.py b/tw2png.py index e298cd8..3b62eb5 100644 --- a/tw2png.py +++ b/tw2png.py @@ -1,36 +1,16 @@ -import requests -from pathlib import Path -from platform import system -from json import load as j_load +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# /********************************************************************************** +# * _author : Domeniko Gentner +# * _mail : code@tuxstash.de +# * _repo : https://git.tuxstash.de/gothseidank/tweet2png +# * _license : This project is under MIT License +# *********************************************************************************/ from mail import mail +from painter import painter +from twitter import twitter +from sys import exit -get_last_id_url = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=GothSeidank&count=1&trim_user=1" -# get_tweet_url = "https://api.twitter.com/2/tweets/1324994969590001666" - - -if system().lower() == "windows": - path = Path("bearer.json") -else: - path = Path("/etc/twpng/bearer.json") - - try: - with path.open('r') as fp: - credentials = j_load(fp) - except FileNotFoundError: - mail("Could not find bearer token file! Script was discontinued.") - exit(1) - -try: - header = { - "Authorization": f"Bearer {credentials['bearer']}" - } - - r = requests.get(url=get_last_id_url, headers=header) - r.raise_for_status() - -except Exception as e: - message = f"The api call to twitter failed and requests said:\n'{e}'. Script was discontinued." - mail(message) - exit(1) - - +twitter = twitter() +painter(twitter.get_latest_tweet(), twitter.handle()) +exit(0) diff --git a/twitter/__init__.py b/twitter/__init__.py new file mode 100644 index 0000000..5f5b8ca --- /dev/null +++ b/twitter/__init__.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# /********************************************************************************** +# * _author : Domeniko Gentner +# * _mail : code@tuxstash.de +# * _repo : https://git.tuxstash.de/gothseidank/tweet2png +# * _license : This project is under MIT License +# *********************************************************************************/ +from .twitter import twitter diff --git a/twitter/twitter.py b/twitter/twitter.py new file mode 100644 index 0000000..76c4003 --- /dev/null +++ b/twitter/twitter.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# /********************************************************************************** +# * _author : Domeniko Gentner +# * _mail : code@tuxstash.de +# * _repo : https://git.tuxstash.de/gothseidank/tweet2png +# * _license : This project is under MIT License +# *********************************************************************************/ +import requests +from pathlib import Path +from platform import system +from json import load as j_load +from mail import mail +from typing import Union +from sys import exit + + +class twitter: + + def __init__(self): + self.path = str() + self.credentials = str() + + if system().lower() == "windows": + self.path = Path("bearer.json") + else: + self.path = Path("/etc/twpng/bearer.json") + + try: + with self.path.open('r') as fp: + self.credentials = j_load(fp) + + except FileNotFoundError: + mail("Could not find bearer token file! Script was discontinued.") + exit(1) + + def handle(self): + return self.credentials['twitter-handle'] + + def get_latest_tweet(self) -> Union[str, None]: + try: + get_url = f"https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=" \ + f"{self.credentials['twitter-handle']}&count=1&trim_user=1" + + header = { + "Authorization": f"Bearer {self.credentials['bearer']}" + } + + r = requests.get(url=get_url, headers=header) + r.raise_for_status() + return r.json()[0] + + except Exception as e: + message = f"The api call to twitter failed, the server responded:\n'{e}'.\nScript was discontinued." + mail(message) + exit(1)