|
|
@ -95,8 +95,8 @@ def parse_timeline(data):
|
|
|
|
for entry in entries:
|
|
|
|
for entry in entries:
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
result += parse_entry(entry)
|
|
|
|
result += parse_entry(entry)
|
|
|
|
except:
|
|
|
|
except Exception as e:
|
|
|
|
logger.error(f"error when parsing entry: {entry}")
|
|
|
|
logger.error(f"error when parsing entry: {e} {e.args}\n{entry}")
|
|
|
|
result.sort(key=lambda x: x["timestamp"], reverse=True)
|
|
|
|
result.sort(key=lambda x: x["timestamp"], reverse=True)
|
|
|
|
return result
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
@ -122,8 +122,8 @@ def parse_content(content):
|
|
|
|
if "retweeted_status_result" in tweet["legacy"]:
|
|
|
|
if "retweeted_status_result" in tweet["legacy"]:
|
|
|
|
data["retweeted"] = parse_tweet(tweet["legacy"]["retweeted_status_result"]["result"])
|
|
|
|
data["retweeted"] = parse_tweet(tweet["legacy"]["retweeted_status_result"]["result"])
|
|
|
|
return data
|
|
|
|
return data
|
|
|
|
except:
|
|
|
|
except Exception as e:
|
|
|
|
logger.error(f"error when parsing tweet: {tweet}")
|
|
|
|
logger.error(f"error when parsing tweet: {e} {e.args}\n{tweet}")
|
|
|
|
return {}
|
|
|
|
return {}
|
|
|
|
|
|
|
|
|
|
|
|
def parse_media(media):
|
|
|
|
def parse_media(media):
|
|
|
@ -150,10 +150,26 @@ def parse_entities(entity):
|
|
|
|
def parse_card(card):
|
|
|
|
def parse_card(card):
|
|
|
|
data = {}
|
|
|
|
data = {}
|
|
|
|
for v in card["legacy"]["binding_values"]:
|
|
|
|
for v in card["legacy"]["binding_values"]:
|
|
|
|
if "choice" in v["key"] or v["key"] in ["end_datetime_utc"]:
|
|
|
|
if "choice" in v["key"] or v["key"] in ["end_datetime_utc", "unified_card"]:
|
|
|
|
value_name = f"{v['value']['type'].lower()}_value"
|
|
|
|
value_name = f"{v['value']['type'].lower()}_value"
|
|
|
|
data[v["key"]] = v['value'].get(value_name, "")
|
|
|
|
data[v["key"]] = v['value'].get(value_name, "")
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
|
|
photo = None
|
|
|
|
|
|
|
|
if "unified_card" in data:
|
|
|
|
|
|
|
|
card_data = json.loads(data["unified_card"])
|
|
|
|
|
|
|
|
del data["unified_card"]
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
|
|
for k, v in card_data["media_entities"].items():
|
|
|
|
|
|
|
|
if "media_url_https" in v:
|
|
|
|
|
|
|
|
photo = {
|
|
|
|
|
|
|
|
"url": v["media_url_https"] + "?name=orig",
|
|
|
|
|
|
|
|
"video": ""
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
break
|
|
|
|
|
|
|
|
except:
|
|
|
|
|
|
|
|
logger.error(f"error parsing unified_card {card_data}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return data, photo
|
|
|
|
|
|
|
|
|
|
|
|
def parse_tweet(tweet):
|
|
|
|
def parse_tweet(tweet):
|
|
|
|
# with open("tweet.json", "w") as f: json.dump(tweet, f)
|
|
|
|
# with open("tweet.json", "w") as f: json.dump(tweet, f)
|
|
|
@ -184,7 +200,8 @@ def parse_tweet(tweet):
|
|
|
|
data["entities"].sort(key=lambda x: x["indices"][0])
|
|
|
|
data["entities"].sort(key=lambda x: x["indices"][0])
|
|
|
|
|
|
|
|
|
|
|
|
if "card" in tweet:
|
|
|
|
if "card" in tweet:
|
|
|
|
data["card"] = parse_card(tweet["card"])
|
|
|
|
data["card"], _photo = parse_card(tweet["card"])
|
|
|
|
|
|
|
|
if _photo: data["media"].append(_photo)
|
|
|
|
|
|
|
|
|
|
|
|
return data
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
|
@ -273,6 +290,6 @@ def main(config):
|
|
|
|
if __name__ == "__main__":
|
|
|
|
if __name__ == "__main__":
|
|
|
|
with open("config.json", 'r') as f:
|
|
|
|
with open("config.json", 'r') as f:
|
|
|
|
config = json.load(f)
|
|
|
|
config = json.load(f)
|
|
|
|
main(config)
|
|
|
|
# main(config)
|
|
|
|
|
|
|
|
|
|
|
|
# with open("lovelive.json", 'r', encoding="utf8") as f: pprint(parse_timeline(json.load(f)))
|
|
|
|
with open("lovelive.json", 'r', encoding="utf8") as f: pprint(parse_timeline(json.load(f)))
|
|
|
|