1

I using telethon package, for connecting and getting data from telegram. I want to convert Message object to valid JSON. for example, I get this object from the one API in telethon :

{
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?

2
  • what is the datatype of the date objects ? In the first example they aren't strings but in the second example they are strings ? Commented Sep 5, 2017 at 10:07
  • First code seems be invalid or its just a string but I doubt. Please check the first code or add more specific information for us to help you. Commented Sep 5, 2017 at 10:14

2 Answers 2

4

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.

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()
channel_as_json = json.dumps(channel_dict,default=date_format)

and helpers.py

import datetime


def date_format(message):
    """
    :param message:
    :return:
    """
    if isinstance(message, datetime.datetime):
        return message.strftime("%Y-%m-%d %H:%M:%S")
Sign up to request clarification or add additional context in comments.

Comments

1

You can convert for example every object to dict recursively:

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.