Created
June 26, 2016 04:32
-
-
Save TakahisaShiratori/f0e3f8e8b8ecbc2d33f670f43f2054e1 to your computer and use it in GitHub Desktop.
Lambda functon to generate Box Note regularly
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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