From 503e36e0d38fd7ad57f48fc0f46dba9b6959c84a Mon Sep 17 00:00:00 2001 From: "Maxence G. de Montauzan" Date: Sat, 4 Jul 2020 00:33:32 +0200 Subject: [PATCH] First verison with disgusting code and pretty readme https://media.giphy.com/media/7E2taKYzqOux4lwgJY/giphy.gif --- README.md | 48 ++++++++++++++++++++ conf.ini | 12 +++++ example-mail.png | Bin 0 -> 40732 bytes notifier.py | 115 +++++++++++++++++++++++++++++++++++++++++++++++ pit.db | Bin 0 -> 2128 bytes template.html | 53 ++++++++++++++++++++++ 6 files changed, 228 insertions(+) create mode 100644 README.md create mode 100644 conf.ini create mode 100644 example-mail.png create mode 100644 notifier.py create mode 100644 pit.db create mode 100644 template.html diff --git a/README.md b/README.md new file mode 100644 index 0000000..b6f23b5 --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +What for? +========= + +This project is a simple Python script to send a email when tracked Github projects (specified in conf) have a new release. +The purpose is to use this script in a cron table. + +Unbelievable, but I haven't found an existing equivalent! + +![An example of mail sent by the script](example-mail.png) + +Why using configuration?... +------------------------ +...instead use stared project of your Github account? +Cause I've got about 80 "stared" projects and I don't wan't to be alerted for new releases of each of these project. +But, perhaps I'll add such a feature later on... + +And, Github API limits is at 60 requests by seconds, and I want to write this script really quickly in a first time. + +How to use? +----------- +Really simple! + +* Edit conf.ini file to set `[config]` section + * your SMTP server configuration (host and port) + * sender mail + * receiver mail (:warning: not tested with more than 1 receiver) +* Add the projects you want to follow in the section `[project]` + * Be careful to follow a JSON valid syntax as in the provided file, i.e. coma after each `autor/project` except the last one. + +After first execution, the `conf.ini` file will be filled with last release tag found by the script, as you can see in the provided file. + +Hope you like, and have fun to read your mail! + +Problems I have to solve really quickly +--------------------------------------- +I wrote this script really quickly, certainly faster than this README. So I already have two big proglems: +* The script sends mail even if no new projets or release has been detected +* The biggest, you have to edit script to specify absolute path... +* A lot of other little problems, like the code that's disgusting and so on. +But overall, the script works and sends mail! + +Hey boy, what is the `pit.db` file? +----------------------------------- +Oh, just for fun, and because I love this project, I use [pit by michaeldv](https://github.com/michaeldv/pit) to follow my task etc. + +It makes me think I should push my python version of this project on occasion when I will take the time to do... + + diff --git a/conf.ini b/conf.ini new file mode 100644 index 0000000..15bbe66 --- /dev/null +++ b/conf.ini @@ -0,0 +1,12 @@ +[config] +github_api_url = https://api.github.com/repos/ +smtp_port = 25 +smtp_server = localhost +sender_email = sender@host.eu +receiver_email = receiver@anotherhost.eu + +[projects] +projects = [ + "borgbackup/borg", + "microsoft/vscode" + ] diff --git a/example-mail.png b/example-mail.png new file mode 100644 index 0000000000000000000000000000000000000000..53a23d8361edce08f621d22dd2996a214aa8169b GIT binary patch literal 40732 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 EZ_!(lAOHXW literal 0 HcmV?d00001 diff --git a/notifier.py b/notifier.py new file mode 100644 index 0000000..d14f158 --- /dev/null +++ b/notifier.py @@ -0,0 +1,115 @@ +from configparser import ConfigParser +import json +import smtplib +from email.mime.text import MIMEText +from email.mime.multipart import MIMEMultipart + +import datetime + +import requests + +SMTP_PORT = 0 +SMTP_SERVER = 'null' +SENDER_EMAIL = 'a@b.c' +RECEIVER_EMAIL = 'd@e.f' + +def main(): + global SMTP_PORT, SMTP_SERVER, SENDER_EMAIL, RECEIVER_EMAIL + parser = ConfigParser() + parser.read('conf.ini') + + SMTP_PORT = parser.get('config', 'smtp_port') + SMTP_SERVER = parser.get('config', 'smtp_server') + SENDER_EMAIL = parser.get('config', 'sender_email') + RECEIVER_EMAIL = parser.get('config', 'receiver_email') + + projects = json.loads(parser.get('projects', 'projects')) + new_releases = [] + new_projects = [] + + if not parser.has_section('release'): + parser.add_section('release') + + for project in projects: + last_release = get_last_release(project) + + if not parser.has_option('release', project): + new_projects.append(last_release) + else: + last_config_tag = parser.get('release', project) + if last_config_tag != last_release['release_tag']: + last_release['preview_tag'] = last_config_tag + new_releases.append(last_release) + parser.set('release', project, last_release['release_tag']) + + content = "" + + for new_r in new_releases: + content += """ +
  • {}: new release {} available (old: {}). + (published {})
  • + """.format( + new_r['release_url'], + new_r['project_name'], + new_r['release_url'], + new_r['release_tag'], + new_r['preview_tag'], + convert_date(new_r['published_date'])) + for new_p in new_projects: + content += """ +
  • {} was added to your configuration. Last release: {} + (published {})
  • """.format( + new_p['release_url'], + new_p['project_name'], + new_p['release_url'], + new_p['release_tag'], + convert_date(new_p['published_date'])) + + # print(content) + + with open('template.html', 'r') as f_template: + template = f_template.read() + + send_mail(template.replace('{{content}}', content)) + + with open('conf.ini', 'w') as configfile: + parser.write(configfile) + +def get_last_release(project): + url = 'https://api.github.com/repos/{}/releases/latest'.format(project) + result = requests.get(url) + + print(project) + print(url) + release = result.json() + release_tag = release['tag_name'] + published_date = release['published_at'] + # body = release['body'] + release_url = release['html_url'] + + return {'release_tag': release_tag, + 'published_date': published_date, + # 'body': body, + 'project_name': project, + 'release_url': release_url} + +def send_mail(content): + message = MIMEMultipart("alternative") + message["Subject"] = "New Github releases" + message["From"] = SENDER_EMAIL + message["To"] = RECEIVER_EMAIL + + # part1 = MIMEText(text, "plain") + part2 = MIMEText(content, "html") + + # message.attach(part1) + message.attach(part2) + + with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server: + server.sendmail(SENDER_EMAIL, RECEIVER_EMAIL, message.as_string()) + +def convert_date(date: str, format='%d %b %Y at %H:%M') -> str: + return datetime.datetime.strptime(date, "%Y-%m-%dT%H:%M:%SZ").strftime(format) + +if __name__ == "__main__": + main() diff --git a/pit.db b/pit.db new file mode 100644 index 0000000000000000000000000000000000000000..63cb69ab7f32e24ad1f5d02a2cf8f71be442315b GIT binary patch literal 2128 zcmd^9y-veG3=RkhiKpC2>*p6>}TT^N7G8jZ}lm zPys_9AoFf$N3aWo7x_x_6Q=n9LC0$ zFfGu5^WbnQJji1M6Ho{+6lU{&pe262)g2|g zDR-;#MkZbfX)ErgIf*h{hfKTm!O~62b1ln6PTr?Eh3=0hSofK5CUY#Z7H>x>thwX< J1b@00-vAsR$}|7~ literal 0 HcmV?d00001 diff --git a/template.html b/template.html new file mode 100644 index 0000000..5e73f99 --- /dev/null +++ b/template.html @@ -0,0 +1,53 @@ + + + + + + + + + +

    + + Some new release on Github project available!

    +

      {{content}}

    +
    + +