Создание сообщества в Slack

2015-10-07

Цель создании сообщества в Slack – расширение кругозора, освоение новых инструментов, знакомство с единомышленниками, прокачка коммуникационных и письменных навыков. Да и просто хочется сделать что то полезное для общества.

Мне было бы очень интересно прочитать про местные проекты или проекты в которых участвовали или участвуют разработчики из группы. И чтобы положить начало напишу о создании http://tasdev.uz.

image00

Мне нравится пользоваться Slack. Мы его используем в своей компании и плотно интегрировали с другими инструментами и сервисами. Узнав об использовании Slack в качестве платформы для сообщества, я загорелся идеей объединить ташкентских (узбекистанских) разработчиков в нем. Есть группа в ФБ – я про нее помню. Но считаю Slack более удобным. О нем подробнее можно найти тонны статей в интернет. По мимо факта появления платформы для общения – мне было интересно ее создать (техническую часть). Для себя я увидел возможности попробовать различные инструменты, технологии – покупка и управление доменом, хостинг, опросники, автоматизация и т.д. и т.п.

Первым делом я просмотрел различные сообщества (помог в этом список из статьи на medium – https:[email protected]/an-incomplete-list-of-communities-on-slack-1b1b6f157bda). Нашел пачку статей о том как это здорово (сообщество в Slack).

Так как каждая из компонент независима друг от друга я начал со Slack.

Создание команды в Slack

image01

Процесс до боли прост. Проходите по ссылке https://slack.com/create, придумываете имя, заводите себе учетку и все. Но в Slack нет самостоятельной регистрации или запросов на вступление в существующую команду (на самом деле есть, например всем пользователям с email заканчивающимся на @yourdomain.com). Поэтому придется приглашать пользователей самостоятельно – высылая инвайты на почту. Но для этого необходимо получить почтовые адреса желающих вступить в группу и пригласить их вручную.
image03

Как говорится, у программиста должна быть мантра – “Можно ли сделать лучше?”.

Slack API

Slack предоставляет API на все случаи жизни. Но к сожалению в документации нет ничего про приглашение пользователей в команду. Благодаря статье – https://levels.io/slack-typeform-auto-invite-sign-ups – нашел как это сделать. Панель управления так же использует свой API. Посмотрев, что происходит во время приглашения – можно увидеть скрытые разделы.
image05

Приглашая пользователя – посылается POST запрос по адресу

https://tashkentdeveloper.slack.com/api/users.admin.invite?t=1443899008

с передаваемыми полями:

Отлично! Далее необходимо собирать почтовые адреса.

Сбор почтовых адресов через Typeform

image04

У существующих сообществ популярен сервис для создания опросов – Typeform. Функциональный, модный, но дорогой. Благо есть бесплатный план – со своими ограничениями конечно же (не очень удобными для нас правда).

Typeform – это новый сервис для создания обратной связи, опросов и прочих форм. Имеет бесплатный план. Для моей задумки он позволит мне бесплатно собирать почтовые адреса (и прочую информацию) людей желающих вступить в сообщество. Я могу просматривать собранные данные через панель управления или же, самое главное, используя API.

image06

API позволяет получать список ответов с различными фильтрами. Мне были интересны только новые, не обработанные мной, ответы.

Запрос выглядит следующим образом

https://api.typeform.com/v0/form/FormUID?key=ApiKey&completed=true&offset=0

где

image02

Ответы возвращаются в JSON, который остается распарсить, чтобы получить список новых запросов.

Собираем все кусочки вместе

Наиболее удобным способом для получения данных запросов и обработки их – мне показалось написание bash-скрипта.

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


TYPEFORM_API_KEY=
TYPEFORM_FORM_ID=pS0B3D

SLACK_API_TOKEN=xoxp-xxxxx
SLACK_TEAM_NAME=tashkentdevelopers

Далее необходимо получить список пользователей заполнивших нашу форму. Получать каждый раз одних и тех же пользователей не имеет смысла. Поэтому обработанные записи я записываю в файл processed_list. Одна заявка = одна строка. В запросе к Typeform – выставляю offset равный количеству строк в файле processed_list. И выполняю запрос с помощью curl.


# Getting number of processed requests
processed_number=0
[[ -f processed_list ]] && processed_number=`wc -l < processed_list`

# Getting rew requests
data=`curl -s "https://api.typeform.com/v0/form/${TYPEFORM_FORM_ID}?key=${TYPEFORM_API_KEY}&completed=true&offset=${processed_number}&limit=100"`

Результат получаю в JSON. Который парсится с помощью утилиты jq (http://stedolan.github.com/jq). Пробегаю по каждой записи, выкусываю адрес и имя и посылаю запрос в Slack. Так же каждый обработанную заявку записываю в processed_list.

Результат ответа Slack – записываю в лог (это помогло выловить различные ошибки, которые не учел в самом начале).


# Extracting emails and seding invites
emails_number=`echo $data | jq '.responses | length'`
for (( i = 0; i < $emails_number; i++ )); do
 email=`echo $data | jq -r ".responses[${i}].answers.email_10536843"`
 firstname=`echo $data | jq -r ".responses[${i}].answers.textfield_10536841"`
 lastname=`echo $data | jq -r ".responses[${i}].answers.textfield_10536842"`

 echo "Inviting $firstname $lastname <$email> - to Slack"

 # Inviting new member
 response=`curl -s "https://${SLACK_TEAM_NAME}.slack.com/api/users.admin.invite" --data "email=${email}&first_name=${firstname}&last_name=${lastname}&token=${SLACK_API_TOKEN}&set_active=true"`

 # Saving processed request
 echo "$email|$first_name|$last_name" >> processed_list

 # Log invition result
 echo "$email : $response" >> log
done

Ну и чтобы не было совсем никакой ручной работы – добавил скрипт в cron на компьютере запущенном 24×7 для выполнения каждые 5 минут.

*/5 * * * * /opt/slack_autoinvite/process_requests.sh

Теперь для вступления в сообщество нужно только заполнить форму и приглашение придет в течении 5 минут.

UPDATES

Comments

comments