Compare commits

...

3 Commits

@ -1,6 +1,13 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
"""
Detta är ELAB:s Slack-app.
# Detta skript ska sitta bakom HTTPS och lyssna på anrop från Slack. (Kör "ngrok http 8000" för att få en tillfällig proxy för testning.) Lägg till "/slack/events" till den resulterande HTTPS-URL:en och använd som Request URL på <https://api.slack.com/apps/AN6HH95ML/event-subscriptions>. Den har för närvarande i uppgift att göra "affiliate links" av Banggood-länkar.
"""
# Detta skript ska sitta bakom HTTPS och lyssna på anrop från Slack. (Kör
# "ngrok http 8000" för att få en tillfällig proxy för testning.) Lägg till
# "/slack/events" till den resulterande HTTPS-URL:en och använd som Request URL
# på <https://api.slack.com/apps/AN6HH95ML/event-subscriptions>.
from slackeventsapi import SlackEventAdapter from slackeventsapi import SlackEventAdapter
from slackclient import SlackClient from slackclient import SlackClient
@ -10,58 +17,80 @@ from furl import furl
import requests import requests
import extruct import extruct
import html import html
import locale
def make_affiliate(url): def make_affiliate(url):
"""Tar en Banggood-URL och gör den till ELAB:s."""
u = furl(url) u = furl(url)
# Lägg in ELABs ID. Egentligen vill vi skriva över endast parametern `p`, men för att komma runt en bugg med &-tecken rensar vi tills vidare bort alla parametrar. <https://github.com/slackapi/python-slack-events-api/issues/49> # Lägg in ELABs ID. Egentligen vill vi skriva över endast parametern `p`,
# men för att komma runt en bugg med &-tecken rensar vi tills vidare bort
# alla parametrar.
# <https://github.com/slackapi/python-slack-events-api/issues/49>
# u.args['p'] = 'ZT07151453182201504Y' # u.args['p'] = 'ZT07151453182201504Y'
u.args = {'p': 'ZT07151453182201504Y'} u.args = {'p': 'ZT07151453182201504Y'}
return str(u) return str(u)
def unfurl(url): def unfurl(url):
page = requests.get(url).text.replace('};', '}') # Ett semikolon hos Banggood kraschar extruct och måste plockas bort. <https://github.com/scrapinghub/extruct/issues/109> """Skapar en presentation (rubrik, bild osv.) av en länk."""
# Ett semikolon hos Banggood kraschar extruct och måste plockas
# bort. <https://github.com/scrapinghub/extruct/issues/109>
page = requests.get(url).text.replace('};', '}')
ld = extruct.extract(page, syntaxes=['json-ld'])['json-ld'][0] ld = extruct.extract(page, syntaxes=['json-ld'])['json-ld'][0]
desc = ld['description'] # Banggood verkar ha HTML-kodat den här strängen av slentrian, fast de nog
title = html.unescape(ld['name']) # Banggood verkar ha HTML-kodat den här strängen av slentrian, fast de nog inte borde göra så. Vi avkodar. # inte borde göra så. Vi avkodar.
title = html.unescape(ld['name'])
image = ld['image'] image = ld['image']
currency = ld['offers']['priceCurrency'] currency = ld['offers']['priceCurrency']
if currency == 'SEK': if currency == 'SEK':
currency = 'kr' currency = 'kr'
price = ld['offers']['price'] + '' + currency # Formateringsinstruktionen "n" ger oss decimaltecken enligt aktuell
# locale.
price = f'{float(ld["offers"]["price"]):n}' + '' + currency
return {'fallback': title + ' <' + url + '>', return {'fallback': title + ' <' + url + '>',
'color': '#cf8e00', # ELAB-orange 'color': '#cf8e00', # ELAB-orange
#'pretext': 'Optional text that appears above the attachment block', # 'pretext': 'Text that appears above the attachment block',
'author_name': 'Banggood', 'author_name': 'Banggood',
'author_link': make_affiliate('https://banggood.com/'), 'author_link': make_affiliate('https://banggood.com/'),
'author_icon': 'https://www.banggood.com/favicon.ico', 'author_icon': 'https://www.banggood.com/favicon.ico',
'title': title, 'title': title,
'title_link': url, 'title_link': url,
#'text': desc, # Utelämnas eftersom denna sträng från Banggood nästan aldrig innehåller något vettigt. # Utelämnas eftersom denna sträng från Banggood nästan aldrig
#'text': price, # innehåller något vettigt.
# 'text': ld['description'],
'fields': [{'title': 'Pris', 'fields': [{'title': 'Pris',
'value': price, 'value': price,
'short': True}], 'short': True}],
#'image_url': image, # Visas som stor bild, vilket tar för mycket plats. # Visas som stor bild, vilket tar för mycket plats.
# 'image_url': image,
'thumb_url': image, 'thumb_url': image,
'footer': 'Använd denna länk för att gynna ELAB.', 'footer': 'Använd denna länk för att gynna ELAB.',
'footer_icon': 'https://www.elab.kth.se/static/favicon.png', 'footer_icon': 'https://www.elab.kth.se/static/favicon.png',
#'ts': 123456789 # Endast om informationen är knuten till en viss tidpunkt # Endast om informationen är knuten till en viss tidpunkt
# 'ts': 123456789
} }
# Our app's Slack Event Adapter for receiving actions via the Events API # Our app's Slack Event Adapter for receiving actions via the Events API
slack_signing_secret = os.environ['SLACK_SIGNING_SECRET'] # <https://api.slack.com/apps/AN6HH95ML/general> # Signing token: <https://api.slack.com/apps/AN6HH95ML/general>
slack_events_adapter = SlackEventAdapter(slack_signing_secret, '/slack-eggberg/events') slack_signing_secret = os.environ['SLACK_SIGNING_SECRET']
slack_events_adapter = SlackEventAdapter(slack_signing_secret,
'/slack-eggberg/events')
# Create a SlackClient for your bot to use for Web API requests # Create a SlackClient for your bot to use for Web API requests
token = os.environ['SLACK_TOKEN'] # Börjar med "xoxp-". <https://api.slack.com/apps/AN6HH95ML/oauth> # Slack token börjar med "xoxp-". <https://api.slack.com/apps/AN6HH95ML/oauth>
token = os.environ['SLACK_TOKEN']
slack_client = SlackClient(token) slack_client = SlackClient(token)
# Prenumerera på eventet `link_shared`. # Prenumerera på eventet `link_shared`.
@slack_events_adapter.on('link_shared') @slack_events_adapter.on('link_shared')
def link_shared(event_data): def link_shared(event_data):
"""Anropas när någon har postat en länk i Slack."""
urls = [link['url'] for link in event_data['event']['links']] urls = [link['url'] for link in event_data['event']['links']]
unfurls = json.dumps({url: unfurl(make_affiliate(url)) unfurls = json.dumps({url: unfurl(make_affiliate(url))
for url in urls}) for url in urls})
@ -71,5 +100,9 @@ def link_shared(event_data):
ts=event_data['event']['message_ts'], ts=event_data['event']['message_ts'],
unfurls=unfurls) unfurls=unfurls)
# Sätt locale (för att få komma som decimaltecken).
locale.setlocale(locale.LC_ALL, '')
# Starta en server med endpointen `/slack/events`. # Starta en server med endpointen `/slack/events`.
slack_events_adapter.start(port=8000) slack_events_adapter.start(port=8000)

@ -0,0 +1,6 @@
#!/usr/bin/env bash
DIR="$(readlink -f "${BASH_SOURCE%/*}")"
cd "${DIR}"
flake8 && pydocstyle
Loading…
Cancel
Save