Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.14 KB | None | 0 0
  1. !pip install pyTelegramBotAPI
  2. !pip install googletrans
  3. !pip install flask
  4. import telebot
  5. import requests
  6. from googletrans import Translator
  7. from pprint import pprint
  8. import datetime
  9.  
  10. APPID = 'd699d894ac2c53930be1ee0df5f8d64d'
  11.  
  12. TOKEN = '833600167:AAFs3BiDmCGOc_kTqFyssj0nUmrOnT-wr9Y'
  13.  
  14. bot = telebot.TeleBot(TOKEN)
  15. translator = Translator()
  16. users = {}
  17. modes = {}
  18.  
  19.  
  20. def weather(city, gap):
  21. answer = ''
  22. try:
  23. if gap == 'now':
  24. res = requests.get("http://api.openweathermap.org/data/2.5/weather",
  25. params={'q': (city), 'units': 'metric', 'lang': 'ru', 'APPID': APPID})
  26. data = res.json()
  27. pprint(data)
  28. answer = str(data['weather'][0]['description']) + '\n' + str(data['main']['temp']) + ' ℃'
  29. elif gap == 'hourly':
  30. answer = []
  31. data = requests.get("http://api.openweathermap.org/data/2.5/forecast/hourly",
  32. params={'q': (city), 'units': 'metric', 'lang': 'ru', 'APPID': APPID}).json()
  33. for i in data['list']:
  34. answer.append(i['dt_txt'] + '\n' + i['weather']['description'] + '\n' + i['main']['temp'])
  35. answer = '\n'.join(answer)
  36. elif gap == '5d':
  37. answer = []
  38. data = requests.get("http://api.openweathermap.org/data/2.5/forecast",
  39. params={'q': (city), 'units': 'metric', 'lang': 'ru', 'APPID': APPID}).json()
  40. for i in data['list']:
  41. answer.append(i['dt_txt'] + '\n' + i['weather']['description'] + '\n' + i['main']['temp'])
  42. answer = '\n'.join(answer)
  43. elif gap == '16d':
  44. answer = []
  45. data = requests.get("http://api.openweathermap.org/data/2.5/forecast/daily",
  46. params={'q': (city), 'units': 'metric', 'lang': 'ru', 'APPID': APPID}).json()
  47. for i in data['list']:
  48. answer.append(i['dt_txt'] + '\n' + i['weather']['description'] + '\n' + i['main']['temp'])
  49. answer = '\n'.join(answer)
  50. except Exception as e:
  51. answer = "Exception (weather): " + str(e)
  52. return answer
  53.  
  54.  
  55. def coord(lat, lon):
  56. try:
  57. res = requests.get("http://api.openweathermap.org/data/2.5/weather",
  58. params={'lat': str(lat), 'lon': str(lon), 'units': 'metric', 'lang': 'ru', 'APPID': APPID})
  59. data = res.json()
  60. answer = str(data['weather'][0]['description']) + '\n' + str(data['main']['temp']) + ' ℃' + '\n' + str(
  61. data['name'])
  62. if gap == 'now':
  63. res = requests.get("http://api.openweathermap.org/data/2.5/weather",
  64. params={'lat': str(lat), 'lon': str(lon), 'units': 'metric', 'lang': 'ru',
  65. 'APPID': APPID})
  66. data = res.json()
  67. pprint(data)
  68. answer = str(data['weather'][0]['description']) + '\n' + str(data['main']['temp']) + ' ℃'
  69. elif gap == 'hourly':
  70. answer = []
  71. data = requests.get("http://api.openweathermap.org/data/2.5/forecast/hourly",
  72. params={'lat': str(lat), 'lon': str(lon), 'units': 'metric', 'lang': 'ru',
  73. 'APPID': APPID}).json()
  74. for i in data['list']:
  75. answer.append(i['dt_txt'] + '\n' + i['weather']['description'] + '\n' + i['main']['temp'])
  76. answer = '\n'.join(answer)
  77. elif gap == '5d':
  78. answer = []
  79. data = requests.get("http://api.openweathermap.org/data/2.5/forecast",
  80. params={'lat': str(lat), 'lon': str(lon), 'units': 'metric', 'lang': 'ru',
  81. 'APPID': APPID}).json()
  82. for i in data['list']:
  83. answer.append(i['dt_txt'] + '\n' + i['weather']['description'] + '\n' + i['main']['temp'])
  84. answer = '\n'.join(answer)
  85. elif gap == '16d':
  86. answer = []
  87. data = requests.get("http://api.openweathermap.org/data/2.5/forecast/daily",
  88. params={'lat': str(lat), 'lon': str(lon), 'units': 'metric', 'lang': 'ru',
  89. 'APPID': APPID}).json()
  90. for i in data['list']:
  91. answer.append(i['dt_txt'] + '\n' + i['weather']['description'] + '\n' + i['main']['temp'])
  92. answer = '\n'.join(answer)
  93. except Exception as e:
  94. answer = "Exception (weather): " + str(e)
  95. return answer
  96.  
  97.  
  98. def to_coords(city):
  99. url = "https://geocode-maps.yandex.ru/1.x/"
  100. params = {
  101. 'geocode': city,
  102. 'format': 'json'
  103. }
  104. response = requests.get(url, params)
  105. json = response.json()
  106. coordinates_str = json['response']['GeoObjectCollection']['featureMember'][0]['GeoObject']['Point']['pos']
  107. lon, lat = map(float, coordinates_str.split())
  108. return lat, lon
  109.  
  110.  
  111. def get_carbon(lat, lon):
  112. try:
  113. data = requests.get("http://api.openweathermap.org/pollution/v1/co/",
  114. params={'location': f'{str(lat)},{str(lon)}',
  115. 'datetime': datetime.datetime.now().isoformat(), 'APPID': APPID}).json()
  116. answer = data['data'][0]['value']
  117. except Exception as e:
  118. answer = e
  119. return answer
  120.  
  121.  
  122. @bot.message_handler(commands=['start'])
  123. def handle_start(message):
  124. user_markup = telebot.types.ReplyKeyboardMarkup(True, False)
  125. user_markup.row('/start', '/stop')
  126. # user_markup.row('Погода')
  127. bot.send_message(message.from_user.id,
  128. "Напишите нужный вам город или отправьте геопозицию и получите сводку погоды.",
  129. reply_markup=user_markup)
  130.  
  131.  
  132. @bot.message_handler(commands=['stop'])
  133. def handle_stop(message):
  134. hide_markup = telebot.types.ReplyKeyboardRemove()
  135. bot.send_message(message.from_user.id, "...", reply_markup=hide_markup)
  136.  
  137.  
  138. @bot.message_handler(commands=['gap'])
  139. def handle_stop(message):
  140. global users
  141. msgl = message.text.lower().strip('/gap').strip()
  142. if msgl in ['now', 'hourly', '5d', '16d']:
  143. users[message.from_user.id] = msgl
  144. else:
  145. bot.send_message(message.from_user.id,
  146. "Некорректный промежуток времени. Значения: now, hourly, 5d, 16d")
  147.  
  148.  
  149. @bot.message_handler(commands=['mode'])
  150. def handle_stop(message):
  151. global users
  152. msgl = message.text.lower().strip('/mode').strip()
  153. if msgl in ['weather', 'cd']:
  154. users[message.from_user.id] = msgl
  155. else:
  156. bot.send_message(message.from_user.id,
  157. "Некорректное значение. Допустимые: weather, cd")
  158.  
  159.  
  160. @bot.message_handler(content_types=['location'])
  161. def handle_location(message):
  162. global users, modes
  163. if message.from_user.id not in users:
  164. users[message.from_user.id] = 'day'
  165. if message.from_user.id not in modes:
  166. modes[message.from_user.id] = 'weather'
  167. answer = coord(message.location.latitude, message.location.longitude)
  168. bot.send_message(message.from_user.id, answer)
  169. if modes[message.from_user.id] == 'weather':
  170. bot.send_message(message.from_user.id, coord(message.location.latitude, message.location.longitude))
  171. else:
  172. bot.send_message(message.from_user.id, get_carbon(message.location.latitude, message.location.longitude))
  173.  
  174.  
  175. @bot.message_handler(content_types=['text'])
  176. def handle_text(message):
  177. global users
  178. if message.from_user.id not in users:
  179. users[message.from_user.id] = 'day'
  180. if message.from_user.id not in modes:
  181. modes[message.from_user.id] = 'weather'
  182. if modes[message.from_user.id] == 'weather':
  183. bot.send_message(message.from_user.id, weather(translator.translate(message.text.lower(), dest='en').text,
  184. users[message.from_user.id]))
  185. else:
  186. bot.send_message(message.from_user.id, get_carbon(*to_coords(message.text.lower())))
  187.  
  188.  
  189. bot.polling(none_stop=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement