|  |  | #!/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å <https://api.slack.com/apps/AN6HH95ML/event-subscriptions>.
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 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. <https://github.com/slackapi/python-slack-events-api/issues/49>
 | 
						
						
						
							|  |  |     #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. <https://github.com/scrapinghub/extruct/issues/109>
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     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'] # <https://api.slack.com/apps/AN6HH95ML/general>
 | 
						
						
						
							|  |  | 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-". <https://api.slack.com/apps/AN6HH95ML/oauth>
 | 
						
						
						
							|  |  | 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)
 |