Рубрики
Без рубрики

Создание функции NetLify Lambda, чтобы превратить списки Twitter в Digests по электронной почте.

Я, наверное, не единственный, кто сейчас чувствует себя перегруженным общей паникой в социальных сетях …. Tagned с Twitter, JavaScript, NetLify, Serverless.

Я, вероятно, сейчас не единственный, кто чувствует себя ошеломленной общей паникой в социальных сетях.

Я решил кодировать некоторое здравомыслие обратно в свою жизнь, создав функцию netLify Lambda, которая отправляет мне писать твиты один раз в день.

Ссылка GitHub

Учебное пособие: настройка

Вещи, которые нам нужны

  • Бесплатная учетная запись SendGrid и ключ API
  • Учетная запись NetLify
  • Ключ API Twitter и секрет API
  • Общедоступный список в Твиттере
  • Служба работы Cron, которая позволяет вам устанавливать заголовки (что я нашел: cron-job.org -бесплатно, easycron.com – Бесплатная пробная версия) или если у вас есть сервер, вы сможете настроить его самостоятельно.
  • Некоторое понимание JavaScript и http.
  • Электронное письмо

Нам нужно создать проект узла и установить зависимости. Запустите следующие команды в вашем каталоге проекта. У вас должен быть файл package.json/package-lock.json и папку Node_modules.

npm init -y
npm i netlify-lambda @sendgrid/mail encoding twitter-lite dotenv-webpack

NetLify -Lambda – помогает в объединении и местном развитии.

@SendGrid/Mail – помогает нам использовать API SendGrid’s Mail API

Twitter -Lite – обертка для API Twitter’s API

dotenv -webpack – установление переменных локальной среды разработки (не описано в этом посте, ознакомьтесь с репонированием GitHub)

Кодирование – было установлено для решения ошибки развертывания, с которой я столкнулся ( Выпуск ).

Проектная структура папок

Создайте следующие файлы в соответствии со структурой ниже. (Модули узлов, пакет-lock.json и package.json уже должны быть там)

node_modules/ 
src/
  lambda/
    digest.js 
  utils/
    twitter.js 
    sendgrid.js 
    email.js 
netlify.toml 
.gitignore 
package.json 
package-lock.json 

Создание дайджеста

Мы должны сделать 3 вещи (только 2 из которых требуют написания кода):

  1. Получите твиты из списка Twitter.
  2. Отправьте электронное письмо с этими твитами.
  3. Запланируйте электронные письма, которые будут отправлены каждый день (или всякий раз, когда) с cron-job.org

Ниже приведена наша функция лямбда (digest.js), которая объединяет различные компоненты функции.

Первое, что мы делаем, – это добавить некоторую базовую авторизацию и проверку запроса. Допустимый запрос на функцию должен:

  • Иметь метод запроса почты
  • Иметь заголовок авторизации
  • Иметь надлежащую ценность в заголовке авторизации

Примечание. Я буду использовать Process.env для обозначения переменных, которые будут установлены позже при развертывании.

Я возвращаю код состояния 404, чтобы не выявить, существует ли конечная точка. Мое обоснование состоит в том, что 404 – не найдено, с большей вероятностью сдерживает скучный спамер/злоумышленник, чем 401 – несанкционированный.

//digest.js
const twitter = require('../utils/twitter');
const sendGrid = require('../utils/sendgrid');

exports.handler = async (event, context)=>{
         try{
             //Validate the request method and the authorization header
             if(event.httpMethod != 'POST') return {statusCode: 404}
             if(!event.headers.authorization)  return {statusCode: 404};

             //check for valid authorization value
             const basicAuth = (new Buffer(`${process.env.AUTH_USER}:${process.env.AUTH_PASS}`)).toString('base64')
             if(event.headers.authorization.split(' ')[1] !== basicAuth) return {statusCode: 404};

             //Get tweets
             const tweets = await twitter();

             //Send email if there are tweets available
             if(tweets.length > 0) await sendGrid(tweets);

             // success
             return {statusCode: 200}
             
         }catch(err){
             console.log(err)
             //error
             return {statusCode: 500}
         }
}

Остальная часть функции включает в себя вызов модулей, которые мы импортировали вверху. Одним из них является функция, которая аутентифицирует Twitter и получает твиты из нашего списка (Twitter.js). Другой отправляет нашу электронную почту (sendgrid.js).

1) Получение твитов из нашего списка Twitter

//File - twitter.js
const Twitter = require('twitter-lite')
module.exports = async () => { 
    //a) authenticate with twitter
    const user = new Twitter({
      consumer_key: process.env.TWITTER_KEY,
      consumer_secret: process.env.TWITTER_SECRET
    });
    const response = await user.getBearerToken();
    const app = new Twitter({
      bearer_token: response.access_token
    });

     //b) get tweets from list
    const data = await app.get('lists/statuses', {
                                list_id: process.env.TWITTER_LIST_ID,
                                tweet_mode: 'extended'
                            })

     //c) get only the necessary data & return tweets
    const tweets = data.map(tweet=>{
        return {
            text: tweet.full_text, 
            user:tweet.user.screen_name,
            url: `https://twitter.com/${tweet.user.screen_name}/status/${tweet.id_str}`
        }
    })

    return tweets;
     
}

a) Мы установили пакет под названием Twitter-Lite, который является оберткой для API Twitter. Для аутентификации нам просто нужны наш ключ API Twitter API (Twitter_key) и Twitter API Secret (Twitter_secret), введенные в функцию Twitter Packages.

API Twitter имеет аутентификацию пользователей и аутентификацию приложений. Мы используем аутентификацию приложений, нам просто нужен токен для носителя, чтобы начать делать запросы в API Twitter. Пакет заботится обо всем, вы можете увидеть полную документацию для Twitter-Lite здесь

b) Мы можем использовать Twitter-Lite, чтобы получить твиты из списка, позвонив в метод Get в «Приложении». Объект передается в app.get () содержит параметры запроса, необходимые для Списки Твиттера/Статусы конечная точка Анкет

Это включает в себя идентификатор списка Twitter (list_id) и, хотим ли мы получить полный твит против усеченной версии твита (tweet_mode). Он возвращает массив объектов твита, когда закончите.

c) Как только у нас появятся твиты, нам нужно только несколько бит информации (текст твита, имя пользователя «твитера» и твит -url). Используя метод карты массива, мы можем создать новый массив, который содержит только необходимые данные из каждого твита.

2) Отправка электронной почты.

//sendgrid.js
//a) set sendgrid's api key
const sgMail = require('@sendgrid/mail');
const createHtmlEmail = require('./email');
sgMail.setApiKey(process.env.SENDGRID_KEY); 

module.exports = (tweets) => {
    return sgMail.send({ 
            to: process.env.MY_EMAIL,
            from: process.env.MY_EMAIL,
            subject: 'Your Tweet Digest',
            html: createHtmlEmail(tweets), //b) create html email & send
            });
}

a) Здесь мы импортируем SendGrid’s NPM Package , установите ключ API для SendGrid и импортируйте модуль, который помогает нам создать электронную почту HTML, содержащую твиты.

b) sgmail.send () принимает объект с некоторой информацией о электронной почте, которую мы должны отправить. Чтобы получить значение для свойства «HTML», которое мы называем CreateHtmLemail и передаем наши твиты.

Вот что происходит внутри функции CreateHtmLemail. Мы, по сути, вставляем наши данные твита в HTML и возвращаем строку HTML. Это очень легко сделать благодаря Шаблоны литералы Анкет

//File - email.js
//creates the html email
module.exports = (tweets) => {
    let tweetElements = '';

    //insert tweet data into elements
    tweets.forEach(tweet=>{
       tweetElements += `
                

@${tweet.user}

${tweet.text}

Read Tweet
` }) //Wrap tweet elements in a div let email = `
${tweetElements}
`; return email; }

sgmail.send () возвращает обещание, поэтому мы используем ключевое слово await в нашей функции Lamda (digest.js).

Развернуть функцию!

Прежде чем развернуть, нам нужно отредактировать несколько файлов

  • package.json – добавление сценария сборки
  • netLify.toml – добавляет команду сборки и дает NetLify знать, в какой папке находится наша функция (SRC/Lambda)
  • .gitignore – удаляет нашу папку node_modules из отслеживания git
//package.json
"scripts": {
    "build:lambda": "netlify-lambda build src/lambda"
}

//netlify.toml
[build]
  Command = "npm run build:lambda"
  Functions = "lambda" 

//.gitignore
node_modules/

Теперь мы можем совершить проект на GitHub.

git init
git remote add origin 
git add .
git commit -m "commit message"
git push origin master

Теперь мы можем войти в систему в NetLify. Вы должны увидеть возможность создать новый сайт из GIT, как только вы нажмете, что вы пройдете через 3 -этажный процесс, в котором вы выбираете поставщика GIT, авторизуете NetLify и выберите репозиторий. Самым важным является шаг 3, где у нас есть варианты сборки.

Нажав «Показать Advanced», тогда «Новая переменная» должна позволить вам добавить переменные среды (Process.env Prefixed Stuff на протяжении всего кода).

Вот список переменных, которые необходимо установить

Name:           Description:
TWITTER_KEY     your twitter API key
TWITTER_SECRET  your twitter API secret
AUTH_USER       a username (does not have to be your twitter username, just come up with something)
AUTH_PASS       a password (does not have to be your twitter password, just come up with something)
YOUR_EMAIL      your email
TWTTER_LIST_ID  id of your twitter list, it is simply the numbers at the end of the URL when you are on your twitter list
Example:   will have a TWITTER_LIST_ID of 1234

GitHub Repository Объясняет некоторые из этих переменных среды немного лучше. После заполнения переменных среды проект может быть развернут.

Планирование функции для работы каждый день.

Вы должны быть в состоянии получить доступ к URL вашей функции так:

https://[DEPLOY_URL]/.netlify/functions/digest.js

[Deploy_url] представляет URL -адрес сайта, показанный в обзорной панели обзора NetLify для вашего развернутого сайта. Например, если URL вашего сайта – Пример.netLify. com, тогда ваш URL -адрес функции:

https://example.netlify.com/.netlify/functions/digest.js

Мы будем использовать работу Cron на https://cron-job.org Чтобы называть URL -адрес функции ежедневно. После регистрации на сайте вас следует привлечь на панель участников, где вы можете нажать «Cronjobs» на верхней левой навигационной панели, а затем нажмите «Создать Cronjob».

Теперь заполните форму

  • Название – любое имя, которое вы хотите
  • Адрес – URL вашей функции (https://….)
  • Проверять «Требуется аутентификация HTTP»
    • Пользователь – так же, как Auth_User SET ранее
    • Пароль – такой же, как auth_pass, установленная ранее
  • Расписание – Установите график для любого временного интервала (Я использую каждый день)

Когда вы закончите с этим, нажмите «Создать Cronjob». Вы будете перенаправлены на страницу, в которой перечислены ваши текущие Cronjobs, теперь найдите недавно созданное задание и нажмите «Редактировать».

На странице «Редактировать форму» вы можете прокрутить вниз, чтобы найти «расширенные настройки», что позволяет изменить метод запроса с Get to Post, а затем сохранить форму.

а также…..

Вот и все!

Полученные результаты!: D.

Выглядит прилично.

Конечно, есть много улучшений, поэтому, если у вас есть некоторые идеи, чтобы улучшить его, вы можете пойти дальше и внести свой вклад в проект на GitHub Анкет

: D

Ресурсы:

Репозиторий GitHub

Оригинальный пост в блоге

Оригинал: “https://dev.to/tobenxe/building-a-netlify-lambda-function-to-turn-twitter-lists-into-email-digests-3ock”