Standardmäßig ist der Prompt ausgewählt, der zuerst die Quelle prüft. Sie können zu einem direkten Befehl wechseln oder eine lokale Kopie herunterladen.
Quelldateien prüfen
Lesen Sie SKILL.md und alle von SkillsMP angezeigten Begleitdateien, bevor Sie sich für eine Installation entscheiden.
Mit Codex oder Claude installieren Kopieren Sie diesen Prompt, fügen Sie ihn in Codex, Claude oder einen anderen Assistant ein und lassen Sie die Skill-Seite prüfen und installieren.
Ein direkter Befehl überspringt den Prüf-Prompt. Prüfen Sie die Quelle, bevor Sie ihn ausführen.
Implement Evernote webhook notifications and sync events.
Use when handling note changes, implementing real-time sync,
or processing Evernote notifications.
Trigger with phrases like "evernote webhook", "evernote events",
"evernote sync", "evernote notifications".
allowed-tools
Read, Write, Edit, Bash(curl:*)
version
1.0.0
license
MIT
author
Jeremy Longshore <jeremy@intentsolutions.io>
Evernote Webhooks & Events
Overview
Implement Evernote webhook notifications for real-time change detection. Note: Evernote webhooks notify you that changes occurred, but you must use the sync API to retrieve actual changes.
Prerequisites
Evernote API key with webhook permissions
HTTPS endpoint accessible from internet
Understanding of Evernote sync API
How Evernote Webhooks Work
Unlike most APIs, Evernote webhooks only notify that a user's account changed. They do NOT include the actual changes in the payload. You must:
// Note: Webhook registration is done through Evernote Developer Portal// API key settings, not through the API itself.// Webhook configuration in Evernote Developer Portal:// 1. Go to https://dev.evernote.com/// 2. Navigate to your API key settings// 3. Enable webhooks// 4. Set webhook URL: https://your-domain.com/webhooks/evernote// For local development, use ngrok:// ngrok http 3000// Then update webhook URL temporarily in developer portal
Step 7: Polling Fallback
// services/polling-service.js/**
* Fallback polling for when webhooks aren't available
* or as a backup sync mechanism
*/classPollingService {
constructor(syncService, options = {}) {
this.syncService = syncService;
this.pollInterval = options.pollInterval || 5 * 60 * 1000; // 5 minutesthis.users = newMap(); // userId -> lastUpdateCountthis.timer = null;
}
/**
* Start polling for a user
*/addUser(userId, accessToken) {
this.users.set(userId, {
accessToken,
lastUpdateCount: 0
});
}
/**
* Remove user from polling
*/removeUser(userId) {
this.users.delete(userId);
}
/**
* Start polling loop
*/start() {
if (this.timer) return;
this.timer = setInterval(async () => {
awaitthis.pollAllUsers();
}, this.pollInterval);
console.log(`Polling started (interval: ${this.pollInterval}ms)`);
}
/**
* Stop polling
*/stop() {
if (this.timer) {
clearInterval(this.timer);
this.timer = null;
}
}
/**
* Poll all registered users
*/asyncpollAllUsers() {
for (const [userId, data] ofthis.users) {
try {
awaitthis.pollUser(userId, data);
} catch (error) {
console.error(`Poll failed for user ${userId}:`, error.message);
}
}
}
/**
* Poll single user for changes
*/asyncpollUser(userId, data) {
const state = awaitthis.syncService.getSyncState();
if (state.updateCount > data.lastUpdateCount) {
console.log(`Changes detected for user ${userId}`);
const changes = awaitthis.syncService.incrementalSync(
data.lastUpdateCount
);
// Update stored count
data.lastUpdateCount = state.updateCount;
// Process changesawaitthis.processChanges(userId, changes);
}
}
asyncprocessChanges(userId, changes) {
// Same processing as webhook handler
}
}
module.exports = PollingService;