简体   繁体   English

如何在python中将telethon对象转换为有效的JSON

[英]how to convert telethon object to valid JSON in python

I using telethon package, for connecting and getting data from telegram.我使用 Telethon 包,用于连接和从电报中获取数据。 I want to convert Message object to valid JSON.我想将 Message 对象转换为有效的 JSON。 for example, I get this object from the one API in telethon :例如,我从 Telethon 中的一个 API 获取此对象:

{
Message: {
    via_bot_id: None,
    entities: [],
    out: None,
    post: True,
    from_id: None,
    message: "hi everybody",
    id: 71,
    media_unread: None,
    reply_markup: None,
    fwd_from: {
        channel_id: 1119999790,
        channel_post: 2,
        date: 2017 - 09 - 04 15: 43: 48,
        from_id: None
    },
    reply_to_msg_id: None,
    edit_date: None,
    to_id: {
        channel_id: 1099583379
    },
    views: 2,
    mentioned: None,
    date: 2017 - 09 - 05 09: 28: 46,
    media: None,
    silent: None
} }

and this is my favorite result:这是我最喜欢的结果:

{
"Message": {
    "via_bot_id": "None",
    "entities": [],
    "out": "None",
    "post": "True",
    "from_id": "None",
    "message": "hi everybody",
    "id": 71,
    "media_unread": "None",
    "reply_markup": "None",
    "fwd_from": {
        "channel_id": 1119999790,
        "channel_post": 2,
        "date": "2017 - 09 - 04 15: 43: 48",
        "from_id": "None"
    },
    "reply_to_msg_id": "None",
    "edit_date": "None",
    "to_id": {
        "channel_id": 1099583379
    },
    "views": 2,
    "mentioned": "None",
    "date": "2017 - 09 - 05 09: 28: 46",
    "media": "None",
    "silent": "None"
}}

Is there a way to convert in Python?有没有办法在 Python 中进行转换?

You can convert for example every object to dict recursively:例如,您可以将每个对象递归地转换为 dict:

def has_to_dict(obj):
   method = getattr(obj, "to_dict", None)

   return callable(method)

def to_dict_req(obj):
res = {}
if has_to_dict(obj):
    for key, value in obj.to_dict().items():
        if has_to_dict(value):
            value = to_dict_req(value)
        else:
            value = str(value)
        res[key] = value
    return res
else:
    return str(obj)

I solved my problem this way我这样解决了我的问题

I hope it will be useful for you too我希望它对你也有用

for example, I get channel object and convert it to JSON.例如,我获取channel对象并将其转换为 JSON。

index.py

import json

from telethon import TelegramClient
from telethon.tl.functions.channels import GetFullChannelRequest
from telethon.tl.types import ChannelParticipantsSearch

from helpers import date_format

api_id = XXXXX
api_hash = 'XXXXXXXXXXXXXXXXXXXXXX'
phone_number = '+98XXXXXXXXXXX'
################################################
channel_username = 'tehrandb'
################################################

client = TelegramClient('session_name',
                    api_id,
                    api_hash)

assert client.connect()
if not client.is_user_authorized():
client.send_code_request(phone_number)
me = client.sign_in(phone_number, input('Enter code: '))

# ---------------------------------------
my_filter = ChannelParticipantsSearch('')
all_participants = []
while_condition = True
# ---------------------------------------
channel = client(GetFullChannelRequest(channel_username))
channel_dict = channel.to_dict()
json = json.dumps(channel_dict,default=date_format)

and helpers.pyhelpers.py

import datetime


def date_format(message):
    """
    :param message:
    :return:
    """
    if type(message) is datetime:
        return message.strftime("%Y-%m-%d %H:%M:%S")

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM