pychan adalah klien Python untuk berinteraksi dengan 4chan. 4Chan tidak memiliki API resmi, dan upaya untuk mengimplementasikannya oleh pihak ketiga cenderung merana, jadi sebagai gantinya, perpustakaan ini memberikan abstraksi daripada berinteraksi dengan (mengikis) 4Chan secara langsung. pychan berorientasi objek dan implementasinya malas di mana masuk akal (menggunakan generator Python) untuk mengoptimalkan kinerja dan meminimalkan operasi I/O yang berlebihan.
Jika Anda memiliki Python> = 3.10 dan <4.0 terpasang, pychan dapat diinstal dari PYPI menggunakan sesuatu seperti
pip install pychan Semua interaksi 4Chan dicekik secara internal dengan tidur utas yang dieksekusi. Jika Anda mengeksekusi pychan dengan cara multithreaded, Anda tidak akan mendapatkan manfaat dari pelambatan ini. pychan tidak bertanggung jawab atas konsekuensi dari permintaan HTTP yang berlebihan dalam kasus -kasus seperti itu.
from pychan import FourChan , LogLevel , PychanLogger
# With all defaults (logging disabled, all exceptions raised)
fourchan = FourChan ()
# Tell pychan to gracefully ignore HTTP exceptions, if any, within its internal logic
fourchan = FourChan ( raise_http_exceptions = False )
# Tell pychan to gracefully ignore parsing exceptions, if any, within its internal logic
fourchan = FourChan ( raise_parsing_exceptions = False )
# Configure logging explicitly
logger = PychanLogger ( LogLevel . INFO )
fourchan = FourChan ( logger = logger )
# Use all of the above settings at once
logger = PychanLogger ( LogLevel . INFO )
fourchan = FourChan ( logger = logger , raise_http_exceptions = True , raise_parsing_exceptions = True ) Sisa contoh dalam README ini mengasumsikan bahwa Anda telah membuat contoh kelas FourChan seperti yang ditunjukkan di atas.
Fungsi ini secara dinamis mengambil papan dari 4chan pada waktu panggilan.
Catatan: Papan yang tidak kompatibel dengan
pychantidak dikembalikan dalam daftar ini.
boards = fourchan . get_boards ()
# Sample return value:
# ['a', 'b', 'c', 'd', 'e', 'g', 'gif', 'h', 'hr', 'k', 'm', 'o', 'p', 'r', 's', 't', 'u', 'v', 'vg', 'vm', 'vmg', 'vr', 'vrpg', 'vst', 'w', 'wg', 'i', 'ic', 'r9k', 's4s', 'vip', 'qa', 'cm', 'hm', 'lgbt', 'y', '3', 'aco', 'adv', 'an', 'bant', 'biz', 'cgl', 'ck', 'co', 'diy', 'fa', 'fit', 'gd', 'hc', 'his', 'int', 'jp', 'lit', 'mlp', 'mu', 'n', 'news', 'out', 'po', 'pol', 'pw', 'qst', 'sci', 'soc', 'sp', 'tg', 'toy', 'trv', 'tv', 'vp', 'vt', 'wsg', 'wsr', 'x', 'xs'] # Iterate over all threads in /b/
for thread in fourchan . get_threads ( "b" ):
# Do stuff with the thread
print ( thread . title )
# You can also iterate over all the posts in the thread
for post in fourchan . get_posts ( thread ):
# Do stuff with the post - refer to the model documentation in pychan's README for details
print ( post . text )Catatan: Beberapa papan tidak memiliki arsip (mis
/b/). Papan semacam itu akan mengembalikan daftar kosong atau menaikkan pengecualian tergantung pada bagaimana Anda mengkonfigurasi instanceFourChanAnda.
Utas yang dikembalikan oleh fungsi ini akan selalu memiliki bidang title yang berisi teks yang ditunjukkan pada antarmuka 4Chan di bawah header kolom "kutipan". Teks ini dapat berupa judul asli utas atau pratinjau teks posting asli. Melewati salah satu utas yang dikembalikan dengan metode ini ke metode get_posts() akan secara otomatis memperbaiki bidang title (jika perlu) pada utas yang dilampirkan ke posting yang dikembalikan. Lihat Fetch Post untuk utas tertentu untuk detail lebih lanjut.
Secara teknis,
pychandapat membahas perilakutitleyang dijelaskan di atas dengan mengeluarkan permintaan HTTP tambahan untuk setiap utas untuk mendapatkan judul sebenarnya, tetapi dengan semangat membuat jumlah terkecil dari permintaan HTTP mungkin,pychansecara langsung menggunakan kutipan itu sebagai gantinya.
for thread in fourchan . get_archived_threads ( "pol" ):
# Do stuff with the thread
print ( thread . title )
# You can also iterate over all the posts in the thread
for post in fourchan . get_posts ( thread ):
# Do stuff with the post - refer to the model documentation in pychan's README for details
print ( post . text )Melakukan pencarian terhadap 4Chan jauh lebih rumit daripada mengakses sisa data 4Chan. Ini karena 4Chan memiliki firewall Cloudflare di depan API REST-nya, jadi satu-satunya cara untuk mendapatkan data kembali dari pencarian adalah dengan memasok informasi permintaan HTTP yang diperlukan untuk memotong pemeriksaan anti-bot CloudFlare. Pada akhirnya, ini berarti melewati header tertentu bersama dengan permintaan HTTP, tetapi tantangan berasal dari benar -benar memperoleh header tersebut.
Saat ini berada di luar ruang lingkup pychan untuk menghasilkan header ini untuk Anda, jadi jika Anda ingin mengotomatiskan keliling perlindungan Cloudflare, Anda mungkin ingin melihat ke dalam menggunakan proyek seperti salah satu dari yang berikut (daftar ini abjad dan tidak lengkap):
Cara manual untuk memperoleh nilai -nilai ini adalah dengan melakukan pencarian 4Chan menggunakan browser web dan memanfaatkan alat pengembang browser untuk melacak permintaan jaringan yang dibuat selama pencarian. Permintaan yang berisi nilai cloudflare akan dibuat untuk https://find.4chan.org/api dengan beberapa parameter kueri. Setelah Anda menemukan permintaan ini, salin nilai User-Agent dan Cookie yang dikirim dalam permintaan Anda, lalu berikan mereka ke metode search() pychan . Ketahuilah bahwa Cloudflare Cookie memiliki kedaluwarsa, jadi solusi manual ini hanya akan mengembalikan hasil sampai Cloudflare membatalkan cookie Anda. Setelah itu, Anda perlu memperoleh nilai -nilai baru.
CATATAN: Utas tertutup/lengket/diarsipkan tidak pernah dikembalikan dalam hasil pencarian.
# This "threads" variable will contain a Python Generator (not a list) in order to facilitate laziness
threads = fourchan . search (
board = "b" ,
text = "ylyl" ,
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36" ,
cloudflare_cookies = {
"cf_clearance" : "bm2RICpcDeR4cXoC2nfI_cnZcbAkN4UYpN6c1zzeb8g-1440859602-0-160"
}
)
for thread in threads :
# The thread object is the same class as the one returned by get_threads()
for post in fourchan . get_posts ( thread ):
# Do stuff with the post - refer to the model documentation in pychan's README for details
print ( post . text ) from pychan . models import Thread
# Instantiate a Thread instance with which to query for posts
thread = Thread ( "int" , 168484869 )
# Note: the thread contained within the returned posts will have all applicable metadata (such as
# title and sticky status), regardless of whether you provided such data above - pychan will
# "auto-discover" all metadata and include it in the post models' copy of the thread
posts = fourchan . get_posts ( thread )Tabel berikut merangkum semua jenis data yang tersedia pada berbagai model yang digunakan oleh perpustakaan ini.
Perhatikan juga bahwa semua kelas model di pychan menerapkan metode berikut:
__repr____str____hash____eq____iter__ - Ini diimplementasikan sehingga model dapat diteruskan ke fungsi tuple() Python__copy____deepcopy__ Tabel di bawah ini sesuai dengan kelas pychan.models.Thread .
| Bidang | Jenis | Nilai contoh |
|---|---|---|
thread.board | str | "b" , "int" |
thread.number | int | 882774935 , 168484869 |
thread.title | Optional[str] | None , "YLYL thread" |
thread.is_stickied | bool | True , False |
thread.is_closed | bool | True , False |
thread.is_archived | bool | True , False |
thread.url | str | "https://boards.4chan.org/a/thread/251097344" |
Tabel di bawah ini sesuai dengan kelas pychan.models.Post .
| Bidang | Jenis | Nilai contoh |
|---|---|---|
post.thread | Thread | pychan.models.Thread |
post.number | int | 882774935 , 882774974 |
post.timestamp | DATETIME.DATETIME | DATETIME.DATETIME |
post.poster | Poster | pychan.models.Poster |
post.text | str | ">be men>be boredn>write pychann>somehow it works" |
post.is_original_post | bool | True , False |
post.file | Optional[File] | None , pychan.models.File |
post.replies | list[Post] | [] , [pychan.models.Post, pychan.models.Post] |
post.url | str | "https://boards.4chan.org/a/thread/251097344#p251097419" |
Bidang replies yang ditunjukkan di atas adalah murni fitur kenyamanan yang disediakan pychan untuk mengakses semua pos di dalam utas yang menggunakan operator >> untuk "membalas" ke posting saat ini. Namun, tidak perlu menggunakan bidang replies untuk mengakses semua posting yang tersedia di utas; Saat Anda memanggil metode get_posts() , Anda masih akan menerima semua posting (dalam urutan mereka diposting) sebagai satu daftar datar.
Tabel di bawah ini sesuai dengan kelas pychan.models.Poster .
| Bidang | Jenis | Nilai contoh |
|---|---|---|
poster.name | str | "Anonymous" |
poster.is_moderator | bool | True , False |
poster.id | Optional[str] | None , "BYagKQXI" |
poster.flag | Optional[str] | None , "United States" , "Canada" |
Tabel di bawah ini sesuai dengan kelas pychan.models.File .
| Bidang | Jenis | Nilai contoh |
|---|---|---|
file.url | str | "https://i.4cdn.org/pol/1658892700380132.jpg" |
file.name | str | "wojak.jpg" , "i feel alone.jpg" |
file.size | str | "601 KB" |
file.dimensions | tuple[int, int] | (1920, 1080) , (800, 600) |
file.is_spoiler | bool | True , False |
Lihat Kontribusi.MD untuk informasi yang berorientasi pengembang.