Help to sort out the json error –
C:Users123AppDataLocalProgramsPythonPython38>python C:main_3.py
Traceback (most recent call last):
File "C:main_3.py", line 10, in <module>
data = json.load(file)
File "C:Users123AppDataLocalProgramsPythonPython38libjson__init__.py", line 293, in load
return loads(fp.read(),
File "C:Users123AppDataLocalProgramsPythonPython38libjson__init__.py", line 357, in loads
return _default_decoder.decode(s)
File "C:Users123AppDataLocalProgramsPythonPython38libjsondecoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:Users123AppDataLocalProgramsPythonPython38libjsondecoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
C:Users123AppDataLocalProgramsPythonPython38>
Perhaps this error is due to an empty file – ping_data.json? In this case, I do not know how to prepare this file for the first launch.
Telegram bot.
The point of the program is to ping hosts and keep a record of the status of the last check, and in case of program crashes and startup, all the results of the last check must be read from the file.
Complete code
import telebot
from pythonping import ping
import time
import yaml
from libs.host import address
import json
ping_data = dict()
with open('C:ping_data.json') as file:
data = json.load(file)
def init():
global bot, userid, interval
interval = 30
with open('C:config2.yaml', encoding="utf-8") as f:
try:
docs = yaml.load_all(f, Loader=yaml.FullLoader)
for doc in docs:
for k, v in doc.items():
if k == "botkey":
bot = telebot.TeleBot(v)
elif k == "userid":
userid = v
elif k == "hosts":
set_hosts(v)
elif k == "interval":
interval = int(v)
except yaml.YAMLError as exc:
print(exc)
def set_hosts(hosts):
"""
Здесь парсим список хостов и передаем их в массив
"""
global hosts_list
hosts_list = []
for item in hosts:
ac = item.split(":")
hosts_list.append(address(ac[0], ac[1]))
def send_message(message):
"""
Посылаем сообщение пользователю
"""
bot.send_message(userid, message)
def ping_host(address):
status = ping_url(address.address)
if data['address.address'] != status:
ping_data['address.address'] = status
send_message(( "! " if status is None else "+ " if status else "- ") + address.comment)
def ping_url(url):
"""
Пинг хоста. Response list - это ответ библиотеки ping. По умолчанию она
посылает четыре пакета. Если хотя бы один пинг успешен, хост активен
"""
try:
response_list = ping(url, timeout=5, verbose = True)
except:
return None
return sum(1 for x in response_list if x.success) > 0
def main():
"""
Бесконечный цикл, который пингует сервисы один за другим.
"""
init()
while True:
for host in hosts_list:
ping_host(host)
with open('C:ping_data.json','w') as file:
json.dump(ping_data, file, indent=2)
time.sleep(interval)
if __name__ == '__main__':
main()
The contents of the config2.yaml file for example.
botkey: ***********************************
userid: -**********
interval: 60
hosts:
- "google.com:Google.ru"
- "ya.ru:Yandex.ru"
- "mail.ru:Mail.ru"
- "rambler.ru:Rambler.ru"
2
Answers
Understood, everything works. The error is only due to the encoding of the JSON file.
You can’t read a empty file as dictionary. But you can read a empty dictionary from a file.
So,
Try saving a empty dictionary in the file rather than empty file for your first launch
i.e: The content of ping_data.json should be empty flower brackets(like the one below)
Cheers.