حالات الاستخدام

جمع بيانات الرعاية الصحية خلف جدران CAPTCHA

تستخدم بوابات بيانات الرعاية الصحية - أدلة مقدمي الخدمة، وقواعد بيانات تسعير الأدوية، وسجلات التجارب السريرية - اختبار CAPTCHA لمنع جمع البيانات تلقائيًا. يحتاج الباحثون ومنصات التكنولوجيا الصحية إلى هذه البيانات لإجراء التحليلات والامتثال واتخاذ القرارات المستنيرة.


مكان ظهور اختبار CAPTCHA

المصدر نوع التحقق البيانات حالة الاستخدام
أدلة الموفرين (NPI) صورة التحقق بحث Doctor/facility كفاية الشبكة
بوابات تسعير الأدوية reCAPTCHA v2 أسعار الأدوية شفافية الأسعار
سجلات التجارب السريرية reCAPTCHA v2 بيانات التجربة، النتائج تحليل البحوث
صيغ التأمين reCAPTCHA v2 قوائم تغطية المخدرات مقارنة الوصفات
مجالس ترخيص الدولة صورة التحقق التحقق من الترخيص الشيكات الاعتماد
تقييمات جودة المستشفى Cloudflare Turnstile مقاييس الجودة تحليل الأداء

مكشطة دليل الموفر

import requests
import time
import re
import base64
from bs4 import BeautifulSoup
import csv

CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"


def solve_recaptcha(sitekey, pageurl):
    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY, "method": "userrecaptcha",
        "googlekey": sitekey, "pageurl": pageurl, "json": 1,
    })
    task_id = resp.json()["request"]
    for _ in range(60):
        time.sleep(5)
        result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
            "key": CAPTCHAAI_KEY, "action": "get",
            "id": task_id, "json": 1,
        })
        data = result.json()
        if data["request"] != "CAPCHA_NOT_READY":
            return data["request"]
    raise TimeoutError("Timeout")


def solve_image_captcha(image_bytes):
    img_b64 = base64.b64encode(image_bytes).decode()
    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY, "method": "base64",
        "body": img_b64, "json": 1,
    })
    task_id = resp.json()["request"]
    for _ in range(20):
        time.sleep(3)
        result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
            "key": CAPTCHAAI_KEY, "action": "get",
            "id": task_id, "json": 1,
        })
        data = result.json()
        if data["request"] != "CAPCHA_NOT_READY":
            return data["request"]
    raise TimeoutError("Timeout")


class HealthcareDataCollector:
    def __init__(self, proxy=None):
        self.session = requests.Session()
        if proxy:
            self.session.proxies = {"http": proxy, "https": proxy}
        self.session.headers.update({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
            "AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36",
        })

    def search_providers(self, portal_url, specialty, location, sitekey=None):
        """Search provider directory with CAPTCHA handling."""
        resp = self.session.get(portal_url, timeout=30)

        data = {"specialty": specialty, "location": location}

        # Handle CAPTCHA
        if sitekey:
            token = solve_recaptcha(sitekey, portal_url)
            data["g-recaptcha-response"] = token
        else:
            captcha_img = re.search(r'src="(/captcha[^"]+)"', resp.text)
            if captcha_img:
                img_url = portal_url.rstrip("/") + captcha_img.group(1)
                img = self.session.get(img_url)
                data["captcha"] = solve_image_captcha(img.content)

        resp = self.session.post(portal_url, data=data)
        return self._parse_providers(resp.text)

    def lookup_drug_prices(self, pricing_url, drug_name, zip_code, sitekey):
        """Look up drug prices with CAPTCHA solving."""
        # Load search page
        self.session.get(pricing_url)

        # Solve CAPTCHA
        token = solve_recaptcha(sitekey, pricing_url)

        resp = self.session.post(pricing_url, data={
            "drug": drug_name,
            "zip": zip_code,
            "g-recaptcha-response": token,
        })

        if resp.status_code == 200:
            return self._parse_prices(resp.text)
        return []

    def batch_provider_lookup(self, portal_url, specialties, locations, output_file):
        """Batch search across specialties and locations."""
        all_providers = []

        for specialty in specialties:
            for location in locations:
                try:
                    providers = self.search_providers(
                        portal_url, specialty, location,
                    )
                    for p in providers:
                        p["specialty_search"] = specialty
                        p["location_search"] = location
                    all_providers.extend(providers)
                    print(f"{specialty} / {location}: {len(providers)} providers")
                    time.sleep(5)
                except Exception as e:
                    print(f"Error: {specialty} / {location}: {e}")

        # Export
        if all_providers:
            keys = all_providers[0].keys()
            with open(output_file, "w", newline="", encoding="utf-8") as f:
                writer = csv.DictWriter(f, fieldnames=keys)
                writer.writeheader()
                writer.writerows(all_providers)

        return all_providers

    def _parse_providers(self, html):
        soup = BeautifulSoup(html, "html.parser")
        providers = []
        for card in soup.select(".provider-card, .doctor-result, tr.provider"):
            providers.append({
                "name": self._text(card, ".name, .provider-name"),
                "specialty": self._text(card, ".specialty"),
                "address": self._text(card, ".address"),
                "phone": self._text(card, ".phone"),
                "accepting": self._text(card, ".accepting-patients"),
            })
        return providers

    def _parse_prices(self, html):
        soup = BeautifulSoup(html, "html.parser")
        prices = []
        for row in soup.select(".pharmacy-row, .price-result"):
            prices.append({
                "pharmacy": self._text(row, ".pharmacy-name"),
                "price": self._text(row, ".price, .drug-price"),
                "quantity": self._text(row, ".quantity"),
            })
        return prices

    def _text(self, el, selector):
        found = el.select_one(selector)
        return found.get_text(strip=True) if found else ""


# Usage
collector = HealthcareDataCollector(
    proxy="http://user:pass@residential.proxy.com:5000"
)

# Provider search
providers = collector.search_providers(
    portal_url="https://provider-directory.example.com/search",
    specialty="Cardiology",
    location="New York, NY",
)

# Drug pricing
prices = collector.lookup_drug_prices(
    pricing_url="https://drug-prices.example.com/compare",
    drug_name="atorvastatin",
    zip_code="10001",
    sitekey="6Lc_xxxxxxx",
)

جمع بيانات التجارب السريرية

def collect_clinical_trials(search_url, condition, sitekey):
    """Collect clinical trial data for a medical condition."""
    collector = HealthcareDataCollector(
        proxy="http://user:pass@residential.proxy.com:5000"
    )

    token = solve_recaptcha(sitekey, search_url)
    resp = collector.session.post(search_url, data={
        "condition": condition,
        "status": "recruiting",
        "g-recaptcha-response": token,
    })

    if resp.status_code != 200:
        return []

    soup = BeautifulSoup(resp.text, "html.parser")
    trials = []
    for item in soup.select(".trial-item, .study-result"):
        trials.append({
            "title": collector._text(item, ".title, h3"),
            "status": collector._text(item, ".status"),
            "sponsor": collector._text(item, ".sponsor"),
            "phase": collector._text(item, ".phase"),
            "enrollment": collector._text(item, ".enrollment"),
            "location": collector._text(item, ".location"),
        })

    return trials

اعتبارات خصوصية البيانات

نوع البيانات الحساسية توصية
أدلة الموفر منخفض (معلومات عامة) بشكل عام آمن للجمع
تسعير الأدوية منخفض (التسعير العام) مسموح به للشفافية
البيانات الوصفية للتجارب السريرية منخفض (السجلات العامة) استخدام البحوث المناسبة
مراجعات المرضى متوسط إخفاء الهوية قبل التحليل
تفاصيل خطة التأمين منخفضة (المعدلات المنشورة) مسموح للمقارنة

هام: لا تحاول مطلقًا جمع معلومات صحية محمية (PHI). ركز فقط على البيانات المتاحة للعامة وغير الخاصة بالمريض.


استكشاف الأخطاء وإصلاحها

المشكلة السبب الإجراء
صورة CAPTCHA غير قابلة للقراءة صورة ذات جودة منخفضة أعد المحاولة - تم إنشاء صورة جديدة
يعود بحث الموفر فارغًا قام CAPTCHA بحظر البحث حل اختبار CAPTCHA قبل الإرسال
سعر الدواء يختلف حسب الموقع التسعير على أساس الجغرافي مطابقة موقع الوكيل بالرمز البريدي
تنتهي صلاحية الجلسة على صفحات متعددة مهلة البوابة استكمال عمليات البحث بسرعة
معدل محدود على عمليات البحث دفعة طلبات كثيرة جدًا إضافة تأخير 5-10 ثانية

الأسئلة الشائعة

هل يُسمح بجمع بيانات تسعير الرعاية الصحية؟

يتم تشجيع شفافية تسعير الأدوية من خلال التنظيم (قاعدة شفافية أسعار CMS). يمكن الوصول إلى بيانات دليل الموفر العام بشكل عام.

هل يمكنني مقارنة أسعار الأدوية في الصيدليات؟

نعم. خدمات مثل GoodRx تفعل ذلك على نطاق واسع. يتعامل CaptchaAI مع اختبارات CAPTCHA التي تستخدمها بوابات التسعير للحد من الوصول الآلي.

كيف أتعامل مع HIPAA عند إلغاء مواقع الرعاية الصحية؟

ينطبق HIPAA على المعلومات الصحية المحمية (PHI). البيانات العامة مثل أدلة مقدمي الخدمة، وأسعار الأدوية، وسجلات التجارب السريرية ليست معلومات صحية محمية. لا تقم أبدًا بكشط سجلات المرضى الفردية.


أدلة ذات صلة


التعليقات غير مفعّلة لهذا المقال.