Anasayfa / Nedir? / Araçlar / Uygulamlar / OpenClaw’ı Kişisel Google Drive’ınıza Bağlamak

OpenClaw’ı Kişisel Google Drive’ınıza Bağlamak

Bu yazıda, kendi sunucumda host ettiğim OpenClaw ajanımı (Kendisine Kanka diyorum 🙂 )kişisel Google Drive’ımda, OpenClaw için oluşturduğum klasör ile nasıl entegre ettiğimi anlatacağım.

Bu projede iki tane amacım vardı. Birincisi “Şu notu Drive’a kaydet”, “Şu scripti Drive’a ekle”, “Şu dosyayı drive’a ekle” diyerek kişisel asistanıma özel bir alan tahsis etmek, ikincisi de bir nevi RAG olarak kullanmaktı.

RAG tarafında tabii ki vektör veritabanı şeklinde değil, dosya kaynağı + embed edilen içerik olarak kullanmak. Sonra ki adımım ise bu dosyaları Qdrant veya Weaviate gibi vektör veritabanına basmak olacak.

Proje sürecinde üç problemim vardı. Bunlar:

  1. OpenClaw’ın çalıştığı sunucum ile Google Drive’ım arasında güvenli bir iletişim katmanı kurmak.
  2. Google’ın service account kısıtlamalarından dolayı Drive’ımda kota sorunu yaşamamak.
  3. Tüm bunları, ileri de geliştirebileceğim bir ufak bir REST API ile gerçekleştirmek.

Projenin Genel Mimarisi

Projenin genel mimarisini aşağıdaki şekilde oluşturdum:

  1. OpenClaw ajanım, doğrudan Google Drive API’sine dokunmuyor.
  2. Fast tabanlı Drive Bridge ile Google Drive ile konuşmak.
  3. Bu script ile ilgili klasör (OpenClaw Files) içerisinde okuma/yazma/düzenleme haklarına sahip olması.
  4. Kimlik doğrulama olarak service account yerine, kullanıcının hesabı ile yetkilendirilmiş bir OAuth Client + Refresh Token kombinasyonunun kullanılması.

Peki böylece ne oldu;

  1. Ajan sadece local HTTP endpointlerine istek atıyor. (Örnek: HTTP /files)
  2. Google tarafında erişimimizi sağlayan tüm hassas veriler sunucu da barındırılıyor. (credentials.json, token.json)
  3. Drive erişimi sadece ilgili klasöre ve dosyalara gerçekleşiyor.

İlk Deneme: Service Account Neden Olmadı?

İlk başta Google Cloud Console‘da bir servis oluşturdum. Sonrasında oluşturduğum bu servis altında bir service account oluşturdum.

Bir mail hesabı gibi aldığım bu service account‘u daha sonrasında Google Drive’ım da ki klasörde “Paylaş” diyerek yetki verdim. Ayrıca ilgili klasörün ID’sini de URL’de ki bardan aldım. (Örnek: https://drive.google.com/drive/folders/KLASÖR_ID)

Daha sonrasında FastAPI içerisinde service-account.json dosyası ile Drive API Client‘ı oluşturdum.

İlk başta okuma ve listeleme de mimari çalışsa da, dosya oluşturma kısmında aşağıda ki hata ile karşılaştım:

Service Accounts do not have storage quota. ... reason: storageQuotaExceeded

Bu hata; kişisel Google Drive hesabımda service accountların kendi başına bir kota sahibi olmadığı için dosya yükleyemiyor veya oluşturamıyor.

Yaptığım araştırmalarda Google Workspace’de bu hatanın bir çözümü olduğu yönündeydi fakat ben Google Workspace kullanmadığım için ne yazık ki işime yaramadı. Bu yüzden de mimari de bir değişikliğe giderek OAuth üzerinden erişmeye çalıştım.

Yeni Mimari: OAuth Client + Offline Token

Karşılaştığım sorunlar ve yaptığım araştırmalar sonucunda Google Drive’ıma erişim için en doğru ve güvenilir yol GCP (Google Cloud Platform) üzerinde bir OAuth Client ID ile devam etmekti. Bunda da yöntem olarak Desktop App‘i seçtim.

Ardından lokal bilgisayarımda çalıştıracağım bir python script ile (get_token.py) tarayıcı üzerinden bir token ürettim. Sonrasında kendi bilgisayarım üzerinden ürettiğim token.json ve credential.json ikilisini OpenClaw sunucuma taşıyarak, backend’in kullanıcı adına ilgili Drive’ıma erişmesini sağladım.

Kullandığım Scope:

SCOPES = ["https://www.googleapis.com/auth/drive.file"]

Bu scope, uygulamaya sadece kendi oluşturduğu veya açtığı dosya ve klasörlere erişim izni veriyor. Böylece OpenClaw ajanı, Drive’ım da ki tüm dosya ve klasörleri göremiyor, sadece entegrasyona dahil dosya ve klasörlere erişim sağlayabiliyor.

Token Oluşturma Scripti

Lokal makinemde, yani bilgisayarımda aşağıda ki adımları gerçekleştirdim:

  • Google Cloud Console’dan OAuth Client dosyasını indirip, credentials.json olarak kaydettim.
  • Aynı klasörde get_token.py python scriptini çalıştırdım.
  • Script tarayıcı da yeni bir sekme açarak, Google login ve izin ekranlarını açtı. Gerekli izinleri verdiğimde token.json dosyasını üretti.

Sonrasında bu iki dosyayı (credentials.json ve token.json) OpenClaw’ın olduğu sunucu da, ayrıca oluşturduğum workspace içerisinde ki dosyaya yükledim.

FastAPI ile “OpenClaw Drive Bridge” Servisi

OpenClaw sunucumda ki ilgili workspace içinde aşağıdaki yapıda bir proje oluştudum;

openclaw-drive-bridge/
-main.py
-requirements.txt
-credentials.json
-token.json
-.env

Bağlılıklar

Requirement.txt:

fastapi
uvicorn[standard]
google-api-python-client
google-auth
google-auth-httplib2
google-auth-oauthlib
python-multipart

Proje seviyesinde izole kalması için bir virtualenv içinde oluşturdum:

cd /root/.openclaw/workspace/kanka-drive-bridge
python3 -m venv .venv
./.venv/bin/pip install -r requirements.txt

OAuth ile Drive Client Oluşturma

FastAPI uygulamasında Drive Client şöyle oluşuyor:

from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
SCOPES = ["https://www.googleapis.com/auth/drive.file"]
CREDENTIALS_FILE = "credentials.json"   # OAuth client
TOKEN_FILE = "token.json"               # Kullanıcı token'ı
OPENCLAW_GOOGLEDRIVE_FOLDER_ID = "DRIVE_FOLDER_ID"  # OpenClaw Files klasörü
def get_drive_service():
    creds = Credentials.from_authorized_user_file(TOKEN_FILE, SCOPES)
    if not creds.valid:
        if creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            raise RuntimeError("Geçersiz veya yenilenemeyen Drive kimlik bilgileri")
    service = build("drive", "v3", credentials=creds)
    return service

Burada önemli olan, uygulamanın gerekirse her istekte token’ı Refresh Token üzerinden yenileyebilmesi.

RestAPI Endpointleri

Servis aşağıdaki endpointleri sağlıyor:

@app.post("/files", response_model=FileContentResponse)
def create_or_update_file(req: FileCreateRequest):
    try:
        service = get_drive_service()
        existing = None
        if req.overwrite:
            existing = find_file_in_folder_by_name(service, req.name)
        data = req.content.encode("utf-8")
        media = MediaInMemoryUpload(data, mimetype=req.mimeType, resumable=False)
        file_metadata = {
            "name": req.name,
            "parents": [DRIVE_FOLDER_ID],
        }
        if existing and req.overwrite:
            file_id = existing["id"]
            file = service.files().update(
                fileId=file_id,
                media_body=media,
            ).execute()
        else:
            file = service.files().create(
                body=file_metadata,
                media_body=media,
                fields="id, name, mimeType, parents",
            ).execute()
        file_id = file["id"]
        downloaded = service.files().get_media(fileId=file_id).execute()
        return FileContentResponse(
            id=file_id,
            name=file["name"],
            mimeType=file.get("mimeType", req.mimeType),
            content=downloaded.decode("utf-8", errors="ignore"),
        )
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

Bu sayede Kanka, sunucuda yalnızca şu formatta bir HTTP isteği yaparak Drive’a dosya yazabiliyor:

curl -X POST "http://localhost:8000/files" \
-H "Content-Type: application/json" \
-d '{
"name": "deneme-notu.txt",
"content": "Merhaba, bu OpenClaw Files klasörüne giden ilk not 👊 (OAuth)",
"mimeType": "text/plain",
"overwrite": true
}'

GET /files ve GET /files/{file_id} de listeleme ve içerik okuma için kullanılıyor.

OpenClaw Tarafında Kullanım

Bu yapımızla beraber ajanımızın işi oldukça basit:

  • Telegram üzerinden yazdığım ve not olarak kaydet dediğim metinleri ajan otomatik olarak Google Drive’a uygun bir şekilde dönüştürüyor. (.md veya .txt olarak)
  • Arka tarafta POST /files endpointine istek atarak Drive üzerinde ki ilgili klasöre atıyor.
  • Daha sonra notu aç dediğinizde önce GET /files ile ilgili dosyayı buluyor, değiştirme isteği varsa GET /files/{id} şeklinde ilgili datayı çekip, işliyor.

Bütün hassas işlemler (OAuth, refresh token, Google Drive API çağrıları) Drive Bridge servisinde izole bir şekilde kalıyor.

Sonrasında planladıklarım;

  • Alt Klasör Mantığı (Blog, Work, Media, Git, Notes vb.)
  • Binary Upload (Video, ses, görüntü dosyaları için multipart upload destekleyen ek endpoint’ler.)
  • Çift Yönlü Entegrasyon (Drive’daki belirli bir klasörü tarayıp “Yeni gelen dosyalar var mı?” şeklinde Kanka’ya tetikleyici olarak bağlamak.)

GitHub Reposu: https://github.com/mutkus/OpenClaw-GoogleDrive-Bridge/

Etiketlendi:

Cevap bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site istenmeyenleri azaltmak için Akismet kullanır. Yorum verilerinizin nasıl işlendiğini öğrenin.