Преодолейте эксклюзивные предложения Twitter с Node.js и Twilio SMS

  1. Начиная
  2. Получение номера Twilio
  3. Настройка среды вашего узла.
  4. Создание вашего проекта и установка Twilio
  5. Установка дополнительных зависимостей
  6. Обработка переменных среды
  7. Кодирование приложения
  8. Кодирование приложения
  9. Инициализация клиентов Twilio, Twitter и MongoDB
  10. Добавление пакета Moment и модуля Assert
  11. Написание наших функций
  12. Подключение к MongoDB
  13. Создание App Engine
  14. Как мы туда попадем?
  15. Развертывание в Heroku
  16. Подключиться к Heroku
  17. Добавить переменные среды в производство
  18. Проверьте переменные среды
  19. Добавить, зафиксировать и нажать
  20. Это работает?

Я просто не мог выйти в интернет достаточно быстро. Возможно, вам знакомо это чувство: кто-то или кто-то, за кем вы следите, размещает в Твиттере распродажу, и к тому времени, когда вы подключаетесь к Интернету, вы либо пропустили твит, либо продажа закончилась. Вы можете включить SMS-уведомления и своевременно отправлять вам сообщения в твиттере, но это действительно не помогает, поскольку вы начинаете настраивать тексты, когда объем превышает несколько твитов в течение короткого периода времени. Что, если бы вы могли создать приложение, которое отправляет вам SMS-уведомление только тогда, когда твит совпадает с продажей, которую вы на самом деле ищете?

Это где Twilio SMS API приходит на помощь.

В моем случае я большой поклонник Уэса Бос ( @wesbos ). Уэс - разработчик, который создает качественные и увлекательные онлайн-курсы для изучения веб-разработки, особенно в среде JavaScript. Г-н Бос постоянно пишет в Твиттере, и он действительно хорош в личном общении со своими последователями. Но он также производит нестандартные, качественные наклейки для ноутбуков по низкой цене , Проблема в том, что, хотя он увеличивал размер своей партии при каждой продаже, я не смог вовремя подключиться к Интернету, чтобы купить их до того, как они были распроданы. С его высокой скоростью твитов и огромным количеством подписчиков я знал, что мне нужно использовать свои навыки кодирования, чтобы добиться успеха.

Прослушивая в своем твиттере конкретное ключевое слово через API REST Twitter Я задумал хак, который будет проверять его трансляцию каждые несколько минут и отправлять сообщения самому себе, если в течение этого периода он публиковал наклейки.

Давайте построим это вместе.

Начиная

Чтобы следовать этому посту, необходимо следующее:

Получение номера Twilio

Twilio не так дорого в настройке. На самом деле, вы можете зарегистрироваться и получите ключ API бесплатно и получите небольшой пробный баланс просто чтобы попробовать это. Если вы используете пробный баланс, обновление будет очень недорогим для небольших проектов. Для местного номера в США это всего 1 доллар в месяц, а SMS-сообщения стоят недорого. В моем случае, поскольку я израсходовал пробный баланс, я обновил свой аккаунт и загрузил 20 долларов в июле 2017 года, и по состоянию на середину ноября у меня все еще осталось 15,71 доллара. Я знал, что это будет очень недорогой способ подделать доброе старомодное преследование в Твиттере.

Настройка среды вашего узла.

Давайте начнем с приложения.

Создание вашего проекта и установка Twilio

В командной строке создайте новую папку и перейдите в нее:

mkdir twitter - stalk cd twitter - stalk

Чтобы установить все нужные нам пакеты, нам нужно инициализировать папку для npm.

Из командной строки запустите npm init, установив server.js в качестве значения «main» при появлении запроса. После завершения этого процесса установите Пакет Twilio Node.js

npm установить twilio - сохранить

Установка дополнительных зависимостей

Этот проект требует дополнительных зависимостей, чтобы обеспечить постоянство данных с MongoDB, форматирование даты и времени с Moment.js, доступ к API Twitter и хранение переменных среды с помощью dotenv. Обратите внимание, вы можете установить несколько пакетов npm одновременно.

npm install - сохранить mongodb щебетать момент dotenv

Пока вы еще в командной строке, создайте следующие файлы: .gitignore, .env, Procfile и server.js.

Нам нужно убедиться, что мы не проверяем определенные файлы в системе контроля версий, поэтому добавьте следующее в .gitignore.

В .env мы будем хранить переменные нашей среды для использования во время разработки. Мы должны убедиться, что мы не позволяем нашему ключу API Twilio или любым другим ключам API стать доступными для всех и по любой причине.

Наконец, Procfile используется Heroku после развертывания для чтения этого приложения как рабочего, то есть не имеющего внешнего интерфейса в сети.

Просто добавьте эту единственную строку в ваш Procfile:

Обработка переменных среды

Мы будем использовать переменные среды для безопасной передачи наших ключей API и других секретов приложению. Опять же, мы не хотим, чтобы эта информация была общедоступной, чтобы кто-то не украл наши ключи в своих гнусных целях. В этом случае мы собираемся хранить наши ключи в .env для импорта в server.js. При развертывании мы можем использовать панель инструментов Heroku или пакет heroku-cli для хранения этих переменных для вашего приложения. Узнайте больше о переменных среды в этой превосходной статье Доминика Кунделя ,

Из Twilio, после того как вы приобрели свой номер, с консоли Twilio , вы сможете просматривать как идентификатор своей учетной записи, так и свой токен авторизации. Внутри .env добавьте следующие строки, конечно, опуская угловые скобки, которые я указал в примере ниже:

TWILIO_ACCOUNTSID = "notarealSIDywillseeabunch of A9cdzstuff" TWILIO_AUTHTOKEN = "alsonotrealbutsomerandomalphanumericcode" TWILIO_PERSONALNUMBER = "+12018675309" TWILIO_TWILIONUMBER = "+ 1290K

Примечание: для вашего личного номера и номера Twilio для США укажите 1, а затем 10-значный номер. Без пробелов, скобок, тире или других знаков препинания - знак плюс, за которым следуют 11 цифр.

Для Twitter, перейдите на https://apps.twitter.com/ , войдите в систему и создайте новое приложение. Дайте ему имя и описание. Поскольку у этого приложения нет внешнего интерфейса, используйте значение заполнителя для «Веб-сайт», например: https://www.twilio.com и оставьте пустым «Обратный звонок». После создания приложения нажмите на вкладку «Ключи и токены доступа». Затем нажмите «Создать токен», и теперь у вас есть доступ к тому, что вы добавите в .env:

TWITTER_CONSUMER_KEY = "randomAlphanumericCodeFromTwitter" TWITTER_CONSUMER_SECRET = "moreRandomAlphanumericCodeFromTwitter" TWITTER_ACCESS_TOKEN_KEY = "stillMoreRandomAlphanumericCodeFromTFRTTMTRECRTMCTURTCT_RUT_COM_COM_COM_COM_COM_COM_RUT_COM_COM_COM_COM_RUT_COM_COM_RET_COM_COM_RUT_COM_COM_RUT_COM_REC_COM_COM_RUT_COM_COM_RIT_COM_RUT_COM_REC_COM_COM_RIT_COM_RUT_COM_COM_RUT_COM_RIT_COM_RIT_COM_RIT_COM_RUT_COM_RIT_COM_RUT_RITR

Наконец, для MongoDB давайте настроим бесплатный сервер разработки через MLAB.

Если вы этого еще не сделали, перейдите к http://www.mlab.com и настроить учетную запись.

После создания учетной записи и проверки адреса электронной почты вы можете получить доступ к бесплатному серверу 500 МБ, нажав кнопку «Создать новый» под заголовком «Развертывания MongoDB».

Затем выберите облачного провайдера «AWS» и тип плана «Песочница», который позволит вам выбрать свой географический регион после продолжения нажатия. На этом этапе введите имя вашей базы данных как twitter-stalk. Вы всего в нескольких секундах от бесплатной облачной базы данных MongoDB на 500 ГБ.

После того, как база данных будет создана, вы увидите зеленую галочку рядом с вашим экземпляром базы данных.

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

На экране базы данных вы увидите предупреждение о том, что вам нужен пользователь базы данных, чтобы использовать базу данных.

Вторая вкладка в середине страницы - вкладка «Пользователи». Нажмите здесь, и вы увидите опцию Добавить пользователя базы данных в правом нижнем углу.

Установите имя пользователя admin и введите безопасный пароль на ваш выбор. Вам понадобится этот пароль через минуту.

Обратите внимание на URI для доступа к вашей базе данных. Настройте пользователя с правами администратора и дайте этому пользователю безопасный пароль. Как только вы вернетесь на страницу базы данных, прокрутите до верхней части страницы и увидите следующую инструкцию: Для подключения с помощью драйвера через стандартный URI MongoDB

Скопируйте пример uri под этим приглашением и в .env добавьте следующее:

MLAB_URI = "mongodb: // admin: yourUniquePassword @ yourSpecificMLabLocation / twitter-stalk"

Кодирование приложения

Мы создадим три функции: одну для вызова API Twitter и добавления новых твитов в базу данных, другую для получения последнего твита из базы данных и, наконец, одну для отправки SMS-сообщения. В этом уроке мы будем использовать API REST для Twitter, поскольку нам нужно проверять твиты только очень часто.

Откройте файл server.js в вашем редакторе кода и начнем!

Кодирование приложения

Импорт переменных среды

Пакет dotenv импортирует все переменные, которые мы сохранили в нашем файле .env. Мы хотим импортировать эти переменные тогда и только тогда, когда мы находимся в среде разработки. Мы исключаем наш файл .env из системы контроля версий git, поэтому для производства мы будем импортировать переменные среды другим способом, что будет обсуждаться позже.

В первой строке server.js добавьте следующий блок кода:

if (process. env. NODE_ENV! == 'production') {require ('dotenv'). нагрузка (); }

Инициализация клиентов Twilio, Twitter и MongoDB

Загрузив переменные нашей среды, теперь мы можем использовать их в нашем приложении. Добавьте следующее в server.js для инициализации наших клиентов Twilio, Twitter и MongoDB:

const twilioClient = require ('twilio') (process. env. TWILIO_ACCOUNTSID, process. env. TWILIO_AUTHTOKEN); const twitterClient = require ('twitter') ({consumer_key: process. env. TWITTER_CONSUMER_KEY, consumer_secret: process. env. TWITTER_CONSUMER_SECRET, access_token_key: process. env. TWITTER_ACCESS_TOKEN_KEY, access_toEN_ACESS: TW_TOC_sec:. const MongoClient = require ('mongodb'). MongoClient;

Как для пакетов twilio, так и для твиттера вы импортируете функцию, которую вы можете вызвать напрямую, передав ключи в качестве параметров. Twilio принимает два параметра: ваш SID учетной записи и ваш токен авторизации. Twitter принимает один объект, содержащий все четыре ключа, которые вы сохранили ранее.

Для MongoDB нам нужно сделать немного больше. На данный момент, установите URI для соединения:

const uri = процесс. окружение MLAB_URI || 'mongodb: // localhost: 27017 / twitter-stalk';

Добавление пакета Moment и модуля Assert

постоянный момент = требуется ('момент'); const assert = require ('assert');

Момент позволяет вам последовательно форматировать временные метки в разных средах. Мы будем использовать его здесь для хранения метки времени Unix. Assert позволит нам проверять ошибки на нашем соединении MongoDB и убивать наше приложение, если мы не можем подключиться к БД.

Написание наших функций

Наше приложение нуждается только в нескольких функциях для работы. Перед созданием основного движка приложения мы создадим и протестируем отправку SMS-сообщений с помощью Twilio.

Что мне нравится в Twilio, так это его простота. Twilio дает нам обещанный метод отправки SMS-сообщений, основная структура которого следующая: client.messages.create ({}). Then (). Catch ()

Все, что нам нужно сделать, это заполнить данные в соответствии с нашей заявкой:

TwilioClient. Сообщения . создать ({to: process. env. TWILIO_PERSONALNUMBER, от: process. env. TWILIO_TWILIONUMBER, тело: 'Уэс Бос только что написал про стикеры'}). затем (msg => console. log (`SMS с идентификатором: $ {msg. sid} отправлено с отметкой времени: $ {moment. now ()}`)). catch (err => console. error ({twilioError: err}));

Что делает эта функция?
Метод messages.create принимает один аргумент - объект с нашими текстовыми данными. Twilio делает все возможное, чтобы отправить текст SMS на любой номер, который вы передаете, при условии, что он отправляется с действительного номера Twilio (с доступным балансом).

Позже мы передадим весь твит на сообщение. Если это произойдет, мы зарегистрируем идентификатор сообщения и метку времени. И, конечно же, мы получим текст.

Давайте проверим это! После того, как вы добавили кодовый блок выше, сохраните server.js. Затем из командной строки запустите узел сервера. В ближайшее время вы должны получить текстовое сообщение с текстом «Уэс Бос только что написал о наклейках».
После тестирования вашего звонка в Twilio SMS API мы можем приступить к созданию движка, который соединит все три сервиса: MongoDB, Twitter и Twilio.

В этом приложении нам нужны все три службы, чтобы мы могли контролировать объем сообщений и ограничивать время, которое наше приложение тратит на подключение к API Twitter. Веб-трафик дорог, и мы делаем это по дешевке.

Подключение к MongoDB

После тестирования кода снова откройте server.js в вашем текстовом редакторе и в последней строке вставьте следующее:

// инициализируем переменную для хранения значения, возвращаемого setInterval ниже let delay; MongoClient. connect (uri, function (err, db) {"использовать строгий"; assert. equal (null, err); console. log ("Успешно подключен к MongoDB."); // получить коллекцию "твитов" или создать одну коллекцию const = db. collection ('tweets'); // первоначальный вызов для запуска stalker appEngine (collection); // вызов stalker один раз каждые 3 минуты или через любой интервал по вашему выбору // 1000 * 60 * 3 = 180000 delay = setInterval ( function () {appEngine (collection)}, 180000);});

Метод connect берет URI, который мы создали ранее, и возвращает нам базу данных, на которую мы будем ссылаться в нашем приложении. Мы назовем нашу коллекцию твитов именно так, твиты. Мы должны передать нашу коллекцию в нашу (все еще неписанную) функцию appEngine, чтобы мы могли хранить и получать данные твитов.

Создание App Engine

Что должен делать движок приложения? Он должен вызвать API Twitter, определить, писал ли @wesbos о наклейках и отправить нам эту информацию. Мы вызываем API REST Twitter, поэтому каждый раз, когда мы делаем это, возможно, мы получим повторяющиеся результаты от одного вызова к другому. Как мы можем избежать дублирования результатов?

У каждого объекта твита есть id_str. Значение 0 (ноль) представляет самый ранний возможный идентификатор твита. И число только увеличивается со временем и твиты, оно никогда не уменьшается. Это означает, что если мы храним самые последние твиты, мы можем искать твиты, которые произошли с того времени. Когда мы получим результат от вызова API, мы будем хранить твиты в нашей базе данных и отправлять SMS с текстом твита.

function appEngine (collection) {}

Эта функция принимает только один аргумент - коллекцию. В коллекции я собираюсь использовать функцию findOne MongoDB, сортировать ее в порядке убывания по твиту id_str и ограничивать результаты до 1. Идентификатор id_str подобен метке времени, поскольку чем больше число, тем более свежим твит.

function appEngine (collection) {collection. findOne ({}, {sort: {id_str: - 1}, предел: 1}). затем (твит => {const lastTweetId = твит && твит. hasOwnProperty ('id_str')? твит. id_str: 0;}). catch (err => console. error ({MongoFindError: err})); }

Обратите внимание на троичный оператор, используемый для определения значения lastTweetId. Если значение твита равно нулю или в твите отсутствует id_str, то мы не можем прочитать tweet.id_str без выдачи ошибки типа. Тернарный оператор возвращает значение 0, если возвращается любое недопустимое значение.

Как только мы нашли последний идентификатор твита, если он есть, мы используем его для вызова API поиска в Твиттере , Мы вызываем get на twitterClient, передавая путь API поиска и объект параметров поиска. Мы уточним, что мы хотим искать твиты из @wesbos, за исключением ретвитов и поиска по одному слову «стикеры». Мы также ограничим наш поиск твитами с момента последнего идентификатора твита, который мы получили из нашей базы данных.

function appEngine (collection) {collection. findOne ({}, {sort: {id_str: - 1}, предел: 1}). затем (tweet => const lastTweetId = tweet && tweet. hasOwnProperty ('id_str')? tweet. id_str: 0; // вызвать TwitterClient. get API-интерфейса Twitter ('search / tweets', {q: 'from: wesbos -filter) : retweets стикеры ', since_id: lastTweetId}, (err, tweets, response) => {}}). catch (err => console. error ({mongoFindError: err}));}

Если есть какие-либо статусы, мы напишем первый возвращенный твит с помощью вызова API Twilio, который мы тестировали ранее, а затем вставим все статусы в нашу базу данных.

Теперь мы готовы скопировать кодовый блок Twilio сверху и вставить его в нашу функцию appEngine. Мы чуть-чуть доработаем функцию, чтобы отправить текст сообщения вместе с текстом нашего текста. Мы просто должны убедиться, что вызов API успешен и что он возвращает новые твиты.

Вот как будет выглядеть конечный продукт:

function appEngine (collection) {collection. findOne ({}, {sort: {id_str: - 1}, предел: 1}). then (tweet => {const lastTweetId = tweet && tweet. hasOwnProperty ('id_str')? tweet. id_str: 0; // вызвать TwitterClient. get API-интерфейса Twitter ('search / tweets', {q: 'from: wesbos - filter: retweets наклейки ', since_id: lastTweetId}, (err, tweets, response) => {// регистрировать любые ошибки подключения к Твиттеру, если (err) {вернуть консоль. error ({twitterError: err})}} // отправлять только смс и вставьте новые твиты, если вызов API возвращает массив статусов if (твиты. статусы && твиты. статусы. длина) {// вырезать и пропустить здесь вызов API Twilio twilioClient. messages. create ({to: process. env. TWILIO_PERSONALNUMBER, from: process. env. TWILIO_TWILIONUMBER, body: `Уэс Бос только что написал в Твиттере о стикерах: $ {tweets. statuses [0]. text}`}). then (msg => {console. log (`SMS с идентификатором: $ { msg. sid} отправлено с отметкой времени: $ {moment. now ()} `); // добавление всех возвращенных статусов в коллекцию БД. insertMany (твиты. состояния). then (done => {}). catch (err) => кон единственный . ошибка ({mongoInsertError: err})); }). catch (err => console. error ({twilioError: err})); }}); }). catch (err => console. error ({mongoFindError: err})); }

Как мы туда попадем?

Внутри блока кода функции обратного вызова twitterClient.get () мы используем два условных оператора: один, чтобы перехватывать любые ошибки соединения с Twitter, и второй условный оператор, чтобы проверить, что ответ включает новые твиты.

if (err) вернуть консоль. ошибка ({twitterError: err}); if (твиты. статусы && твиты. статусы. длина) {}

Затем мы вырезали и вставляли функцию twilioClient.messages.create во второй блок условного кода, но мы меняем тело, чтобы включить текст твита. (Убедитесь, что вы удалили исходный вызов twilioClient.messages.create, иначе вы получите текст при каждом запуске скрипта.)

Итак, мы получаем:

if (твиты. статусы && твиты. статусы. длина) {twilioClient. Сообщения . create ({to: process. env. TWILIO_PERSONALNUMBER, from: process. env. TWILIO_TWILIONUMBER, body: `Уэс Бос только что написал о стикерах: $ {tweets. statuses [0]. text}`})}

Мы используем moment.now () для отслеживания метки времени Unix в наших журналах каждый раз, когда мы отправляем сообщение, поэтому у нас есть запись, которую мы можем проверить позже.

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

Мы делаем это с помощью функции коллекции MongoDB insertMany (). Нам не нужно беспокоиться о схемах данных в таком масштабе, поэтому мы просто вставим все полученные статусы.

, затем (msg => {console. log (`SMS с идентификатором: $ {msg. sid} отправлено с отметкой времени: $ {moment. now ()}`); collection. insertMany (твиты. статусы). then (done => {}). catch (err => console. error ({mongoInsertError: err}));}). catch (err => console. error ({twilioError: err}));

Теперь давайте запустим приложение. Сначала откройте второй терминал или командную строку, чтобы запустить базу данных MongoDB, запустив mongod, а затем в папке проекта запустите средство уведомления с сервером узлов. Вы должны увидеть сообщение об успехе при подключении к MongoDB и получить текст от Twilio, когда @wesbos пишет о наклейках во время работы приложения.

Вы можете сохранить его на своем компьютере, но, вероятно, лучше развернуть его на сервере, чтобы вы могли получать тексты Twilio в режиме реального времени. Вот как развернуть его на Heroku.

Развертывание в Heroku

Загрузите и установите Heroku CLI ,
Внутри вашей папки проекта инициализируйте Git из командной строки, запустив git init.

Подключиться к Heroku

После того, как вы установили интерфейс командной строки Heroku и инициализировали свой репозиторий, выполните следующие команды:

Вам будет предложено ввести адрес электронной почты и пароль, которые вы установили в своей учетной записи Heroku.

Heroku создаст случайное имя для вашего приложения, которое вы можете изменить позже в Heroku Dashboard , Это также добавит удаленный источник для вашего приложения.

Добавить переменные среды в производство

Для каждой переменной среды, которую мы сохранили в .env для нашей среды разработки, мы должны добавить ее в нашу производственную среду в Heroku.

Из командной строки выполните следующую команду, заменив ключи и значения на значения, которые мы сохранили ранее. Вы можете добавить все переменные окружения одной командой, разделив пары ключ / значение пробелом. Также не используйте кавычки до или после ваших значений:

Проверьте переменные среды

Убедитесь, что все ваши переменные хранятся с помощью команды:

Добавить, зафиксировать и нажать

Выполните следующие команды git подряд:

Это подготовит все ваши файлы для контроля версий.

git commit - m 'initial commit'

Это фиксирует ваши изменения на данный момент. При необходимости вы всегда можете откатить свой код до этой точки разработки в будущем. Команда -m позволяет добавить комментарий к этому коммиту. Поскольку это наш первый коммит, мы просто прокомментируем «первоначальный коммит».

Эта команда будет выполняться в течение нескольких секунд. На экране вы увидите процесс создания приложения узла на Heroku, и в итоге вам будет сказано, что процесс завершен !. На данный момент ваше приложение доступно в Интернете, и вы будете периодически получать текстовые сообщения всякий раз, когда Уэс Бос пишет в Твиттере о наклейках.

Если вы хотите увидеть эту работу прямо сейчас, вместо того, чтобы использовать ручку Уэса Боса в Твиттере, используйте свою собственную, а затем отправьте сообщение с наклейками со словами в тексте вашего сообщения. Вы получите SMS-сообщение в считанные секунды. Обязательно поменяйте его позже, чтобы вы могли получить свой собственный набор наклеек для ноутбука от Wes Bos.

Это работает?

Это работает

Мое приложение послужило мне хорошо. Я наконец-то получил наклейки от человека, мифа, легенды, Уэса Боса. Я получал тексты очень часто, так как тема наклеек была затронута, но я почти сразу получил объявление о том, что наклейки были выставлены на продажу, и я купил несколько из первых 100 упаковок, которые будут проданы. Теперь, когда у меня есть пара сладких наборов наклеек, я рад поделиться с вами своей техникой -> https://github.com/wesleylhandy/bos-stalker
Это помогло вам набрать несколько собственных стикеров? Я хотел бы услышать от вас!

Twitter: @wesleylhandy
Github: https://github.com/wesleylhandy
LinkedIn: https://www.linkedin.com/in/wesleylhandy/
Эл. адрес: [email protected]

Похожие

Как это делается: маринованные грибы
... и кладут приложения и специи - вручную, как на обычной кухне"> Сначала в банки кладут приложения и специи - вручную, как на обычной кухне .. Женщины на конвейере работают в резиновых перчатках. Измельченные морковь, лук, приправы насыпают мерной посудой - поочередно. Фото: Татьяна Донченко На современном производстве, которое соответствует европейским стандартам и экспортирует свою продукцию, многие процессы механизированы. Однако есть операции, которые все же выполняются
Проверьте! ? Приложения для велосипедов? который стоит иметь.
Приложения для велосипедов, которые стоит иметь. 4 (80%) 2 голоса В эпоху растущей популярности приложений для смартфонов не могло быть решений, предназначенных для любителей активного отдыха, путешественников и людей, которые любят активный отдых. Выбор действительно огромен, и нелегко найти те, которые действительно будут соответствовать нашим ожиданиям. Большинство приложений, благодаря GPS-приемнику, предлагают регистрацию маршрута, измерение средней скорости и количество
Создание сайтов и веб-приложений
Наша основная деятельность - это создание сайтов компаний и обширных сайтов. В большинстве случаев мы используем системы управления контентом (CMS), благодаря которым нашим клиентам не приходится нанимать обученный персонал для работы с веб-сайтами. Они могут сделать это сами и таким образом сэкономить деньги. Наши сайты
Как добавить или изменить подпись в Office 365 OWA
В этой статье я собираюсь показать вам, как создавать и редактировать подписи в почтовом клиенте Office 365. После входа в учетную запись Office 365 щелкните вкладку «Почта» в верхнем меню или на главной панели, чтобы включить Outlook Web App.
Как шпионить WhatsApp News
Описание: WhatsApp полностью изменил способ нашего общения. Однако для родителей и работодателей это усиленное общение может вызывать беспокойство. Дети могут получить доступ к неподходящим материалам и связаться с людьми, которые могут использовать их невиновность, а сотрудники могут тратить время на ненужные вещи, пока вы платите им за рабочее время. Давайте посмотрим на три лучших шпионских приложения для iPhone и Android, от которых я могу эффективно избавиться.
Как построить свой умный домашний хаб с Raspberry Pi
... исследовали несколько способов настроить умный дом, не полагаясь на Amazon, Google, Apple и другие большие пушки. Конечно, всеохватывающие голосовые команды великолепны и удобны, но не всем нравятся постоянно слушающие элементы Google Home и Amazon Echo. умные колонки , Аналогичным образом, некоторые люди не хотят, чтобы эти фирмы,
Места с Гарри Поттером - как посетить Хогвартс и сколько это стоит?
Сядьте на поезд Хогварт Экспресс, выпейте сливочное пиво в Pod Trzema Miotłami, постучите в дверь Хогвартса - о чем не мечтает поклонник Гарри Поттера? Это все возможно! Только для детей? Отсюда еще раз: книги Дж. К. Роулинг, изданные с 1990-х годов, похитили даже поколение сегодняшних 20-летних и 30-летних. Где именно места от Гарри Поттера? Мы приглашаем вас в путешествие.
Мы добавили курьера InPost от Allegro курьеров и InPost от Allegro курьера в административную панель вашей комп...
Мы добавили курьера InPost от Allegro курьеров и InPost от Allegro курьера в административную панель вашей компании, которую вы теперь можете сделать доступной для своих клиентов в качестве одного из способов доставки при совершении покупок через Allegro. Благодаря сотрудничеству с InPost, Allegro предлагает отправку посылок клиентам с помощью онлайн-аукционов по выгодным ценам. Покупатель может выбрать способ доставки из двух специализированных сервисов: Allegro Parcel Locker
Как увеличить покрытие WiFi дома?
Почему у роутера плохое покрытие WiFi? В начале мы представим наиболее распространенные причины плохого покрытия. Прежде всего, речь может идти о материале, из которого сделаны стены и потолок. В блоках, где стены сделаны из железобетона, проблемы с дальностью - настоящий кошмар. Но и в домах не лучше, если стены толстые, а комнат много. Другая проблема - помехи, вызванные другими сетями WiFi. Количество пользователей данной сети также важно. Качество роутера и нашей
Как использовать часы в Minecraft
Это руководство Minecraft объясняет, как использовать часы со скриншотами и пошаговые инструкции. В Minecraft вы можете использовать часы, чтобы узнать, какое сейчас время дня, когда вы работаете под землей или в помещении. Давайте рассмотрим, как использовать часы. Требуемые материалы В Minecraft это материалы, необходимые для использования часов: СОВЕТ: Вам нужен только элемент кадра, если вы хотите поставить часы на стену /
Настройка роутера не должна быть сложной
... идаю очень мало значения качеству мобильного оборудования. Хотя меня интересовало оборудование, в течение многих лет я был убежден, что маршрутизатор - это всего лишь коробка для продвижения сетей WiFi, и его производительность или дополнительные функции не нужны. Я обнаружил, что это неправда, когда я получил возможность использовать маршрутизатор D-Link DIR-865L. Содержимое коробки этого оборудования было стандартным и состояло из самого маршрутизатора,

Комментарии

Усилитель сигнала WiFi - как это работает?
Усилитель сигнала WiFi - как это работает? Если у вас большой дом, к сожалению, даже самый лучший маршрутизатор не может обрабатывать все закоулки с правильной скоростью передачи. В этом случае покупка и установка являются хорошим решением усилитель сигнала , Как работает усилитель сигнала? Расширитель диапазона получает сигнал от основного маршрутизатора,
Как это работает?
Как это работает? Разве Microsoft не ограничивает приложения для Windows 8? Когда Microsoft анонсировала Windows 8, они сказали, что существует три типа приложений для Windows 8. «Приложения Metro» имеют очень ограниченные возможности и должны распространяться через магазин приложений. Настольные приложения Windows работают нормально, но не могут работать в новом интерфейсе Metro (теперь «в стиле Windows 8»). Третий тип приложений - это «настольный браузер с поддержкой стиля Metro».
Как обычно в таких случаях, истина лежит где-то посередине, так как же это на самом деле?
Как обычно в таких случаях, истина лежит где-то посередине, так как же это на самом деле? Реклама в Google регулируется собственными законами. Прежде всего, это взимается за стоимость одной диверсии. Это означает, что чем больше бюджет, тем больше людей будет посещать наш сайт. Если мы сократим бюджет вдвое, шанс сохранить текущее количество перенаправлений будет незначительным. Вот как работает реклама Google, и это элемент, с которым нам определенно нужно смириться. Продукт за
6. Как создаются новые предложения Play?
Как работает интеграция IAI-Shop с услугами Allegro InPost?
Как работает интеграция IAI-Shop с услугами Allegro InPost? При оформлении заказа через Allegro заказчик выбирает курьера и, в случае услуг Allegro Paczkomaty InPost, личный пункт сбора (так называемый пункт блокировки посылок). Ваш магазин собирает заказ с помощью Allegro вместе с формой покупки (FOD) и на его основе обновляет данные о способе доставки. Генерация меток курьера и книги передач осуществляется так же, как и в случае стандартных услуг InPost, с той разницей,
Хорошо, так как он узнает, чтобы начать слушать прямо перед тем, как я собираюсь сказать «Хорошо, Google?
Хорошо, так как он узнает, чтобы начать слушать прямо перед тем, как я собираюсь сказать «Хорошо, Google?») «Это не имеет большого значения». (Компания Stealth устанавливает аудиослушатель, который слушает каждую комнату в мире, которую он может, и передает аудиоданные на корабль, когда он встречает неизвестный, возможно, индивидуально подобранный список ключевых слов - и это не страшно !?) «Вы можете отказаться , Это в Условиях предоставления услуг ». (Нет. Просто нет. Это не то, что является малейшим
Если вы находитесь в таком месте, как этот, вы иногда задаетесь вопросом, какова его история: с каких пор эта река течет, как поднимался этот песчаный холм?
Если вы находитесь в таком месте, как этот, вы иногда задаетесь вопросом, какова его история: с каких пор эта река течет, как поднимался этот песчаный холм? - Извините, у меня нет такой тенденции, но я знаю ответ на остальные ваши вопросы - ледник. - Согласен. Хотя, вероятно, было бы лучше сказать ледяной покров ... Жаль, однако, что у вас нет тенденции смотреть на вещи на расстоянии. Жаль ... К счастью, автор редко отдает предпочтение такой окраске своей лекции. Большая часть контента
Почему это должно быть способом сделать это?
Почему это должно быть способом сделать это? По словам Оперы, это единственный разумный путь. В противном случае гонка вооружений продолжится, что мы наблюдаем в некоторых случаях сегодня. Отдельные сайты используют антиблокирующую рекламу, поэтому создатели их блокирующих расширений создают антиблокирующую рекламу и так далее. Это не только пустая трата ресурсов, но и портит рынок ... нет, не только веб-сайты, но и сама реклама: количество показов растет, но также наиболее важным фактором является
Как вы всегда можете иметь это дома?
Как вы всегда можете иметь это дома? Просто добавьте ссылку https://customers.verisure.it/ на старте вашего Windows Phone, и веб-приложение портала клиентов будет доступно прямо на главной странице вашего смартфона. My Verisure был дополнен новыми функциями и графическим рестайлингом, который делает его более интуитивным и простым в управлении. Активируйте будильник, где бы вы ни были Вы путешествуете и забыли
Что мы делаем, чтобы это исправить?
Что мы делаем, чтобы это исправить? Мы внедряем дополнительные проверки в процессах генерации, проверки и обнаружения, чтобы предотвратить такие ошибки в будущем. С точки зрения снижения рисков Avast может передавать обновления для выбора контейнеров обнаружения. Однако этот конкретный тип обнаружения в настоящее время не включен в потоковые обновления. Мы также включим потоковую передачу для этого типа обнаружения, чтобы в будущем можно было быстрее удалить эти обнаружения. Заключение
Как работает ограниченный режим USB?
Как работает ограниченный режим USB? Хакеры работают, подключаясь к порту Lightning вашего iPhone через USB, так же, как вы подключаете iPhone к резервному копированию с помощью iTunes, но есть инструменты взлома паролей, которые используют этот порт для взлома вашего iPhone. После того, как вы включили ограниченный режим USB, ваш iPhone полностью отключит USB-доступ к iPhone, если ваш телефон не был разблокирован более часа, что исключает возможность атаки. СВЯЗАННЫЕ

Что, если бы вы могли создать приложение, которое отправляет вам SMS-уведомление только тогда, когда твит совпадает с продажей, которую вы на самом деле ищете?
Как мы можем избежать дублирования результатов?
Затем (твит => {const lastTweetId = твит && твит. hasOwnProperty ('id_str')?
Затем (tweet => const lastTweetId = tweet && tweet. hasOwnProperty ('id_str')?
Then (tweet => {const lastTweetId = tweet && tweet. hasOwnProperty ('id_str')?
Это работает?
Приложения для велосипедов?
Сядьте на поезд Хогварт Экспресс, выпейте сливочное пиво в Pod Trzema Miotłami, постучите в дверь Хогвартса - о чем не мечтает поклонник Гарри Поттера?
Только для детей?
Где именно места от Гарри Поттера?