Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,5 @@ Pipfile.lock
geckodriver.log
.env
screenshots
private_key.pem
public_key.pem
1 change: 1 addition & 0 deletions databags/meetup_gql.json

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions netlify.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[build]
environment = { PYTHON_VERSION = "3.13" }
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ MarkupSafe==2.1.5
mccabe==0.7.0
mistune==0.8.4
platformdirs==4.3.6
PyJWT==2.9.0
pylint==3.2.7
python-slugify==8.0.4
pytz==2023.3.post1
Expand Down
30 changes: 15 additions & 15 deletions scripts/create_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def extract_meetup_json(file):
return events


def transform_event(event: dict):
def transform_event(event_node: dict):
"""
Transforma un evento de Meetup en un diccionario ordenado con los campos necesarios.

Expand All @@ -38,20 +38,17 @@ def transform_event(event: dict):
Returns:
OrderedDict: Diccionario ordenado con los campos transformados.
"""
event = event_node['node']
content = OrderedDict()
content["title"] = event["name"]
content["date_start"] = f"{event['local_date']} {event['local_time']}"
content["link"] = event["link"]
content["title"] = event["title"]
content["date_start"] = event['dateTime']
content["link"] = event["eventUrl"]
content["information"] = event["description"]
try:
content["featured_photo"] = event["featured_photo"]["photo_link"]
except KeyError:
print("Key error: featured_photo on", event["name"])
try:
content["venue"] = event["venue"]["name"]
content["address_1"] = event["venue"]["address_1"]
except KeyError:
print("Key error: venue on", event["name"])
if event["featuredEventPhoto"]:
content["featured_photo"] = event["featuredEventPhoto"]["standardUrl"]
if event["venues"] and len(event["venues"])>0:
content["venue"] = event["venues"][0]["name"]
content["address_1"] = event["venues"][0]["address"]
return content


Expand Down Expand Up @@ -89,6 +86,9 @@ def load_events(event_list):


if __name__ == "__main__":
event_data = extract_meetup_json("databags/meetup.json")
transformed_events = [transform_event(event) for event in event_data["past_events"]]
event_data = extract_meetup_json("databags/meetup_gql.json")
transformed_events = [
transform_event(event)
for event in event_data["data"]["groupByUrlname"]["past_events"]["edges"]
]
load_events(transformed_events)
52 changes: 52 additions & 0 deletions scripts/get_events.graphql
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@

query ($group: String!) {
groupByUrlname(urlname: $group) {
name
description
future_events: events(status: ACTIVE, sort: DESC) {
edges {
node {
id
title
dateTime
eventUrl
description
featuredEventPhoto {
standardUrl
}
venues {
name
address
}
}
}
totalCount
pageInfo {
hasNextPage
}
}
past_events: events(status: PAST, sort: DESC) {
edges {
node {
id
title
dateTime
eventUrl
description
featuredEventPhoto {
standardUrl
}
venues {
name
address
}
}
}
totalCount
pageInfo {
hasNextPage
}
}
}
}

65 changes: 65 additions & 0 deletions scripts/graphql_api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
"""Descarga eventos usando Meetup api usando la api graphql"""

import os
import json
import jwt
import requests
from lektor.utils import slugify
from dotenv import load_dotenv

load_dotenv()

# Load environment variables
CLIENT_ID = os.getenv("MEETUP_CLIENT_ID")
AUTHORIZED_MEMBER_ID = os.getenv("MEETUP_MEMBER_ID")
SIGNING_KEY_ID = os.getenv("MEETUP_SIGNING_KEY_ID")
MEETUP_API_URL = "https://api.meetup.com/gql-ext"
GROUP_URLNAME = os.getenv("MEETUP_GROUP_URLNAME")
PRIVATE_KEY = os.getenv("MEETUP_PRIVATE_KEY")

# Load from .pem if ENV variable MEETUP_PRIVATE_KEY does not exists
if PRIVATE_KEY is None:
with(open('private_key.pem', "r", encoding='UTF-8')) as file:
PRIVATE_KEY = file.read()

# Generate JWT Token
payload = {
"iss": CLIENT_ID,
"sub": AUTHORIZED_MEMBER_ID,
"aud": "api.meetup.com",
"exp": 120
}

JWT_TOKEN = jwt.encode(
payload,
PRIVATE_KEY,
algorithm="RS256",
headers={"kid": SIGNING_KEY_ID}
)

with(open('scripts/get_events.graphql', "r", encoding='UTF-8')) as file:
query = file.read()

# Send Request to Meetup API
headers = {"Authorization": f"Bearer {JWT_TOKEN}"}
payload = {"query": query, "variables": {"group": GROUP_URLNAME}}
response = requests.post(MEETUP_API_URL, json=payload, headers=headers, timeout=20000)
data = response.json()

# Print Fetched Event Data (Instead of Writing to Files)
for event in data["data"]["groupByUrlname"]["past_events"]["edges"]:
event_data = event["node"]
slug = f"{event_data['dateTime'][:10]}-{slugify(event_data['title'])}"
print(f"https://pybaq.co/eventos/{slug}")
print(f"Slug: {slug}")
print(f"Event ID: {event_data['id']}")
print(f"Titulo: {event_data['title']}")
print(f"Fecha: {event_data['dateTime']}")
print(f"URL: {event_data['eventUrl']}")
print(f"Imagen: {event_data['featuredEventPhoto']}")
print(f"Descripción: {event_data['description']}")
print(f"Lugar: {event_data['venues']}")
print("-" * 40) # Separator for readability

with open("databags/meetup_gql.json", "w", encoding="utf-8") as outfile:
outfile.write(json.dumps(data))