برنامه نویسی

یک نماینده ایمیل مبتنی بر هوش مصنوعی با کد قابل استفاده مجدد بسازید

Summarize this content to 400 words in Persian Lang

چرا وظایف خود را خودکار کنید؟

سلام به همه 👋! به‌عنوان یک توسعه‌دهنده برنامه، مشتاقم به اشتراک بگذارم که چگونه می‌توانید عوامل ساده و در عین حال قدرتمندی برای خودکارسازی کارهای روزانه خود ایجاد کنید.

📬 من هم مانند بسیاری از شما، هر روز تعداد زیادی ایمیل دریافت می کنم. علیرغم تمام تلاشم، دستیابی به چیزهای دست نیافتنی صندوق ورودی صفر یک چالش باقی می ماند مرتب‌سازی از طریق ایمیل‌هایی مانند تأیید سفارش و به‌روزرسانی‌های ارسال، خسته‌کننده و زمان‌بر است.

اما خبر خوب اینجاست: اتوماسیون می تواند روز را نجات دهد!🤖 من یک اسکریپت اساسی با استفاده از هوش مصنوعی برای کمک به دسته‌بندی خودکار ایمیل‌ها نوشته‌ام – و شما هم می‌توانید.

در این مقاله، من تکه‌های کد قابل استفاده مجدد را به اشتراک می‌گذارم تا به شما کمک کند تا عوامل اتوماسیون خود را متناسب با نیازهای خود بسازید. 🚀

زیبایی اتوماسیون

ابزارهای بی شماری از جمله پلتفرم های بدون کد وجود دارند که می توانند کل فرآیندها را برای شما انجام دهند. با این حال، من ترجیح می دهم تکالیف را بشکنم قطعه کد مدولار. چرا؟

انعطاف پذیری: کد ماژولار می تواند به راحتی با نیازهای در حال تغییر سازگار شود.

قابلیت استفاده مجدد: یک بار بنویس، برای همیشه استفاده کن.

قابلیت نگهداری: اشکال‌زدایی و بهبود تکه‌های کوچک و مستقل کد آسان‌تر است.

با گرفتن یک رویکرد افزایشی، می توانید به تدریج مراحل دستی را با مراحل خودکار جایگزین کنید.

👩‍💻 ابزار اصلی من برای نمونه سازی اسکریپت ها است Znote- یک نوت بوک با کدنویسی زنده و هوش مصنوعی که به من کمک می کند گردش کار خود را ردیابی و بهبود بخشد. آن را امتحان کنید یا از IDE مورد علاقه خود استفاده کنید!

بیایید یک نماینده اتوماسیون ایمیل بسازیم

اهداف

وقتی یک ایمیل جدید می رسد، می خواهیم:

ایمیل را بخوانید و اطلاعات مربوطه را استخراج کنید.

از LLM استفاده کنید برای تعیین دسته آن از یک لیست از پیش تعریف شده.

برچسب های جیمیل ایجاد کنید (اگر از قبل وجود نداشته باشند).

برچسب های ایمیل را به روز کنید برای انعکاس دسته اختصاص داده شده

شروع به کار

پیش نیازها

مرحله 1: Gmail API را فعال کنید

به Google Cloud Console بروید و Gmail API را فعال کنید.

اعتبارنامه OAuth را برای یک برنامه دسکتاپ تنظیم کنید. برای دانلود خود این مراحل را دنبال کنید google-credentials.json فایل و آن را در فهرست پروژه خود قرار دهید.

مرحله 2: اوللاما را نصب کنید

Ollama را برای اجرای یک LLM محلی دانلود کنید. پس از نصب، یک مدل را دانلود کنید:

ollama pull mistral

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 3: Dependencies را نصب کنید

کتابخانه های Node.js مورد نیاز را نصب کنید:

npm install -S @google-cloud/local-auth googleapis openai

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نوشتن کد

1. با Google API احراز هویت

یک اتصال OAuth به Gmail راه اندازی کنید:

// google-api.js
const fs = require(“fs”);
const path = require(“path”);
const { authenticate } = require(“@google-cloud/local-auth”);
const { google } = require(“googleapis”);

class GoogleAPI {
constructor(credentialFilename) {
this.TOKEN_PATH = path.join(__dirname, `token-${credentialFilename}`);
this.CREDENTIALS_PATH = path.join(__dirname, credentialFilename);
this.SCOPES = [
“https://mail.google.com/”,
“https://www.googleapis.com/auth/gmail.modify”,
];
}

async authorize() {
const loadSavedCredentials = () => {
try {
const content = fs.readFileSync(this.TOKEN_PATH);
return google.auth.fromJSON(JSON.parse(content));
} catch {
return null;
}
};

const saveCredentials = (client) => {
const keys = JSON.parse(fs.readFileSync(this.CREDENTIALS_PATH));
fs.writeFileSync(
this.TOKEN_PATH,
JSON.stringify({
type: “authorized_user”,
client_id: keys.installed.client_id,
client_secret: keys.installed.client_secret,
refresh_token: client.credentials.refresh_token,
})
);
};

let client = await loadSavedCredentials();
if (!client) {
client = await authenticate({
scopes: this.SCOPES,
keyfilePath: this.CREDENTIALS_PATH,
});
if (client.credentials) saveCredentials(client);
}
return client;
}
}

module.exports = GoogleAPI;

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2. برچسب های جیمیل ایجاد کنید

از این تابع برای ایجاد برچسب ها و بازیابی شناسه آنها استفاده کنید:

async function createAndGetLabels(labelsToCreate) {
const google = await getGoogleClient();
const gmail = google.gmail({ version: “v1” });

const existingLabels = (await gmail.users.labels.list({ userId: “me” })).data.labels || [];

const labelsMap = new Map();
for (const label of labelsToCreate) {
const existing = existingLabels.find((l) => l.name === label);
if (existing) {
labelsMap.set(label, existing.id);
} else {
const res = await gmail.users.labels.create({
userId: “me”,
requestBody: { name: label },
});
labelsMap.set(label, res.data.id);
}
}
return labelsMap;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

3. ایمیل ها را بخوانید

استخراج جزئیات از api پیام:

async function readEmails(gmail, maxResults = 10) {
const res = await gmail.users.messages.list({ userId: “me”, labelIds: [“INBOX”], maxResults });
return Promise.all(
res.data.messages.map(async ({ id }) => {
const email = await gmail.users.messages.get({ userId: “me”, id });
return email.data;
})
);
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

4. رمزگشایی اطلاعات مربوطه

استخراج جزئیات معنی دار از ایمیل ها:

function extractMailInfos(mail) {
// Define the headers to extract
const relevantHeaders = [“Date”, “Subject”];

// Extract and structure the relevant headers
const headers = mail.payload.headers
.filter(header => relevantHeaders.includes(header.name))
.reduce((accumulator, header) => {
accumulator[header.name] = header.value;
return accumulator;
}, {});

// Add the unique mail ID directly to the headers object
headers.id = mail.id;

return headers;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

5. از یک LLM برای دسته بندی استفاده کنید

Ollama یا OpenAI را برای طبقه بندی ایمیل ها ادغام کنید:

async function classifyEmail(prompt) {
const { OpenAI } = require(“openai”);
const openai = new OpenAI({ baseURL: “http://127.0.0.1:11434/v1”, apiKey: “not-needed” });

const response = await openai.chat.completions.create({
model: “mistral”,
temperature: 0.3,
messages: [{ role: “user”, content: prompt }],
});

return response.choices[0].message.content.trim();
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

قرار دادن آن همه با هم

در اینجا همه چیز با هم کار می کند:

const labelsToCreate = [“Order”, “Shipping”, “Newsletter”, “Other”];
const labelsMap = await createAndGetLabels(labelsToCreate);

const promptSystem = `
Your role is to determine the category of the emails by choosing from the categories listed below.

Here are the possible categories:
– Order
– Shipping
– Newsletter
– Other

You must return in response the name of the category without further explanation and without quotation marks.
`

const rawEmails = await readEmails(gmail);
const emails = rawEmails.map(m => extractMailInfos(m));
for (const email of emails) {

const prompt = `${promptSystem}
Categorize this email: ${email.Subject}`;

const category = await classifyEmail(prompt);

if (labelsMap.has(category)) {
await gmail.users.messages.modify({
userId: “me”,
id: email.id,
requestBody: {
addLabelIds: [labelsMap.get(category)],
//removeLabelIds: [“INBOX”],
},
});
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

🎉 همین! صندوق ورودی شما اکنون هوشمندتر و سازماندهی شده است.

برو جلوتر

اما چرا اینجا توقف کنید؟ نمونه‌های پیشرفته‌تری را برای خواندن محتوای ایمیل، ارسال پیش‌نویس‌ها و ساختن هر چیزی که برای پاسخ‌های کاملاً خودکار نیاز دارید، کاوش کنید.برای ایده های اتوماسیون بیشتر و اسکریپت های قابل استفاده مجدد، Znote را بررسی کنید.بیایید کارهای روزانه شما را به چیزی سرگرم کننده و کارآمد تبدیل کنیم! 🌈

چرا وظایف خود را خودکار کنید؟

سلام به همه 👋! به‌عنوان یک توسعه‌دهنده برنامه، مشتاقم به اشتراک بگذارم که چگونه می‌توانید عوامل ساده و در عین حال قدرتمندی برای خودکارسازی کارهای روزانه خود ایجاد کنید.

📬 من هم مانند بسیاری از شما، هر روز تعداد زیادی ایمیل دریافت می کنم. علیرغم تمام تلاشم، دستیابی به چیزهای دست نیافتنی صندوق ورودی صفر یک چالش باقی می ماند مرتب‌سازی از طریق ایمیل‌هایی مانند تأیید سفارش و به‌روزرسانی‌های ارسال، خسته‌کننده و زمان‌بر است.

اما خبر خوب اینجاست: اتوماسیون می تواند روز را نجات دهد!

🤖 من یک اسکریپت اساسی با استفاده از هوش مصنوعی برای کمک به دسته‌بندی خودکار ایمیل‌ها نوشته‌ام – و شما هم می‌توانید.

در این مقاله، من تکه‌های کد قابل استفاده مجدد را به اشتراک می‌گذارم تا به شما کمک کند تا عوامل اتوماسیون خود را متناسب با نیازهای خود بسازید. 🚀


زیبایی اتوماسیون

ابزارهای بی شماری از جمله پلتفرم های بدون کد وجود دارند که می توانند کل فرآیندها را برای شما انجام دهند. با این حال، من ترجیح می دهم تکالیف را بشکنم قطعه کد مدولار. چرا؟

  1. انعطاف پذیری: کد ماژولار می تواند به راحتی با نیازهای در حال تغییر سازگار شود.
  2. قابلیت استفاده مجدد: یک بار بنویس، برای همیشه استفاده کن.
  3. قابلیت نگهداری: اشکال‌زدایی و بهبود تکه‌های کوچک و مستقل کد آسان‌تر است.

با گرفتن یک رویکرد افزایشی، می توانید به تدریج مراحل دستی را با مراحل خودکار جایگزین کنید.

👩‍💻 ابزار اصلی من برای نمونه سازی اسکریپت ها است Znote– یک نوت بوک با کدنویسی زنده و هوش مصنوعی که به من کمک می کند گردش کار خود را ردیابی و بهبود بخشد. آن را امتحان کنید یا از IDE مورد علاقه خود استفاده کنید!


بیایید یک نماینده اتوماسیون ایمیل بسازیم

اهداف

وقتی یک ایمیل جدید می رسد، می خواهیم:

  1. ایمیل را بخوانید و اطلاعات مربوطه را استخراج کنید.
  2. از LLM استفاده کنید برای تعیین دسته آن از یک لیست از پیش تعریف شده.
  3. برچسب های جیمیل ایجاد کنید (اگر از قبل وجود نداشته باشند).
  4. برچسب های ایمیل را به روز کنید برای انعکاس دسته اختصاص داده شده

شروع به کار

پیش نیازها

مرحله 1: Gmail API را فعال کنید

  1. به Google Cloud Console بروید و Gmail API را فعال کنید.
  2. اعتبارنامه OAuth را برای یک برنامه دسکتاپ تنظیم کنید. برای دانلود خود این مراحل را دنبال کنید google-credentials.json فایل و آن را در فهرست پروژه خود قرار دهید.

مرحله 2: اوللاما را نصب کنید

Ollama را برای اجرای یک LLM محلی دانلود کنید. پس از نصب، یک مدل را دانلود کنید:

ollama pull mistral  
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 3: Dependencies را نصب کنید

کتابخانه های Node.js مورد نیاز را نصب کنید:

npm install -S @google-cloud/local-auth googleapis openai  
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


نوشتن کد

1. با Google API احراز هویت

یک اتصال OAuth به Gmail راه اندازی کنید:

// google-api.js
const fs = require("fs");
const path = require("path");
const { authenticate } = require("@google-cloud/local-auth");
const { google } = require("googleapis");

class GoogleAPI {
  constructor(credentialFilename) {
    this.TOKEN_PATH = path.join(__dirname, `token-${credentialFilename}`);
    this.CREDENTIALS_PATH = path.join(__dirname, credentialFilename);
    this.SCOPES = [
      "https://mail.google.com/",
      "https://www.googleapis.com/auth/gmail.modify",
    ];
  }

  async authorize() {
    const loadSavedCredentials = () => {
      try {
        const content = fs.readFileSync(this.TOKEN_PATH);
        return google.auth.fromJSON(JSON.parse(content));
      } catch {
        return null;
      }
    };

    const saveCredentials = (client) => {
      const keys = JSON.parse(fs.readFileSync(this.CREDENTIALS_PATH));
      fs.writeFileSync(
        this.TOKEN_PATH,
        JSON.stringify({
          type: "authorized_user",
          client_id: keys.installed.client_id,
          client_secret: keys.installed.client_secret,
          refresh_token: client.credentials.refresh_token,
        })
      );
    };

    let client = await loadSavedCredentials();
    if (!client) {
      client = await authenticate({
        scopes: this.SCOPES,
        keyfilePath: this.CREDENTIALS_PATH,
      });
      if (client.credentials) saveCredentials(client);
    }
    return client;
  }
}

module.exports = GoogleAPI;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2. برچسب های جیمیل ایجاد کنید

از این تابع برای ایجاد برچسب ها و بازیابی شناسه آنها استفاده کنید:

async function createAndGetLabels(labelsToCreate) {
  const google = await getGoogleClient();
  const gmail = google.gmail({ version: "v1" });

  const existingLabels = (await gmail.users.labels.list({ userId: "me" })).data.labels || [];

  const labelsMap = new Map();
  for (const label of labelsToCreate) {
    const existing = existingLabels.find((l) => l.name === label);
    if (existing) {
      labelsMap.set(label, existing.id);
    } else {
      const res = await gmail.users.labels.create({
        userId: "me",
        requestBody: { name: label },
      });
      labelsMap.set(label, res.data.id);
    }
  }
  return labelsMap;
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

3. ایمیل ها را بخوانید

استخراج جزئیات از api پیام:

async function readEmails(gmail, maxResults = 10) {
  const res = await gmail.users.messages.list({ userId: "me", labelIds: ["INBOX"], maxResults });
  return Promise.all(
    res.data.messages.map(async ({ id }) => {
      const email = await gmail.users.messages.get({ userId: "me", id });
      return email.data;
    })
  );
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

4. رمزگشایی اطلاعات مربوطه

استخراج جزئیات معنی دار از ایمیل ها:

function extractMailInfos(mail) {
  // Define the headers to extract
  const relevantHeaders = ["Date", "Subject"];

  // Extract and structure the relevant headers
  const headers = mail.payload.headers
    .filter(header => relevantHeaders.includes(header.name))
    .reduce((accumulator, header) => {
      accumulator[header.name] = header.value;
      return accumulator;
    }, {});

  // Add the unique mail ID directly to the headers object
  headers.id = mail.id;

  return headers;
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

5. از یک LLM برای دسته بندی استفاده کنید

Ollama یا OpenAI را برای طبقه بندی ایمیل ها ادغام کنید:

async function classifyEmail(prompt) {
  const { OpenAI } = require("openai");
  const openai = new OpenAI({ baseURL: "http://127.0.0.1:11434/v1", apiKey: "not-needed" });

  const response = await openai.chat.completions.create({
    model: "mistral",
    temperature: 0.3,
    messages: [{ role: "user", content: prompt }],
  });

  return response.choices[0].message.content.trim();
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


قرار دادن آن همه با هم

در اینجا همه چیز با هم کار می کند:

const labelsToCreate = ["Order", "Shipping", "Newsletter", "Other"];
const labelsMap = await createAndGetLabels(labelsToCreate);

const promptSystem = `
Your role is to determine the category of the emails by choosing from the categories listed below.

Here are the possible categories:
- Order
- Shipping
- Newsletter
- Other

You must return in response the name of the category without further explanation and without quotation marks.
`

const rawEmails = await readEmails(gmail);
const emails = rawEmails.map(m => extractMailInfos(m));
for (const email of emails) {

  const prompt = `${promptSystem}
    Categorize this email: ${email.Subject}`;

  const category = await classifyEmail(prompt);

  if (labelsMap.has(category)) {
    await gmail.users.messages.modify({
      userId: "me",
      id: email.id,
      requestBody: { 
        addLabelIds: [labelsMap.get(category)],
        //removeLabelIds: ["INBOX"],
      },
    });
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


🎉 همین! صندوق ورودی شما اکنون هوشمندتر و سازماندهی شده است.

برو جلوتر

اما چرا اینجا توقف کنید؟ نمونه‌های پیشرفته‌تری را برای خواندن محتوای ایمیل، ارسال پیش‌نویس‌ها و ساختن هر چیزی که برای پاسخ‌های کاملاً خودکار نیاز دارید، کاوش کنید.
برای ایده های اتوماسیون بیشتر و اسکریپت های قابل استفاده مجدد، Znote را بررسی کنید.

بیایید کارهای روزانه شما را به چیزی سرگرم کننده و کارآمد تبدیل کنیم! 🌈

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا