ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   Python requests (https://forum.antichat.xyz/showthread.php?t=1400689)

chapo 04.09.2021 14:49

привет, пару часов назад захотел начать учить пайтон 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
)
)


#Northn 04.09.2021 14:52

GitHub - niyoh120/pyjson: A Recursive-Descent JSON parser written in python

A Recursive-Descent JSON parser written in python - niyoh120/pyjson

github.com

kin4stat 04.09.2021 14:55

Цитата:

Сообщение от #Northn

GitHub - niyoh120/pyjson: A Recursive-Descent JSON parser written in python

A Recursive-Descent JSON parser written in python - niyoh120/pyjson

github.com


Ок

Python:





Код:

res
=
requests
.
get
(
api_url
+
'id='
+
cityid
+
'&units='
+
cf
+
'&APPID='
+
apikey
)
data
=
res
.
json
(
)
bot
.
send_message
(
message
.
chat
.
id
,
"Температура: "
+
str
(
data
[
"main"
]
[
"temp"
]
)
)
# 10.17


kin4stat 04.09.2021 14:59

Цитата:

Сообщение от FooOoott

Если ты не понял как доставать то по такому принципу res.text['coord']['lat']
А ещё телебот синхронный

res.text вовзвращает строку, а не dictionary object

kin4stat 04.09.2021 15:16

Цитата:

Сообщение от chapo

а как достать название города? Принцип я понял, но я не вижу ошибку в своем коде

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
)
)


pomidorq 04.09.2021 15:22

Ради практики на ботов не парьмя с какими-то погодами и.т.д. Тебе для телеграм апи нужно понять как работают две клавиатуры, как работает callback data и bot.edit_message_text, короче работа с сообщениями.

laiser 07.09.2021 00:07

Цитата:

Сообщение от devilgoat

Ради практики на ботов не парьмя с какими-то погодами и.т.д. Тебе для телеграм апи нужно понять как работают две клавиатуры, как работает callback data и bot.edit_message_text, короче работа с сообщениями.

ТС захотел себе погоду в ТГ, он делает. Зачем ему учить сейчас какие-то кнопки, если они не нужны?

Когда захочет бота с кнопками, то у него уже появится цель это выучить и он поймет как и что.

И да, не советую использовать telebot, так как уже мертвая библиотека и вроде как не собирается обновляться

pomidorq 07.09.2021 21:36

Цитата:

Сообщение от laiser

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

Друг, основа ботов в телеге это взаимодействие с сообщениями, добавление кнопок, изменение кнопок и всё редактирование в целом. На остальном можно сосредоточиться позже.


Время: 06:32