Python의 텔레그램 봇. 처음부터 환율로 봇을 작성하기 위한 완전한 가이드

Telegram의 봇은 청중과의 접촉을 설정하거나 이전에 수동으로 수행해야 했던 작업을 단순화하는 데 도움이 되는 프로그램입니다. 이 프로그램은 메신저 플랫폼을 위해 특별히 작성되었습니다. 봇은 다음과 같은 방식으로 작동합니다. 사용자는 입력 라인을 통해 명령을 보내고 시스템은 텍스트 또는 대화형 메시지로 응답합니다. 때때로 프로그램은 실제 사람의 행동을 모방하기까지 합니다. 이러한 봇은 고객 사이에서 더 많은 신뢰를 불러일으킵니다.

사용자에게 자동 지원을 위한 여러 유형의 시스템이 있습니다. 일부 봇은 고객과 통신만 하고 다른 봇은 정기적으로 정보를 제공합니다. 프로그램을 유형으로 명확하게 나누는 것은 불가능합니다. 개발자는 종종 하나의 봇에 여러 기능을 결합합니다.

9단계로 화면 버튼 형태의 인터랙티브 요소가 있는 텔레그램용 간단한 봇을 작성할 수 있습니다. 각각을 자세히 살펴보고 몇 가지 질문에 답해 보겠습니다.

  • 봇을 시작하는 방법;
  • 하나 이상의 버튼에서 내장 키보드를 등록하는 방법;
  • 원하는 기능의 버튼을 프로그래밍하는 방법;
  • 인라인 모드란 무엇이며 기존 봇에 대해 설정하는 방법입니다.

0단계: Telegram 봇 API에 대한 이론적 배경

텔레그램 봇을 만드는 데 사용되는 주요 도구는 HTML 응용 프로그래밍 인터페이스(HTML API)입니다. 이 요소는 방문자 요청을 수락하고 정보 형식으로 응답을 보냅니다. 기성품 디자인은 프로그램 작업을 단순화합니다. Telegram용 봇을 작성하려면 다음 이메일 주소를 사용해야 합니다. https://api.telegram.org/bot/METHOD_NAME

봇이 올바르게 작동하려면 프로그램을 보호하고 신뢰할 수 있는 개발자에게 액세스 권한을 제공하는 문자 조합인 토큰도 필요합니다. 각 토큰은 고유합니다. 문자열은 생성 시 봇에 할당됩니다. getUpdates, getChat 등의 방법이 다를 수 있습니다. 방법 선택은 개발자가 봇에서 기대하는 알고리즘에 따라 다릅니다. 토큰 예:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

봇은 GET 및 POST 요청을 사용합니다. 예를 들어 sendMessage 메서드가 채팅 ID와 일부 텍스트를 보내야 하는 경우와 같이 메서드 매개변수를 보완해야 하는 경우가 많습니다. 메소드 구체화를 위한 매개변수는 application/x-www-form-urlencoded를 사용하거나 application-json을 통해 URL 쿼리 문자열로 전달할 수 있습니다. 이러한 방법은 파일 다운로드에 적합하지 않습니다. UTF-8 인코딩도 필요합니다. API에 요청을 보내면 결과를 JSON 형식으로 얻을 수 있습니다. getME 메소드를 통한 정보 검색에 대한 프로그램의 응답을 살펴보십시오.

https://api.telegram.org/bot 받기/getMe{ ok: true, 결과: { id: 231757398, first_name: "환율 봇", 사용자 이름: "exchangetestbot" } }

다음과 같은 경우 결과를 얻을 수 있습니다. ok 같음 참된. 그렇지 않으면 시스템에 오류가 표시됩니다.

봇에서 사용자 지정 메시지를 받는 방법에는 두 가지가 있습니다. 두 방법 모두 효과적이지만 다른 경우에 적합합니다. 메시지를 받으려면 getUpdates 메소드를 사용하여 수동으로 요청을 작성할 수 있습니다. 프로그램은 화면에 업데이트 데이터 배열을 표시합니다. 요청은 정기적으로 보내야 하며 각 어레이를 분석한 후 전송을 반복합니다. Offset은 확인된 개체가 다시 나타나지 않도록 새 결과를 로드하기 전에 건너뛴 레코드 수를 결정하는 매개변수입니다. getUpdates 메서드의 이점은 다음과 같은 경우에 적용됩니다.

  • HTTPS를 구성할 방법이 없습니다.
  • 복잡한 스크립팅 언어가 사용됩니다.
  • 봇 서버는 수시로 변경됩니다.
  • 봇이 사용자와 함께 로드됩니다.

사용자 메시지를 수신하기 위해 작성할 수 있는 두 번째 방법은 setWebhook입니다. 한 번만 사용되므로 계속해서 새 요청을 보낼 필요가 없습니다. 웹훅은 데이터 업데이트를 지정된 URL로 보냅니다. 이 방법에는 SSL 인증서가 필요합니다. Webhook은 다음과 같은 경우에 유용합니다.

  • 웹 프로그래밍 언어가 사용됩니다.
  • 봇에 과부하가 걸리지 않고 사용자가 너무 많지 않습니다.
  • 서버가 변경되지 않으면 프로그램이 오랫동안 동일한 서버에 유지됩니다.

추가 지침에서는 getUpdates를 사용합니다.

@BotFather Telegram 서비스는 챗봇을 생성하도록 설계되었습니다. 기본 설정도 이 시스템을 통해 설정됩니다. BotFather는 설명 작성, 프로필 사진 삽입, 지원 도구 추가를 도와드립니다. 텔레그램 봇에 대한 HTML 요청 세트인 라이브러리는 인터넷에서 사용할 수 있으며 상당히 많습니다. 예제 프로그램을 만들 때 pyTelegramBotApi를 사용했습니다.

1단계: 환율 요청 구현

먼저 쿼리를 수행하는 코드를 작성해야 합니다. PrivatBank API를 작성할 때 사용할 것입니다. 아래 링크는 https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5입니다. 코드에서 다음 메서드를 사용해야 합니다.

  • load_exchange – 환율을 찾고 인코딩된 정보를 표시합니다.
  • get_exchange – 특정 통화에 대한 데이터를 표시합니다.
  • get_exchanges – 샘플에 따른 통화 목록을 보여줍니다.

결과적으로 pb.py 파일의 코드는 다음과 같습니다.

가져오기 다시 가져오기 요청 가져오기 json URL = 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5' def load_exchange(): return json.loads(requests.get(URL).text) def get_exchange(ccy_key ): exc in load_exchange(): if ccy_key == exc['ccy']: return exc return False def get_exchanges(ccy_pattern): result = [] ccy_pattern = re.escape(ccy_pattern) + '.*' for exc in load_exchange(): re.match(ccy_pattern, exc['ccy'], re.IGNORECASE)가 None이 아닌 경우: result.append(exc) 반환 결과

프로그램은 지정된 요청에 대해 다음 응답을 발행할 수 있습니다.

[ { ccy:"USD", base_ccy:"UAH", 구매:"25.90000", 판매:"26.25000" }, { ccy:"EUR", base_ccy:"UAH", 구매:"29.10000", 판매:"29.85000 " }, { ccy:"RUR", base_ccy:"UAH", 구매:"0.37800", 판매:"0.41800" }, { ccy:"BTC", base_ccy:"USD", 구매:"11220.0384", 판매: "12401.0950" } ]

2단계: @BotFather로 텔레그램 봇 생성

@BotFather 서비스를 사용하여 메시지를 수신하고 응답하는 프로그램을 만들 수 있습니다. 그의 텔레그램 페이지로 이동하여 /newbot 명령을 입력하십시오. 채팅에 지침이 나타나며 먼저 봇의 이름을 기록한 다음 주소를 적어야 합니다. 봇 계정이 생성되면 토큰이 포함된 환영 메시지가 화면에 나타납니다. 추가 구성을 위해 다음 명령을 사용하십시오.

  • /setdescription – 설명;
  • /setabouttext – 새 봇에 대한 정보
  • /setuserpic – 프로필 사진
  • /setinline – 인라인 모드
  • /setcommands – 명령에 대한 설명입니다.

마지막 구성 단계에서 /help 및 /exchange에 대해 설명합니다. 모든 단계가 완료되면 코딩으로 넘어갈 차례입니다.

3단계: 봇 설정 및 실행

config.py 파일을 만들어 봅시다. 여기에는 고유한 봇 코드와 프로그램이 정보를 찾을 시간대를 지정해야 합니다.

토큰 = '' # 봇의 토큰으로 교체TIMEZONE = 'Europe/Kiev' TIMEZONE_COMMON_NAME = 'Kiev'

다음으로 이전에 작성된 pb.py, 라이브러리 및 기타 필요한 구성 요소를 가져와서 다른 파일을 만듭니다. 누락된 라이브러리는 패키지 관리 시스템(pip)에서 설치됩니다.

import telebotimport configimport pbimport datetimeimport pytzimport jsonimport traceback 가져오기 P_TIMEZONE = pytz.timezone(config.TIMEZONE) TIMEZONE_COMMON_NAME = config.TIMEZONE_COMMON_NAME

pyTelegramBotApi의 콘텐츠를 사용하여 봇을 생성해 보겠습니다. 다음 코드를 사용하여 수신된 토큰을 보냅니다.

봇 = telebot.TeleBot(config.TOKEN) bot.polling(none_stop=True)

none_stop 매개변수는 요청이 지속적으로 전송되도록 합니다. 매개변수의 작동은 메소드 오류의 영향을 받지 않습니다.

4단계: /start 명령 처리기 작성

이전 단계가 모두 올바르게 완료되면 봇이 작동하기 시작한 것입니다. 프로그램은 getUpdates 메소드를 사용하기 때문에 정기적으로 요청을 생성합니다. none_stop 요소가 있는 줄 앞에 /start 명령을 처리하는 코드가 필요합니다.

@bot.message_handler(commands=['start']) def start_command(message): bot.send_message( message.chat.id, '안녕하세요! 환율을 보여드릴 수 있습니다.n' + '환율을 알아보려면 /를 누르세요. exchange.n' + '도움을 받으려면 /help를 누르세요.' )

RџS‚Rё 명령=['시작'] 참과 같음 start_command가 호출됩니다. 메시지의 내용이 거기에 있습니다. 다음으로 send 함수를 구현해야 합니다._메세지 특정 메시지와 관련하여.

5단계: /help 명령 처리기 만들기

/help 명령은 버튼으로 구현할 수 있습니다. 클릭하면 사용자는 개발자의 텔레그램 계정으로 이동합니다. "개발자에게 문의하기"와 같이 버튼에 이름을 지정합니다. send_message 메소드에 대해 사용자를 링크로 리디렉션하는 reply_markup 매개변수를 설정하십시오. 키보드를 생성하는 매개변수(InlineKeyboardMarkup)를 코드에 작성해 보겠습니다. 하나의 버튼(InlineKeyboardButton)만 있으면 됩니다.

최종 명령 처리기 코드는 다음과 같습니다.

@bot.message_handler(commands=['help']) def help_command(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( '개발자에게 문의하기', url='ваша ссылка на профиль' ) ) bot.send_message( message.chat.id, '1) 사용 가능한 통화 목록을 받으려면 /exchange.n' + '2) 관심 통화를 클릭하세요.n' + '3) 귀하 소스 및 대상 통화에 대한 정보가 포함된 메시지를 받게 됩니다. ' + '구매율 및 판매율.n' + '4) "업데이트"를 클릭하여 요청에 대한 현재 정보를 수신합니다. ' + '봇은 이전 환율과 현재 환율의 차이도 보여줍니다.n' + '5) 봇은 인라인을 지원합니다. 유형 @ 모든 채팅 및 통화의 첫 글자.', reply_markup=keyboard )

Telegram 채팅의 코드 작업:

Python의 텔레그램 봇. 처음부터 환율로 봇을 작성하기 위한 완전한 가이드

6단계: /exchange 명령 처리기 추가

이 단계는 채팅에서 사용 가능한 통화 기호가 있는 버튼을 표시하는 데 필요합니다. 옵션이 있는 화면 키보드는 실수를 방지하는 데 도움이 됩니다. PrivatBank는 루블, 달러 및 유로에 대한 정보를 제공합니다. InlineKeyboardButton 옵션은 다음과 같이 작동합니다.

  1. 사용자는 원하는 지정이 있는 버튼을 클릭합니다.
  2. getUpdates는 콜백(CallbackQuery)을 수신합니다.
  3. 키보드 누르기를 처리하는 방법이 알려지며 누른 버튼에 대한 정보가 전송됩니다.

/exchange 핸들러 코드:

@bot.message_handler(commands=['exchange']) def exchange_command(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton('USD', callback_data='get-USD') ) keyboard.row( telebot.types.InlineKeyboardButton('EUR', callback_data='get-EUR'), telebot.types.InlineKeyboardButton('RUR', callback_data='get-RUR') ) bot.send_message( message.chat .id, '선택한 통화 클릭:', reply_markup=keyboard )

Telegram의 코드 결과:

Python의 텔레그램 봇. 처음부터 환율로 봇을 작성하기 위한 완전한 가이드

7단계: 내장 키보드 버튼에 대한 핸들러 작성

pyTelegramBot Api 패키지에는 @bot.callback_query_handler 데코레이터 기능이 포함되어 있습니다. 이 구성 요소는 콜백을 함수로 변환하도록 설계되었습니다. API는 호출을 풀고 다시 생성합니다. 다음과 같이 쓰여 있습니다.

@bot.callback_query_handler(func=lambda call: True) def iq_callback(query): data = query.data if data.startswith('get-'): get_ex_callback(query)

get_ex_callback 메서드도 작성해 보겠습니다.

def get_ex_callback(query): bot.answer_callback_query(query.id) send_exchange_result(query.message, query.data[4:])

또 다른 유용한 방법인 answer_callback_query가 있습니다. 버튼을 누르고 화면에 결과를 표시하는 사이의 부하를 제거하는 데 도움이 됩니다. 일부 통화 코드와 메시지를 전달하여 send_exchange_query에 메시지를 보낼 수 있습니다. send_exchange_result를 작성해 보겠습니다.

def send_exchange_result(message, ex_code): bot.send_chat_action(message.chat.id, 'typing') ex = pb.get_exchange(ex_code) bot.send_message( message.chat.id, serialize_ex(ex), reply_markup=get_update_keyboard(ex) ), parse_mode='HTML' )

챗봇이 은행에서 요청한 결과를 받는 동안 API, 방문자는 "메시지 입력"이라는 비문을 봅니다. 실제 사람이 대답하는 것처럼 보입니다. 이러한 표시기를 화면에 표시하려면 입력 상태 줄을 추가해야 합니다. 다음으로 get_exchange를 사용할 것입니다. 도움을 받아 프로그램은 통화 지정(루블, 유로 또는 달러)을 받게 됩니다. send_message는 추가 방법을 사용합니다. serialize_ex는 통화를 다른 형식으로 변환하고 get_update_keyboard는 정보를 업데이트하고 통화 시장 데이터를 다른 채팅으로 보내는 소프트키를 설정합니다.

get_update_keyboard에 대한 코드를 작성해 보겠습니다. 두 개의 버튼을 언급해야 합니다. t와 e는 유형 및 교환을 나타냅니다. 사용자가 여러 채팅 중에서 선택할 수 있도록 공유 버튼에 대한 switch_inline_query 항목이 필요합니다. 방문자는 달러, 루블 또는 유로의 현재 환율을 보낼 사람을 선택할 수 있습니다.

def get_update_keyboard(예시): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton( '업데이트', callback_data=json.dumps({ 't': 'u', 'e': { ' b': ex['구매'], 's': ex['sale'], 'c': ex['ccy'] } }).replace(' ', '') ), telebot.types.InlineKeyboardButton ('공유', switch_inline_query=ex['ccy']) ) 키보드 반환

때로는 환율이 단기간에 얼마나 변했는지 확인해야 합니다. 사용자가 코스를 비교할 수 있도록 업데이트 버튼에 대해 두 가지 메서드를 작성해 보겠습니다.

환율의 차이는 diff 매개변수를 통해 직렬 변환기로 전달됩니다.

규정된 방법은 데이터가 업데이트된 후에만 작동하며 코스의 첫 번째 표시에는 영향을 미치지 않습니다.

def serialize_ex(ex_json, diff=None): 결과 = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + '매수: ' + ex_json['매수'] if diff: 결과 += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + '매도: ' + ex_json['판매'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' else: result += 'nSell: ' + ex_json['sale'] + 'n' return result def serialize_exchange_diff(diff): result = '' if diff > 0: 결과 = '(' + str(diff) + ' " src="https://sworg/images/core/emoji/2.3/svg/2197.svg">" src="https://sworg/images /core/emoji/72x72/2197.png">" src="https://sworg/images/core/emoji/72x72/2197.png">)' elif diff < 0: 결과 = '(' + str( diff)[1:] + ' " src="https://sworg/images/core/emoji/2.3/svg/2198.svg">" src="https://sworg/images/core/emoji/72x72 /2198.png">" src="https://sworg/images/core/emoji/72x72/2198.png">)' 반환 결과

방문자가 달러 환율을 알고 싶어한다고 상상해보십시오. 메시지에서 USD를 선택하면 다음과 같이 됩니다.

Python의 텔레그램 봇. 처음부터 환율로 봇을 작성하기 위한 완전한 가이드

8단계: 업데이트 버튼 핸들러 구현

업데이트 버튼으로 작업을 처리하는 코드를 작성하고 여기에 iq_callback_method 부분을 추가해 보겠습니다. 프로그램 항목이 get 매개변수로 시작되면 get_ex_callback을 작성해야 합니다. 다른 상황에서는 JSON을 구문 분석하고 키 t를 얻으려고 시도합니다.

@bot.callback_query_handler(func=lambda 호출: True) def iq_callback(query): data = query.data if data.startswith('get-'): get_ex_callback(query) else: try: if json.loads(data)[ 't'] == 'u': Edit_message_callback(query) 제외 ValueError: 통과

t가 u이면 edit_message_callback 메소드를 위한 프로그램을 작성해야 합니다. 이 프로세스를 단계별로 분해해 보겠습니다.

  1. 통화 시장 상태에 대한 최신 정보 다운로드(exchange_now = pb.get_exchange(data['c']).
  1. diff를 사용하여 직렬 변환기를 통해 새 메시지 작성
  2. 서명 추가(get_edited_signature).

초기 메시지가 변경되지 않으면 edit_message_text 메소드를 호출하십시오.

def edit_message_callback(query): 데이터 = json.loads(query.data)['e'] exchange_now = pb.get_exchange(data['c']) 텍스트 = serialize_ex( exchange_now, get_exchange_diff( get_ex_from_iq_data(data), exchange_now ) ) + 'n' + get_edited_signature() if query.message: bot.edit_message_text( text, query.message.chat.id, query.message.message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML' ) elif query.idline_message : bot.edit_message_text( text, inline_message_id=query.inline_message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML' )

JSON을 구문 분석하기 위해 get_ex_from_iq_data 메서드를 작성해 보겠습니다.

def get_ex_from_iq_data(exc_json): return { '구매': exc_json['b'], '판매': exc_json['s'] }

몇 가지 방법이 더 필요합니다. 예를 들어 get_exchange_diff는 통화 비용에 대한 이전 정보와 새 정보를 읽고 차이를 표시합니다.

def get_exchange_diff(last, now): return { 'sale_diff': float("%.6f" % (float(now['sale']) - float(last['sale']))), 'buy_diff': float ("%.6f" % (float(now['buy']) - float(last['buy']))) }

마지막 get_edited_signature는 코스가 마지막으로 업데이트된 시간을 보여줍니다.

def get_edited_signature(): 반환 '업데이트됨 ' + str(datetime.datetime.now(P_TIMEZONE).strftime('%H:%M:%S')) + ' (' + TIMEZONE_COMMON_NAME + ')'

결과적으로 안정적인 환율로 봇에서 업데이트된 메시지는 다음과 같습니다.

Python의 텔레그램 봇. 처음부터 환율로 봇을 작성하기 위한 완전한 가이드

코스가 변경되면 지정된 매개 변수로 인해 값의 차이가 메시지에 표시됩니다.

Python의 텔레그램 봇. 처음부터 환율로 봇을 작성하기 위한 완전한 가이드

9단계: 임베디드 모드 구현

프로그램에서 모든 채팅으로 정보를 빠르게 보내려면 기본 제공 모드가 필요합니다. 이제 대화에 참가자로 봇을 추가할 필요가 없습니다. 텔레그램 사용자가 앞에 @ 기호가 있는 봇 이름을 입력하면 입력 라인 위에 변환 옵션이 나타나야 합니다. 항목 중 하나를 클릭하면 봇이 결과와 데이터 업데이트 및 전송 버튼이 포함된 메시지를 대화에 보냅니다. 보낸 사람의 이름에는 "통해"라는 캡션이 포함됩니다. ".

InlineQuery는 라이브러리를 통해 query_text에 전달됩니다. 이 코드는 answer_line 함수를 사용하여 검색 결과를 데이터 배열 및 inline_query_id 요소로 검색합니다. 요청 시 봇이 여러 통화를 찾을 수 있도록 get_exchanges를 사용합니다.

@bot.inline_handler(func=lambda 쿼리: True) def query_text(inline_query): bot.answer_inline_query( inline_query.id, get_iq_articles(pb.get_exchanges(inline_query.query)) )

이 메서드를 통해 InlineQueryResultArticle에서 개체를 반환하기 위해 데이터 배열을 get_iq_articles에 전달합니다.

def get_iq_articles(exchanges): 결과 = [] 교환의 exc: result.append( telebot.types.InlineQueryResultArticle( id=exc['ccy'], title=exc['ccy'], input_message_content=telebot.types.InputTextMessageContent ( serialize_ex(exc), parse_mode='HTML' ), reply_markup=get_update_keyboard(exc), description='Convert ' + exc['base_ccy'] + ' -> ' + exc['ccy'], thumb_height=1 ) ) 반환 결과

이제 @를 쓰면 줄에 공백을 입력하면 검색 결과가 화면에 나타납니다(사용 가능한 세 가지 통화로 변환하는 옵션).

Python의 텔레그램 봇. 처음부터 환율로 봇을 작성하기 위한 완전한 가이드

사용자는 원하는 통화를 입력하여 결과를 필터링할 수 있습니다.

목록에서 원하는 통화를 클릭하면 채팅은 봇 사용자가 받는 것과 동일한 메시지를 받습니다. 업데이트 버튼을 사용할 수도 있습니다. 아래 이미지는 봇을 통해 전송된 업데이트된 메시지를 보여줍니다.

Python의 텔레그램 봇. 처음부터 환율로 봇을 작성하기 위한 완전한 가이드

결론

이제 Telegram용 봇을 만드는 방법을 알게 되었습니다. 프로그램에 유용한 도구를 추가할 수 있습니다. 결과를 업데이트하고 다른 메신저 사용자에게 보내기 위한 버튼과 채팅 외부에서 봇의 기능을 사용할 수 있는 기본 제공 모드가 있습니다. 이 지침에 따라 환율을 표시하는 것뿐만 아니라 다른 기능을 가진 간단한 봇을 만들 수 있습니다. 라이브러리, API 및 코드를 실험하여 Telegram에서 고객과 채팅하고 회사와 관심 있는 사람들의 연결을 강화하는 자동화된 도우미를 만드는 것을 두려워하지 마십시오.

댓글 1

  1. 판타스티카 퍼블리시온

댓글을 남겨주세요.