Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

8 Commits

Repository files navigation

Medium Command Line Client

medium_cli.py is command line client for interacting with medium.com.

Summary

Medium command line client allows you to push html, markdown, or restructured text files to medium.com.

HTML rendering is fairly limited by supported tags at medium, but the cli at least preserves line breaks in code/pre tags.

Markdown is probably the most reliable since it is also very limited in what is supported.

Restructured text is handled by munging out some unsupported tags and mangling things like ordered lists that allow multi-part list items in rst, but have no counterpart in medium.

Post feedback and suggestions on medium.com

Installation

  1. Install requirements and set executable bit.

    user@myhost$ git clone https://github.com/devendor/medium_cli.gituser@myhost$ cd medium_cliuser@myhost$ pip install -r requirements.txtuser@myhost$ chmod +x medium_cli.py
  2. Make an initial request to get the the config template (~/.medium)

    user@myhost$ ./medium_cli.pyYou must specify one of --list --user or file to postUsage: Allows post of html, markdown, or rst files to medium.usage: medium_cli.py [options] [file]Options: -h, --help show this help message and exit -c CODE, --code=CODE code from redirect url after approval -u, --user print user info -l, --list-publications list-publications -t TITLE, --title=TITLE article title -a PUBLICATION, --authors=PUBLICATION show contributor info for pub -p PUB, --pub=PUB posts to publication -r URL, --ref-url=URL canonicalUrl. Ref if originally posted elsewhere -k, --keep-tmpfiles Keep /tmp/article.rst and /tmp/article.html tmp files when processing rstuser@myhost$ ./medium_cli.py -uError Config file not found: /home/rferguson/.medium
    # Config file example[medium]client_id=supplied_when_registering_appclient_secret=supplied_when_registering_appredirect_url=http://192.0.2.1/must_match_registered_urlstate=canBeAnythingTraceback (most recent call last): File "/home/rferguson/bin/medium_cli.py", line 73, in <module> os.exit(1)AttributeError: 'module' object has no attribute 'exit'
  3. On medium.com settings, scroll down to developer applications, and register an application. You can pick any redirect_url.

  4. Fill in a config file with the client_id, and client_secret returned from medium.com along with the redirect_url you used when requesting it.

    user@myhost$ cat <<'EOF'>~/.medium[medium]client_id=supplied_when_registering_appclient_secret=supplied_when_registering_appredirect_url=http://192.0.2.1/must_match_registered_urlstate=eipaik2ieMei0iemoun1queik9leixaeEOF
  5. Once you have a config, just make another request to get an authorization url.

    user@myhost$ medium_cli.py -uAuthorized the app by following the url, and passing the code= value in the redirect url to --code to generate a new bearer tokenhttps://medium.com/m/oauth/authorize?scope=...
  6. Follow that url in a browser, click the authorize button on medium.com, and make note of the code=.... value in the url your are redirected to.

  7. Make a request and provide that initial authorization code to receive a bearer token.

    user@myhost$ medium_cli.py -c 1f127f985cfe -u{ "username": "Ray.Ferguson", "url": "https://medium.com/@Ray.Ferguson", "imageUrl": "https://cdn-images-1.medium.com/fit/c/400/400/0*GmLZd7BSAeKonMEV.", "id": "1ea052e3e51b23b17fbbb0825cc6f3c8963e2438da106f96f12d2d0b01183961e", "name": "Raymond Ferguson"}
  8. Once a bearer token is established, it is stored and kept up to date in ~/.medium_bearer allowing you to use the cli without passing a new code.

    user@myhost$ ./medium_cli.py -u{ "username": "Ray.Ferguson", "url": "https://medium.com/@Ray.Ferguson", "imageUrl": "https://cdn-images-1.medium.com/fit/c/400/400/0*GmLZd7BSAeKonMEV.", "id": "1ea052e3e51b23b17fbbb0825cc6f3c8963e2438da106f96f12d2d0b01183961e", "name": "Raymond Ferguson"}

Usage Notes

To post to a publication, you need the publication id and permissions on the publication.

user@myhost$ ./medium_cli.py -l[ { "url": "https://medium.com/devendor-tech", "imageUrl": "https://cdn-images-1.medium.com/fit/c/400/400/1*l9geaqCJ_QQtvRB_ddEgPw.png", "description": "Technical publications from Devendor Tech", "id": "71cdf2d7072c", "name": "Devendor Tech" }, { "url": "https://medium.com/free-code-camp", "imageUrl": "https://cdn-images-1.medium.com/fit/c/400/400/1*MotlWcSa2n6FrOx3ul89kw.png", "description": "Our community publishes stories worth reading on development, design, and data science.", "id": "336d898217ee", "name": "freeCodeCamp" }]

Inbound file type is determined by extension.

*.md=markdown
*.rst=restructured text
*.*=anything else is assumed to be html

Example

me@home$ ./medium_cli.py -p 71cdf2d7072c \ -r https://github.com/devendor/medium_cli \ -t "Medium Command Line Client" README.rstposting to publication{ "publicationId": "71cdf2d7072c", "canonicalUrl": "https://github.com/devendor/medium_cli", "license": "", "title": "Medium Command Line Client", "url": "https://medium.com/@Ray.Ferguson/5dc3940b5780", "tags": [], "authorId": "1ea052e3e51b23b17fbbb0825cc6f3c8963e2438da106f96f12d2d0b01183961e", "publishStatus": "draft", "licenseUrl": "https://medium.com/policy/9db0094a1e0f", "id": "5dc3940b5780"}

Related Projects

  • medium-sdk-python provides the base of my inline class. It looks like they have several pull reauests that try to contribute additional features but nobodies rolling them in so I decided to embed my own.
  • medium-sdk-docs provides api information.

About

Medium command line client allows you to push html, markdown, or restructured text files to medium.com.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages