인셔셔RSS 관심 있는 블로그, 뉴스, 기술 정보를 효율적으로 추적하고 읽으세요
원문 읽기 InertiaRSS에서 열기

추천 피드

小众软件
小众软件
博客园 - 叶小钗
有赞技术团队
有赞技术团队
大猫的无限游戏
大猫的无限游戏
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LangChain Blog
Hugging Face - Blog
Hugging Face - Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
aimingoo的专栏
aimingoo的专栏
Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
T
Tailwind CSS Blog
Jina AI
Jina AI
量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
J
Java Code Geeks
V
Visual Studio Blog
月光博客
月光博客

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python)
어떻게 AT 프로토콜 API를 사용하여 Bluesky 스크래퍼를 만들고 Apify에 게시했는지
Daniel Ainsw · 2026-05-28 · via DEV Community

블루스카이는 올해 초 4천만 명의 사용자를 기록했으며, 트위터와 달리 오픈 프로토콜인 AT 프로토콜 위에서 동작합니다. 공개 데이터는 진정으로 공개되며, 설계상 기계가 읽을 수 있습니다. $5,000/월 엔터프라이즈 API 계층은 없습니다. 법률 전문가가 이해해야 할 비율 제한도 없습니다. 단순히 누구나 쿼리할 수 있는 깨끗한 REST API만 있습니다.

나는 이를 스크래핑하고 싶었습니다. 제가 생산 준비된 액터를 어떻게 만들고 그 과정에서 배운 점은 다음과 같습니다.

왜 Bluesky는 스크래핑하기 쉽다 (합법적으로)

대부분의 소셜 미디어 스크래퍼는 Cloudflare, 로테이팅 프록시, 그리고 서비스 약관의 회색 영역과의 싸움이지만 Bluesky는 다르다. AT 프로토콜은 제3자 클라이언트와 데이터 접근을 명시적으로 설계되었다. public.api.bsky.app에 있는 공개 API는 인증되지 않은 읽기 요청을 처리한다. 지문 인식이 없고, CAPTCHA가 없고, DOM 파싱도 없다.

유일한 접목점: 검색 엔드포인트 (app.bsky.feed.searchPosts)는 이제 무료 앱 비밀번호를 통해 인증이 필요합니다. 나머지 모든 것 - 작성자 피드, 스레드, 프로필 - 토큰 없이 작동합니다.

세 가지 모드를 만들었습니다

주요 B2B 사용 사례를 하나의 역할자가 다루고 싶었습니다.

게시물 검색 — 키워드와 해시태그 검색, 날짜 범위, 언어 필터링, 정렬 순서 사용bsky.social/xrpc/app.bsky.feed.searchPosts에 Bearer 토큰을 사용합니다.

작성자 피드 — 하나 이상의 핸들에서 모든 게시물을 가져옵니다. 인증이 필요 없습니다. 경쟁사 모니터링 또는 창작자의 콘텐츠 역사를 검토하는 데 유용합니다.

스레드 — 게시물 URL에서 전체 대화 트리를 가져옵니다. API는 중첩된 트리를 반환하며, 저는 깊이 우선으로 평평하게 만들어서 게시물의 깔끔한 순서 있는 목록을 얻게 됩니다.

주의할 점: API 라우팅

이게 나를 상처 입혔다. I was sending authenticated requests (with a JWT) to public.api.bsky.app. That endpoint is Cloudflare-fronted and returns 403 if you send auth tokens to it — it's for unauthenticated traffic only.

해결책: authenticated calls go to bsky.social. Unauthenticated reads go to public.api.bsky.app. You auth against bsky.social, get a JWT, then use that JWT only on subsequentbsky.social calls.

단일 저장소 배포 고민

TypeScript 단일 저장소에서 npm 워크스페이스를 사용하여 Apify 액터 포트폴리오를 구축하고 있습니다. 공유 라이브러리 (@apify-actors/shared)에는 PPE 충전 도우미 및 오류 클래스가 포함되어 있습니다. 로컬에서는 워크스페이스 해결이 깔끔하게 처리됩니다. Apify의 빌드 서버에서는 단일 저장소가 없습니다. 오직 업로드된 액터 폴더만 있습니다.

해결책: 공유 소스를src/shared/를 각 액터 내부에 넣고 상대적 임포트를 사용하세요. tsup은 모든 것을 하나의 dist/main.js로 묶어줍니다. 공유 코드는 저장소의 하나의 표준적인 위치에 남아있으며, 각 액터는 빌드 시 자신만의 사본이 포함됩니다.

출력 스키마

모든 게시물은 평평한 JSON 기록으로 반환됩니다.

{
  "url": "https://bsky.app/profile/user.bsky.social/post/3lhxxxxxxxxx",
  "text": "Post content here",
  "authorHandle": "user.bsky.social",
  "authorDisplayName": "User Name",
  "likeCount": 142,
  "repostCount": 28,
  "replyCount": 19,
  "images": [{ "thumb": "...", "fullsize": "...", "alt": "..." }],
  "externalEmbed": { "uri": "...", "title": "...", "description": "..." },
  "createdAt": "2025-11-15T10:30:00.000Z"
}

전체 화면 모드로 전환 전체 화면 모드 종료

Apify에서 직접 JSON, CSV, 또는 Excel로 내보내기. Zapier 또는 Make에 플러그인하여 코드 없는 워크플로우 사용.

액터는 활성화됨

아무것도 만들지 않고 사용하고 싶다면: Apify 스토어의 Bluesky Posts Scraper

PPE 가격: 실행당 $0.25 + 게시물당 $0.003 ($3/1,000). 구독 없음.

AT 프로토콜은 Bluesky를 현재 작업할 수 있는 가장 깨끗한 데이터 소스 중 하나로 만듭니다. 만약 당신의 사용 사례가 사회적 리스닝, 브랜드 모니터링, 빠르게 성장하는 기술 선도적인 대중의 리드 생성 신호를 포함한다면, 스택에 추가하는 것이 가치가 있습니다.