@ -1,6 +1,9 @@
#!/usr/bin/env python3
#!/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 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>.
# 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
@ -12,57 +15,72 @@ import extruct
import html
import html
import locale
import locale
def make_affiliate ( url ) :
def make_affiliate ( url ) :
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>
# 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 '
# Formateringsinstruktionen "n" ger oss decimaltecken enligt aktuell
# locale.
price = f ' { float ( ld [ " offers " ] [ " price " ] ) : n } ' + ' ' + currency
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 t ext that appears above the attachment block',
# 'pretext': 'T ext 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
}
}
# Sätt locale (för att få komma som decimaltecken).
locale . setlocale ( locale . LC_ALL , ' ' )
# 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 ) :
@ -75,5 +93,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 )