WhaTap Labsは、職員の業務能力を向上させるために図書購入を支援しています。職員が一番好きな企業福祉の一つと言えると思います。ただし、図書購入の手続きが思ったより多くの人材が消費されていました。
改編前の図書購入の手順は次のとおりした。
WhaTap Labsの職員が一番好きな企業福祉であるだけに、図書購入の申請量も相当であるため、これをすべて確認してシートに作成するのはかなりの時間がかかりました。
図書購入を頻繁に行う立場で後ろから努力してくださる経営支援チームに感謝する心で該当区間を自動化しなければならないと思いました。
私が改善した図書購入の自動化は、以下のようなフローで動作します。
BookSupportBot
経営支援チームの業務を完全に置き換える仕組み(完全自動化)
from telegram.extimport Updaterfrom telegram.extimport MessageHandler, Filters#telegram bot tokentoken =""bot = telegram.Bot(token)#message pollingupdater = Updater(token=token, use_context=True)dispatcher = updater.dispatcherupdater.start_polling()#update event handlerdefhandler(update, context):#telegram chat id_id=update.message.chat.id#telegram message 内容user_text = update.message.textif user_text.startswith("/") == False:return#telegram message 送信者if update.message.from_user.last_nameis None:user_name=update.message.from_user.first_nameelse:user_name = update.message.from_user.last_name+update.message.from_user.first_nameecho_handler = MessageHandler(Filters.text, handler)dispatcher.add_handler(echo_handler)
from urllibimport responsefrom urllib.parseimport urlparse, parse_qsimport requestsimport jsondefparsing_url(url):try:parsed_url = urlparse(url)#短縮 url確認 (aladin短縮 urlは aladin.krをhostとして持つ)if parsed_url.hostname=="aladin.kr":print(url)#redirect url確認final_url=get_final_url(url)parsed_url=urlparse(final_url)if parsing_url==None:return Nonequery_params = parse_qs(parsed_url.query)#ItemId 獲得item_id = query_params.get('ItemId', [None])[0]if item_id:return item_idelse:item_id = query_params.get('itemid', [None])[0]if item_id:return item_idelse:print("Error: ItemId not found in the URL.")return Noneexcept Exceptionas e:return None
from urllibimport responsefrom urllib.parseimport urlparse, parse_qsimport requestsimport jsondefget_final_url(url):try:response = requests.head(url, allow_redirects=True)final_url = response.urlreturn final_urlexcept requests.RequestExceptionas e:print(f"Error: {e}")return None
from urllibimport responsefrom urllib.parseimport urlparse, parse_qsimport requestsimport jsondefsearchAladin(item_id):try:url = f"http://www.aladin.co.kr/ttb/api/ItemLookUp.aspx?ttbkey={key}&itemIdType=ItemId&ItemId={item_id}&output=js&Version=20131101"response = requests.get(url)response_json = json.loads(response.text)title = response_json['item'][0]['title']mallType = response_json['item'][0]['mallType']priceSales= response_json['item'][0]['priceSales']return title+"@"+mallType+"@"+str(priceSales)except Exceptionas e:return None
import telegramfrom telegram.extimport Updaterfrom telegram.extimport MessageHandler, Filtersimport gspread#telegram bot tokentoken =""#Aladin api keykey= ""#スプレッドシートkeyspreadsheet_key = ""#グーグルサービスアカウントgc = gspread.service_account(filename="")bot = telegram.Bot(token)#sheet opengcopen = gc.open_by_key(spreadsheet_key)#本の情報を得るfor book_infoin book_infos:book_info_split=book_info.split('@')#sheetに入れるsh.insert_row([date_split[0],"["+book_info_split[1]+"]"+book_info_split[0],"",user_name ,book_info_split[2],book_info_split[3]], int(line),value_input_option='USER_ENTERED')#申請確認メッセージの送信bot.send_message(chat_id=_id, text=user_name+"様の図書購入リクエスト"+str(success_count)+"件成功しました。")
from urllibimport responsefrom urllib.parseimport urlparse, parse_qsimport telegramfrom telegram.extimport Updaterfrom telegram.extimport MessageHandler, Filtersimport gspreadfrom datetimeimport datetimefrom pytzimport timezoneimport requestsimport json#telegram bot tokentoken =""#Aladin api keykey= ""#スプレッドシートkeyspreadsheet_key = ""#グーグルサービスアカウントgc = gspread.service_account(filename="")bot = telegram.Bot(token)gcopen = gc.open_by_key(spreadsheet_key)updater = Updater(token=token, use_context=True)dispatcher = updater.dispatcherupdater.start_polling()defhandler(update, context):_id=update.message.chat.iduser_text = update.message.textprint(user_text)if user_text.startswith("/") == False:returnif update.message.from_user.last_nameis None:user_name=update.message.from_user.first_nameelse:user_name = update.message.from_user.last_name+update.message.from_user.first_namedate=datetime.now(timezone('Asia/Seoul'))sheet=str(date.month)+"月"date=date.strftime("'%Y-%m-%d '%H:%M:%S")sh=gcopen.worksheet(sheet)line= 2if "구매"in user_text :try:user_text_split=user_text.split()count=0book_infos=[]success=Truesuccess_count=0for bookin user_text_split:if count!=0:item_id=parsing_url(book)print(item_id)if item_id!=None:result=searchAladin(item_id)if result!=None:book_infos.append(result+"@"+book)success_count+=1else:success=Falsebreakelse :success=Falsebreakelse:count+=1if success:date_split= str(date).split(' ')for book_infoin book_infos:book_info_split=book_info.split('@')sh.insert_row([date_split[0],"["+book_info_split[1]+"]"+book_info_split[0],"",user_name ,book_info_split[2],book_info_split[3]], int(line),value_input_option='USER_ENTERED')bot.send_message(chat_id=_id, text=user_name+"様の図書購入リクエスト"+str(success_count)+"件が成功しました。")else:bot.send_message(chat_id=_id, text=user_name+"様の図書購入リクエストに失敗しました。\n通常のAladin URLであることを確認してください。")except Exceptionas e:print(f"Error during test: {e}")bot.send_message(chat_id=_id, text=user_name+"様の図書購入リクエストに失敗しました。\n"+str(e))elif '/?' == user_textor '/help' == user_text:message="===図書購入=== \n図書購入時/購入を入力してからAladin URLをいれたら完了します。\n複数の図書購入の際には改行で区切る必要があります。\n\n図書購入のリクエストは、https://docs.google.com/spreadsheets/d/1HJfOMeKSS3A2AcWRg7BPAI4T6y_tERwMV27_zfcXs1g/edit#gid=654922794でご確認ください。\n追加のお問い合わせは、DevOpsチームのチェジョンミンまでお問い合わせください。"bot.send_message(chat_id=_id, text=message)echo_handler = MessageHandler(Filters.text, handler)dispatcher.add_handler(echo_handler)defparsing_url(url):try:parsed_url = urlparse(url)if parsed_url.hostname=="aladin.kr":print(url)final_url=get_final_url(url)parsed_url=urlparse(final_url)if parsing_url==None:return Nonequery_params = parse_qs(parsed_url.query)item_id = query_params.get('ItemId', [None])[0]if item_id:return item_idelse:item_id = query_params.get('itemid', [None])[0]if item_id:return item_idelse:print("Error: ItemId not found in the URL.")return Noneexcept Exceptionas e:return NonedefsearchAladin(item_id):try:url = f"http://www.aladin.co.kr/ttb/api/ItemLookUp.aspx?ttbkey={key}&itemIdType=ItemId&ItemId={item_id}&output=js&Version=20131101"response = requests.get(url)response_json = json.loads(response.text)title = response_json['item'][0]['title']mallType = response_json['item'][0]['mallType']priceSales= response_json['item'][0]['priceSales']return title+"@"+mallType+"@"+str(priceSales)except Exceptionas e:return Nonedefget_final_url(url):try:response = requests.head(url, allow_redirects=True)final_url = response.urlreturn final_urlexcept requests.RequestExceptionas e:print(f"Error: {e}")return None
テレグラム
Google Sheet
WhaTap LabsのDevOpsエンジニアとして様々な仕事をしています。その中で最も嬉しいことの1つは、職員が苦労しているときに役立つことだと思います。その作業以降から、図書購入量が増えたのは内緒ではありません!