Python requests

chapo

чопа сребдс // @moujeek
Автор темы
Модератор
8,891
11,621
привет, пару часов назад захотел начать учить пайтон a.k.a питон и в качестве первой работы решил сделать бота для тг который будет отправлять погоду, но при обращении к API сайта мне выдает как я понял json таблицу, как можно достать из нее определенные значения?
res.text:
Погода: {"coord":{"lon":37.6156,"lat":55.7522},"weather":[{"id":804,"main":"Clouds","description":"overcast clouds","icon":"04d"}],"base":"stations","main":{"temp":10.17,"feels_like":8.7,"temp_min":9.75,"temp_max":10.29,"pressure":1007,"humidity":56,"sea_level":1007,"grnd_level":989},"visibility":10000,"wind":{"speed":6.55,"deg":296,"gust":9.42},"clouds":{"all":98},"dt":1630752048,"sys":{"type":2,"id":2009195,"country":"RU","sunrise":1630723217,"sunset":1630772239},"timezone":10800,"id":524901,"name":"Moscow","cod":200}
python:
import telebot
import requests

cityid = '524901' ## Москва, узнать id: https://openweathermap.org/city/524901
api_url = "http://api.openweathermap.org/data/2.5/weather?"
cf = 'metric'
apikey = '1c8790deb22eccba1aba3596a53b275d'

weatherPlaceHolder = 'text +1'

print("BOT STARTED----------------------------------")

bot = telebot.TeleBot('huypizda')

@bot.message_handler(commands=['start'])
def start_command(message):
    bot.send_message(message.chat.id, "Привет, ты запустил бота Chapo's Weather Bot, введи /get если хочешь узнать погоду")
 
@bot.message_handler(commands=['get'])
def start_command(message):
    res = requests.get(api_url + 'id=' + cityid + '&units=' + cf + '&APPID=' + apikey)
    bot.send_message(message.chat.id, "Погода: " + res.text)
 
bot.polling()

## FROM LUA
## api_url = "http://api.openweathermap.org/data/2.5/weather?"
## -- http://openweathermap.org/help/city_list.txt , http://openweathermap.org/find
## cityid = "5128581"
## cf = "metric" -- metric or imperial
##
## apikey = "1c8790deb22eccba1aba3596a53b275d" -- get an open weather map api key: http://openweathermap.org/appid
## measure = '°' .. (cf == 'metric' and 'C' or 'F') -- measure is °C if metric and °F if imperial

##  weather = http.request(("%sid=%s&units=%s&APPID=%s"):format(api_url, cityid, cf, apikey))
 
Решение

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,744
4,812

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,744
4,812
а как достать название города? Принцип я понял, но я не вижу ошибку в своем коде
debug console:
text = 'Город: ' + str(data['timezone']['name']) + + '\nТемпература: ' + str(data['main']['temp']) + ' (ощущается как ' + str(data['main']['feels_like']) + '\n'
TypeError: 'int' object is not subscriptable
PS C:\Users\admin\Desktop\chapos weather bot telegram>


code:
res = requests.get(api_url + 'id=' + cityid + '&units=' + cf + '&APPID=' + apikey)
    if res.status_code == 200:
        bot.send_message(message.chat.id, 'code 200, wait...')
        res_payload_dict = res.json()
        print(res_payload_dict)
        data = res.json()
      
        text = 'Город: ' + str(data['timezone']['name']) + '\nТемпература: ' + str(data['main']['temp']) + ' (ощущается как ' + str(data['main']['feels_like']) + '\n'
        bot.send_message(message.chat.id, text)
    else:
        bot.send_message(message.chat.id, 'Ошибка при обращении к API')
ошибка в data['timezone']['name']
Держи нормальный жсон:

Код:
{
    "coord": {
        "lon": 37.6156,
        "lat": 55.7522
    },
    "weather": [
        {
            "id": 804,
            "main": "Clouds",
            "description": "overcast clouds",
            "icon": "04d"
        }
    ],
    "base": "stations",
    "main": {
        "temp": 10.17,
        "feels_like": 8.7,
        "temp_min": 9.75,
        "temp_max": 10.29,
        "pressure": 1007,
        "humidity": 56,
        "sea_level": 1007,
        "grnd_level": 989
    },
    "visibility": 10000,
    "wind": {
        "speed": 6.55,
        "deg": 296,
        "gust": 9.42
    },
    "clouds": {
        "all": 98
    },
    "dt": 1630752048,
    "sys": {
        "type": 2,
        "id": 2009195,
        "country": "RU",
        "sunrise": 1630723217,
        "sunset": 1630772239
    },
    "timezone": 10800,
    "id": 524901,
    "name": "Moscow",
    "cod": 200
}

чтобы сделать также -
Python:
import pprint
pprint.pprint(json_object)
либо
Python:
import json
print(json.dumps(json_object, indent=4))
 
  • Нравится
Реакции: chapo

laiser

Известный
184
90
Ради практики на ботов не парьмя с какими-то погодами и.т.д. Тебе для телеграм апи нужно понять как работают две клавиатуры, как работает callback data и bot.edit_message_text, короче работа с сообщениями.
ТС захотел себе погоду в ТГ, он делает. Зачем ему учить сейчас какие-то кнопки, если они не нужны?
Когда захочет бота с кнопками, то у него уже появится цель это выучить и он поймет как и что.
И да, не советую использовать telebot, так как уже мертвая библиотека и вроде как не собирается обновляться
 

Josski Molodoi

Активный
182
83
ТС захотел себе погоду в ТГ, он делает. Зачем ему учить сейчас какие-то кнопки, если они не нужны?
Когда захочет бота с кнопками, то у него уже появится цель это выучить и он поймет как и что.
И да, не советую использовать telebot, так как уже мертвая библиотека и вроде как не собирается обновляться
Друг, основа ботов в телеге это взаимодействие с сообщениями, добавление кнопок, изменение кнопок и всё редактирование в целом. На остальном можно сосредоточиться позже.