aidevops 2.52.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/AGENTS.md +614 -0
- package/.agent/accounts.md +65 -0
- package/.agent/aidevops/add-new-mcp-to-aidevops.md +456 -0
- package/.agent/aidevops/api-integrations.md +335 -0
- package/.agent/aidevops/architecture.md +510 -0
- package/.agent/aidevops/configs.md +274 -0
- package/.agent/aidevops/docs.md +244 -0
- package/.agent/aidevops/extension.md +311 -0
- package/.agent/aidevops/mcp-integrations.md +340 -0
- package/.agent/aidevops/mcp-troubleshooting.md +162 -0
- package/.agent/aidevops/memory-patterns.md +172 -0
- package/.agent/aidevops/providers.md +217 -0
- package/.agent/aidevops/recommendations.md +321 -0
- package/.agent/aidevops/requirements.md +301 -0
- package/.agent/aidevops/resources.md +214 -0
- package/.agent/aidevops/security-requirements.md +174 -0
- package/.agent/aidevops/security.md +350 -0
- package/.agent/aidevops/service-links.md +400 -0
- package/.agent/aidevops/services.md +357 -0
- package/.agent/aidevops/setup.md +153 -0
- package/.agent/aidevops/troubleshooting.md +389 -0
- package/.agent/aidevops.md +124 -0
- package/.agent/build-plus.md +244 -0
- package/.agent/content/guidelines.md +109 -0
- package/.agent/content.md +87 -0
- package/.agent/health.md +59 -0
- package/.agent/legal.md +59 -0
- package/.agent/loop-state/full-loop.local.md +16 -0
- package/.agent/loop-state/ralph-loop.local.md +10 -0
- package/.agent/marketing.md +440 -0
- package/.agent/memory/README.md +260 -0
- package/.agent/onboarding.md +796 -0
- package/.agent/plan-plus.md +245 -0
- package/.agent/research.md +100 -0
- package/.agent/sales.md +333 -0
- package/.agent/scripts/101domains-helper.sh +701 -0
- package/.agent/scripts/add-missing-returns.sh +140 -0
- package/.agent/scripts/agent-browser-helper.sh +311 -0
- package/.agent/scripts/agno-setup.sh +712 -0
- package/.agent/scripts/ahrefs-mcp-wrapper.js +168 -0
- package/.agent/scripts/aidevops-update-check.sh +71 -0
- package/.agent/scripts/ampcode-cli.sh +522 -0
- package/.agent/scripts/auto-version-bump.sh +156 -0
- package/.agent/scripts/autogen-helper.sh +512 -0
- package/.agent/scripts/beads-sync-helper.sh +596 -0
- package/.agent/scripts/closte-helper.sh +5 -0
- package/.agent/scripts/cloudron-helper.sh +321 -0
- package/.agent/scripts/codacy-cli-chunked.sh +581 -0
- package/.agent/scripts/codacy-cli.sh +442 -0
- package/.agent/scripts/code-audit-helper.sh +5 -0
- package/.agent/scripts/coderabbit-cli.sh +417 -0
- package/.agent/scripts/coderabbit-pro-analysis.sh +238 -0
- package/.agent/scripts/commands/code-simplifier.md +86 -0
- package/.agent/scripts/commands/full-loop.md +246 -0
- package/.agent/scripts/commands/postflight-loop.md +103 -0
- package/.agent/scripts/commands/recall.md +182 -0
- package/.agent/scripts/commands/remember.md +132 -0
- package/.agent/scripts/commands/save-todo.md +175 -0
- package/.agent/scripts/commands/session-review.md +154 -0
- package/.agent/scripts/comprehensive-quality-fix.sh +106 -0
- package/.agent/scripts/context-builder-helper.sh +522 -0
- package/.agent/scripts/coolify-cli-helper.sh +674 -0
- package/.agent/scripts/coolify-helper.sh +380 -0
- package/.agent/scripts/crawl4ai-examples.sh +401 -0
- package/.agent/scripts/crawl4ai-helper.sh +1078 -0
- package/.agent/scripts/crewai-helper.sh +681 -0
- package/.agent/scripts/dev-browser-helper.sh +513 -0
- package/.agent/scripts/dns-helper.sh +396 -0
- package/.agent/scripts/domain-research-helper.sh +917 -0
- package/.agent/scripts/dspy-helper.sh +285 -0
- package/.agent/scripts/dspyground-helper.sh +291 -0
- package/.agent/scripts/eeat-score-helper.sh +1242 -0
- package/.agent/scripts/efficient-return-fix.sh +92 -0
- package/.agent/scripts/extract-opencode-prompts.sh +128 -0
- package/.agent/scripts/find-missing-returns.sh +113 -0
- package/.agent/scripts/fix-auth-headers.sh +104 -0
- package/.agent/scripts/fix-common-strings.sh +254 -0
- package/.agent/scripts/fix-content-type.sh +100 -0
- package/.agent/scripts/fix-error-messages.sh +130 -0
- package/.agent/scripts/fix-misplaced-returns.sh +74 -0
- package/.agent/scripts/fix-remaining-literals.sh +152 -0
- package/.agent/scripts/fix-return-statements.sh +41 -0
- package/.agent/scripts/fix-s131-default-cases.sh +249 -0
- package/.agent/scripts/fix-sc2155-simple.sh +102 -0
- package/.agent/scripts/fix-shellcheck-critical.sh +187 -0
- package/.agent/scripts/fix-string-literals.sh +273 -0
- package/.agent/scripts/full-loop-helper.sh +773 -0
- package/.agent/scripts/generate-opencode-agents.sh +497 -0
- package/.agent/scripts/generate-opencode-commands.sh +1629 -0
- package/.agent/scripts/generate-skills.sh +366 -0
- package/.agent/scripts/git-platforms-helper.sh +640 -0
- package/.agent/scripts/gitea-cli-helper.sh +743 -0
- package/.agent/scripts/github-cli-helper.sh +702 -0
- package/.agent/scripts/gitlab-cli-helper.sh +682 -0
- package/.agent/scripts/gsc-add-user-helper.sh +325 -0
- package/.agent/scripts/gsc-sitemap-helper.sh +678 -0
- package/.agent/scripts/hetzner-helper.sh +485 -0
- package/.agent/scripts/hostinger-helper.sh +229 -0
- package/.agent/scripts/keyword-research-helper.sh +1815 -0
- package/.agent/scripts/langflow-helper.sh +544 -0
- package/.agent/scripts/linkedin-automation.py +241 -0
- package/.agent/scripts/linter-manager.sh +599 -0
- package/.agent/scripts/linters-local.sh +434 -0
- package/.agent/scripts/list-keys-helper.sh +488 -0
- package/.agent/scripts/local-browser-automation.py +339 -0
- package/.agent/scripts/localhost-helper.sh +744 -0
- package/.agent/scripts/loop-common.sh +806 -0
- package/.agent/scripts/mainwp-helper.sh +728 -0
- package/.agent/scripts/markdown-formatter.sh +338 -0
- package/.agent/scripts/markdown-lint-fix.sh +311 -0
- package/.agent/scripts/mass-fix-returns.sh +58 -0
- package/.agent/scripts/mcp-diagnose.sh +167 -0
- package/.agent/scripts/mcp-inspector-helper.sh +449 -0
- package/.agent/scripts/memory-helper.sh +650 -0
- package/.agent/scripts/monitor-code-review.sh +255 -0
- package/.agent/scripts/onboarding-helper.sh +706 -0
- package/.agent/scripts/opencode-github-setup-helper.sh +797 -0
- package/.agent/scripts/opencode-test-helper.sh +213 -0
- package/.agent/scripts/pagespeed-helper.sh +464 -0
- package/.agent/scripts/pandoc-helper.sh +362 -0
- package/.agent/scripts/postflight-check.sh +555 -0
- package/.agent/scripts/pre-commit-hook.sh +259 -0
- package/.agent/scripts/pre-edit-check.sh +169 -0
- package/.agent/scripts/qlty-cli.sh +356 -0
- package/.agent/scripts/quality-cli-manager.sh +525 -0
- package/.agent/scripts/quality-feedback-helper.sh +462 -0
- package/.agent/scripts/quality-fix.sh +263 -0
- package/.agent/scripts/quality-loop-helper.sh +1108 -0
- package/.agent/scripts/ralph-loop-helper.sh +836 -0
- package/.agent/scripts/ralph-upstream-check.sh +341 -0
- package/.agent/scripts/secretlint-helper.sh +847 -0
- package/.agent/scripts/servers-helper.sh +241 -0
- package/.agent/scripts/ses-helper.sh +619 -0
- package/.agent/scripts/session-review-helper.sh +404 -0
- package/.agent/scripts/setup-linters-wizard.sh +379 -0
- package/.agent/scripts/setup-local-api-keys.sh +330 -0
- package/.agent/scripts/setup-mcp-integrations.sh +472 -0
- package/.agent/scripts/shared-constants.sh +246 -0
- package/.agent/scripts/site-crawler-helper.sh +1487 -0
- package/.agent/scripts/snyk-helper.sh +940 -0
- package/.agent/scripts/sonarcloud-autofix.sh +193 -0
- package/.agent/scripts/sonarcloud-cli.sh +191 -0
- package/.agent/scripts/sonarscanner-cli.sh +455 -0
- package/.agent/scripts/spaceship-helper.sh +747 -0
- package/.agent/scripts/stagehand-helper.sh +321 -0
- package/.agent/scripts/stagehand-python-helper.sh +321 -0
- package/.agent/scripts/stagehand-python-setup.sh +441 -0
- package/.agent/scripts/stagehand-setup.sh +439 -0
- package/.agent/scripts/system-cleanup.sh +340 -0
- package/.agent/scripts/terminal-title-helper.sh +388 -0
- package/.agent/scripts/terminal-title-setup.sh +549 -0
- package/.agent/scripts/test-stagehand-both-integration.sh +317 -0
- package/.agent/scripts/test-stagehand-integration.sh +309 -0
- package/.agent/scripts/test-stagehand-python-integration.sh +341 -0
- package/.agent/scripts/todo-ready.sh +263 -0
- package/.agent/scripts/tool-version-check.sh +362 -0
- package/.agent/scripts/toon-helper.sh +469 -0
- package/.agent/scripts/twilio-helper.sh +917 -0
- package/.agent/scripts/updown-helper.sh +279 -0
- package/.agent/scripts/validate-mcp-integrations.sh +250 -0
- package/.agent/scripts/validate-version-consistency.sh +131 -0
- package/.agent/scripts/vaultwarden-helper.sh +597 -0
- package/.agent/scripts/vercel-cli-helper.sh +816 -0
- package/.agent/scripts/verify-mirrors.sh +169 -0
- package/.agent/scripts/version-manager.sh +831 -0
- package/.agent/scripts/webhosting-helper.sh +471 -0
- package/.agent/scripts/webhosting-verify.sh +238 -0
- package/.agent/scripts/wordpress-mcp-helper.sh +508 -0
- package/.agent/scripts/worktree-helper.sh +595 -0
- package/.agent/scripts/worktree-sessions.sh +577 -0
- package/.agent/seo/dataforseo.md +215 -0
- package/.agent/seo/domain-research.md +532 -0
- package/.agent/seo/eeat-score.md +659 -0
- package/.agent/seo/google-search-console.md +366 -0
- package/.agent/seo/gsc-sitemaps.md +282 -0
- package/.agent/seo/keyword-research.md +521 -0
- package/.agent/seo/serper.md +278 -0
- package/.agent/seo/site-crawler.md +387 -0
- package/.agent/seo.md +236 -0
- package/.agent/services/accounting/quickfile.md +159 -0
- package/.agent/services/communications/telfon.md +470 -0
- package/.agent/services/communications/twilio.md +569 -0
- package/.agent/services/crm/fluentcrm.md +449 -0
- package/.agent/services/email/ses.md +399 -0
- package/.agent/services/hosting/101domains.md +378 -0
- package/.agent/services/hosting/closte.md +177 -0
- package/.agent/services/hosting/cloudflare.md +251 -0
- package/.agent/services/hosting/cloudron.md +478 -0
- package/.agent/services/hosting/dns-providers.md +335 -0
- package/.agent/services/hosting/domain-purchasing.md +344 -0
- package/.agent/services/hosting/hetzner.md +327 -0
- package/.agent/services/hosting/hostinger.md +287 -0
- package/.agent/services/hosting/localhost.md +419 -0
- package/.agent/services/hosting/spaceship.md +353 -0
- package/.agent/services/hosting/webhosting.md +330 -0
- package/.agent/social-media.md +69 -0
- package/.agent/templates/plans-template.md +114 -0
- package/.agent/templates/prd-template.md +129 -0
- package/.agent/templates/tasks-template.md +108 -0
- package/.agent/templates/todo-template.md +89 -0
- package/.agent/tools/ai-assistants/agno.md +471 -0
- package/.agent/tools/ai-assistants/capsolver.md +326 -0
- package/.agent/tools/ai-assistants/configuration.md +221 -0
- package/.agent/tools/ai-assistants/overview.md +209 -0
- package/.agent/tools/ai-assistants/status.md +171 -0
- package/.agent/tools/ai-assistants/windsurf.md +193 -0
- package/.agent/tools/ai-orchestration/autogen.md +406 -0
- package/.agent/tools/ai-orchestration/crewai.md +445 -0
- package/.agent/tools/ai-orchestration/langflow.md +405 -0
- package/.agent/tools/ai-orchestration/openprose.md +487 -0
- package/.agent/tools/ai-orchestration/overview.md +362 -0
- package/.agent/tools/ai-orchestration/packaging.md +647 -0
- package/.agent/tools/browser/agent-browser.md +464 -0
- package/.agent/tools/browser/browser-automation.md +400 -0
- package/.agent/tools/browser/chrome-devtools.md +282 -0
- package/.agent/tools/browser/crawl4ai-integration.md +422 -0
- package/.agent/tools/browser/crawl4ai-resources.md +277 -0
- package/.agent/tools/browser/crawl4ai-usage.md +416 -0
- package/.agent/tools/browser/crawl4ai.md +585 -0
- package/.agent/tools/browser/dev-browser.md +341 -0
- package/.agent/tools/browser/pagespeed.md +260 -0
- package/.agent/tools/browser/playwright.md +266 -0
- package/.agent/tools/browser/playwriter.md +310 -0
- package/.agent/tools/browser/stagehand-examples.md +456 -0
- package/.agent/tools/browser/stagehand-python.md +483 -0
- package/.agent/tools/browser/stagehand.md +421 -0
- package/.agent/tools/build-agent/agent-review.md +224 -0
- package/.agent/tools/build-agent/build-agent.md +784 -0
- package/.agent/tools/build-mcp/aidevops-plugin.md +476 -0
- package/.agent/tools/build-mcp/api-wrapper.md +445 -0
- package/.agent/tools/build-mcp/build-mcp.md +240 -0
- package/.agent/tools/build-mcp/deployment.md +401 -0
- package/.agent/tools/build-mcp/server-patterns.md +632 -0
- package/.agent/tools/build-mcp/transports.md +366 -0
- package/.agent/tools/code-review/auditing.md +383 -0
- package/.agent/tools/code-review/automation.md +219 -0
- package/.agent/tools/code-review/best-practices.md +203 -0
- package/.agent/tools/code-review/codacy.md +151 -0
- package/.agent/tools/code-review/code-simplifier.md +174 -0
- package/.agent/tools/code-review/code-standards.md +309 -0
- package/.agent/tools/code-review/coderabbit.md +101 -0
- package/.agent/tools/code-review/management.md +155 -0
- package/.agent/tools/code-review/qlty.md +248 -0
- package/.agent/tools/code-review/secretlint.md +565 -0
- package/.agent/tools/code-review/setup.md +250 -0
- package/.agent/tools/code-review/snyk.md +563 -0
- package/.agent/tools/code-review/tools.md +230 -0
- package/.agent/tools/content/summarize.md +353 -0
- package/.agent/tools/context/augment-context-engine.md +468 -0
- package/.agent/tools/context/context-builder-agent.md +76 -0
- package/.agent/tools/context/context-builder.md +375 -0
- package/.agent/tools/context/context7.md +371 -0
- package/.agent/tools/context/dspy.md +302 -0
- package/.agent/tools/context/dspyground.md +374 -0
- package/.agent/tools/context/llm-tldr.md +219 -0
- package/.agent/tools/context/osgrep.md +488 -0
- package/.agent/tools/context/prompt-optimization.md +338 -0
- package/.agent/tools/context/toon.md +292 -0
- package/.agent/tools/conversion/pandoc.md +304 -0
- package/.agent/tools/credentials/api-key-management.md +154 -0
- package/.agent/tools/credentials/api-key-setup.md +224 -0
- package/.agent/tools/credentials/environment-variables.md +180 -0
- package/.agent/tools/credentials/vaultwarden.md +382 -0
- package/.agent/tools/data-extraction/outscraper.md +974 -0
- package/.agent/tools/deployment/coolify-cli.md +388 -0
- package/.agent/tools/deployment/coolify-setup.md +353 -0
- package/.agent/tools/deployment/coolify.md +345 -0
- package/.agent/tools/deployment/vercel.md +390 -0
- package/.agent/tools/git/authentication.md +132 -0
- package/.agent/tools/git/gitea-cli.md +193 -0
- package/.agent/tools/git/github-actions.md +207 -0
- package/.agent/tools/git/github-cli.md +223 -0
- package/.agent/tools/git/gitlab-cli.md +190 -0
- package/.agent/tools/git/opencode-github-security.md +350 -0
- package/.agent/tools/git/opencode-github.md +328 -0
- package/.agent/tools/git/opencode-gitlab.md +252 -0
- package/.agent/tools/git/security.md +196 -0
- package/.agent/tools/git.md +207 -0
- package/.agent/tools/opencode/oh-my-opencode.md +375 -0
- package/.agent/tools/opencode/opencode-anthropic-auth.md +446 -0
- package/.agent/tools/opencode/opencode.md +651 -0
- package/.agent/tools/social-media/bird.md +437 -0
- package/.agent/tools/task-management/beads.md +336 -0
- package/.agent/tools/terminal/terminal-title.md +251 -0
- package/.agent/tools/ui/shadcn.md +196 -0
- package/.agent/tools/ui/ui-skills.md +115 -0
- package/.agent/tools/wordpress/localwp.md +311 -0
- package/.agent/tools/wordpress/mainwp.md +391 -0
- package/.agent/tools/wordpress/scf.md +527 -0
- package/.agent/tools/wordpress/wp-admin.md +729 -0
- package/.agent/tools/wordpress/wp-dev.md +940 -0
- package/.agent/tools/wordpress/wp-preferred.md +398 -0
- package/.agent/tools/wordpress.md +95 -0
- package/.agent/workflows/branch/bugfix.md +63 -0
- package/.agent/workflows/branch/chore.md +95 -0
- package/.agent/workflows/branch/experiment.md +115 -0
- package/.agent/workflows/branch/feature.md +59 -0
- package/.agent/workflows/branch/hotfix.md +98 -0
- package/.agent/workflows/branch/refactor.md +92 -0
- package/.agent/workflows/branch/release.md +96 -0
- package/.agent/workflows/branch.md +347 -0
- package/.agent/workflows/bug-fixing.md +267 -0
- package/.agent/workflows/changelog.md +129 -0
- package/.agent/workflows/code-audit-remote.md +279 -0
- package/.agent/workflows/conversation-starter.md +69 -0
- package/.agent/workflows/error-feedback.md +578 -0
- package/.agent/workflows/feature-development.md +355 -0
- package/.agent/workflows/git-workflow.md +702 -0
- package/.agent/workflows/multi-repo-workspace.md +268 -0
- package/.agent/workflows/plans.md +709 -0
- package/.agent/workflows/postflight.md +604 -0
- package/.agent/workflows/pr.md +571 -0
- package/.agent/workflows/preflight.md +278 -0
- package/.agent/workflows/ralph-loop.md +773 -0
- package/.agent/workflows/release.md +498 -0
- package/.agent/workflows/session-manager.md +254 -0
- package/.agent/workflows/session-review.md +311 -0
- package/.agent/workflows/sql-migrations.md +631 -0
- package/.agent/workflows/version-bump.md +283 -0
- package/.agent/workflows/wiki-update.md +333 -0
- package/.agent/workflows/worktree.md +477 -0
- package/LICENSE +21 -0
- package/README.md +1446 -0
- package/VERSION +1 -0
- package/aidevops.sh +1746 -0
- package/bin/aidevops +21 -0
- package/package.json +75 -0
- package/scripts/npm-postinstall.js +60 -0
- package/setup.sh +2366 -0
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
LinkedIn Automation Script for AI DevOps Framework
|
|
4
|
+
Automates LinkedIn interactions like liking posts on timeline
|
|
5
|
+
|
|
6
|
+
Author: AI DevOps Framework
|
|
7
|
+
Version: 1.3.1
|
|
8
|
+
|
|
9
|
+
IMPORTANT: This script is for educational purposes and personal use only.
|
|
10
|
+
Always respect LinkedIn's Terms of Service and use responsibly.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import time
|
|
14
|
+
import random
|
|
15
|
+
import os
|
|
16
|
+
from datetime import datetime
|
|
17
|
+
|
|
18
|
+
try:
|
|
19
|
+
from playwright.sync_api import sync_playwright, Page
|
|
20
|
+
PLAYWRIGHT_AVAILABLE = True
|
|
21
|
+
except ImportError:
|
|
22
|
+
PLAYWRIGHT_AVAILABLE = False
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
# Selenium imports would go here if needed
|
|
26
|
+
SELENIUM_AVAILABLE = True
|
|
27
|
+
except ImportError:
|
|
28
|
+
SELENIUM_AVAILABLE = False
|
|
29
|
+
|
|
30
|
+
class LinkedInAutomation:
|
|
31
|
+
"""LinkedIn automation class with ethical guidelines"""
|
|
32
|
+
|
|
33
|
+
def __init__(self, headless: bool = False, delay_range: tuple = (2, 5)):
|
|
34
|
+
self.headless = headless
|
|
35
|
+
self.delay_range = delay_range
|
|
36
|
+
self.session_stats = {
|
|
37
|
+
'likes_given': 0,
|
|
38
|
+
'posts_processed': 0,
|
|
39
|
+
'errors': 0,
|
|
40
|
+
'start_time': datetime.now()
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
def random_delay(self, min_delay: float = None, max_delay: float = None):
|
|
44
|
+
"""Add random delay to mimic human behavior"""
|
|
45
|
+
if min_delay is None:
|
|
46
|
+
min_delay = self.delay_range[0]
|
|
47
|
+
if max_delay is None:
|
|
48
|
+
max_delay = self.delay_range[1]
|
|
49
|
+
|
|
50
|
+
delay = random.uniform(min_delay, max_delay)
|
|
51
|
+
print(f"⏳ Waiting {delay:.1f} seconds...")
|
|
52
|
+
time.sleep(delay)
|
|
53
|
+
|
|
54
|
+
def playwright_automation(self, email: str, password: str, max_likes: int = 10):
|
|
55
|
+
"""LinkedIn automation using Playwright"""
|
|
56
|
+
if not PLAYWRIGHT_AVAILABLE:
|
|
57
|
+
print("❌ Playwright not available. Install with: pip install playwright")
|
|
58
|
+
return False
|
|
59
|
+
|
|
60
|
+
print("🎭 Starting LinkedIn automation with Playwright...")
|
|
61
|
+
|
|
62
|
+
with sync_playwright() as p:
|
|
63
|
+
# Launch browser
|
|
64
|
+
browser = p.chromium.launch(headless=self.headless)
|
|
65
|
+
context = browser.new_context(
|
|
66
|
+
user_agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"
|
|
67
|
+
)
|
|
68
|
+
page = context.new_page()
|
|
69
|
+
|
|
70
|
+
try:
|
|
71
|
+
# Login to LinkedIn
|
|
72
|
+
if not self._playwright_login(page, email, password):
|
|
73
|
+
return False
|
|
74
|
+
|
|
75
|
+
# Navigate to feed
|
|
76
|
+
print("📰 Navigating to LinkedIn feed...")
|
|
77
|
+
page.goto("https://www.linkedin.com/feed/")
|
|
78
|
+
page.wait_for_load_state("networkidle")
|
|
79
|
+
|
|
80
|
+
# Like posts on timeline
|
|
81
|
+
self._playwright_like_posts(page, max_likes)
|
|
82
|
+
|
|
83
|
+
# Print session summary
|
|
84
|
+
self._print_session_summary()
|
|
85
|
+
|
|
86
|
+
return True
|
|
87
|
+
|
|
88
|
+
except Exception as e:
|
|
89
|
+
print(f"❌ Error during automation: {e}")
|
|
90
|
+
self.session_stats['errors'] += 1
|
|
91
|
+
return False
|
|
92
|
+
finally:
|
|
93
|
+
browser.close()
|
|
94
|
+
|
|
95
|
+
def _playwright_login(self, page: Page, email: str, password: str) -> bool:
|
|
96
|
+
"""Login to LinkedIn using Playwright"""
|
|
97
|
+
try:
|
|
98
|
+
print("🔐 Logging into LinkedIn...")
|
|
99
|
+
page.goto("https://www.linkedin.com/login")
|
|
100
|
+
|
|
101
|
+
# Fill login form
|
|
102
|
+
page.fill('input[name="session_key"]', email)
|
|
103
|
+
page.fill('input[name="session_password"]', password)
|
|
104
|
+
|
|
105
|
+
# Click login button
|
|
106
|
+
page.click('button[type="submit"]')
|
|
107
|
+
|
|
108
|
+
# Wait for navigation
|
|
109
|
+
page.wait_for_load_state("networkidle")
|
|
110
|
+
|
|
111
|
+
# Check if login was successful
|
|
112
|
+
if "feed" in page.url or "mynetwork" in page.url:
|
|
113
|
+
print("✅ Successfully logged into LinkedIn")
|
|
114
|
+
return True
|
|
115
|
+
else:
|
|
116
|
+
print("❌ Login failed - check credentials")
|
|
117
|
+
return False
|
|
118
|
+
|
|
119
|
+
except Exception as e:
|
|
120
|
+
print(f"❌ Login error: {e}")
|
|
121
|
+
return False
|
|
122
|
+
|
|
123
|
+
def _playwright_like_posts(self, page: Page, max_likes: int):
|
|
124
|
+
"""Like posts on LinkedIn timeline using Playwright"""
|
|
125
|
+
print(f"👍 Starting to like posts (max: {max_likes})...")
|
|
126
|
+
|
|
127
|
+
likes_given = 0
|
|
128
|
+
scroll_attempts = 0
|
|
129
|
+
max_scrolls = 5
|
|
130
|
+
|
|
131
|
+
while likes_given < max_likes and scroll_attempts < max_scrolls:
|
|
132
|
+
# Find like buttons that haven't been clicked
|
|
133
|
+
like_buttons = page.query_selector_all(
|
|
134
|
+
'button[aria-label*="Like"][aria-pressed="false"]'
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
if not like_buttons:
|
|
138
|
+
print("📜 Scrolling to load more posts...")
|
|
139
|
+
page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
|
|
140
|
+
self.random_delay(3, 6)
|
|
141
|
+
scroll_attempts += 1
|
|
142
|
+
continue
|
|
143
|
+
|
|
144
|
+
# Like posts with random selection
|
|
145
|
+
for button in like_buttons[:min(3, max_likes - likes_given)]:
|
|
146
|
+
try:
|
|
147
|
+
# Scroll button into view
|
|
148
|
+
button.scroll_into_view_if_needed()
|
|
149
|
+
self.random_delay(1, 3)
|
|
150
|
+
|
|
151
|
+
# Click like button
|
|
152
|
+
button.click()
|
|
153
|
+
likes_given += 1
|
|
154
|
+
self.session_stats['likes_given'] += 1
|
|
155
|
+
self.session_stats['posts_processed'] += 1
|
|
156
|
+
|
|
157
|
+
print(f"👍 Liked post {likes_given}/{max_likes}")
|
|
158
|
+
|
|
159
|
+
# Random delay between likes
|
|
160
|
+
self.random_delay()
|
|
161
|
+
|
|
162
|
+
if likes_given >= max_likes:
|
|
163
|
+
break
|
|
164
|
+
|
|
165
|
+
except Exception as e:
|
|
166
|
+
print(f"⚠️ Error liking post: {e}")
|
|
167
|
+
self.session_stats['errors'] += 1
|
|
168
|
+
continue
|
|
169
|
+
|
|
170
|
+
# Scroll for more content
|
|
171
|
+
if likes_given < max_likes:
|
|
172
|
+
page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
|
|
173
|
+
self.random_delay(3, 6)
|
|
174
|
+
scroll_attempts += 1
|
|
175
|
+
|
|
176
|
+
print(f"✅ Completed liking session: {likes_given} posts liked")
|
|
177
|
+
|
|
178
|
+
def _print_session_summary(self):
|
|
179
|
+
"""Print automation session summary"""
|
|
180
|
+
duration = datetime.now() - self.session_stats['start_time']
|
|
181
|
+
|
|
182
|
+
print("\n" + "="*50)
|
|
183
|
+
print("📊 LinkedIn Automation Session Summary")
|
|
184
|
+
print("="*50)
|
|
185
|
+
print(f"👍 Posts liked: {self.session_stats['likes_given']}")
|
|
186
|
+
print(f"📰 Posts processed: {self.session_stats['posts_processed']}")
|
|
187
|
+
print(f"❌ Errors: {self.session_stats['errors']}")
|
|
188
|
+
print(f"⏱️ Duration: {duration}")
|
|
189
|
+
print(f"🕐 Started: {self.session_stats['start_time'].strftime('%Y-%m-%d %H:%M:%S')}")
|
|
190
|
+
print("="*50)
|
|
191
|
+
|
|
192
|
+
def main():
|
|
193
|
+
"""Main function for LinkedIn automation"""
|
|
194
|
+
print("🔗 LinkedIn Automation for AI DevOps Framework")
|
|
195
|
+
print("⚠️ IMPORTANT: Use responsibly and respect LinkedIn's Terms of Service")
|
|
196
|
+
print("")
|
|
197
|
+
|
|
198
|
+
# Check if automation tools are available
|
|
199
|
+
if not PLAYWRIGHT_AVAILABLE and not SELENIUM_AVAILABLE:
|
|
200
|
+
print("❌ No browser automation tools available")
|
|
201
|
+
print("Install with: pip install playwright selenium")
|
|
202
|
+
print("Then run: playwright install")
|
|
203
|
+
return
|
|
204
|
+
|
|
205
|
+
# Get credentials from environment or prompt
|
|
206
|
+
email = os.getenv('LINKEDIN_EMAIL')
|
|
207
|
+
password = os.getenv('LINKEDIN_PASSWORD')
|
|
208
|
+
|
|
209
|
+
if not email or not password:
|
|
210
|
+
print("🔐 LinkedIn credentials not found in environment variables")
|
|
211
|
+
print("Set LINKEDIN_EMAIL and LINKEDIN_PASSWORD environment variables")
|
|
212
|
+
print("Or run with: LINKEDIN_EMAIL=your@email.com LINKEDIN_PASSWORD=yourpass python linkedin-automation.py")
|
|
213
|
+
return
|
|
214
|
+
|
|
215
|
+
# Configuration
|
|
216
|
+
max_likes = int(os.getenv('LINKEDIN_MAX_LIKES', '10'))
|
|
217
|
+
headless = os.getenv('LINKEDIN_HEADLESS', 'false').lower() == 'true'
|
|
218
|
+
|
|
219
|
+
print(f"⚙️ Configuration:")
|
|
220
|
+
print(f" Email: {email}")
|
|
221
|
+
print(f" Max likes: {max_likes}")
|
|
222
|
+
print(f" Headless: {headless}")
|
|
223
|
+
print("")
|
|
224
|
+
|
|
225
|
+
# Create automation instance
|
|
226
|
+
automation = LinkedInAutomation(headless=headless)
|
|
227
|
+
|
|
228
|
+
# Run automation
|
|
229
|
+
if PLAYWRIGHT_AVAILABLE:
|
|
230
|
+
success = automation.playwright_automation(email, password, max_likes)
|
|
231
|
+
else:
|
|
232
|
+
print("❌ Playwright not available")
|
|
233
|
+
success = False
|
|
234
|
+
|
|
235
|
+
if success:
|
|
236
|
+
print("🎉 LinkedIn automation completed successfully!")
|
|
237
|
+
else:
|
|
238
|
+
print("❌ LinkedIn automation failed")
|
|
239
|
+
|
|
240
|
+
if __name__ == "__main__":
|
|
241
|
+
main()
|