블랙베리 클래식(Q20) 카카오톡 메시지 텔레그램으로 받기

블랙베리 클래식을 가지고 놀면서 제일 불편했던 점이 카카오톡을 사용할 수 없다는 부분이었습니다. 아마 블랙베리를 사용하신 분들이 안드로이드로 많이 전향했던 이유가 이 부분이었던 것 같은데요, 블랙베리 네이버 카페에서 카카오톡 메시지를 텔레그램으로 보내는 방법이 있지만, Tasker라는 앱을 이용한 방법도 있어 간단하게 써보겠습니다.

준비물

우선 준비물은 아래와 같습니다.

설정하는 방법이 조금 복잡할 수 있지만 원리는 매우 간단합니다.
안드로이드와 블랙베리 둘 다 유심을 사용 할 경우 카톡 메시지를 SMS로 보내는 설정만으로 충분히 사용가능합니다.
하지만 저처럼 블랙베리에 유심이 없는 분들은 번호가 없기 때문에 텔레그램으로 보내는것이죠~

Step1. Tasker를 활용한 문자/카톡 등 알람 SMS 보내기

SMS 설정은 매우 친절하게 설명해주신 블로그가 있어서 링크 첨부합니다.
해당 블로그 따라 하면 충분히 구현 가능합니다.

USIM이 각각 있어서 텔레그램은 필요 없고 SMS로 내용을 전달받으실 분은 아래 블로그를 통해 설정 후 텔레그램 연동 부분을 지나 Step3. 추가 작업으로 이동하시면 됩니다.

https://blog.naver.com/dukeyoun/222252556195

부연 설명

  • 1번 설정 부분에서 To 영역에 아무것도 안 넣으면 저장이 안 되는데 이 부분은 엔터키를 입력하여 한 줄 띄워주면 됩니다. (아래 7번 상세 화면 이미지 참고)
  • 화면이 꺼지고 Tasker 작동이 멈출때
    1. 배터리 절전 모드 예외처리(tasker, autonotification, restask 3개 전부)
    2. Tasker -> Preference -> MISC에 Allow External Access 체크!

Step2. 텔레그램 메시지로 연동하기

텔레그램으로 보내는 내용은 블랙베리 네이버 카페에 자세히 다루고 있어 링크를 첨부합니다.
봇을 만들고 설정하는 부분이 복잡하긴 한데 몇 번 정독하면서 따라 하니 성공했습니다.

https://cafe.naver.com/blackberrysmartphone/539118

원리는 처음 설정했던 Send SMS 부분을 RESTask로 교체하고 RESTask를 통해서 텔레그램 봇에게 메시지를 받는 원리입니다.

Step3. 추가 작업

구축을 완료하여 사용해보니 어떤 앱에서 오는 알림인지 단톡방이면 어떤 방에서 오는 건지 알 수가 없어서 또 이리저리 찾아보다가 설정을 조금 고쳐보았습니다.

  • 카톡에 n개의 안 읽은 메시지 삭제
  • 앱 이름 + 단톡방 노출
  • 단톡방(서브 텍스트) 이름이 없을 땐 삭제
카카오톡 개인 메시지와 단톡방 차이
카카오톡 말고 다른 앱 알림도 받을 수 있습니다.

변수가 하나 더 추가되었는데 긁어오는 메시지에 서브 텍스트가 있는지 없는지를 체크하기 위해 생성되었습니다.
원리는 동일합니다.

해당 부분은 이미지로 설명하는 부분이 편할 것 같아서 첨부합니다.

변수 설정 화면

TASKS 설정 화면

Send SMS 부분은 사용하지 않기 때문에 disable 처리한 상태입니다.

네이버 블로그에 있던 구조와 동일하지만, 앞에 If 문이 들어가면서 서브 텍스트에 n개의 안 읽은 메시지 제외와 서브 텍스트가 없을 때 보내는 메시지에 노출이 안 되는 작업까지 들어간 부분을 확인할 수 있습니다.
If 문은 + 누르고 추가하셔서 쭉 드래그하여 올리면 됩니다.

1번 상세 화면

IF 조건문에 아래와 같이 AND 조건으로 추가하시면 해당 메시지는 전달이 안 됩니다.

3번 상세 화면

5번 상세 화면

7번 상세 화면

Tasker xml 파일

전화번호와 텔레그램 정보들을 삭제하여 올렸습니다. 해당 정보들을 넣으면 정상 작동합니다!
전화번호, Host, chat_id 값 수정 필요!

<TaskerData sr="" dvi="1" tv="5.13.6">
	<Task sr="task4">
		<cdate>1628830784213</cdate>
		<edate>1631457114729</edate>
		<id>4</id>
		<nme>Resend Notifications Sample</nme>
		<pri>100</pri>
		<rty>1</rty>
		<Action sr="act0" ve="7">
			<code>37</code>
			<ConditionList sr="if">
				<bool0>And</bool0>
				<Condition sr="c0" ve="3">
					<lhs>%ansubtext</lhs>
					<op>3</op>
					<rhs>*개의 안 읽은 메시지*</rhs>
				</Condition>
				<Condition sr="c1" ve="3">
					<lhs>%antitle</lhs>
					<op>3</op>
					<rhs>*업그레이드 중입니다.*</rhs>
				</Condition>
			</ConditionList>
		</Action>
		<Action sr="act1" ve="7">
			<code>37</code>
			<ConditionList sr="if">
				<Condition sr="c0" ve="3">
					<lhs>%ansubtext</lhs>
					<op>2</op>
					<rhs>*ansubtext*</rhs>
				</Condition>
			</ConditionList>
		</Action>
		<Action sr="act10" ve="7">
			<code>41</code>
			<on>false</on>
			<Str sr="arg0" ve="3">01022223333</Str>
			<Str sr="arg1" ve="3">%SendMsg</Str>
			<Int sr="arg2" val="0"/>
			<Str sr="arg3" ve="3"/>
			<Int sr="arg4" val="0"/>
		</Action>
		<Action sr="act11" ve="7">
			<code>554915598</code>
			<Bundle sr="arg0">
				<Vals sr="val">
					<bundle_header></bundle_header>
					<bundle_header-type>java.lang.String</bundle_header-type>
					<bundle_param>chat_id ********||text %SendMsg</bundle_param>
					<bundle_param-type>java.lang.String</bundle_param-type>
					<com.freehaha.restask.BASICAUTH></com.freehaha.restask.BASICAUTH>
					<com.freehaha.restask.BASICAUTH-type>java.lang.String</com.freehaha.restask.BASICAUTH-type>
					<com.freehaha.restask.BODY></com.freehaha.restask.BODY>
					<com.freehaha.restask.BODY-type>java.lang.String</com.freehaha.restask.BODY-type>
					<com.freehaha.restask.CERT></com.freehaha.restask.CERT>
					<com.freehaha.restask.CERT-type>java.lang.String</com.freehaha.restask.CERT-type>
					<com.freehaha.restask.CERTPATH>empty</com.freehaha.restask.CERTPATH>
					<com.freehaha.restask.CERTPATH-type>java.lang.String</com.freehaha.restask.CERTPATH-type>
					<com.freehaha.restask.CHUNKED>n</com.freehaha.restask.CHUNKED>
					<com.freehaha.restask.CHUNKED-type>java.lang.String</com.freehaha.restask.CHUNKED-type>
					<com.freehaha.restask.COOKIE>%rtck</com.freehaha.restask.COOKIE>
					<com.freehaha.restask.COOKIE-type>java.lang.String</com.freehaha.restask.COOKIE-type>
					<com.freehaha.restask.COOKIEJAR>restask</com.freehaha.restask.COOKIEJAR>
					<com.freehaha.restask.COOKIEJAR-type>java.lang.String</com.freehaha.restask.COOKIEJAR-type>
					<com.freehaha.restask.CUSTOMBODY>n</com.freehaha.restask.CUSTOMBODY>
					<com.freehaha.restask.CUSTOMBODY-type>java.lang.String</com.freehaha.restask.CUSTOMBODY-type>
					<com.freehaha.restask.CUSTOMECERT>n</com.freehaha.restask.CUSTOMECERT>
					<com.freehaha.restask.CUSTOMECERT-type>java.lang.String</com.freehaha.restask.CUSTOMECERT-type>
					<com.freehaha.restask.HEADER>%rthdr</com.freehaha.restask.HEADER>
					<com.freehaha.restask.HEADER-type>java.lang.String</com.freehaha.restask.HEADER-type>
					<com.freehaha.restask.HOST>https://api.telegram.org/bot**********/sendMessage</com.freehaha.restask.HOST>
					<com.freehaha.restask.HOST-type>java.lang.String</com.freehaha.restask.HOST-type>
					<com.freehaha.restask.KEEP_COOKIE>n</com.freehaha.restask.KEEP_COOKIE>
					<com.freehaha.restask.KEEP_COOKIE-type>java.lang.String</com.freehaha.restask.KEEP_COOKIE-type>
					<com.freehaha.restask.OUTPUT_FILE></com.freehaha.restask.OUTPUT_FILE>
					<com.freehaha.restask.OUTPUT_FILE-type>java.lang.String</com.freehaha.restask.OUTPUT_FILE-type>
					<com.freehaha.restask.REDIRECT>y</com.freehaha.restask.REDIRECT>
					<com.freehaha.restask.REDIRECT-type>java.lang.String</com.freehaha.restask.REDIRECT-type>
					<com.freehaha.restask.RESPONSE>%rtres</com.freehaha.restask.RESPONSE>
					<com.freehaha.restask.RESPONSE-type>java.lang.String</com.freehaha.restask.RESPONSE-type>
					<com.freehaha.restask.RETCODE>%rtcode</com.freehaha.restask.RETCODE>
					<com.freehaha.restask.RETCODE-type>java.lang.String</com.freehaha.restask.RETCODE-type>
					<com.freehaha.restask.SYNCCALL>y</com.freehaha.restask.SYNCCALL>
					<com.freehaha.restask.SYNCCALL-type>java.lang.String</com.freehaha.restask.SYNCCALL-type>
					<com.freehaha.restask.TIMEOUT>30</com.freehaha.restask.TIMEOUT>
					<com.freehaha.restask.TIMEOUT-type>java.lang.String</com.freehaha.restask.TIMEOUT-type>
					<com.freehaha.restask.TYPE>POST</com.freehaha.restask.TYPE>
					<com.freehaha.restask.TYPE-type>java.lang.String</com.freehaha.restask.TYPE-type>
					<com.twofortyfouram.locale.intent.extra.BLURB>REST call</com.twofortyfouram.locale.intent.extra.BLURB>
					<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
					<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>com.freehaha.restask.TYPE com.freehaha.restask.HOST com.freehaha.restask.TIMEOUT com.freehaha.restask.BASICAUTH com.freehaha.restask.CUSTOMBODY com.freehaha.restask.BODY com.freehaha.restask.CUSTOMECERT com.freehaha.restask.CERTPATH com.freehaha.restask.SYNCCALL com.freehaha.restask.HEADER com.freehaha.restask.COOKIE com.freehaha.restask.COOKIEJAR com.freehaha.restask.KEEP_COOKIE com.freehaha.restask.REDIRECT com.freehaha.restask.CHUNKED com.freehaha.restask.OUTPUT_FILE bundle_param bundle_header</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
					<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
					<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
					<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
				</Vals>
			</Bundle>
			<Str sr="arg1" ve="3">com.freehaha.restask</Str>
			<Str sr="arg2" ve="3">com.freehaha.restask.EditActivity</Str>
			<Int sr="arg3" val="30"/>
			<Int sr="arg4" val="0"/>
		</Action>
		<Action sr="act12" ve="7">
			<code>549</code>
			<Str sr="arg0" ve="3">%SendMsg</Str>
			<Int sr="arg1" val="0"/>
			<Int sr="arg2" val="0"/>
			<Int sr="arg3" val="0"/>
		</Action>
		<Action sr="act2" ve="7">
			<code>547</code>
			<Str sr="arg0" ve="3">%GetMsg</Str>
			<Str sr="arg1" ve="3">[ %anapp ]
   %antitle : %antext</Str>
			<Int sr="arg2" val="0"/>
			<Int sr="arg3" val="0"/>
			<Int sr="arg4" val="0"/>
			<Int sr="arg5" val="3"/>
			<Int sr="arg6" val="0"/>
		</Action>
		<Action sr="act3" ve="7">
			<code>43</code>
		</Action>
		<Action sr="act4" ve="7">
			<code>547</code>
			<Str sr="arg0" ve="3">%GetMsg</Str>
			<Str sr="arg1" ve="3">[ %anapp %ansubtext ]
   %antitle : %antext</Str>
			<Int sr="arg2" val="0"/>
			<Int sr="arg3" val="0"/>
			<Int sr="arg4" val="0"/>
			<Int sr="arg5" val="3"/>
			<Int sr="arg6" val="0"/>
		</Action>
		<Action sr="act5" ve="7">
			<code>38</code>
		</Action>
		<Action sr="act6" ve="7">
			<code>547</code>
			<Str sr="arg0" ve="3">%SendMsg</Str>
			<Str sr="arg1" ve="3">
</Str>
			<Int sr="arg2" val="0"/>
			<Int sr="arg3" val="0"/>
			<Int sr="arg4" val="1"/>
			<Int sr="arg5" val="3"/>
			<Int sr="arg6" val="0"/>
			<ConditionList sr="if">
				<Condition sr="c0" ve="3">
					<lhs>%SendMsg</lhs>
					<op>12</op>
					<rhs></rhs>
				</Condition>
			</ConditionList>
		</Action>
		<Action sr="act7" ve="7">
			<code>547</code>
			<Str sr="arg0" ve="3">%SendMsg</Str>
			<Str sr="arg1" ve="3">%GetMsg</Str>
			<Int sr="arg2" val="0"/>
			<Int sr="arg3" val="0"/>
			<Int sr="arg4" val="1"/>
			<Int sr="arg5" val="3"/>
			<Int sr="arg6" val="0"/>
		</Action>
		<Action sr="act8" ve="7">
			<code>549</code>
			<Str sr="arg0" ve="3">%GetMsg</Str>
			<Int sr="arg1" val="0"/>
			<Int sr="arg2" val="0"/>
			<Int sr="arg3" val="0"/>
		</Action>
		<Action sr="act9" ve="7">
			<code>30</code>
			<Int sr="arg0" val="0"/>
			<Int sr="arg1" val="3"/>
			<Int sr="arg2" val="0"/>
			<Int sr="arg3" val="0"/>
			<Int sr="arg4" val="0"/>
		</Action>
	</Task>
</TaskerData>

마치며

블랙베리만 가지고 외출할 때 텔레그램으로 알림을 오게 세팅하니 답장은 못 해도 카톡이 없다는 불안감은 어느 정도 해결되는 것 같습니다.

설정이 이래저래 복잡하지만 한 번 해두면 수정할 일이 없으니 블랙베리 사용 중인 거라면 도전해보세요!