A Python wrapper for the 4chan API and other imageboards
Project description
py-chan-api
Objective:
- Unification: Have one library to use for multiple imageboards. Convert them to 4chan compliant API specifications.
- Wrapper: Parse the JSON to programming-language-specific data structures (in this case, to Python).
API Documentation
4chan
FFuuka based Imageboards
Feature | Source |
---|---|
✔️ Single thread | a.4cdn.org/{board}/thread/{threadnumber}.json |
✔️ Thread index | a.4cdn.org/{board}/{pagenumber}.json (threads @ pg #) |
✔️ Board list | a.4cdn.org/boards.json |
✔️ Board catalog | a.4cdn.org/{board}/catalog.json |
✔️ Thread list | a.4cdn.org/{board}/threads.json |
✔️ Archived threads | a.4cdn.org/{board}/archive.json |
🚧 HTTPS | On by default in urllib3 |
🚧 Rate limiting | x requests allowed in n seconds |
🚧 If-Modified-Since |
req.headers['last-modified'] |
🚧 In-place thread updating | req.headers['last-modified']; difflib |
Extra Support
Extra Imageboards | Compatibility |
---|---|
✔️ FFuuka | Thread , Post |
❔ warosu | |
❔ yuki.la |
Installation
$ pip install py-chan-api # NOTE: Only Python 3.7+
# Or with virtualenv
$ pip install virtualenv # Install virtualenv if you haven't already
$ virtualenv venv # Create a virtualenv
$ source venv/bin/activate # Activate it
$ pip install py-chan-api # Install py-chan-api
Usage
import pychan
# pychan infers what type of object you're giving it. See the above table.
# Whether its a string pointing to a file/dict/dict in string format.
threadIndex = pychan.FourChan("thread_index.json")
board = pychan.FourChan("boards.json")
thread = pychan.FourChan("thread.json")
threadList = pychan.FourChan("thread_list.json")
archivedThread = pychan.FourChan("archived_threads.json")
post = thread.posts[0]
print(thread.posts[0].com) # Get the first post and its comment
print(post) # If you're unsure of what fields to call
# just print the object itself to see a list of key/values
# Or see the type of the unknown object
print(type(pychan.FourChan("unknown.json")))
print(thread.posts[0])
print(threadIndex.threads[0].posts[1])
print(board.trollflags.AC)
print(board.boards[0].title)
print(catalog.page[0].threads[0])
print(threadList.page[0].threads[0])
print(archivedThread[-1])
# To get individual key value/pairs
jdb = thread.posts[0].json # Convert the Post object to a dictionary
for k,v in jdb.items(): # Iterate through the key/value pairs
print(k, v)
Converting
import pychan
fuukaThread = pychan.Fuuka("desu_thread.json") # Specify the imageboard implementation
# Parallelism (multiprocessing) is turned on automatically if you supply more
# than one key/value pairs in a dictionary.
# You can override this behaviour by specifying the parallel field
# By using a dictionary, you can also output it to a file.
fthread1 = pychan.Fuuka({"desu_thread.json" : "out1.json"}, parallel = True)
# Which then you could read it as a normal 4chan json
fthread = pychan.FourChan("out1.json")
# We can also just use the outputed value from before
print(fthread1.posts[1]) # Note: fthread1 is the same as fthread and fuukaThread
Tests
Tests are done with pytest
.
$ pip install -U pytest pytest-xdist
$ pytest tests.py -v
Support
Pull requests are welcome. Feel free to ping shiimizu @ this Matrix server.
⚠️ Archiving (polling)
- Archiving capabilities are beyond the scope of this project.
- Please see:
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
py-chan-api-0.1.3.tar.gz
(7.5 kB
view hashes)
Built Distribution
Close
Hashes for py_chan_api-0.1.3-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1ca1ebf4d36c257fe85a96b128429a3ae2c11f14637f1e0cff5724770dc1d40b |
|
MD5 | 45e719fcfeb621bc20395fdf135f6aa7 |
|
BLAKE2b-256 | 56441772e1863d48df843e5032ce3bc4d282179ac203dd9087f6d029bb25a54f |