一つ上のディレクトリに戻ってzipを作ります。
cd ../ zip -r9 layer.zip python
そしてそのzipファイルを、lambdaのレイヤーに登録し、
実行できているのかを細かく確認するために、kanehosi_tukeai.pyを
import ipadic
import jaconv
import MeCab
import re
import requests
import time
get_url = "https://slack.com/api/conversations.history"
post_url = "https://slack.com/api/chat.postMessage"
token = "xoxb-xxxxxxxxxxxxx-xxxxxxxxxxxxx-xxxxxxxxxx..."# tokenを入れてください
m = MeCab.Tagger(ipadic.MECAB_ARGS) #形態素解析用objectの宣言
def post_message(thread_ts):
data["thread_ts"] = thread_ts
requests.post(post_url, headers=header, data=data)
def extract_hiragana(text):
return "".join(re.findall(r'[ぁ-ゔー]', text))
def get_pronunciation_list(text):
m_result = m.parse(text).splitlines() #mecabの解析結果の取得
m_result = m_result[:-1] #最後の1行は不要な行なので除く
pro = [] #いい感じに切った読み全体を格納する変数
for v in m_result:
if '\t' not in v:
continue
if v.split('\t')[1].split(",")[0] in ["記号"]:
continue
surface = v.split('\t')[0] #表層形
p = v.split('\t')[1].split(",") [7] #読みを取得, 8は発音
if p == '*':#発音が取得できていないときsurfaceで代用
p = surface
if v.split('\t')[1].split(",")[0] in ["助詞", "助動詞"] and pro:
pro[-1] += p
else:
pro.append(p)
pro = [jaconv.kata2hira(p) for p in pro] #ひらがなをカタカナに変換
pro = [extract_hiragana(p) for p in pro if p] #余計な記号を削除
return pro
def is_575(text: str) -> bool:
words = get_pronunciation_list(text)
length = 0
reversed_expected_length_list = [5, 7, 5]
for word in words:
if not reversed_expected_length_list: # 575が終わったのにまだ続く
return False
length += len(re.sub(r'[ぁぃぅぇぉゃゅょ]', '', word)) # 1音を構成しない文字
if length == reversed_expected_length_list[-1]:
length = 0
reversed_expected_length_list.pop()
if reversed_expected_length_list: # 575と切り取れなかった
return False
return True
header={
"Authorization": "Bearer {}".format(token)
}
payload = {
"channel" : "C0123456789",# Conversation IDを入れてください
"oldest" : (time.time() - 60)
}
res = requests.get(get_url, headers=header, params=payload)
data = {
"channel" : "C0123456789",# Conversation IDを入れてください
"text" : "それにつけても金の欲しさよ"
}
def post_77_to_575(event, context):
print("A")
json_channel_history = res.json()
print("json_channel_history", json_channel_history)
if "messages" not in json_channel_history:
print("no message recentry, check token and channel ID")
return
for message in json_channel_history["messages"]:
print("message: ", message["text"])
if is_575(message["text"]):
post_message(message["ts"])
print("kanehosi-!")
return
if __name__ == "__main__":
post_77_to_575("", "")
と、79行目と81行目に少し表示を増やしておきます。
このPythonファイルもLambdaのアップロード元ボタンからアップロードし、Slackに「古池や蛙飛びこむ水の音」と投稿誌、橙色のTestボタンを押すと…
Test Event Name
test
Response
null
Function Logs
START RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Version: $LATEST
A
json_channel_history {'ok': True, 'oldest': 'xxxxxxxxxx.xxxxxx', 'messages': [{'client_msg_id': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', 'type': 'message', 'text': '古池や蛙飛びこむ水の音', 'user': 'xxxxxxxxxxx', 'ts': 'xxxxxxxxxx.xxxxxx', 'team': 'xxxxxxxxxxx', 'blocks': [{'type': 'rich_text', 'block_id': 'z=KP', 'elements': [{'type': 'rich_text_section', 'elements': [{'type': 'text', 'text': '古池や蛙飛びこむ水の音'}]}]}]}], 'has_more': False, 'pin_count': 0, 'channel_actions_ts': None, 'channel_actions_count': 0}
message: 古池や蛙飛びこむ水の音
kanehosi-!
END RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx
REPORT RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx Duration: 204.84 ms Billed Duration: 205 ms Memory Size: 128 MB Max Memory Used: 64 MB
Request ID
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx
Slack「スッコココ!」
おめでとうございます。200 ms 128MBなので0.001円くらいで575が判定され、「それにつけても金の欲しさよ」とリプライが来ました。
Q. ついに、終わったんですか? A. 定期実行されてる? LogStreamでLogを確認してみよう
じゃあ毎分この調子で来るかな?と新しく俳句をチャンネルに書き込みます。
判定されません。
テスト時と違って、printされたものがExecution resultsに出ていません。またLambdaのページをうろうろしていると、[モニタリング]タブにLogStreamというものがあり、Logが貯まっていそうです。リンクになっているのでここをクリックしてみると、print文の結果が出ています。
そしてここを見ると、最新のメッセージが取得できていないことがわかります。もしかしてhttps://slack.com/api/conversations.historyのせい? と疑って手元で実行しても、コンテナから実行してもうまく取得できます。AWSからの取得だけうまくいかないんでしょうか。仮説としてはUTCとの時差である9時間差が考えられましたが、デプロイ直後には動いていたのでこれは無さそうです。
この記事では、Lambda上でプログラムを動かせました。しかし手元での実行と少し実行結果が異なっていました。次の記事では、ログを見ながらこの差を解決します。