51 lines
1.3 KiB
Python
Executable File
51 lines
1.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import argparse
|
|
from bscon import connect
|
|
from bsdlprofile import TMP_DIR
|
|
import os
|
|
from atproto import Client
|
|
0
|
|
|
|
LIMIT_LOAD = 100
|
|
|
|
def save_item(post, filename, directory=""):
|
|
filename = f"{directory}/{filename}"
|
|
subprocess.run(["mkdir", "-p", directory])
|
|
if not os.path.isfile(filename):
|
|
with open(filename, 'w') as f:
|
|
f.write(post.record.text)
|
|
|
|
|
|
def get_feeds(client, profile, tmp_dir=TMP_DIR, save=False, cursor=None):
|
|
directory = f"{tmp_dir}/{profile}"
|
|
n = 0
|
|
while True:
|
|
res = client.app.bsky.feed.get_author_feed(
|
|
params={"actor": profile, "limit": LIMIT_LOAD, **({"cursor": cursor} if cursor else {})}
|
|
)
|
|
for post in res["feed"]:
|
|
save_item(post.post, post.post.record.created_at, directory)
|
|
n += 1
|
|
cursor = res.cursor
|
|
if not cursor:
|
|
break
|
|
|
|
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="Download Bluesky profile posts to JSON")
|
|
parser.add_argument("handle", help="Bluesky handle (ex: ni-bot.bsky.social)")
|
|
parser.add_argument("--folder", default=TMP_DIR)
|
|
args = parser.parse_args()
|
|
|
|
client = connect()
|
|
profile = get_feeds(client, args.handle, args.folder)
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|