Экспорт событий Meetup.com на сайт Github Pages Jekyll

Я помогаю руководить Omaha Java Users Group, и долгое время наше общение происходило через meetup.com/omahajava/, однако у нас также есть сайт ojug.org. Сначала мы аккуратно копировали события и на Meetup, и на OJUG.org, но через несколько месяцев вы увидите, что мы просто перестали дублировать усилия, и события на ojug.org быстро устарели. В то время это не было большой проблемой. Но было бы неплохо архивировать наши прошлые мероприятия на сайте ojug.org (особенно в связи с тем, что мы изучаем альтернативы Meetup.com в ближайшем будущем [1]).

(если вы хотите TL&DR: смотрите все подробности на https://github.com/jeffsheets/ojug-meetup-export).

Экспорт событий с Meetup.com

Первым шагом было найти способ экспортировать наши прошлые события. Я надеялся на экспорт в CSV через пользовательский интерфейс администратора, но ничего не увидел. Затем я подумал, что для этого может потребоваться веб-скрейпинг или, возможно, просмотр api вызовов инструментов разработки сети. Но заметил, что в пользовательском интерфейсе администратора есть серая настройка для Meetup API 🤔. Быстрое гугление нашло страницу Meetup GraphQL API Playground. И к моему удивлению, отправка тестового запроса сработала! 🎉

После небольших проб и ошибок из их документации по API и увеличения количества результатов до 100, чтобы получить все наши события без постраничного просмотра, я смог экспортировать все прошедшие события в JSON:

  query($meetupId: String!) {
    groupByUrlname(urlname: $meetupId) {
      description
      pastEvents(input: {first: 100}) {
        count
        edges {
          node {
            title
            description
            dateTime
            going
          }
        }
      }
    }
  }
Войти в полноэкранный режим Выйти из полноэкранного режима

И несколько входов:

  {"meetupId":"omahajava"}
Войти в полноэкранный режим Выйти из полноэкранного режима

Что дало хороший результат в формате JSON, например, такой:

{
    "data": {
      "groupByUrlname": {
        "description": "Omaha's Java User Group [@omahajug](https://twitter.com/omahajug/). yadda yadda yadda",
        "pastEvents": {
          "count": 65,
          "edges": [
            {
              "node": {
                "title": "Angular JS for Java Developers",
                "description": "This month //etc etc etc",
                "dateTime": "2014-05-20T17:30-05:00",
                "going": 27
              }
            },
.....
Ввести полноэкранный режим Выход из полноэкранного режима

Технологии ojug.org

Прежде чем показать вам, как генерируются страницы с записями в блоге мероприятия, небольшое замечание о технологии ojug.org (src на https://github.com/OJUG/ojug.github.io). Он работает на стандартном стеке рабочих процессов Github Pages Jekyll. Хотя у нас есть мысли перенести его на 11ty, пока что Jekyll работает нормально. Создайте новый файл с разметкой в папке _posts, слейте его в основную ветку, и рабочий процесс автоматически запустится и заново развернет наш сайт ojug.org, как по волшебству.

Генерация постов Jekyll о мероприятиях Meetup

Учитывая это, блогу нужны .md файлы, созданные для каждого события в JSON событий. Используя немного Groovy, это было сделано довольно быстро с помощью шаблона GSP, некоторых функций для украшения форматов дат и функции создания имени файла. Шаблон groovy post.gsp выглядит следующим образом:

---
layout: post
title: " "<%= longDate %> <%= title %>""
---

<%= description %>

(This past event was exported from Meetup.com)
(<%= attended %> people had RSVP'd to this event in Meetup)
Вход в полноэкранный режим Выход из полноэкранного режима

Затем код, который генерирует шаблон для каждого события JSON, находится в PostGenerator.groovy:

    void generatePosts() {
        def events = new JsonSlurper().parse(getClass().getResource(SRC_JSON)).data.groupByUrlname.pastEvents.edges
        events.each {
            def event = it.node
            def filename = makeFilename(event.title, event.dateTime)
            def outfile = new File("$DEST_FOLDER/$filename")
            def filecontents = new SimpleTemplateEngine()
                    .createTemplate(getClass().getResource('/post.gsp'))
                    .make([
                            title      : event.title.replaceAll('"', '"'),
                            description: event.description,
                            longDate   : convertToLongDate(event.dateTime),
                            attended   : event.going
                    ])
                    .toString()
            outfile.write filecontents
        }
    }
Войти в полноэкранный режим Выйти из полноэкранного режима

При выполнении в выходном каталоге генерируются красивые markdown файлы, похожие на 2014-05-20-angular-js-for-java-developers.md:

---
layout: post
title:  "May 20, 2014 Angular JS for Java Developers"
---

This month //etc etc etc

(This past event was exported from Meetup.com)
(27 people had RSVP'd to this event in Meetup)
Войти в полноэкранный режим Выход из полноэкранного режима

Последним шагом было скопировать все новые файлы разметки в каталог _posts, создать PR, объединить их и посмотреть окончательные результаты на ojug.org!

Подведение итогов

Вот и все! Написание этого поста, вероятно, заняло больше времени, чем процесс экспорта Meetup в JSON и создание новых файлов разметки для блога Jekyll! Вы можете просмотреть все исходники на моем github по адресу https://github.com/jeffsheets/ojug-meetup-export.

[1] — Небольшая сноска о Meetup.com… За годы существования Meetup отлично зарекомендовал себя для рекламы нашей группы, привлечения новых членов, отличного пользовательского интерфейса и простого сбора RSVP для мероприятий. Нам всегда везло на отличных спонсоров, которые оплачивали постоянно растущий взнос, который сейчас составляет $197,98 в год. Однако решение Meetup не позволить нам (или любой другой группе) «заморозить» аккаунт означает, что наш спонсор уже 2,5 года платит этот взнос без какой-либо пользы. Поговорив с другими организаторами местных технологических встреч, стало очевидно, что многие из нас размышляют о том, как освободиться от этих сборов. Наши спонсоры могли бы устраивать отличные вечеринки для групп пользователей за счет сэкономленных средств! Однако нам придется повторить множество функций, поэтому я оставлю это обсуждение на другой раз…

Оцените статью
devanswers.ru
Добавить комментарий