$ cat node-template.py
L
Lark Get Member
// Fetches details of a single Lark user by their ID. Returns name, email, avatar, and department. Use to enrich task data with member information.
Input
Integration
template.py
1import os2import sys3import json4import traceback56try:7 import requests8except ImportError:9 import subprocess10 subprocess.check_call([sys.executable, "-m", "pip", "install", "requests"])11 import requests1213LARK_BASE_URL = "https://open.larksuite.com/open-apis"141516def get_lark_token():17 # Prefer user token (OAuth — sees user's resources)18 user_token = os.getenv("LARK_USER_TOKEN")19 if user_token:20 return user_token2122 # Fallback to tenant token (app-level — limited visibility)23 app_id = os.getenv("LARK_APP_ID")24 app_secret = os.getenv("LARK_APP_SECRET")25 if not app_id or not app_secret:26 raise ValueError(27 "Lark is not connected. Add LARK_APP_ID and LARK_APP_SECRET as workspace secrets, "28 "then connect via workspace settings to authorize user access."29 )30 resp = requests.post(31 f"{LARK_BASE_URL}/auth/v3/tenant_access_token/internal",32 json={"app_id": app_id, "app_secret": app_secret},33 )34 resp.raise_for_status()35 data = resp.json()36 if data.get("code") != 0:37 raise ValueError(f"Lark auth failed: {data.get('msg')}")38 return data["tenant_access_token"]394041def lark_request(method, path, **kwargs):42 token = get_lark_token()43 headers = {44 "Authorization": f"Bearer {token}",45 "Content-Type": "application/json; charset=utf-8",46 }47 resp = requests.request(48 method, f"{LARK_BASE_URL}{path}", headers=headers, **kwargs49 )50 resp.raise_for_status()51 data = resp.json()52 if data.get("code") != 0:53 raise ValueError(f"Lark API error ({data['code']}): {data.get('msg')}")54 return data555657def main():58 try:59 inputs = json.loads(sys.stdin.read()).get("inputs", {})6061 user_id = inputs.get("userId", "").strip()62 if not user_id:63 raise ValueError("userId is required")6465 user_id_type = inputs.get("userIdType", "open_id")6667 result = lark_request(68 "GET",69 f"/contact/v3/users/{user_id}",70 params={"user_id_type": user_id_type},71 )7273 user = result.get("data", {}).get("user", {})7475 # Extract avatar URL (prefer 72px thumbnail)76 avatar_obj = user.get("avatar", {})77 avatar_url = (78 avatar_obj.get("avatar_72")79 or avatar_obj.get("avatar_240")80 or avatar_obj.get("avatar_640")81 or avatar_obj.get("avatar_origin")82 or ""83 )8485 # Primary department86 dept_ids = user.get("department_ids", [])87 department = dept_ids[0] if dept_ids else ""8889 output = {90 "name": user.get("name", ""),91 "email": user.get("email", ""),92 "avatar": avatar_url,93 "department": department,94 "member": user,95 "success": True,96 }97 print(json.dumps(output, indent=2, ensure_ascii=False))9899 except Exception as e:100 error_output = {101 "error": str(e),102 "errorType": type(e).__name__,103 "traceback": traceback.format_exc(),104 }105 print(json.dumps(error_output), file=sys.stderr)106 sys.exit(1)107108109if __name__ == "__main__":110 main()$ git log --oneline
v1.1.0
HEAD
2026-05-07v1.0.02026-04-09