def joke(text): if 'ㅠ' in text: head_section = SectionBlock(text='회원님~ 울면 근손실 일어나요~\n울지마요~') block1 = ImageBlock(image_url='http://bitly.kr/8iTBeh', alt_text='이미지 오류') return [head_section, block1] elif '배고파' in text: head_section = SectionBlock(text='이걸 보고도 밥이 목구녕으로 넘어가요?\n단식하세요 회원님~') block1 = ImageBlock(image_url='http://bitly.kr/PopTfn', alt_text='이미지 오류') return [head_section, block1] elif '언더아머' in text: head_section = SectionBlock( text='언더아머는 3대 500치는 회원님들만 착용 가능합니다.\n단속걸리지 않게 조심하세요 회원님~') block1 = ImageBlock(image_url='http://bitly.kr/Q0ANbf', alt_text='이미지 오류') return [head_section, block1] else: a = random.randint(1, 4) if a == 1: head_section = SectionBlock(text='운동만이 살길입니다 회원님~\n오늘도 식단관리 화이팅~!') block1 = ImageBlock(image_url='http://bitly.kr/f9TIze', alt_text='이미지 오류') return [head_section, block1] elif a == 2: head_section = SectionBlock(text='운동은 마음가짐입니다 회원님~\n열심히 노력하셔야 해요!') block1 = ImageBlock(image_url='http://bitly.kr/5sNxFM', alt_text='이미지 오류') return [head_section, block1] else: head_section = SectionBlock(text='몸도 중요하지만 회원님~\n몸완얼인것도 아시죠??') block1 = ImageBlock(image_url='http://bitly.kr/3bBR3R', alt_text='이미지 오류') return [head_section, block1]
def test_json_simple(self): section = SectionBlock(text=MarkdownTextObject(text="some text"), block_id="a_block").to_dict() json = { "text": { "text": "some text", "type": "mrkdwn", "verbatim": False }, "block_id": "a_block", "type": "section", } self.assertDictEqual(section, json)
def test_document_2(self): input = { "type": "section", "text": { "text": "A message *with some bold text* and _some italicized text_.", "type": "mrkdwn", }, "fields": [ {"type": "mrkdwn", "text": "High"}, {"type": "plain_text", "emoji": True, "text": "String"}, ], } self.assertDictEqual(input, SectionBlock(**input).to_dict())
def test_json(self): self.assertDictEqual( { "text": {"text": "some text", "type": "mrkdwn"}, "block_id": "a_block", "type": "section", }, SectionBlock(text="some text", block_id="a_block").to_dict(), ) self.assertDictEqual( { "text": {"text": "some text", "type": "mrkdwn"}, "fields": [ {"text": "field0", "type": "mrkdwn"}, {"text": "field1", "type": "mrkdwn"}, {"text": "field2", "type": "mrkdwn"}, {"text": "field3", "type": "mrkdwn"}, {"text": "field4", "type": "mrkdwn"}, ], "type": "section", }, SectionBlock( text="some text", fields=[f"field{i}" for i in range(5)] ).to_dict(), ) button = LinkButtonElement(text="Click me!", url="http://google.com") self.assertDictEqual( { "type": "section", "text": {"text": "some text", "type": "mrkdwn"}, "accessory": button.to_dict(), }, SectionBlock(text="some text", accessory=button).to_dict(), )
def test_document_3(self): input = { "type": "section", "text": { "text": "*Sally* has requested you set the deadline for the Nano launch project", "type": "mrkdwn", }, "accessory": { "type": "datepicker", "action_id": "datepicker123", "initial_date": "1990-04-28", "placeholder": {"type": "plain_text", "text": "Select a date"}, }, } self.assertDictEqual(input, SectionBlock(**input).to_dict())
def on_view2_submit(rqst: ViewRequest): # same technique as on_main_modal_submit; in this case disable the submit # button only allow the User to click the "Done" (close) button. modal = Modal(rqst) view = modal.view view.title = PlainTextObject(text='Final Modal View') view.close = PlainTextObject(text='Done') view.submit = None view.add_block(SectionBlock(text=MarkdownTextObject(text='Final bit.'))) return modal.update()
def on_main_modal_submit( rqst: ViewRequest, input_values: Dict ): params = session[SESSION_KEY]['params'] # The input_values is a dictionary of key=action_id and value=user-input # since all action_id are formulated with dots (.), just use the # last token as the variable name when form results = { k.rpartition('.')[-1]: v for k, v in input_values.items() } results.update(dict( clicks=params['clicks'], checkboxes=params['checkboxes'], )) modal = Modal(rqst, view=View( type="modal", title=PlainTextObject(text='Modal Results'), close=PlainTextObject(text='Done'), clear_on_close=True, blocks=[ SectionBlock( text=PlainTextObject(text="Input results in raw JSON") ), SectionBlock( text=MarkdownTextObject(text="```" + json.dumps(results, indent=3) + "```") ) ] )) return modal.push()
def test_json_with_accessory(self): button = LinkButtonElement(text=PlainTextObject(text="Click me!"), url="http://google.com") section = SectionBlock(text=MarkdownTextObject(text="some text"), accessory=button).to_dict() coded = { "text": { "text": "some text", "type": "mrkdwn", "verbatim": False }, "accessory": button.to_dict(), "type": "section", } self.assertDictEqual(section, coded)
def findFood(food_name): with open("food5.csv", 'rt', encoding='UTF8') as file: kal = 0 for i in file: if food_name == i.split(',')[0].strip(): kal = float(i.split(',')[1].strip()) if kal == 0: head_section = SectionBlock( text="*" + food_name + "*" + " 의 칼로리에 대한 정보는 없네요 회원님 ㅠㅠ\n다른 음식을 찾아보시겠어요??" ) block1 = ImageBlock( image_url='https://lh3.googleusercontent.com/9JbVrSd_VM5gtIES8nV1hFv9INJ5aOatExiwP9BOMjRL5StZKojJiZwNjvzyO5fJdToeh9fuoNEZwOkVEzWIj0znMJs3zVJtU__dfTzeQpBb72tI7v_H6UL654Up-Dz8UlvRg1QtCoE_qFR7_rjp60j-uVnw6H7v60nOc5sLzo0cFdxWJmo9NMvxPdHKVCsqLBLVresLeyL6Ulndh2ayShzKb4DCHnbH2kYBVQJ7HFNLuN_8wU5Z9lc0D97ppiX9awxoXqMgqvvS9epaBeg5Jn0KNEM4BdyAxTqbZcakZdCD3s8HjwJ0K0BOrbugNcKI9GPwsJ0Zjzoq9LUb6Yz8mJpoVAuMKMPJemI0NXCPLLzisjNzR6kCLI7Rc2BHSyIJkc4aEGWCMBTFKtd54SIQuv9lkCvK3kTOKfjS39G1-YDfGfWcbgU83l6TMPxOMQlU7l6328vd_QXOWe8c4WVv2Mh6toJnWXCwIwCghaxMGmqc5qwj96gUlBir-l1CooBPp1Ln-iurmhc1CeySEsCyfS2wa0Xz4AN8VNwMwOHHTJT6fgepWfZIrqby57GsyJ3fuBRekvQIkK_XIQmBYGnwmwGdcBF46j3bSMuAals0PraWUv8NptJaB2U48eGJfbV3H3NnqCniTyhkSuzklrnjjcN8F-Pukus=w530-h375-no', alt_text='이미지 오류' ) return [head_section, block1] head_section = SectionBlock( text="*" + food_name + "*" + " 의 칼로리는 " + "*" + str(kal) + "*" + " 이네요.\n생각보다 높아서 걱정인데....\n정말 드시겠어요 회원님...??" ) block1 = ImageBlock( image_url='https://lh3.googleusercontent.com/Jrn3NDI3XofgtKIMK-_lyY7vQn2Na6GvEr4DCPNtEh-bTb7IWlVAuGw3ypduDBgAgcs5h1ukAHrPhVaGf62CZ62896nfLqWYsrpr27_Y_R7FzezsWA0pd4x4g4PWdCD5uKRyUIyDfo0padPBrSNNjdD1CoBhZVibqueexsMXLX3iqv7tiyULWnDB-Ll6y7VgIGgo4iw7ONEbL8VoQ9apWbbg-Koo9mNZhKMRiRSUJAeSe6chB8NSqzurj7Np7ZpORa45pTb4iR5fgr4j3nQGVNccGuJ_2H6yDtpoPNuPhPaDzBtcw99djbqGESM3QYNRPnvu3s3vWmQw7eQA9ZRmSv51qCoj78e3udOkRCqC13RAmfVVsEGVu06AZNcwZQ_pu4BbImM01-OO0iu9OdX4gkM3dTUHlka4BdKfl4oGOp8gU986jkKNComnse0Ex1SD6qDEg_MTzDQ-yEPdkCVr0ZXC6Guj5bYJLDFqFoDK5F0pHKjt7YJcqsyZFxHgFi-dGtSKddv4NERsVUWt2_I6OHUNZaGTMGY6ctdXN7zZ99sep64kGE_EZ1m0rtmT3Qgf8k6AjlX1wdlwQpOiHlYIZz0V7P3V7YA9ZTh9LCeekQrtcp0k2ytrt4fgnTak6gGn6xpzbRAE8FCjcRtJSV9k63PHmcuY4LQ=w640-h960-no', alt_text='이미지 오류' ) return [head_section, block1]
def main(rqst: Union[InteractiveMessageRequest, CommandRequest]) -> None: block_id = cmd.prog + '.main.button' # create a Slack message that will be used to respond to the User's # interaction which was the invocation of the /demo command. resp = Response(rqst) # ------------------------------------------------------------------------- # define the button callback handler to send a response back to the # User telling the time when they pressed the button # ------------------------------------------------------------------------- @rqst.app.ic.block_action.on(block_id) def on_button(btn_rqst: BlockActionRequest, btn_action: ActionEvent): btn_resp = Response(btn_rqst) btn_resp.send_response( text=(f"At timestamp `{btn_action.data['action_ts']}`, " f"you pressed: *{btn_action.value.title()}*")) # ------------------------------------------------------------------------- # create a message to send to the User that has two buttons; and when # they click either one, the above callback will be executed. # ------------------------------------------------------------------------- user_id = rqst.user_id resp['blocks'] = extract_json([ SectionBlock(text=f'Hi there <@{user_id}>!'), DividerBlock(), ActionsBlock(block_id=block_id, elements=[ ButtonElement(text='Press for Bad', style='danger', action_id=f'{block_id}.bad', value='bad'), ButtonElement(text='Press for Good', style="primary", action_id=f'{block_id}.good', value='good') ]), DividerBlock() ]) resp.send()
def main(rqst: AnyRequest): modal = Modal( rqst, callback=on_main_modal_submit, view=View(title='First Modal View', callback_id=cmd.prog + ".view1", close='Cacel', submit='Start'), ) modal.view.add_block(SectionBlock(text='Click the Start button to begin.')) res = modal.open() if not res.get('ok'): rqst.app.log.error(res)
def action_go_to_alerts(self, request: GladosRequest, **kwargs): # self.bot.validate_slack_signature(request) self.bot.send_message( message=Message( text="Going to alerts", blocks=[ SectionBlock( text="Confirm Action", accessory=ButtonElement( text="Acknowledge", action_id="ack", value="ack" ), ) ], ), channel=request.json.user.id, )
def on_boop_button(rqst): params = session[SESSION_KEY]['params'] params['boops'] += 1 boops = params['boops'] modal = Modal(rqst) view = modal.view view.blocks.pop(0) view.blocks.insert(0, SectionBlock(text=f'Boop {boops}')) res = modal.update() if not res.get('ok'): rqst.app.log.error(f'failed to boop: {res}')
def on_main_modal_submit(rqst: ViewRequest): # define the modal and view based on the received view request from # api.slack.com as a result of this instance, the code can then "update" # the view by returning the update payload as a resposse message. modal = Modal(rqst) view = modal.view view.title = 'Second Modal View' view.callback_id = cmd.prog + ".view2" modal.callback = on_view2_submit view.add_block(SectionBlock(text="New bits.")) return modal.update()
def main(rqst: AnyRequest): # create a Modal and view, setting the callback so that when the User # clicks the "Next" button the code in on_main_modal_submit will be used as # the handler. Modal(rqst, callback=on_main_modal_submit, view=View(type="modal", title='First Modal View', callback_id=cmd.prog + ".view1", close='Cancel', submit='Next', blocks=[ SectionBlock(text=MarkdownTextObject( text="This is the *first* modal view.")) ])).open()
def update_message(self, request: GladosRequest, **kwargs): message = Message( text=request.json.message, blocks=[ ContextBlock(elements=[ MarkdownTextObject( text= f"Message Updated: {datetime.now().isoformat(sep=' ', timespec='minutes')}" ) ]), SectionBlock(text=MarkdownTextObject( text=request.json.message)), ], ) return self.bot.update_message(channel=request.json.channel, ts=request.json.ts, message=message)
def test_json_with_fields(self): self.assertDictEqual( SectionBlock(text=MarkdownTextObject(text="some text"), fields=[ MarkdownTextObject(text=f"field{i}") for i in range(5) ]).to_dict(), { "text": { "text": "some text", "type": "mrkdwn", "verbatim": False }, "fields": [ { "text": "field0", "type": "mrkdwn", "verbatim": False }, { "text": "field1", "type": "mrkdwn", "verbatim": False }, { "text": "field2", "type": "mrkdwn", "verbatim": False }, { "text": "field3", "type": "mrkdwn", "verbatim": False }, { "text": "field4", "type": "mrkdwn", "verbatim": False }, ], "type": "section", }, )
async def test_with_blocks(self): url = os.environ[SLACK_SDK_TEST_INCOMING_WEBHOOK_URL] webhook = AsyncWebhookClient(url) response = await webhook.send( text="fallback", blocks=[ SectionBlock( block_id="sb-id", text=MarkdownTextObject( text="This is a mrkdwn text section block."), fields=[ PlainTextObject(text="*this is plain_text text*", emoji=True), MarkdownTextObject(text="*this is mrkdwn text*"), PlainTextObject(text="*this is plain_text text*", emoji=True), ]), DividerBlock(), ActionsBlock(elements=[ ButtonElement( text=PlainTextObject(text="Create New Task", emoji=True), style="primary", value="create_task", ), ButtonElement( text=PlainTextObject(text="Create New Project", emoji=True), value="create_project", ), ButtonElement( text=PlainTextObject(text="Help", emoji=True), value="help", ), ], ), ]) self.assertEqual(200, response.status_code) self.assertEqual("ok", response.body)
def section( self, *, text: Union[str, TextObject] = None, block_id: Optional[str] = None, fields: List[str] = None, accessory: Optional[BlockElement] = None, ) -> "ModalBuilder": """A section is one of the most flexible blocks available. It can be used as a simple text block, in combination with text fields, or side-by-side with any of the available block elements. https://api.slack.com/reference/block-kit/blocks#section Args: text: The text for the block, in the form of string or a text object. Maximum length for the text in this field is 3000 characters. block_id: A string acting as a unique identifier for a block. You can use this block_id when you receive an interaction payload to identify the docs-src of the action. If not specified, one will be generated. Maximum length for this field is 255 characters. block_id should be unique for each message and each iteration of a message. If a message is updated, use a new block_id. fields: optional: a sequence of strings that will be rendered using MarkdownTextObjects. Any strings included with fields will be rendered in a compact format that allows for 2 columns of side-by-side text. Maximum number of items is 10. Maximum length for the text in each item is 2000 characters. accessory: an optional BlockElement to attach to this SectionBlock as secondary content """ self._blocks.append( SectionBlock(text=text, block_id=block_id, fields=fields, accessory=accessory)) return self
def on_main_modal_submit(rqst): modal = Modal(rqst) view = modal.view view.callback_id = cmd.prog + ".view2" view.title = PlainTextObject(text='Awaiting Boop') params = session[SESSION_KEY]['params'] delay = params['delay'] view.blocks[0] = SectionBlock(text=PlainTextObject( text=f"Launching async task for {delay} sec update")) view.submit = None rqst.app.log.debug(modal.view.hash) Thread(target=delayed_update_view, kwargs={ 'rqst': rqst, 'view': modal.view, 'delay': delay }).start() return modal.update()
from slack.web.classes.blocks import DividerBlock, SectionBlock from slack.web.classes.elements import ButtonElement, ExternalDataSelectElement from slack.web.classes.messages import Message from slack.web.classes.objects import MarkdownTextObject from glados import EventRoutes, GladosBot, GladosPlugin, GladosRequest, RouteType from glados.slack_classes.views import Home HOME_VIEW = Home(blocks=[ SectionBlock(text=MarkdownTextObject( text="*Welcome to GLaDOS From Lambda!*")), DividerBlock(), SectionBlock( text="*Security Events*", fields=["*New Alerts*\n20", "*Open Cases*\n5"], accessory=ButtonElement(text="Go To Security Alerts", action_id="gotoSecurityAlerts", value="go"), ), DividerBlock(), SectionBlock( text="*Service Tickets*", fields=["*Total Tickets*\n23"], accessory=ButtonElement(text="Go To Service Desk", action_id="gotoServiceDesk", value="go"), ), DividerBlock(), SectionBlock( text="Test External Menu", accessory=ExternalDataSelectElement(placeholder="Loading",
def main(rqst): app: SlackApp = rqst.app params = session[SESSION_KEY]['params'] # define the event ID for when the User clicks the Submit button on the # Modal. bind that event to the code handler that will process the data. event_id = cmd.prog + ".view1" app.ic.view.on(event_id, on_main_modal_submit) priv_data = { 'name': 'Jeremy', 'state': "NC" } # create a Modal instace, which will also defined a View when one is not # provided. Tie the submit callback ID to the envent_id value modal = Modal(rqst) view = modal.view = View( type="modal", title=PlainTextObject(text="Awesome Modal"), callback_id=event_id, close=PlainTextObject(text="Cancel"), submit=PlainTextObject(text="Next"), private_metadata=str(priv_data)) # ------------------------------------------------------------------------- # Create a button block: # Each time the User clicks it a counter will be incremented by 1. # The button click count is stored in the session params. # ------------------------------------------------------------------------- button1 = view.add_block(SectionBlock( text=PlainTextObject(text="It's Block Kit...but _in a modal_"), block_id=event_id + ".button1")) button1.accessory = ButtonElement( text='Click me', value='0', action_id=button1.block_id, style='danger' ) params['clicks'] = 0 # noinspection PyUnusedLocal @app.ic.block_action.on(button1.block_id) def remember_button(btn_rqst: BlockActionRequest): session[SESSION_KEY]['params']['clicks'] += 1 # ------------------------------------------------------------------------- # Create a Checkboxes block: # When the User checks/unchecks the items, they are stored to the session. # ------------------------------------------------------------------------- checkbox_options = [ Option(label='Box 1', value='A1'), Option(label='Box 2', value='B2') ] params['checkboxes'] = checkbox_options[0].value checkbox = view.add_block(SectionBlock( text=PlainTextObject(text='Nifty checkboxes'), block_id=event_id + ".checkbox")) checkbox.accessory = CheckboxesElement( action_id=checkbox.block_id, options=checkbox_options, initial_options=[checkbox_options[0]] ) @app.ic.block_action.on(checkbox.block_id) def remember_check(cb_rqst: BlockActionRequest, action: ActionEvent): session[SESSION_KEY]['params']['checkboxes'] = action.value # ------------------------------------------------------------------------- # Create an Input block: # Required single line of text. # ------------------------------------------------------------------------- view.add_block(InputBlock( label=PlainTextObject(text='First input'), element=PlainTextInputElement( action_id=event_id + ".text1", placeholder='Type in here' ) )) # ------------------------------------------------------------------------- # Create an Input block: # Optional multi-line text area, maximum 500 characters. # ------------------------------------------------------------------------- host_selector = view.add_block(InputBlock( label=PlainTextObject(text='Next input selector ... start typing'), optional=True, block_id=event_id + ".ext1", element=ExternalDataSelectElement( placeholder='hosts ..', action_id=event_id + ".ext1",) )) @app.ic.select.on(host_selector.element.action_id) def select_host_from_dynamic_list(_rqst): return { 'options': extract_json([ Option(label=val, value=val) for val in ('lx5e1234', 'lx5w1234', 'lx5e4552') ]) } # ------------------------------------------------------------------------- # Create an Input Datepicker block # ------------------------------------------------------------------------- view.add_block(InputBlock( label=PlainTextObject(text="Pick a date"), element=DatePickerElement( action_id=event_id + ".datepicker", placeholder='A date' ) )) # ------------------------------------------------------------------------- # Create an Input to select from static list, optional. # ------------------------------------------------------------------------- view.add_block(InputBlock( label=PlainTextObject(text="Select one option"), optional=True, element=SelectElement( placeholder='Select one of ...', action_id=event_id + ".select_1", options=[ Option(label='this', value='this'), Option(label='that', value='that') ] ) )) # ------------------------------------------------------------------------- # Create an Input to allow the User to select multiple items # from a static list. # ------------------------------------------------------------------------- view.add_block(InputBlock( label=PlainTextObject(text="Select many option"), element=StaticMultiSelectElement( placeholder=PlainTextObject(text='Select any of ...'), action_id=event_id + ".select_N", options=[ Option(label='cat', value='cat'), Option(label='dog', value='dog'), Option(label='monkey', value='monkey') ] ) )) res = modal.open(callback=on_main_modal_submit) if not res.get('ok'): app.log.error(json.dumps(res, indent=3))
def first_recom(text): blocks = [] if '메뉴' in text: food_and_location = text.split()[2:] blocks.append(crawl_one_restaurant(food_and_location)) elif '선택' in text: block = SectionBlock( text="선택을 선택했구냠!! 너의 취향에 따라 메뉴를 추천해줄테니 골라보겠느냠!\n" "먼저 기준을 골라보겠냠?\n" "`~날씨` : 오늘 날씨에 딱 맞는 메뉴를 추천해주겠다냠!\n" "`~분위기` : 예쁜, 가성비, 깔끔 등 다양한 키워드로 특별한 날을 기념해 보는건 어떠냠?\n" "`~방문목적` 데이트, 회식, 혼술, 가족외식 등 목적에 따라 추천도 해주겠다냠!!\n" "`~편의시설` 강아지, 주차, 24시간 등 특별한 상황도 추천해주겠다냠!!\n" "`~인싸맛집` : 방송에 나온 핫한 식당을 가서 핵인싸로 거듭나는건 어떠냠!!\n" "위에 코드 중 하나를 선택해서 설명을 들어라냠!") blocks.append(block) elif '날씨' in text: if len(text.split()) < 3 or text.split()[2] == "": blocks.append( SectionBlock( text="`~날씨 <키워드>` 형식으로 입력해보겠냠 키워드는 *비오는 날, 여름, 겨울 등*으로 해보겠냠" )) else: food = text.split()[2] blocks.append(crawl_one_restaurant(food)) elif '분위기' in text: if len(text.split()) < 3 or text.split()[2] == "": blocks.append( SectionBlock( text="`~분위기 <키워드>` 형식으로 입력해보겠냠 키워드는 *고급, 조용한, 예쁜 등*으로 해보겠냠" )) else: food = text.split()[2:] blocks.append(crawl_one_restaurant(food)) elif '방문목적' in text: if len(text.split()) < 3 or text.split()[2] == "": blocks.append( SectionBlock( text= "`~방문목적 <키워드>` 형식으로 입력해보겠냠 키워드는 *회식, 데이트, 가족외식, 기념일 등*으로 해보겠냠" )) else: food = text.split()[2:] blocks.append(crawl_one_restaurant(food)) elif '편의시설' in text: if len(text.split()) < 3 or text.split()[2] == "": blocks.append( SectionBlock( text= "`~편의시설 <키워드>` 형식으로 입력해보겠냠 키워드는 *무료주차, 발렛주차, 24시간 등*으로 해보겠냠" )) else: food = text.split()[2:] blocks.append(crawl_one_restaurant(food)) elif '인싸맛집' in text: if len(text.split()) < 3 or text.split()[2] == "": blocks.append( SectionBlock( text= "`~인싸맛집 <키워드>` 형식으로 입력해보겠냠 키워드는 *수요미식회, 백종원의3대천왕, 생활의달인 등*으로 해보겠냠" )) else: food = text.split()[2:] blocks.append(crawl_one_restaurant(food)) else: blocks.append( SectionBlock(text="`@<봇이름> 냠냠`으로 시작하면 안되냠. 이유는 없다 그냥 귀엽지않냠")) return blocks
def test_issue_628(self): elem = SectionBlock(text="1234567890" * 300) elem.to_dict() # no exception with self.assertRaises(SlackObjectFormationError): elem = SectionBlock(text="1234567890" * 300 + "a") elem.to_dict()
def test_text_or_fields_populated(self): with self.assertRaises(SlackObjectFormationError): SectionBlock().to_dict()
sys.path.insert(1, f"{dirname(__file__)}/../..") logging.basicConfig(level=logging.DEBUG) # ------------------ def legacy(): from slack.web.classes.blocks import SectionBlock from slack.web.classes.objects import TextObject fields = [] fields.append(TextObject(text='...', type='mrkdwn')) block = SectionBlock(text='', fields=fields) assert block is not None from slack_sdk.models.blocks import SectionBlock, TextObject fields = [] fields.append(TextObject(text='...', type='mrkdwn')) block = SectionBlock(text='', fields=fields) assert block is not None # # pip install mypy # mypy integration_tests/samples/issues/issue_868.py | grep integration_tests # # integration_tests/samples/issues/issue_868.py:26: error: Argument "fields" to "SectionBlock" has incompatible type "List[TextObject]"; expected "Optional[List[Union[str, Dict[Any, Any], TextObject]]]" # integration_tests/samples/issues/issue_868.py:26: note: "List" is invariant -- see http://mypy.readthedocs.io/en/latest/common_issues.html#variance # integration_tests/samples/issues/issue_868.py:26: note: Consider using "Sequence" instead, which is covariant
def test_fields_length(self): with self.assertRaises(SlackObjectFormationError): SectionBlock(fields=[f"field{i}" for i in range(11)]).to_dict()
def eatFood(food_name,user,uu): with open("food5.csv", 'rt', encoding='UTF8') as file: kal = 0 for i in file: if food_name == i.split(',')[0].strip(): kal = float(i.split(',')[1].strip()) if kal == 0: head_section = SectionBlock( text="*" + food_name + "*" + " 의 칼로리에 대한 정보는 없네요 회원님 ㅠㅠ\n다른 음식을 찾아보시겠어요??" ) block1 = ImageBlock( image_url='https://lh3.googleusercontent.com/9JbVrSd_VM5gtIES8nV1hFv9INJ5aOatExiwP9BOMjRL5StZKojJiZwNjvzyO5fJdToeh9fuoNEZwOkVEzWIj0znMJs3zVJtU__dfTzeQpBb72tI7v_H6UL654Up-Dz8UlvRg1QtCoE_qFR7_rjp60j-uVnw6H7v60nOc5sLzo0cFdxWJmo9NMvxPdHKVCsqLBLVresLeyL6Ulndh2ayShzKb4DCHnbH2kYBVQJ7HFNLuN_8wU5Z9lc0D97ppiX9awxoXqMgqvvS9epaBeg5Jn0KNEM4BdyAxTqbZcakZdCD3s8HjwJ0K0BOrbugNcKI9GPwsJ0Zjzoq9LUb6Yz8mJpoVAuMKMPJemI0NXCPLLzisjNzR6kCLI7Rc2BHSyIJkc4aEGWCMBTFKtd54SIQuv9lkCvK3kTOKfjS39G1-YDfGfWcbgU83l6TMPxOMQlU7l6328vd_QXOWe8c4WVv2Mh6toJnWXCwIwCghaxMGmqc5qwj96gUlBir-l1CooBPp1Ln-iurmhc1CeySEsCyfS2wa0Xz4AN8VNwMwOHHTJT6fgepWfZIrqby57GsyJ3fuBRekvQIkK_XIQmBYGnwmwGdcBF46j3bSMuAals0PraWUv8NptJaB2U48eGJfbV3H3NnqCniTyhkSuzklrnjjcN8F-Pukus=w530-h375-no', alt_text='이미지 오류' ) return [head_section, block1] with open(user, "a+") as userfile: data = food_name + "/" + str(kal) + "\n" userfile.write(data) if sumOfcal(user) > getBaseUser(user): head_section = SectionBlock( text="*" + food_name + "*" + " 을 먹어서 지금 " + "*" + str( round(sumOfcal(user) - getBaseUser(user))) + "*" + " 칼로리를 초과했습니다.\n"+uu+" 회원님 갑시다, 진실의 방으로" ) block1 = ImageBlock( image_url='https://lh3.googleusercontent.com/zqYPnV3JrUx6Dc4e5XyejXpgToe9AgvLRQS9tZehGM3QJ5bgzn4ecnNbean_vehAc6lanCI_msyG90jiElDMthDEWm1a9ksEPSL9hXGWfvpvB59a_1FvhHV2I3fqgdGpzpeqVOCpdq7Sdgg8sPRR_K3j2Kzwl615_KU88EgQObn_JP_30eMoRXWuqIJOFhlRLyd-nubo9UmnBSWn0t92qu2ZUecdGvpmwqY0sIuOjSo4YORvW-VYYcFureJJRVDpwJh845vWRSPn0rn6amlk61j7Eaevse4X6ML2hJME7yiXxfjfCf1P_ZbxRlJoViPZXJayd_dPmWMTESf6WDDMEo8F4udtzkBo2N1MYgoJdaivWC00wA5zq-tXotVQTkJkZwAjUiDImjlYsCGW39sdZoo9y7uscK1wNcZkYrmnTa0o-LZQ-7r-4d63A67CdSFzPlfKrzkpRqawjCsKwMf_bv7ussAWSz1NhEf36bmHowhCjd14oCpgO4ZHEnGHNG1MOka_0gQIgFD-yw7JVYlLHQ70NsQ9ict5FZL6QNxsn2MkjiODvA6KbZf7zotrKir7tD06Cay5eDF3KbaRs4u1yS9NcR-cr8lCdcS63qnI7UvZNUPFRkkheRtopnBDQKqYnfH_AQbPGgf5qp6Ov5xntkuUOXB5IGE=w480-h347-no', alt_text='이미지 오류' ) return [head_section, block1] a = round(sumOfcal(user) / getBaseUser(user) * 100) if a < 25: t ="*" + food_name + "*" + " 의 칼로리는 " + "*" + str(kal) + "*" + " 입니다 "+uu+" 회원님~~.\n" + "누적된 칼로리는 " + str( round(sumOfcal(user))) + " / " + str( getBaseUser(user)) + " *-------" + str( round(sumOfcal(user) / getBaseUser(user) * 100)) + "%" + "*" + " 입니다.\n잘 하고 계시니까, 칼로리 안넘치도록 조심하세요!" b = 'https://lh3.googleusercontent.com/CSu1I7gQX8bDjVYVBZxxAjhAVZfg4o2O-rTYXuHvIpwGgfJPV3X5w5iis58nRCQqL16Qubvr1yy2N_YM7ZXGsMhNTKVePFLWNSLG1qOVd7A2D0pd1NVHWW1lUq4BC90_jU9m7F0vw3TpZqONE32IXqwFaEh7X8wPBGBkcfih2yHU0w44FfVnlHhuLhf0jn0qMCpT9TfdfU-FlnymfARPh4BiQP2tTAtA74-JqO_BJwMG-hZJDn0KzFQ2wTO7pxG-D70I2u4SbUHkmsEpD41yxYvdS8pOUpHqlNMuX7CuH3tXS1jWJ-vAZbV27UpfoLBGgEbE3lwA_kaq-iUgQISt7_lrvZcpQ_2byx793fEgWOfCeIPOCr22JkEfXzOeJ_Y4tYOGqUpSLbn5yh8Aj3JmakvtaMtPogfsucrm0cR9kUYW98-n9LstAATvwP4Am44jK0xl8DZ0o8YA5vblX8xX252cQ-uWK0gl4MqNjjlgLbOhaxdExcgQ3e8bGH8TNzh0ewKKjJPI86M5U6fdcxNF4TTzEjC9kH-z-QibqENjaEGzgP3yzuCA7eGAXBPUEqoXAOH3G0KyKPJ0yXUS-IEib8PDI_r5i461spcG83KzRxhpfa5g1EPbUkYWzMEpYBCgYd73UIiwTaXvs9CiIHSKmm7DmkyTvK4=w540-h289-no' elif a < 50: t ="*" + food_name + "*" + " 의 칼로리는 " + "*" + str(kal) + "*" + " 입니다 "+uu+" 회원님~~.\n" + "누적된 칼로리는 " + str( round(sumOfcal(user))) + " / " + str( getBaseUser(user)) + " *-------" + str( round(sumOfcal(user) / getBaseUser(user) * 100)) + "%" + "*" + " 입니다.\n아오, 회원님 때릴뻔 했네...\n 회원님 적당히 먹으세요\n부탁드리겠습니다~" b = 'https://lh3.googleusercontent.com/QG_TduWV3ygep12RCS-h3nuBIJomlBxkTRGxTXXSg9F9PqMCiELoiGbBXzS4V9zQvCDV6hH7Qwy9rJ4VMLFUjLXR0IaPukOzKXisWtu0zdEzsZ9KQfp4TKz2iLHkd8hUKukWHOMhYfd1SukIx-G4pQCBJ8KfWybnr7KB9uXY44kZJOl97aBa3oKyVa3B1ni7zC76f7keWW-ZUH4os1_ZjGRYpd7aTEhEdAH8KI8YvfwEP4uVXMCtEeT_Ruyjd4VXWEDBu4_lg_zz-6e7YSPS7tyOAB_gZ5Oj1jB44X2FOS2fkDx0W_DmwxqA9vBZ-4V1jOPhzdjM0AOMnGfSO-V_dNeHGGrvjHss_BqVnvKrMp_ShgP5IDbxJq5G5VK2qiP4zdB-l4oXwycz1AuhY4_zV_aRRLmPZ7A891Tke2692Dxd2AX5SdoWUWWUZJYGOxFWyCs8E1QvWPr06vyC5MHSr4RZX0bl4ls2l-4I8ncWT-vdD1MfvURs0-miAKMKybhTrSbYXb5qeh8bxbRxab3L_QdNHT57yp20P3SxOh8Pq-OiEJs6jgj1jIWKdPD4_zz7BLXeqowSd3LesCwWRZdLi3442jPOatbKjgJiTk-wnfz87y2fFpX4o7mhn2BTvLUmYyf1wx9ZXEg9uPCS5rVPRBAyt-oYl7U=w674-h448-no' elif a < 75: t = "*" + food_name + "*" + " 의 칼로리는 " + "*" + str(kal) + "*" + " 입니다 "+uu+" 회원님.\n" + "누적된 칼로리는 " + str( round(sumOfcal(user))) + " / " + str( getBaseUser(user)) + " *-------" + str( round(sumOfcal(user) / getBaseUser(user) * 100)) + "%" + "*" + " 입니다.\n회원님... 상큼하게 터져볼래요?\n지금 칼로리 위험위험 합니다 ^^" b = 'https://lh3.googleusercontent.com/WT9FEKwAw66v363gOt5TRBIzhLC_eUUyxgeIUGLRYhiCK_-Igpb0L2Fa2jzdB6fNmt8NftUu2RQ1GZ4B0ZLvNJ5WJSTmYUwgVz-f8AaQrF3Jr3M-Lxiamh1dcluggto_-qtEdSlM_0R4xfK45CpJtk8h-VSW2RNwyLUC4BNpNZsmXoDe14duD_CiODAJOAS0yvCvJQp7yzY2jWy3BUN3QwGxdCmidw9kM2nhzZGKNyo3OCbvBACKGVloxnuCfXQLB96tn4yxBcKjG_gxo0Mxod2kZL4PDWg0ovAEQHkF66mOe7Pyd2xp0wjume36wK4UTXXX2GbGpvZxypkiXm8EFTPDLURVu5Z_XxBCQargbZ9U6tR0c0EBf7SxZw6UAx52IisnVAmDzyvgg-JgLF_YjKb0UsJi2rEvMjMmeJbA9UnG2EWRV90LC3XTDjx34hpK6gPfJSIygx4hxkKZun0_jV0a9bQM-otHiG8_0hElej1wQm0FenEdYBnMBODEDw-48kozRKnUC-wkpqgwOTRN4vxriPkbuM7U1baBji-UZ60LjtVhQS2_ujO0mj-6xKEI5KahZl2Q8TP6MjvlalR3t9PvJKrlp3KRGaT9UWu9JpoWMveBi6nykfi2R6bJJP78BnwOYBjqJpfCgX1i9dJsgetj0ACmaxo=w700-h404-no' elif a < 100: t = "*" + food_name + "*" + " 의 칼로리는 " + "*" + str(kal) + "*" + " 입니다 "+uu+" 회원님.\n" + "누적된 칼로리는 " + str( round(sumOfcal(user))) + " / " + str( getBaseUser(user)) + " *-------" + str( round(sumOfcal(user) / getBaseUser(user) * 100)) + "%" + "*" + " 입니다.\n회..회원님... \n아 말리지 말아봐요..!!" b = 'https://lh3.googleusercontent.com/d-cUNReJdtzfj4Hvy-DEQ1fiIGXgQrtSGOvM1yyuAqq-o3B8iFOJPm40sQjC6qeXyAtkKiTTh6UQKqwVYDp0TfSHUHKDUbnqrUJ-g-zo0y2K-rTLnBV1jcBQTPkj_F0Mo06RBNSfUcgh5A6vfC03vgw1pwIZ2exo_-5YvmHh1BiSFMaB2NLHeBO1RxsfYRj0KayKZIIrojS9osRp6E3A_5QQmjiWcmwp3iqifKV5XLzT6ItJVYFyFgQUVX4yeq3XZUOdOpDa-2g-kzhkQSkFySDK1iv72cCwyFuqn4QxGQFQlFia2rKw26XuNUHQJGJ5kDgU1q-Zg-VUdfrAtwvEOajkw-I_f7cyXos7F2zfTAwK1Ti5QBP1vksU5_5rMeE867DEIG8ybRnMiFJQtdE1oDCkacKzlZM1gt3uspSfkVamKkpzdJ9gF-laaI7d_bE5gsqHe0N5aIvDLlF1WB7no2SA4gQp2HKNPUOCelq__gcEBye1jLgcbcELcGLRxKFzc87zNkOALaqVAJ2HBeR3IfIIzpyKF_ebw_oCpM0F1Rw2ESC4nDkijQbor22FSicbHfeLoRaPTKfwoXk3Et0sHquNyQ_bkBB9aFf5PQQhwhSJkdZLAX5pWPOm3Ou_aWO9ejplSpe82NEbu7CagXGRD-0s9UPhHcI=w550-h367-no' head_section = SectionBlock( text=t ) block1 = ImageBlock( image_url=b, alt_text='이미지 오류' ) return [head_section, block1]
def test_valid_construction(self): modal_view = View( type="modal", callback_id="modal-id", title=PlainTextObject(text="Awesome Modal"), submit=PlainTextObject(text="Submit"), close=PlainTextObject(text="Cancel"), blocks=[ InputBlock( block_id="b-id", label=PlainTextObject(text="Input label"), element=PlainTextInputElement(action_id="a-id"), ), InputBlock( block_id="cb-id", label=PlainTextObject(text="Label"), element=CheckboxesElement( action_id="a-cb-id", options=[ Option( text=PlainTextObject( text="*this is plain_text text*"), value="v1", ), Option( text=MarkdownTextObject( text="*this is mrkdwn text*"), value="v2", ), ], ), ), SectionBlock( block_id="sb-id", text=MarkdownTextObject( text="This is a mrkdwn text section block."), fields=[ PlainTextObject(text="*this is plain_text text*", emoji=True), MarkdownTextObject(text="*this is mrkdwn text*"), PlainTextObject(text="*this is plain_text text*", emoji=True), ], ), DividerBlock(), SectionBlock( block_id="rb-id", text=MarkdownTextObject( text= "This is a section block with radio button accessory"), accessory=RadioButtonsElement( initial_option=Option( text=PlainTextObject(text="Option 1"), value="option 1", description=PlainTextObject( text="Description for option 1"), ), options=[ Option( text=PlainTextObject(text="Option 1"), value="option 1", description=PlainTextObject( text="Description for option 1"), ), Option( text=PlainTextObject(text="Option 2"), value="option 2", description=PlainTextObject( text="Description for option 2"), ), ], ), ), ], ) modal_view.validate_json()
def joke(text): if 'ㅠ' in text: head_section = SectionBlock( text='회원님~ 울면 근손실 일어나요~\n울지마요~' ) block1 = ImageBlock( image_url='https://lh3.googleusercontent.com/hguAuf5QNQrXgUcpzHiZvc8nATE4abjsm36RutYY2RmoRiunaPQYrtVu6bdabJOiAsGVYhNddP6Jwn9oFaBCOcd4yXyeiCK2jMQPSPNSY3Xf-y92L4ZPBwXUk2Sgy_PlvUrhcgnQaDdD5j2Q6GrRLPuFgNRa_B5eDeU8bloS7DiX7-Z-OIwQJFZPYau8bBiplhV6Qb1JEjEJm_9nOTAvuAYoRCGArs6_lFf53oAssxooJnuEnVu8L7VPfLzEnvovK65lvgHaFL2_-voZ5k7uF_vQGVgoSBXJgICOi9afhbKGfy5nqW6rvSYQGQBcKxuhzLAifkZwPfze93a7jLLjlh5uOjd_e_qsF0yAXlEGBqd3k1QehUVYjkZRdkc7_ULxsaWzDgQ1jtu0SYnwlM-WcdGRWf9kayGs3s-_yY0rjn6-TlTI0ip5EFhiVA-oqC1be5LCwGeEvxGCvmZgWvzE0LK8J90grXiINXxGF0xsAECO8-t3MU0eLPDzPazftQRKNMObEfBj5f0mA41n1ergumMc-iliJzx2M4_tN22mIUsq8nM7fP5AkULVrQHs7i_6dC1PE5ua3nxQLMHA8lc_-rIJln3Rqizn27sVJREyuW50hFHlQKfSzzfKT_0_IgYvdpfBO_E6AduGYrl3oXFf0jxPe9cIABk=w1080-h566-no', alt_text='이미지 오류' ) return [head_section, block1] elif '배고파' in text: head_section = SectionBlock( text='이걸 보고도 밥이 목구녕으로 넘어가요?\n단식하세요 회원님~' ) block1 = ImageBlock( image_url='https://lh3.googleusercontent.com/8coAcbfuPVGQusuhukNzXV5QyIjNIQN2TEgBEMGjk7OgGtJBGMoQlf6mYQB8fM5_U_O-q6EOhecKm7k4f5jMiLrJ8gsK3L3PLc9EZFcFdhJfWZ0lEnPee-BN7oOkV4_cwuEjvGIA33jMn0-t8I9bhfm3KwvEAYh7gWnCTdPt7xKL3xEhs2VPLQ3c8D4Nzkc1RExG55s6rhtLCU7Tx7G-2WIOghLbuOpdNL1aVejGXBTBnSU3CEN-7ElUo7yprjb7Y6dxRc0JpZHrveKH_mc0LU5-EUR4LERA2fImwtbpI0-jGBGLOZYzkGOyh04uVIHXfHuNe5yh9CAcNkizPJ3HgDr6yujtyA9Vw5XMgM5GOascxYvM-axlc7k2SUb0478XcipU6ErIS9V8_OiytFNcbJq4rcWWt55VwxUJXFWblf5-cXWapvADG-DRBc2_LJzTrCyC0Yr2cIjGR3PrN4DKIxj-d1TmXXCZx9q3Dbhf2YAY0Qi2jPYcJI2iwRZHpjrKOGQuEpe7a8-NmfvDgxYp5_GEc-JvDg9MQftGS9r3RnF5EmKTpa3T38CgWSAgx1pzcDY6VExt5pwqG5dZp0dNvokCqhw95dqjMRejkRfSTdZ2GwxlWAvLw6vvYXhigSWmSGg2CePCENNnY5IZfXcaXTWUh2AUPL0=w562-h555-no', alt_text='이미지 오류' ) return [head_section, block1] elif '언더아머' in text: head_section = SectionBlock( text='언더아머는 3대 500치는 회원님들만 착용 가능합니다.\n단속걸리지 않게 조심하세요 회원님~' ) block1 = ImageBlock( image_url='https://lh3.googleusercontent.com/dZtOqOrDykNsxJDCb1JePrlnUHRJ6KAZ5kBTdhObypu6kEi-kFYo2nJYdCmlHKnPPfSHxgjSGqA5fVju6YVh6Fq8G6BeFkx7s-l42mkTG0j8GseW-_NKLfXv1f0gKLzHdyq4SuvY5BIJCVpmWdzPK_m6W64uZHNQJaFoOQOSXbwEYdugI1aMFWnZiPW3a3lvFZGAZ9gf9chKumwdxDLs8hb1TMsjlnP-l3OXGeMvd0cZUXxGDPtwfJ-7UWzbEelwpCVC6PynqdMNBcJ-aO92fpx7H6YxCTa8mkeNvKjF7N9UXSeOxkjwv9nCw2vxJdRm7apLXIjPQuCnf70KBtj7yE-Cai4Ri-T2Z1l4sJL7qXU-TKf8jHPmmL5Q1LYgszkuU5XWJsyx5AB2eMUpBhxPRFqdVpK1kJ7cv8i0Z1fo-rL8AZV5CrvLCajY0UWefjbJPNgxdcTKjahuX1nmANUEdLl12pz6X-NXPoYrays12hFjdUVs4jf3L8lkvwQpgLML4tyG_94KBj3shr6885TuWMJ8bzXrX4-wExhpkb83bQ5Y6Fx7T-98zmzFv9GUgDJN0uYyDyxfNdIEqU9OVTz8IgEOJwBEn1dhYCpSwEDfK6ytPfb65MuCOM3rF-OccVIlKy3iRfoqn0lTTh9nbgrZVALFuBqjVG4=w480-h360-no', alt_text='이미지 오류' ) return [head_section, block1] else: a = random.randint(1, 4) if a == 1: head_section = SectionBlock( text='운동만이 살길입니다 회원님~\n오늘도 식단관리 화이팅~!' ) block1 = ImageBlock( image_url='https://lh3.googleusercontent.com/WtzRAuX3FBFWkaJ9f_V9pz4SZeaF0eKtLMBuzG3UQUGMpPwwXDuJRBCm-ywHPXtnseBoQHJY0VL403dRWeBzeC1cbqg-_sonFaboyMbdUE3PK7Dkk7wg6ttB62zU1KcsDQDN5CkBwD8p-46Zrhrbzx6YLj_PEMk8vT3-H11Yv_XRz6liNpOctV_b-ZdSxmxm7ASrbzr2alRXi7LYOc4cBwTTRXSx5RuLsC0YexIY2dbkvctU-uVAwE8D1pVy4oyDhO_JDFvUJ_23tW5PC9hZSxlFfFZbs2Us6JOgJXQTAuV6_v9-ttElhZ3HdmnMhshjs9nOB_msBFIcgFOJiVXbyVHpq_C9z9Me7O3HztaKI2NKStevMVROwVE4Y4LnkAYXPk2GqOIpBHQmOXltIPguu-bWwWfIE7HLFiZ9hPYJdyFr3ocfhxbp6XASnsTKnT8Uo-qKGJvb4UkYSO9snqZBlMqiODjbcxNX5ER2MTyvAoHJCvVrWo_pYNwJmAAjBUR476xr8O8lJLu6_4mJAjx7D1HH6KkV98kedOBI8ZCoXwBbWNLjRJ0GdzLcBlIrDXnf1dsi_UVgUvQ4SN4CffrzlSIFopeAfaCQDPCwVJ4-VKvwg42rkjZGfmOovlgeAq2x9NporUOBkY45BXJ9Z4xLYAUbPsJQElM=w300-h168-no', alt_text='이미지 오류' ) return [head_section, block1] elif a == 2: head_section = SectionBlock( text='운동은 마음가짐입니다 회원님~\n열심히 노력하셔야 해요!' ) block1 = ImageBlock( image_url='https://lh3.googleusercontent.com/sfUnnQaoAysIBzSBkrLbZwO3bUThjF9E0Lb2JxB-QyJ6OgLo5RfGrAubkZKvm31b-zWyhYzsEM_V3_pyrrh_vvjNymptF6BF7YrfvUAdp5VNCBW76ZpOd06-VCjXpe0de0X0jlW6akvPwKxb0UNrkrIIY9ys8cFtMehj004xv7tsTycUXRiwPr83PLFYmUI9d1jCiUfM0HpBntUSO6Kc76PjPI-mNPaxrakpqlvTuPDaxbohioDQFTnJpkTUX6ZmeLX2Tz0M4viIhIFiv3ph5rONmeM_LxYbAc77l_9Y8EeRhdDBCNjxahyquZt4AAH4ots0Yf2FNbxFXsFQph7_UT3PddapAwb0x5rOZflttIxoDiaWbuPWP3uPVM3BW94VsDt6NE6SCHIT0_pnRtr2AYdGQ5VlI2EQ4ocN-ueH89WDOLuZh5GErO77uJTdp9V1rGJhU6Dyvqy19_xV0Udd9Byf9QcQsQ95d7BOHS92FroJFRk6E5igmRNe8VTsJgxX_Fu5Dz-XcaVVpb86BmlaedE10v-ZautFloH9DR-GLjeKhwc1ZTUB5aihno_SWN7h4bAs-krDYZ0TChFV8Q_YsxhSrV43zVK_20oIBFm7YYLWt1PzP-rF1TkQSkONOkbuc5f_F1gskOOBjL_wqRCakZ5lKpB6GCQ=w1200-h675-no', alt_text='이미지 오류' ) return [head_section, block1] else: head_section = SectionBlock( text='몸도 중요하지만 회원님~\n몸완얼인것도 아시죠??' ) block1 = ImageBlock( image_url='https://lh3.googleusercontent.com/MYuP8tgvOl03wNHV0hpwXc_Lbd8937HIzKzmfO1Z2mZdaKuaNUjUkRt5v2j9hvq7R-yS1M6XTcQvE5SQ9lF1fy3YgLyX5E60pbuhzp_e5D6MDzXixj-k-q2-JBKc-_NfClsOwW3fKS2Crh-2vdjhDSjvVz9QrFyNcsBp3wHVHoomzhtnie9rQqN5lJKxmQjOzeO_2eqyDAimS9udOrhQruokCb3wwfNTe9x9R01KeBCR1DzGDcuhZeCvgQ6ae9tTmSSYr1AtDCxpGPN62e9xgPx8uf6zCtiYJkPwzqcW37363fYb9v0I9Ua2O6MgMicDt1dfba18zguP4sGmr3kpzDh6q4MKSOSwSN0XBDRUfZo2GbtZ5ZQj__s3c7Rv5p-WvwQQLBnM-uvx0WOmnyFEOO47UdJg3XU1AYMsb5gmtaIN7x3dhVxPBiuku1KWwZC1NcD59oHc9Gxk1q5LiykC-iDTlo5FKAC1WYvbDFZn2uhHwGJDQuvWEb5Qcpnf2WkLM4vfeAE1dm_LUk_KdvZue6Hs6jv_3BmbMAdxSWGUHA2hGLqrmlxIM9RR4KFVWN2gcqNZO19tz9y74U3uMdx2N7xmuepFF_WTnSOf4nu8QNbpVSV2wLLnaJRmzy5iLDYTGL77S9iNHIG-JtXd2COq1AmVwvFXKE4=w188-h268-no', alt_text='이미지 오류' ) return [head_section, block1]