commit 984c64dbb7402e4f9187011bc8e824f11d9cd0ed Author: Jonas Olson Date: Sat Sep 7 19:57:53 2019 +0200 ELAB:s Slack-app. Första version. Denna app gör unfurls av Banggood-länkar i Slack till "affiliate links" som ger ELAB en slant. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b25c15b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*~ diff --git a/eggberg.py b/eggberg.py new file mode 100755 index 0000000..9a85351 --- /dev/null +++ b/eggberg.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 + +# 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 tesning.) Lägg till "/slack/events" till den resulterande HTTPS-URL:en och använd som Request URL på . + +from slackeventsapi import SlackEventAdapter +from slackclient import SlackClient +import os +import json +from furl import furl +import requests +import extruct +import html + +def make_affiliate(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. + #u.args['p'] = 'ZT07151453182201504Y' + u.args = {'p': 'ZT07151453182201504Y'} + + return str(u) + +def unfurl(url): + page = requests.get(url).text.replace('};', '}') # Ett semikolon hos Banggood kraschar extruct och måste plockas bort. + + ld = extruct.extract(page, syntaxes=['json-ld'])['json-ld'][0] + desc = ld['description'] + 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. + image = ld['image'] + currency = ld['offers']['priceCurrency'] + if currency == 'SEK': + currency = 'kr' + price = ld['offers']['price'] + ' ' + currency + + return {'fallback': title + ' <' + url + '>', + 'color': '#cf8e00', # ELAB-orange + #'pretext': 'Optional text that appears above the attachment block', + 'author_name': 'Banggood', + 'author_link': make_affiliate('https://banggood.com/'), + 'author_icon': 'https://www.banggood.com/favicon.ico', + 'title': title, + 'title_link': url, + #'text': desc, # Utelämnas eftersom denna sträng från Banggood nästan aldrig innehåller något vettigt. + #'text': price, + 'fields': [{'title': 'Pris', + 'value': price, + 'short': True}], + #'image_url': image, # Visas som stor bild, vilket tar för mycket plats. + 'thumb_url': image, + 'footer': 'Använd denna länk för att gynna ELAB.', + 'footer_icon': 'https://www.elab.kth.se/static/favicon.png', + #'ts': 123456789 # Endast om informationen är knuten till en viss tidpunkt + } + +# Our app's Slack Event Adapter for receiving actions via the Events API +slack_signing_secret = os.environ['SLACK_SIGNING_SECRET'] # +slack_events_adapter = SlackEventAdapter(slack_signing_secret, '/slack/events') + +# Create a SlackClient for your bot to use for Web API requests +token = os.environ['SLACK_TOKEN'] # Börjar med "xoxp-". +slack_client = SlackClient(token) + +# Prenumerera på eventet `link_shared`. +@slack_events_adapter.on('link_shared') +def link_shared(event_data): + urls = [link['url'] for link in event_data['event']['links']] + unfurls = json.dumps({url: unfurl(make_affiliate(url)) + for url in urls}) + + slack_client.api_call('chat.unfurl', + channel=event_data['event']['channel'], + ts=event_data['event']['message_ts'], + unfurls=unfurls) + +# Starta en server med endpointen `/slack/events`. +slack_events_adapter.start(port=8000) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..bd2ca2f --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +slackeventsapi ~= 2.1 +slackclient ~= 1.3 +furl ~= 2.0 +extruct ~= 0.7 +requests ~= 2.21