gmail-widget

...τα πάντα για το open source στον χώρο των gadgets, συζητήσεις, εργαλεία, open hardware, οδηγοί κ.ά.

Συντονιστής: adem1

gmail-widget

Δημοσίευσηαπό malos » 23 Δεκ 2023, 23:27

Είχα έντονη επιθυμία να βλέπω πόσα νέα ή μάλλον... πόσα αδιάβαστα 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).

όποιος θέλει ας το δοκιμάσει.

Ο κώδικας

Κώδικας: Επιλογή όλων
#!/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>==&gt;</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_())
Επεξεργαστής: AMD Ryzen 9 5900x
Μνήμη Gskill 16gb (2X8gb), 3200 mh, CL 14
Μητρική: Asrock X570 phantom gaming X
Τροφοδοτικό: Corsair 850 platinum
Δίσκος: SSD Corsair MP600 (1 TB)
Άβαταρ μέλους
malos
saintTUX
saintTUX
 
Δημοσιεύσεις: 1234
Εγγραφή: 02 Νοέμ 2008, 12:00
Εκτύπωση

  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Gadgets με Λογισμικό Ανοιχτού Κώδικα