gmail-widget

Είχα έντονη επιθυμία να βλέπω πόσα νέα ή μάλλον... πόσα αδιάβαστα mail έχω. Χωρίς να ανοίγω παράθυρα κάποιας εφαρμογής όπως ο firefox ας πούμε. Ήθελα λοιπόν ένα γκατζετάκι που όπως στο android, να μου δείχνει σε μια κόκκινη κουκιδίτσα τον αριθμό των αδιάβαστων.
Παλιά θυμάμαι στο gnome2 υπήρχε κάτι παρόμοιο. gnome-gmail λεγότανε; Κάτι τέτοιο.
Χάρηκα όταν είδα ότι υπάρχει plasmoid τέτοιο, στο kde. Όμως με έπιασε μια ανησυχία ότι ο δημιουργός του θα δει τον κωδικό σύνδεσής μου με το gmail. (ναι έχω που και που μερικά τέτοια). Ωστόσο το εγκατέστησα https://store.kde.org/p/1248550 κάποια στιγμή που την είδα αλλιώς και του πέρασα τον κωδικό μου (Ό,τι του φανεί του Λολοστεφανή).
Όπως και να χει δεν δούλεψε ποτέ.
Και τον δρόμο τον ξέρουμε πλέον. Τι καλύτερο από το να έχουμε το δικό μας εφαρμογάκι!
1. Πας εδώ https://cloud.google.com/cloud-console και δημιουργείς "Νέο έργο". Άμα ξέρεις αγγλικά είσαι ΟΚ. Άμα δεν ξέρεις όπως εγώ τον ψιλοπίνεις.
Δεν μπορώ να βοηθήσω σεε αυτή τη διαδικασία γιατί δεν θυμάμαι ακριβώς τα βήματα. Πάντως πρέπει εκεί στη σελίδα να ακολουθήσεις διάφορους συνδέσμους για να:
Δημιουργήσεις και ονομάσεις το project σου
κατεβάσεις κλειδί API
Ενεργοποιήσεις το API του gmail
Δημιουργήσεις διαπιστευτήρια της google, ότι είσαι είσαι εσύ και είσαι έγκυρος, ότι έχεις έγκριση για την εφαρμογή σου, ότι η εφαρμογή σου έχει έγκριση για να λειτουργεί. Είναι δύσκολη διαδικασία για τους μη έχοντες απολύτως καμία σχέση. Αλλά αξίζει τον κόπο, γιατί πραγματικά είναι γουστόζικο εφαρμογάκι και χρήσιμο

Εϊναι το εικονίδιο με τον φάκελο αλληλογραφίας που γράφει ότι έχω 2 αδιάβαστα mails. Όταν πάω το ποντίκι πάνω στο εικονίδιο (hover) ανοίγει pop up όπως είδατε και περιέχει περίληψη του συγκεκριμένου mail. Αν κάνω κλικ πάνω του θα ανοίξει ο firefox στη σελίδα του gmail
(Ναι δεν χρησιμοποιώ thunderbird εδώ και πολλά χρόνια. Δεν ξέρω γιατί. Βολεύτηκα με τη σελίδα του gmail στον browser).
όποιος θέλει ας το δοκιμάσει.
Ο κώδικας
Παλιά θυμάμαι στο gnome2 υπήρχε κάτι παρόμοιο. gnome-gmail λεγότανε; Κάτι τέτοιο.
Χάρηκα όταν είδα ότι υπάρχει plasmoid τέτοιο, στο kde. Όμως με έπιασε μια ανησυχία ότι ο δημιουργός του θα δει τον κωδικό σύνδεσής μου με το gmail. (ναι έχω που και που μερικά τέτοια). Ωστόσο το εγκατέστησα https://store.kde.org/p/1248550 κάποια στιγμή που την είδα αλλιώς και του πέρασα τον κωδικό μου (Ό,τι του φανεί του Λολοστεφανή).
Όπως και να χει δεν δούλεψε ποτέ.
Και τον δρόμο τον ξέρουμε πλέον. Τι καλύτερο από το να έχουμε το δικό μας εφαρμογάκι!
1. Πας εδώ https://cloud.google.com/cloud-console και δημιουργείς "Νέο έργο". Άμα ξέρεις αγγλικά είσαι ΟΚ. Άμα δεν ξέρεις όπως εγώ τον ψιλοπίνεις.
Δεν μπορώ να βοηθήσω σεε αυτή τη διαδικασία γιατί δεν θυμάμαι ακριβώς τα βήματα. Πάντως πρέπει εκεί στη σελίδα να ακολουθήσεις διάφορους συνδέσμους για να:
Δημιουργήσεις και ονομάσεις το project σου
κατεβάσεις κλειδί API
Ενεργοποιήσεις το API του gmail
Δημιουργήσεις διαπιστευτήρια της google, ότι είσαι είσαι εσύ και είσαι έγκυρος, ότι έχεις έγκριση για την εφαρμογή σου, ότι η εφαρμογή σου έχει έγκριση για να λειτουργεί. Είναι δύσκολη διαδικασία για τους μη έχοντες απολύτως καμία σχέση. Αλλά αξίζει τον κόπο, γιατί πραγματικά είναι γουστόζικο εφαρμογάκι και χρήσιμο

Εϊναι το εικονίδιο με τον φάκελο αλληλογραφίας που γράφει ότι έχω 2 αδιάβαστα mails. Όταν πάω το ποντίκι πάνω στο εικονίδιο (hover) ανοίγει pop up όπως είδατε και περιέχει περίληψη του συγκεκριμένου mail. Αν κάνω κλικ πάνω του θα ανοίξει ο firefox στη σελίδα του gmail
(Ναι δεν χρησιμοποιώ thunderbird εδώ και πολλά χρόνια. Δεν ξέρω γιατί. Βολεύτηκα με τη σελίδα του gmail στον browser).
όποιος θέλει ας το δοκιμάσει.
Ο κώδικας
- Κώδικας: Επιλογή όλων
#!/usr/bin/env python3
import os
import sys
import pickle
import base64
import google.auth
import google.auth.transport.requests
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QToolTip, QFrame
from PyQt5.QtGui import QPixmap, QFont, QPainter, QColor
from PyQt5.QtCore import Qt, QTimer, QUrl
from PyQt5.QtGui import QDesktopServices
# Ορίστε τις απαραίτητες παραμέτρους για την εξουσιοδότηση OAuth2
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']
CREDENTIALS_FILE = ''
TOKEN_FILE = 'token.pickle'
def authenticate():
creds = None
if os.path.exists(TOKEN_FILE):
with open(TOKEN_FILE, 'rb') as token:
creds = pickle.load(token)
# Εάν δεν υπάρχουν ή έχουν λήξει τα διαπιστευτήρια, ξεκινήστε τη ροή εξουσιοδότησης
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(google.auth.transport.requests.Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
CREDENTIALS_FILE, SCOPES)
creds = flow.run_local_server(port=0, authorization_prompt_message='')
# Αποθήκευση των διαπιστευτηρίων για μελλοντική χρήση
with open(TOKEN_FILE, 'wb') as token:
pickle.dump(creds, token)
return creds
def get_unread_count():
creds = authenticate()
service = build('gmail', 'v1', credentials=creds)
# Ανάκτηση των αδιάβαστων μηνυμάτων
results = service.users().messages().list(userId='me', q='is:unread').execute()
messages = results.get('messages', [])
unread_count = len(messages)
return unread_count
class MyLabel(QLabel):
def __init__(self, parent=None):
super().__init__(parent)
self.setStyleSheet("background: transparent;")
self.setAlignment(Qt.AlignCenter)
def enterEvent(self, event):
super().enterEvent(event)
self.parent().update_label()
tooltips = []
creds = authenticate()
service = build('gmail', 'v1', credentials=creds)
results = service.users().messages().list(userId='me', q='is:unread', maxResults=5).execute()
messages = results.get('messages', [])
for message in messages:
full_message = service.users().messages().get(userId='me', id=message['id']).execute()
headers = full_message['payload']['headers']
sender = None
for header in headers:
if header['name'] == 'From':
sender = header['value']
break
if sender is not None:
snippet = full_message['snippet']
sender = "<font color='red'><b>{}</b></font>".format(sender)
snippet = "<font color='black'><b>==></b></font> " + snippet
message_url = "https://mail.google.com/mail/u/0/#inbox/{}".format(message['id'])
link = "<a href='{}'>{}</a>".format(message_url, snippet)
tooltip_text = f"{sender}{link}"
tooltips.append(tooltip_text)
# Συνδυασμός των αδιαβαστών μηνυμάτων σε κατακόρυφη διάταξη
tooltip_text = "<br><br>".join(tooltips)
# Εμφάνιση του tooltip
QToolTip.setFont(QFont('SansSerif', 16))
QToolTip.showText(event.globalPos(), tooltip_text)
class MyWidget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setMouseTracking(True)
self.label = MyLabel(self)
self.label.setGeometry(0, 0, 200, 92)
self.timer = QTimer()
self.timer.timeout.connect(self.update_label)
self.timer.start(10000)
self.setWindowFlags(Qt.Window | Qt.WindowStaysOnBottomHint | Qt.CustomizeWindowHint)
self.setWindowOpacity(1.0)
self.layout = QVBoxLayout(self)
self.layout.setSpacing(10)
self.layout.setContentsMargins(-1, -1, -1, -1)
self.setAttribute(Qt.WA_TranslucentBackground, True)
self.label.setFont(QFont('Arial', 20))
self.layout.addWidget(self.label)
self.circle_label = QLabel(self)
self.circle_label.setStyleSheet("background-color: red; border-radius: 20px;")
self.circle_label.setGeometry(125, 5, 40, 40)
self.circle_text = QLabel(self.circle_label)
self.circle_text.setAlignment(Qt.AlignCenter)
self.circle_text.setStyleSheet("color: white; font-weight: bold; font-size: 26px;")
self.circle_text.setGeometry(0, 0, 40, 40)
# Καθορισμός του width εδώ
width = self.circle_text.fontMetrics().width("0")
self.circle_text.move(int(14 - (width / 4)), 2)
self.setLayout(self.layout)
pixmap = QPixmap("/home/user/scripts/gmail-widget/mail-env3-2.png") # Αντικαταστήστε τη διαδρομή με την πραγματική διαδρομή του εικονιδίου
self.label.setPixmap(pixmap)
self.setGeometry(1735, 350, 220, 110)
self.label.move(40, 50)
self.update_label()
def update_label(self):
unread_count = get_unread_count()
self.circle_text.setText(str(unread_count))
self.circle_text.adjustSize()
# Κέντραρε το κείμενο οριζόντια και κατακόρυφα εντός του circle_label
#self.circle_text.setAlignment(Qt.AlignCenter)
def update_label(self):
unread_count = get_unread_count()
#self.label.setText('Gmail ' + str(unread_count) + ' Αδιάβαστα')
self.circle_text.setText(str(unread_count))
self.circle_text.adjustSize()
def mousePressEvent(self, event):
url = QUrl('https://mail.google.com/mail/u/0/#inbox')
QDesktopServices.openUrl(url)
if __name__ == '__main__':
app = QApplication(sys.argv)
widget = MyWidget()
widget.show()
sys.exit(app.exec_())