Python

Среда разработки

Для создания бота потребуется настроить нашу среду разработки и установить необходимые библиотеки и инструменты.
Что нам понадобится: 

  • Python 3
  • virtualenv — среда разработки
  • Requests library — библиотека для удобной работы с http
  • Tweepy — API обёртка для Twitter
  •  json — встроенная библиотека для работы с json
  • time module — встроенная библиотека для работы со временем

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

Создадим директорию для бота:

mkdir twitter_bot                
cd twitter_bot

Следующим шагом создаём саму виртуальную среду. Назовём её environment. При выборе названия учитывайте, что оно должно состоять из строчных букв, без пробелов и специальных символов.

python3 -m venv environment

Перейдём в директорию бота:

cd twitter_bot

Активируем виртуальную среду:

environment\Scripts\activate

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

Теперь установим библиотеки. Создадим файл requirements.txt со списком компонентов, которые впоследствии установим командой pip install. В нашем случае, создадим новый файл в директории бота и сохраним его. Содержимое файла должно быть таким:

tweepy
requests

В командной строке наберите следующую команду для установки пакетов:

pip install -r requirements.txt

В выводе командной строки можно наблюдать процесс установки библиотек Tweepy и requests. Как только загрузка завершится, перейдём к следующему шагу создания нашего бота.

Создание бота

Код нашего бота будет разбит на две функции, каждая из которых выполняет отдельную задачу: первая подключается к API генератора случайных цитат, а вторая публикует твиты.

Создадим новый файл и назовём его twitter_bot.py. После, импортируем библиотеки, которые пригодятся в реализации функции.

import requests    # an http library written for humans

Библиотека requests упрощает использование http в нашей программе. К слову, для работы с этим протоколом, она гораздо удобнее встроенной urllib.

Перед тем, как продолжить писать код, создадим RapidAPI аккаунт, чтобы получить api_key иapi_url.

Перейдите на страницу Andrux API и нажмите на connect GET Endpoint для того чтобы мы могли использовать сервис для получения рандомных цитат.

Как сказано в документации RapidAPI, нужно создать словарь с названием headers, который содержит api_key и api_key.

Создание переменных для api_key и api_url:

api_key = your unique api key in the X-Mashape-Key field (see diagram)
api_url = https:// the url in the X-Mashape-Host field (see diagram)

headers = {'X-Mashape-Key' : api_key, 'X-Mashape-Host' : api_url}

В этом узле мы будем использовать библиотеку requests для взаимодействия с API.

quotes = requests.get(api_url, headers=headers)

print(quotes.json())

Можно запустить код из терминала:

python twitter_bot.py

Так будет выглядеть ответ на запрос json:

[{quote:"As God is my witness, I'll never be hungry again."
author:"Gone With the Wind"
category:"Movies"}]

Создадим нашу первую функцию и назовём её get_quote(). Она выглядит вот так:

def get_quote():
headers = {'X-Mashape-Key': api_key, 'X-Mashape-Host': api_url}
response = requests.get(api_url, headers=headers)
json = response.json()[0]
tweet = json['quote']+ '-' + json['author']
return tweet

Ответ response.get передаём в переменную response:

response = requests.get(api_url, headers=headers)

Ответ необходимо декодировать:

response.json()

Результат выполнения функции будет отправлен в переменную с названием json.

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

def get_quotes():
headers = {'X-Mashape-Key': api_key, 'X-Mashape-Host': api_url}
response = requests.get(api_url, headers=headers)
json = response.json()[0]
tweet = json['quote']+ ' -' + json['author']
return tweet

Мы написали почти половину кода для нашего бота. Теперь перейдём к созданию функции для публикации твитов.

Нужно зарегистрировать Twitter API для получения ключа.

Перейдите на apps.twitter.com и войдите в аккаунт. Затем нажмите на Create New App.

Заполните форму.

Нажмите на ‘Manage Keys and Access Tokens’, затем на Regenerate Consumer Key and Secret или на Regenerate My Access Token and Token Secret для того, чтобы увидеть информацию, которая не показана на странице.

Создайте следующие переменные в вашем коде:

consumer_key = YOUR CONSUMER KEY
consumer_secret = YOUR CONSUMER SECRET
access_token = YOUR ACCESS TOKEN
access_token_secret = YOUR ACCESS TOKEN SECRET

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

Следующим шагом мы импортируем Tweepy:

import tweepy


# Twitter requires oAuth2 to access its API:
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

Для того, чтобы опубликовать запись в Twitter, используем метод update_status:

api.update_status('Hello world') # This will update our timeline with "Hello world"

В нашем случае, аргументом функции будет значение, возвращённое функцией get_quote.

tweet = get_quote()
api.update_status(tweet)
print(‘Done’) # This prints ‘Done’ whenever the update is successful

Нижеприведённые строчки кода должны быть в функции tweet_quote.

def tweet_quote():
tweet = get_quote()
status = api.update_status(tweet)
print(status.id)

Наконец, мы можем вызвать функцию из тела программы:

tweet_quote()

Тестирование и развёртывание бота

Для тестирования корректности работы запустим программу из командной строки. Не забудьте удостовериться, что компьютер подключен к интернету. Бот работает, когда вы увидите Done в командной строке.

cd twitter_bot

Активируйте виртуальную среду:

python twitter_bot.py

twitter_bot.py— название нашего скрипта. Вышеприведённая команда запустит скрипт и выведет id твита в командную строку.
Для развёртывания нашего бота создадим аккаунт в PythonAnywhere, сервисе, который позволяет развёртывать приложения на Python в облаке.

После входа вы попадёте на страницу Dashboard. Выберите вкладку файлы.

Следующая страница будет выглядеть так. Загрузите ваш скрипт.

Для того, чтобы создать расписание работы нашей программы, кликнете на Tasks и создайте новую задачу. Задайте время работы и укажите путь к файлу, который, скорее всего, будет таким: /home/<your username>/twitter_bot.py.

Что дальше?

Вуаля! Мы создали функционирующий бот для Twitterа. Теперь мы можем усовершенствовать его, чтобы он отправлял твиты не по-одному, а несколько за раз. Также, мы можем разработать бота, который будет использовать News API для публикации новостей. Рекомендую вам поиграться с RapidAPI и Tweepy, чтобы найти ещё больше интересных идей для реализации.

Перевод статьи Iyanu Ashiri: Build and Deploy Twitter Bots with Python, Tweepy and PythonAnywhere

Предыдущая статьяЦикл For…of в JavaScript
Следующая статьяМного узлов, одна распределенная система