auto-claude: subtask-4-2 - Add --company-slug support and dotenv loading

- Add --company-slug argument to social_media_audit.py for easier testing
- Add get_company_id_by_slug() method to SocialMediaAuditor class
- Add python-dotenv support to load .env file from project root
- Create verify_google_places.py script for direct API testing

Note: Full verification blocked - current API key (PageSpeed) doesn't have
Places API enabled. Requires enabling Places API in Google Cloud Console
for project NORDABIZNES (gen-lang-client-0540794446).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Maciej Pienczyn 2026-01-08 20:49:59 +01:00
parent 3d69d53550
commit 06c22539d7
2 changed files with 155 additions and 0 deletions

View File

@ -33,6 +33,20 @@ from datetime import datetime, timedelta
from typing import Optional, Dict, List, Tuple, Any from typing import Optional, Dict, List, Tuple, Any
from urllib.parse import urlparse from urllib.parse import urlparse
import time import time
from pathlib import Path
# Load .env file from project root
try:
from dotenv import load_dotenv
# Find .env file relative to this script
script_dir = Path(__file__).resolve().parent
project_root = script_dir.parent
env_path = project_root / '.env'
if env_path.exists():
load_dotenv(env_path)
logging.info(f"Loaded .env from {env_path}")
except ImportError:
pass # python-dotenv not installed, rely on system environment
import requests import requests
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
@ -882,6 +896,18 @@ class SocialMediaAuditor:
return [dict(row._mapping) for row in result] return [dict(row._mapping) for row in result]
def get_company_id_by_slug(self, slug: str) -> Optional[int]:
"""Get company ID by slug."""
with self.Session() as session:
query = text("""
SELECT id FROM companies WHERE slug = :slug
""")
result = session.execute(query, {'slug': slug})
row = result.fetchone()
if row:
return row[0]
return None
def audit_company(self, company: Dict) -> Dict[str, Any]: def audit_company(self, company: Dict) -> Dict[str, Any]:
""" """
Perform full audit for a single company. Perform full audit for a single company.
@ -1111,6 +1137,7 @@ class SocialMediaAuditor:
def main(): def main():
parser = argparse.ArgumentParser(description='Social Media & Website Audit') parser = argparse.ArgumentParser(description='Social Media & Website Audit')
parser.add_argument('--company-id', type=int, help='Audit single company by ID') parser.add_argument('--company-id', type=int, help='Audit single company by ID')
parser.add_argument('--company-slug', type=str, help='Audit single company by slug')
parser.add_argument('--batch', type=str, help='Audit batch of companies (e.g., 1-10)') parser.add_argument('--batch', type=str, help='Audit batch of companies (e.g., 1-10)')
parser.add_argument('--all', action='store_true', help='Audit all companies') parser.add_argument('--all', action='store_true', help='Audit all companies')
parser.add_argument('--dry-run', action='store_true', help='Print results without saving') parser.add_argument('--dry-run', action='store_true', help='Print results without saving')
@ -1125,6 +1152,14 @@ def main():
if args.company_id: if args.company_id:
summary = auditor.run_audit(company_ids=[args.company_id], dry_run=args.dry_run) summary = auditor.run_audit(company_ids=[args.company_id], dry_run=args.dry_run)
elif args.company_slug:
# Look up company ID by slug
company_id = auditor.get_company_id_by_slug(args.company_slug)
if company_id:
summary = auditor.run_audit(company_ids=[company_id], dry_run=args.dry_run)
else:
print(f"Error: Company with slug '{args.company_slug}' not found")
sys.exit(1)
elif args.batch: elif args.batch:
start, end = map(int, args.batch.split('-')) start, end = map(int, args.batch.split('-'))
summary = auditor.run_audit(batch_start=start, batch_end=end, dry_run=args.dry_run) summary = auditor.run_audit(batch_start=start, batch_end=end, dry_run=args.dry_run)

View File

@ -0,0 +1,120 @@
#!/usr/bin/env python3
"""
Verify Google Places API integration for social_media_audit.py.
This script tests the GooglePlacesSearcher class directly without
requiring database access.
"""
import os
import sys
from pathlib import Path
# Add user site-packages to path
sys.path.insert(0, '/Users/maciejpi/Library/Python/3.9/lib/python/site-packages')
# Load .env file from project root
try:
from dotenv import load_dotenv
script_dir = Path(__file__).resolve().parent
project_root = script_dir.parent
env_path = project_root / '.env'
if env_path.exists():
load_dotenv(env_path)
print(f"Loaded .env from {env_path}")
except ImportError:
print("python-dotenv not installed, using system environment")
# Import GooglePlacesSearcher from social_media_audit
from social_media_audit import GooglePlacesSearcher, BraveSearcher
def main():
api_key = os.getenv('GOOGLE_PLACES_API_KEY')
print(f"\nGoogle Places API Key: {'*' * 10 + api_key[-8:] if api_key else 'NOT SET'}")
if not api_key or api_key == 'your_places_api_key_here':
print("ERROR: GOOGLE_PLACES_API_KEY not configured in .env")
sys.exit(1)
# Test GooglePlacesSearcher directly
print("\n" + "=" * 60)
print("Testing GooglePlacesSearcher for INPI company")
print("=" * 60)
searcher = GooglePlacesSearcher(api_key=api_key)
# Step 1: Find place
print("\n1. Finding place for 'INPI' in Wejherowo...")
place_id = searcher.find_place('INPI', 'Wejherowo')
if not place_id:
print(" ERROR: Could not find INPI on Google Places")
print(" This could mean:")
print(" - The company doesn't have a Google Business Profile")
print(" - The API key doesn't have Places API enabled")
print(" - The search query needs adjustment")
sys.exit(1)
print(f" Found place_id: {place_id}")
# Step 2: Get place details
print("\n2. Getting place details...")
details = searcher.get_place_details(place_id)
print(f"\n Results:")
print(f" - google_rating: {details.get('google_rating')}")
print(f" - google_reviews_count: {details.get('google_reviews_count')}")
print(f" - business_status: {details.get('business_status')}")
print(f" - opening_hours: {'Yes' if details.get('opening_hours') else 'Not available'}")
if details.get('opening_hours'):
hours = details.get('opening_hours', {})
if hours.get('weekday_text'):
print(" - Hours:")
for day in hours['weekday_text']:
print(f" {day}")
# Step 3: Test via BraveSearcher.search_google_reviews
print("\n" + "=" * 60)
print("Testing BraveSearcher.search_google_reviews()")
print("=" * 60)
brave = BraveSearcher()
result = brave.search_google_reviews('INPI', 'Wejherowo')
print(f"\n Results:")
print(f" - google_rating: {result.get('google_rating')}")
print(f" - google_reviews_count: {result.get('google_reviews_count')}")
print(f" - business_status: {result.get('business_status')}")
print(f" - opening_hours: {'Yes' if result.get('opening_hours') else 'Not available'}")
# Verify expected data
print("\n" + "=" * 60)
print("VERIFICATION SUMMARY")
print("=" * 60)
success = True
if result.get('google_rating') is not None:
print(f"[PASS] google_rating present: {result['google_rating']}")
else:
print("[FAIL] google_rating is None")
success = False
if result.get('google_reviews_count') is not None:
print(f"[PASS] google_reviews_count present: {result['google_reviews_count']}")
else:
print("[FAIL] google_reviews_count is None")
success = False
if success:
print("\n[SUCCESS] Google Places API integration is working!")
print("The social_media_audit.py can now collect Google reviews data.")
else:
print("\n[WARNING] Some data was not retrieved.")
print("Check if the business has a Google Business Profile with reviews.")
return 0 if success else 1
if __name__ == '__main__':
sys.exit(main())