Skip to content

Instantly share code, notes, and snippets.

Created September 16, 2021 05:06
Show Gist options
  • Save knuxify/a50181103d584bab85547b0ecbbdb1fa to your computer and use it in GitHub Desktop.
Save knuxify/a50181103d584bab85547b0ecbbdb1fa to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
posts to
import argparse
from bs4 import BeautifulSoup
import sys
from urllib import request, parse
SESSION_ID = 'get the session-id from the session_id cookie'
TIMEZONE = 'Europe/Warsaw'
parser = argparse.ArgumentParser(description='Posts and manages thoughts on')
parser.add_argument('thought', help='thought you want to post.')
parser.add_argument('--reply-to', default=None, dest='reply_to_id', help='id of post to reply to')
parser.add_argument('--delete', default=None, dest='delete_id', help='id of post to delete. note that selecting this will not allow you to post at the same time')
def get_post_by_id(id, do_cleanup=True, as_text=False):
"""Returns a post by ID."""
# when there's no api, you gotta get creative!
with request.urlopen(YOUR_PAGE) as page:
page_soup = BeautifulSoup(, 'html.parser')
post = page_soup.find('div', {'id': str(id)})
if do_cleanup:
#details = post.find('details')
#if details:
# details.replaceWith('')
if as_text: #only works on, whoops. change this to just look for <p> i guess
post_text = post.find('div', {'class': 'thoughtcontent'})
return str(post_text.text)
return str(post)
def get_latest_post_id():
"""Returns the ID of the latest thought."""
# hacky, works only on my page
with request.urlopen(YOUR_PAGE) as page:
page_soup = BeautifulSoup(, 'html.parser')
post = page_soup.find('span', {'class': 'thoughtid'})
return str(post.text[1:])
args = parser.parse_args()
thought = args.thought
reply_to = args.reply_to_id
delete_id = args.delete_id
if reply_to == 'latest':
reply_to = get_latest_post_id()
if delete_id == 'latest':
delete_id = get_latest_post_id()
if delete_id:
post = get_post_by_id(delete_id, as_text=True)
print("\033[0;32mnonexistent id \033[0m" + delete_id + "\033[0;32m, or you've lost connection\033[0m")
print("contents:\n" + post)
yesno = input('are you sure you want to remove this post? [y/N] ')
if not yesno.lower() == 'y':
print("keeping post.")
req = request.Request('' + delete_id, data={}, headers={'Cookie': 'session_id=' + SESSION_ID})
resp = request.urlopen(req)
print("\033[0;32mdeleted post \033[0m" + delete_id + "\033[0;32m.\033[0m")
if reply_to:
reply_header = "<span class='replyheader'>reply to <a href='" + YOUR_PAGE + "/#" + str(reply_to) + "'>thought \#" + str(reply_to) + "</a>:</span>"
reply_header = reply_header + "<details><summary>see previous post</summary>" + get_post_by_id(reply_to) + "</details>"
thought = reply_header + "\n" + thought
data = parse.urlencode({'thought': thought, 'timezone': TIMEZONE}).encode()
req = request.Request('', data=data, headers={'Cookie': 'session_id=' + SESSION_ID})
resp = request.urlopen(req)
print("\033[0;31mfailed to post!\033[0m")
print("\033[0;32mposted successfully!\033[0m")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment