2015-06-26 09:55:13 +03:00
|
|
|
# -*- coding: utf-8 -*-
|
2015-07-01 05:36:58 +03:00
|
|
|
from __future__ import print_function
|
2015-06-26 09:55:13 +03:00
|
|
|
|
2015-06-26 10:46:02 +03:00
|
|
|
import json
|
2015-06-26 13:02:30 +03:00
|
|
|
import time
|
|
|
|
import threading
|
2015-06-26 09:55:13 +03:00
|
|
|
|
2015-07-01 05:36:58 +03:00
|
|
|
from telebot import apihelper, types
|
2015-06-30 06:49:35 +03:00
|
|
|
|
2015-06-26 09:55:13 +03:00
|
|
|
"""
|
|
|
|
Module : telebot
|
|
|
|
"""
|
|
|
|
|
|
|
|
API_URL = r"https://api.telegram.org/"
|
|
|
|
|
|
|
|
|
|
|
|
class TeleBot:
|
|
|
|
""" This is TeleBot Class
|
|
|
|
Methods:
|
|
|
|
getMe
|
|
|
|
sendMessage
|
|
|
|
forwardMessage
|
|
|
|
sendPhoto
|
|
|
|
sendAudio
|
|
|
|
sendDocument
|
|
|
|
sendSticker
|
|
|
|
sendVideo
|
|
|
|
sendLocation
|
|
|
|
sendChatAction
|
|
|
|
getUserProfilePhotos
|
|
|
|
getUpdates
|
|
|
|
setWebhook
|
|
|
|
"""
|
|
|
|
|
|
|
|
def __init__(self, token):
|
|
|
|
self.token = token
|
2015-06-26 13:02:30 +03:00
|
|
|
self.update_listener = []
|
|
|
|
self.polling_thread = None
|
|
|
|
self.__stop_polling = False
|
|
|
|
self.interval = 3
|
|
|
|
|
2015-06-30 06:49:35 +03:00
|
|
|
self.last_update_id = 0
|
2015-06-30 02:44:14 +03:00
|
|
|
|
2015-06-26 13:02:30 +03:00
|
|
|
def get_update(self):
|
2015-06-30 06:49:35 +03:00
|
|
|
result = apihelper.get_updates(self.token, offset=(self.last_update_id + 1))
|
2015-06-26 13:02:30 +03:00
|
|
|
updates = result['result']
|
|
|
|
notify_updates = []
|
|
|
|
for update in updates:
|
2015-06-30 06:49:35 +03:00
|
|
|
if update['update_id'] > self.last_update_id:
|
|
|
|
self.last_update_id = update['update_id']
|
2015-06-26 13:02:30 +03:00
|
|
|
msg = types.Message.de_json(json.dumps(update['message']))
|
|
|
|
notify_updates.append(msg)
|
|
|
|
self.__notify_update(notify_updates)
|
|
|
|
|
|
|
|
def __notify_update(self, new_messages):
|
|
|
|
for listener in self.update_listener:
|
2015-06-30 06:54:04 +03:00
|
|
|
t = threading.Thread(target=listener, args=new_messages)
|
2015-06-26 13:02:30 +03:00
|
|
|
t.start()
|
|
|
|
|
2015-06-26 17:16:11 +03:00
|
|
|
def polling(self, interval=3):
|
2015-06-26 13:02:30 +03:00
|
|
|
"""
|
|
|
|
Always get updates.
|
|
|
|
:param interval: iterval secs.
|
|
|
|
:return:
|
|
|
|
"""
|
2015-06-26 17:16:11 +03:00
|
|
|
self.interval = interval
|
|
|
|
# clear thread.
|
2015-06-26 13:02:30 +03:00
|
|
|
self.__stop_polling = True
|
2015-06-26 17:16:11 +03:00
|
|
|
time.sleep(interval + 1)
|
2015-06-26 13:02:30 +03:00
|
|
|
self.__stop_polling = False
|
|
|
|
self.polling_thread = threading.Thread(target=self.__polling, args=())
|
2015-06-27 05:03:02 +03:00
|
|
|
self.polling_thread.daemon = True
|
2015-06-26 13:02:30 +03:00
|
|
|
self.polling_thread.start()
|
|
|
|
|
|
|
|
def __polling(self):
|
2015-07-01 05:36:58 +03:00
|
|
|
print('telegram bot start polling')
|
2015-06-26 13:02:30 +03:00
|
|
|
while not self.__stop_polling:
|
2015-06-27 17:31:40 +03:00
|
|
|
try:
|
|
|
|
self.get_update()
|
|
|
|
except Exception as e:
|
2015-07-01 05:36:58 +03:00
|
|
|
print(e)
|
2015-06-26 13:02:30 +03:00
|
|
|
time.sleep(self.interval)
|
|
|
|
|
2015-07-01 05:36:58 +03:00
|
|
|
print('telegram bot stop polling')
|
2015-06-26 13:02:30 +03:00
|
|
|
|
|
|
|
def stop_polling(self):
|
|
|
|
self.__stop_polling = True
|
|
|
|
|
|
|
|
def set_update_listener(self, listener):
|
|
|
|
self.update_listener.append(listener)
|
2015-06-26 09:55:13 +03:00
|
|
|
|
|
|
|
def get_me(self):
|
2015-06-26 10:46:02 +03:00
|
|
|
result = apihelper.get_me(self.token)
|
|
|
|
if result['ok'] is not True:
|
2015-06-26 13:02:30 +03:00
|
|
|
raise Exception('getMe Error.' + json.dumps(result))
|
2015-06-26 10:46:02 +03:00
|
|
|
u = types.User.de_json(json.dumps(result['result']))
|
|
|
|
return u
|
2015-06-26 09:55:13 +03:00
|
|
|
|
|
|
|
def send_message(self, chat_id, text, disable_web_page_preview=None, reply_to_message_id=None, reply_markup=None):
|
2015-06-28 12:27:25 +03:00
|
|
|
"""
|
|
|
|
Use this method to send text messages.
|
|
|
|
:param chat_id:
|
|
|
|
:param text:
|
|
|
|
:param disable_web_page_preview:
|
|
|
|
:param reply_to_message_id:
|
|
|
|
:param reply_markup:
|
|
|
|
:return:
|
|
|
|
"""
|
2015-06-26 09:55:13 +03:00
|
|
|
return apihelper.send_message(self.token, chat_id, text, disable_web_page_preview, reply_to_message_id,
|
|
|
|
reply_markup)
|
2015-06-26 17:16:11 +03:00
|
|
|
|
|
|
|
def forward_message(self, chat_id, from_chat_id, message_id):
|
2015-06-26 17:35:52 +03:00
|
|
|
"""
|
2015-06-26 20:53:07 +03:00
|
|
|
Use this method to forward messages of any kind.
|
2015-06-26 17:35:52 +03:00
|
|
|
:param chat_id: which chat to forward
|
|
|
|
:param from_chat_id: which chat message from
|
|
|
|
:param message_id: message id
|
|
|
|
:return:
|
|
|
|
"""
|
2015-06-26 17:16:11 +03:00
|
|
|
return apihelper.forward_message(self.token, chat_id, from_chat_id, message_id)
|
2015-06-26 20:53:07 +03:00
|
|
|
|
|
|
|
def send_photo(self, chat_id, photo, caption=None, reply_to_message_id=None, reply_markup=None):
|
2015-06-26 21:14:45 +03:00
|
|
|
"""
|
|
|
|
Use this method to send photos.
|
|
|
|
:param chat_id:
|
|
|
|
:param photo:
|
|
|
|
:param caption:
|
|
|
|
:param reply_to_message_id:
|
|
|
|
:param reply_markup:
|
|
|
|
:return:
|
|
|
|
"""
|
2015-06-26 20:53:07 +03:00
|
|
|
return apihelper.send_photo(self.token, chat_id, photo, caption, reply_to_message_id, reply_markup)
|
|
|
|
|
|
|
|
def send_audio(self, chat_id, data, reply_to_message_id=None, reply_markup=None):
|
2015-06-26 21:14:45 +03:00
|
|
|
"""
|
|
|
|
Use this method to send audio files, if you want Telegram clients to display the file as a playable
|
|
|
|
voice message. For this to work, your audio must be in an .ogg file encoded with OPUS
|
|
|
|
:param chat_id:
|
|
|
|
:param data:
|
|
|
|
:param reply_to_message_id:
|
|
|
|
:param reply_markup:
|
|
|
|
:return:
|
|
|
|
"""
|
2015-06-26 20:53:07 +03:00
|
|
|
return apihelper.send_data(self.token, chat_id, data, 'audio', reply_to_message_id, reply_markup)
|
|
|
|
|
|
|
|
def send_document(self, chat_id, data, reply_to_message_id=None, reply_markup=None):
|
2015-06-26 21:14:45 +03:00
|
|
|
"""
|
|
|
|
Use this method to send general files.
|
|
|
|
:param chat_id:
|
|
|
|
:param data:
|
|
|
|
:param reply_to_message_id:
|
|
|
|
:param reply_markup:
|
|
|
|
:return:
|
|
|
|
"""
|
2015-06-26 20:53:07 +03:00
|
|
|
return apihelper.send_data(self.token, chat_id, data, 'document', reply_to_message_id, reply_markup)
|
|
|
|
|
|
|
|
def send_sticker(self, chat_id, data, reply_to_message_id=None, reply_markup=None):
|
2015-06-26 21:14:45 +03:00
|
|
|
"""
|
|
|
|
Use this method to send .webp stickers.
|
|
|
|
:param chat_id:
|
|
|
|
:param data:
|
|
|
|
:param reply_to_message_id:
|
|
|
|
:param reply_markup:
|
|
|
|
:return:
|
|
|
|
"""
|
2015-06-26 20:53:07 +03:00
|
|
|
return apihelper.send_data(self.token, chat_id, data, 'sticker', reply_to_message_id, reply_markup)
|
|
|
|
|
|
|
|
def send_video(self, chat_id, data, reply_to_message_id=None, reply_markup=None):
|
2015-06-26 21:14:45 +03:00
|
|
|
"""
|
|
|
|
Use this method to send video files, Telegram clients support mp4 videos.
|
|
|
|
:param chat_id:
|
|
|
|
:param data:
|
|
|
|
:param reply_to_message_id:
|
|
|
|
:param reply_markup:
|
|
|
|
:return:
|
|
|
|
"""
|
2015-06-26 20:53:07 +03:00
|
|
|
return apihelper.send_data(self.token, chat_id, data, 'video', reply_to_message_id, reply_markup)
|
2015-06-27 16:55:45 +03:00
|
|
|
|
2015-06-27 17:11:18 +03:00
|
|
|
def send_location(self, chat_id, latitude, longitude, reply_to_message_id=None, reply_markup=None):
|
2015-06-28 12:27:25 +03:00
|
|
|
"""
|
|
|
|
Use this method to send point on the map.
|
|
|
|
:param chat_id:
|
|
|
|
:param latitude:
|
|
|
|
:param longitude:
|
|
|
|
:param reply_to_message_id:
|
|
|
|
:param reply_markup:
|
|
|
|
:return:
|
|
|
|
"""
|
2015-06-27 17:11:18 +03:00
|
|
|
return apihelper.send_location(self.token, chat_id, latitude, longitude, reply_to_message_id, reply_markup)
|
2015-06-28 12:56:32 +03:00
|
|
|
|
|
|
|
def send_chat_action(self, chat_id, action):
|
|
|
|
"""
|
|
|
|
Use this method when you need to tell the user that something is happening on the bot's side.
|
|
|
|
The status is set for 5 seconds or less (when a message arrives from your bot, Telegram clients clear
|
|
|
|
its typing status).
|
|
|
|
:param chat_id:
|
|
|
|
:param action: string . typing,upload_photo,record_video,upload_video,record_audio,upload_audio,upload_document,
|
|
|
|
find_location.
|
|
|
|
:return:
|
|
|
|
"""
|
|
|
|
return apihelper.send_chat_action(self.token, chat_id, action)
|