Skip to content

Instantly share code, notes, and snippets.

@TakahisaShiratori
Created June 26, 2016 04:32
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TakahisaShiratori/f0e3f8e8b8ecbc2d33f670f43f2054e1 to your computer and use it in GitHub Desktop.
Save TakahisaShiratori/f0e3f8e8b8ecbc2d33f670f43f2054e1 to your computer and use it in GitHub Desktop.
Lambda functon to generate Box Note regularly
# -*- coding: utf-8 -*-
# See also http://blog.serverworks.co.jp/tech/2016/06/02/minutes-automation/
import json
import boto3
import urllib2
import httplib
from base64 import b64encode, b64decode
from datetime import datetime, timedelta
client = boto3.client('dynamodb')
table_name = 'box_api'
app_id = 0
key_id = 'arn:aws:kms:ap-northeast-1:[AWS_account_ID_without_hyphen]:key/[KMS_Key_ID]'
original_file_id = '[Original_File_ID]'
copy_destination = '[Copy_Destination_Folder_ID]'
filename_suffix = u'_技術2課_週次定例議事メモ.boxnote'
ENCRYPTED_HOOK_URL = '[Encrypted_Hook_URL]'
SLACK_CHANNEL = '#dept-tech02'
HOOK_URL = "https://" + boto3.client('kms').decrypt(CiphertextBlob=b64decode(ENCRYPTED_HOOK_URL))['Plaintext']
def kms_decrypt(encrypted_str):
return boto3.client('kms').decrypt(CiphertextBlob=b64decode(encrypted_str))['Plaintext']
def kms_encrypt(decrypted_str):
return b64encode(boto3.client('kms').encrypt(KeyId=key_id, Plaintext=decrypted_str)['CiphertextBlob'])
def get_item_from_db(table_name, app_id):
item = client.get_item(
TableName = table_name,
Key={
'app_id': {'N': str(app_id)}
}
)['Item']
return item
def refresh_request(refresh_token_old, client_id, client_secret):
url = 'https://api.box.com/oauth2/token'
data_str = 'grant_type=refresh_token&refresh_token=%s&client_id=%s&client_secret=%s' % (refresh_token_old, client_id, client_secret)
header = {}
request = urllib2.Request(url, data_str, header)
return json.loads(urllib2.urlopen(request).read())
def update_db(access_token, refresh_token_new):
encrypted_access_token = kms_encrypt(access_token)
encrypted_refresh_token_new = kms_encrypt(refresh_token_new)
client.update_item(
TableName = table_name,
Key={
'app_id': {'N': str(app_id)}
},
UpdateExpression="set access_token = :a, refresh_token = :r",
ExpressionAttributeValues={
':a': {'S': encrypted_access_token},
':r': {'S': encrypted_refresh_token_new}
}
)
def copy_file(access_token, original_file_id, copy_destination, filename):
url = 'https://api.box.com/2.0/files/' + original_file_id + '/copy'
data = {'parent': {'id': copy_destination}, 'name': filename}
header = {'Authorization': 'Bearer ' + access_token}
request = urllib2.Request(url, json.dumps(data), header)
reply = urllib2.urlopen(request)
return json.loads(reply.read())
def create_shared_link(access_token, file_id):
url = 'api.box.com'
uri = '/2.0/files/' + file_id
data = {"shared_link": {}}
header = {'Authorization': 'Bearer ' + access_token}
connection = httplib.HTTPSConnection(url)
connection.request("PUT", uri, json.dumps(data), header)
reply = connection.getresponse()
return json.loads(reply.read())
def slack_post(HOOK_URL, SLACK_CHANNEL, file_info):
file_name = file_info['name']
link_url = file_info['shared_link']['url']
slack_message = {
'channel': SLACK_CHANNEL,
'text': u"来週の週次定例議事メモを作成しました。\nファイル名: %s\nリンク: %s" % (file_name, link_url),
}
request = urllib2.Request(HOOK_URL, json.dumps(slack_message))
urllib2.urlopen(request)
def lambda_handler(event, context):
print('Getting Refresh Token etc from Database')
item = get_item_from_db(table_name, app_id)
print('Decrypting Refresh Token etc')
refresh_token_old = kms_decrypt(item['refresh_token']['S'])
client_id = kms_decrypt(item['client_id']['S'])
client_secret = kms_decrypt(item['client_secret']['S'])
print('Requesting New Refresh Token and Access Token')
reply_for_refresh = refresh_request(refresh_token_old, client_id, client_secret)
# print(reply_for_refresh)
access_token = reply_for_refresh['access_token']
refresh_token_new = reply_for_refresh['refresh_token']
print('Updating Refresh Token')
update_db(access_token, refresh_token_new)
filename_prefix = (datetime.now() + timedelta(days=7)).strftime('%Y%m%d')
filename = filename_prefix + filename_suffix
print('Copying file as ' + filename)
reply_from_copy_file = copy_file(access_token, original_file_id, copy_destination, filename)
reply_from_create_shared_link = create_shared_link(access_token, reply_from_copy_file['id'])
print('Posting on Slack')
slack_post(HOOK_URL, SLACK_CHANNEL, reply_from_create_shared_link)
print('Done')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment