Kueri Bluesky API | beragampengetahuan.com – Beragampengetahuan
Oleh: Bingkai Putih
Diposting ulang dari:
Belakangan ini banyak sekali komunitas JuliaLang yang muncul di BlueSky.
Yaitu Saat-saat yang menyenangkan bagi saya, yang sudah cukup lama berada di sana.
Karena hal itu membuat saya memiliki kesenjangan demografis yang besar.
Saya ingin menganalisanya, dan saya pikir saya akan mengambil kesempatan ini untuk menulis sedikit tentang mengakses bsky API dengan Julia.
Ini akan sangat familiar bagi siapa saja yang pernah berurusan dengan REST API.
API atproto yang digunakan oleh bluesky bukanlah hal yang aneh.
Yang mengejutkan adalah berapa banyak yang bisa Anda dapatkan tanpa autentikasi – pada dasarnya apa pun asalkan bersifat publik.
Hanya itu yang kami pedulikan hari ini.
API serupa lainnya tidak mengizinkan Anda mendapatkan apa pun tanpa kunci API, meskipun itu informasi publik
Ini berarti saya tidak harus berurusan dengan OAuth.
Contents
Mari kita mulai dengan menginstal paket-paketnya
Untuk masalah ini saya beralih ke HTTP.jl yang sudah sangat mapan.
Sebagai gantinya, seseorang dapat menggunakan perpustakaan standar Downloads.jl yang didasarkan pada LibCURL, tetapi ini sedikit lebih rumit karena tidak peduli dengan parameter kueri penyandian url, dll.
Kami juga memerlukan parser JSON, jadi saya akan menggunakan JSON3.jl yang tepercaya
Jadi kami akan mengunggahnya:
Mari kita menganalisis pengikut saya
Dapatkan profil saya
Kami akan mendapatkan permohonan yang disetujui app.bsky.actor.getProfile titik akhir.
julia> uri = HTTP.URI(
scheme="https", host="public.api.bsky.app", path="/xrpc/app.bsky.actor.getProfile", query=["actor"=>"oxinabox.net"]
)
URI("https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=oxinabox.net")
julia> resp = HTTP.get(uri)
HTTP.Messages.Response:
"""
HTTP/1.1 200 OK
Date: Sun, 08 Dec 2024 07:49:15 GMT
...
Content-Encoding: gzip
{"did":"did:plc:5iszgpfyko6qsk26ytkfawuh","handle":"oxinabox.net","displayName":"Frames","avatar":"https://cdn.bsky.app/img/avatar/plain/did:plc:5iszgpfyko6qsk26ytkfawuh/bafkreidb26akzyz2223ym6tgduutitekrggdhijjhhgthu3h55kc5u425q@jpeg",...,"pinnedPost":{"cid":"bafyreiahb2jus4k73fw5ylc7g4j326fbsllsvydwo6s5qgagcjjfunw
⋮
1085-byte body
"""
julia> JSON3.read(resp.body)
JSON3.ObjectVectorUInt8, VectorUInt64 with 14 entries:
:did => "did:plc:5iszgpfyko6qsk26ytkfawuh"
:handle => "oxinabox.net"
:displayName => "Frames"
:avatar => "https://cdn.bsky.app/img/avatar/plain/did:plc:5iszgpfyko6qsk26ytkfawuh/bafkreidb26akzyz2223ym6tgduu…
:associated => {…
:labels => Union[]
:createdAt => "2023-07-06T15:04:41.936Z"
:description => "Talking about programming, science, and being queer.\nMinors DNI\n\nIf you know me IRL and see me h…
:indexedAt => "2024-11-29T16:29:51.945Z"
:banner => "https://cdn.bsky.app/img/banner/plain/did:plc:5iszgpfyko6qsk26ytkfawuh/bafkreidpk5h5yw6ptn5kcgr7k47…
:followersCount => 2195
:followsCount => 553
:postsCount => 8526
:pinnedPost => {…
Pola konstruksi URI ini, sebut saja HTTP.get sana dan kemudian menelepon JSON3.read umpan balik akan menjadi sangat berulang.
Satu-satunya hal yang agak normal tentang permintaan pertama ini adalah titik akhir – untuk sisa tutorial ini, kita akan menggunakan titik akhir AppView di public.api.bsky.app (daripada bsky.social tuan rumah)
Mari kita buat fungsi pembantu untuk mengurangi pengulangan.
function run_query(endpoint, host="public.api.bsky.app"; query_params...)
query = [string(key)=>string(val) for (key, val) in query_params]
uri = HTTP.URI(; scheme="https", host, path=endpoint, query);
resp = HTTP.get(uri)
return JSON3.read(resp.body)
end
Anda mungkin memperhatikan di url kami memanfaatkan hal yang tidak perlu dikatakan lagi host=host Dan query=query dalam argumen kata kunci. Fitur modern Julia yang saya lewatkan saat menulis Python baru-baru ini.
Biasanya, saat menulis pembantu seperti itu, saya juga perlu berhati-hati dalam meneruskan token OAuth, tetapi seperti yang disebutkan, bluesky tidak menggunakannya untuk informasi publik.
Jadi kita bisa mengujinya untuk melihat siapa yang mendapatkan hasil yang sama:
julia> run_query("/xrpc/app.bsky.actor.getProfile"; actor="oxinabox.net")
JSON3.ObjectVectorUInt8, VectorUInt64 with 14 entries:
:did => "did:plc:5iszgpfyko6qsk26ytkfawuh"
:handle => "oxinabox.net"
:displayName => "Frames"
:avatar => "
:associated => {…
:labels => Union[]
:createdAt => "2023-07-06T15:04:41.936Z"
:description => "Talking about programming, science, and being queer.\nMinors DNI\n\nIf you know me IRL and see me h…
:indexedAt => "2024-11-29T16:29:51.945Z"
:banner => "
:followersCount => 2195
:followsCount => 553
:postsCount => 8526
:pinnedPost => {…
Besar. Ini berhasil.
Dapatkan pengikut saya.
Ini dilakukan dengan menggunakan app.bsky.graph.getFollowers titik akhir.
Julia> obyek = jalankan_query("/xrpc/app.bsky.graph.getFollowers"; pemain="oxinabox.net")
JSON3.Hal-halVektorUInt8, VektorUInt64 dengan 3 barang:
:pengikut => Hal-hal[{…
:subject => {…
:cursor => "3lcaoii4bxs2y"
julia> obj.followers
47-element JSON3.ArrayJSON3.Object, VectorUInt8, SubArrayUInt64, 1, VectorUInt64, TupleUnitRangeInt64, true:
{
"did": "did:plc:7egjxzliluyeon2pd4txabm7",
"handle":
...
Hang on! 47 elements?
but I have like several thousand followers.
What’s going on?
What is happening here of course, is that the results have been pagenated.
That cursor field returned can be passed to the next call to get rest,
and so forth.
julia> obj2 = run_query("/xrpc/app.bsky.graph.getFollowers"; actor="oxinabox.net", cursor=obj.cursor)
JSON3.ObjectVectorUInt8, VectorUInt64 with 3 entries:
:followers => Object[{…
:subject => {…
:cursor => "3lbuwshgfei2g"
julia> obj2.followers
48-element JSON3.ArrayJSON3.Object, VectorUInt8, SubArrayUInt64, 1, VectorUInt64, TupleUnitRangeInt64, true:
{
"did": "did:plc:l2xlpoj2k5yvs4a4f6pq76iy",
"handle":
This is called pagenation.
Its kinda annoying, but it does prevent getting an unmanagable amount of data all at once.
So we will make a function to help with that:
function run_query_pagenated(endpoint, field, host="public.api.bsky.app"; query_params...)
obj = run_query(endpoint, host="public.api.bsky.app"; query_params...)
initial_vals = getproperty(obj, field)
T = eltype(initial_vals)
return ChannelT(50, spawn=true) do ch # get at most 50 at a time
for x in getproperty(obj, field)
put!(ch, x)
end
while haskey(obj, :cursor)
new_query_params = Dict(query_params)
new_query_params[:cursor] = obyek.penunjuk
obyek = jalankan_query(titik akhir, tuan rumah="publik.api.bsky.app"; new_query_params...)
Karena X DI DALAM mendapatkan properti(obyek, bidang)
meletakkan!(bab, X)
akhir
akhir
akhir
akhir
Jadi, inilah beberapa kode yang cukup rumit.
Semua kerumitan ada di dalamnya Channel.
Saya sebenarnya membuat blog tentang Channel pada tahun 2017, tetapi bahasanya sangat berbeda saat itu.
Singkatnya, satu Channel adalah struktur data untuk komunikasi asinkron.
Ini seperti antrian, memblokir (dan memberikan kontrol ke tugas/utas lain) ketika sudah penuh dan Anda mencoba menambahkan sesuatu, atau ketika kosong dan Anda mencoba membaca sesuatu.
Formulir do-block (sebenarnya formulir pengambilan argumen) membuat tugas asinkron baru untuk menjalankan kode yang ada di dalamnya.
Yang akan mengisi saluran.
Tugas ini berjalan hingga kontrol diberikan (misalnya, diblokir karena Saluran penuh).
Ketika kontrol dikembalikan ke tugas yang membuatnya, fungsi tersebut mengembalikan objek Channel,
dan kode selanjutnya dapat mulai menggunakannya.
Ini akan dilakukan sampai ditutup (dengan keluar dari blok kode) atau sampai berjalan kosong, dalam hal ini kode ini akan diblokir, memberikan kontrol kembali ke tugas yang telah diisi di dalamnya, dll.
itu spawn=true Argumen memungkinkan tugas untuk berjalan pada thread yang tidak membuatnya, yang berarti tugas tersebut sebenarnya dapat diisi saat sedang digunakan, secara praktis secara bersamaan!
Namun tanpa itu pun, hal ini akan tercapai beberapa paralelisme ketika operasi IO menghasilkan saat buffer jaringan terisi.
Mari kita lihat aksinya:
julia> first(run_query_pagenated("/xrpc/app.bsky.graph.getFollowers", :followers; actor="oxinabox.net"))
JSON3.ObjectVectorUInt8, SubArrayUInt64, 1, VectorUInt64, TupleUnitRangeInt64, true with 7 entries:
:did => "did:plc:mj3tgpkknd7asmxvbom4putl"
:handle ...
(Sangat cepat)
Kalau begitu mari kita buat daftarnya bersama:
julia> followers = collect(run_query_pagenated("/xrpc/app.bsky.graph.getFollowers", :followers; actor="oxinabox.net"))
1977-element VectorJSON3.Object:
{
"did":...
(seperti 10 detik)
Menariknya masih belum sepi dengan angka lengkapnya, saya kira ini ada hubungannya dengan akun yang dihapus atau dinonaktifkan.
Beberapa analisis dasar:
function profile_mentions(checker_fun, obj)
for field in (:handle, :displayName, :description)
haskey(obj, field) || continue
if checker_fun(obj[field])
return true
end
end
return false
end
Jadi mari kita lihat berapa banyak profil yang menyebut trans:
julia> trans_marker(str::AbstractString) = occursin(r"(\btrans\b)|⚧️"i, str)
trans_marker (generic function with 1 method)
julia> count(x->profile_mentions(trans_marker, x), followers)
533
Mari kita lihat berapa banyak orang yang menyebut JuliaLang
julia> julia_marker(str::AbstractString) = occursin(r"(\bjulialang\b)"i, str)
julia_marker (generic function with 1 method)
julia> count(x->profile_mentions(julia_marker, x), followers)
30
Saya yakin dapat mengatakan bahwa keduanya diremehkan.
Terutama yang terakhir, saya mungkin harus membandingkannya dengan pelanggan feed Julia atau orang-orang di paket perdana Julia.
Adapun yang pertama… membangun cara untuk mengidentifikasi akun yang berkonversi secara massal secara andal adalah ide yang buruk.
Kesimpulan
Ini adalah pengenalan penggunaan bluesky API dari JuliaLang.
Kami telah membuat beberapa bantuan yang memungkinkan kami menanyakannya dengan lebih mudah.
Masih banyak endpoint API lainnya yang belum kami bahas.
Saya ingin pergi dan menggunakan ini untuk melakukan analisis.
Misalnya, latihan pada saat saya memposting, waktu merespons, dll
Tapi ini sudah terlambat.
Terkait
Software Terbaru Saat Ini
Aplikasi yang sedang trend saat ini
object oriented programming, programming language, programming adalah, web programming, belajar programming, tournament software, software, software adalah, contoh software, apa itu software, pengertian software, aplikasi, aplikasi penghasil uang, aplikasi bokep, aplikasi video, programming
#Kueri #Bluesky #API #beragampengetahuan.com