Mit Tampermonkey/Javascript und Gmail API simple Email schicken?

bernd91364

Cadet 4th Year
Registriert
Nov. 2020
Beiträge
93
Hallo,
ich hoffe hier kann ich etwas Hilfe bekommen, es geht um Tampermonkey und die Gmail API:
Ich habe ein Script gebaut, was auf einer bestimmten Seite einen Wert in der Dom sucht, mit dem vorherigen Wert vergleicht und bei einer Veränderung eine Push Notification rausschickt.
Und alle 20 Sekunden Seite reloaden, risne and repeat.

Klappt auch super.
Jetzt wollte ich das nur erweitern dass zusätzlich zum popup auch eine Email geschickt wird.
Weil sinnvoll, will ich von meiner Gmailadresse aus auf eine andere Emailadresse die Email schicken.
habe den kram direkt bei Google soweit gemacht, google cloud console projekt erstellt, oauth id kram und Api key und sowas besorgt.Ich habe nur nicht den wirklichen Plan wie ich das nun in Tampermonkey/Javascript Code umwandle und nutze.
habe von Gmail, Apis und Co. gar keine Ahnung, nachfolgender nicht funktionierender Code stammt von Chatgpt
(habe Alles bis auf den Emailpart mal rausgelöscht):
Javascript:
// ==UserScript==
// @name         Preisfehler Alert with Email+Push
// @namespace    mydealz-preisfehler-alert-push-email
// @version      0.7
// @description  Email and push notification if a new article appears on the Preisfehler page of mydealz
// @author       bernd
// @match        https://www.mydealz.de/gruppe/preisfehler
// @grant        GM_xmlhttpRequest
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_deleteValue
// @grant        GM_addValueChangeListener
// @grant        GM_notification
// @grant        GM_registerMenuCommand
// @connect      accounts.google.com
// @connect      content.googleapis.com
// @grant        GM_addStyle
// @connect      smtp.gmail.com
// @require      https://apis.google.com/js/api.js

// ==/UserScript==


  const STORAGE_KEY = 'mydealz-preisfehler-alert-push-email-last-article-id';

// Replace the following values with your own client ID, API key, and email address
const CLIENT_ID = '...';
const API_KEY = '...';
const USER_EMAIL = '...';

await (async()=>{
  // Load the Gmail API library
  const script = document.createElement('script');
  script.src = 'https://apis.google.com/js/api.js';
  document.head.appendChild(script);
  document.body.appendChild(script);
})();

// Load the Gmail API client library
await gapi.load('client:auth2', initClient);

// Function to initialize the Gmail API client
async function initClient() {
  // Initialize the client with your API key and OAuth 2.0 client ID
  await gapi.client.init({
    apiKey: API_KEY,
    clientId: CLIENT_ID,
    discoveryDocs: ['https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest'],
    scope: 'https://www.googleapis.com/auth/gmail.send'
  });
}

// Function to send an email
async function sendEmail(sender, receiver, subject, body) {
  // Construct the message object
  let message = '';
  message += 'From: ' + sender + '\r\n';
  message += 'To: ' + receiver + '\r\n';
  message += 'Subject: ' + subject + '\r\n';
  message += '\r\n' + body;

  // Encode the message in base64url format
  let encodedMessage = btoa(message).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');

  // Send the email using the Gmail API
  let request = gapi.client.gmail.users.messages.send({
    'userId': 'me',
    'resource': {
      'raw': encodedMessage
    }
  });

  // Execute the request
  let response = await request.execute();
  console.log(response);
}

  await gapi.load('client:auth2', initClient);
  await sendEmail(USER_EMAIL,'...','PREISFEHLER!!!',title);


Kann mir wer quick and dirty sagen wie ich das easy lösen kann?
Will sprichwörltich nur eine Email mit festem sender, empfänger schciken, Email text wird aus globaler Variable abgelesen.
Also Alles gehardcoded was in die Email gehört.

Ahcja, zu den Fehlern:
Erst kannte er anfangs "gapi" nicht.
jetzt kommen die 2 Fehler:

Code:
Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'gmail')
    at sendEmail
(userscript.html?name=Preisfehler%2520Alert%2520with%2520Email%252BPush.user.js&id=42db437a-6dcc-4e0f-bc33-981ddc6fe60e:105:29)
    at Proxy.<anonymous>
(userscript.html?name=Preisfehler%2520Alert%2520with%2520Email%252BPush.user.js&id=42db437a-6dcc-4e0f-bc33-981ddc6fe60e:159:9)

Uncaught ReferenceError: gapi is not defined
    at cb=gapi.loaded_0?le=scs:1:1

ich mache wohl was grundsätzlich falsch.
Oder sind mein API key, Oauth Teil und so vielleicht falssch eingestellt?
 
Zuletzt bearbeitet: (Ergänzung Errors)
Die Credentials habe ich aus Gründen der Privatsphäre unkenntlich gemacht, muss ja nicht jeder meine Emailadresse(n) kennen :-)
Und API Key und so habe ich auch unkenntlich gemacht, keine Ahnung ob da wer was mit anstellen könnte falls bekannt.

Ich habe keine Ahnung was die Zeile
Javascript:
 'userId': 'me',
tut oder ob ich dort was eintragen muss, ich habe den Code praktisch 1 zu 1 von hier:
https://developers.google.com/gmail/api/quickstart/js?hl=de
Habe nur, anstatt in ner HTML Datei die Script tags zu schriben, die in der betrachteten Seite mit Javascript einfügen lassen.
Kann es also sein dass es vermutlich weniger am Code scheitert, sondern rein API Key und Co falsch sind oder falsch eingestellt sind?
Ich verstehe halt nicht wie er manche Begriffe wie gapi.load nicht kennen kann, der Kram müste doch durch die rein geladenen Sachen bekannt sein?
 
bernd91364 schrieb:
Kann es also sein dass es vermutlich weniger am Code scheitert, sondern rein API Key und Co falsch sind oder falsch eingestellt sind?
Das kann ich dir ohne weitere logs auch nicht beantworten.
bernd91364 schrieb:
Ich verstehe halt nicht wie er manche Begriffe wie gapi.load nicht kennen kann, der Kram müste doch durch die rein geladenen Sachen bekannt sein?
Ja das ist ein guter Hinweis. Hast du die JS Client Libarary den eingebunden? google-api-javascript-client-Abschnitt von GitHub
 
pumuck| schrieb:
Das kann ich dir ohne weitere logs auch nicht beantworten.

Ja das ist ein guter Hinweis. Hast du die JS Client Libarary den eingebunden? google-api-javascript-client-Abschnitt von GitHub
Eh, hm, ehrlich gesagt keine Ahnung :-/
Den Code den ich gepostet habe ist Alles was ich da habe.

Note: This repo does not contain the source code for the gapi client."
steht absolut dämlicherweise in der von dir verlinkten Seite, wozu baut man eine google api wenn man die wichtigste, die gmail api, nicht gescheit einbaut?
Vermutlich müsste ich gapi irgendwoher bekommen aber keine Ahnung wo :-/
Die Seite oben sagt dazu ja auch nichts :-(
 
Zuletzt bearbeitet:
Zurück
Oben