├── .gitignore ├── Pipfile ├── Pipfile.lock ├── README.md ├── Topics.txt ├── Topics_done.txt ├── browser.py ├── requirements.txt └── utils.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled source # 2 | ################### 3 | *.com 4 | *.class 5 | *.dll 6 | *.exe 7 | *.o 8 | *.so 9 | 10 | # Compiled output # 11 | ################### 12 | dist/ 13 | tmp/ 14 | out-tsc/ 15 | bazel-out/ 16 | 17 | # Node # 18 | ######## 19 | node_modules/ 20 | npm-debug.log 21 | yarn-error.log 22 | 23 | # Python # 24 | ########## 25 | __pycache__/ 26 | *.py[cod] 27 | *$py.class 28 | *.egg-info/ 29 | .pytest_cache/ 30 | 31 | # Logs # 32 | ######## 33 | *.log 34 | logs/ 35 | 36 | # Editor directories and files # 37 | ############################## 38 | .vscode/ 39 | .idea/ 40 | *.swp 41 | *.swo 42 | 43 | # OS generated files # 44 | ##################### 45 | .DS_Store 46 | Thumbs.db 47 | 48 | # Compiled output # 49 | ################### 50 | dist/ 51 | tmp/ 52 | out-tsc/ 53 | bazel-out/ 54 | 55 | # Environment # 56 | ############## 57 | .env 58 | .env.* 59 | 60 | 61 | venv/ 62 | 63 | linkedlnbot.sh 64 | .txt -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | selenium = "*" 8 | requests = "*" 9 | webdriver-manager = "*" 10 | python-dotenv = "*" 11 | google-generativeai = "*" 12 | beautifulsoup4 = "*" 13 | scrapy = "*" 14 | scrapy-selenium = "*" 15 | scrapy-playwright = "*" 16 | 17 | [dev-packages] 18 | 19 | [requires] 20 | python_version = "3.10" 21 | -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "ff5c583f26776ae936802745fdd46a8e74a80cc4d0d914745921088c613fc3c4" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.10" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "annotated-types": { 20 | "hashes": [ 21 | "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43", 22 | "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d" 23 | ], 24 | "markers": "python_version >= '3.8'", 25 | "version": "==0.6.0" 26 | }, 27 | "attrs": { 28 | "hashes": [ 29 | "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", 30 | "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" 31 | ], 32 | "markers": "python_version >= '3.7'", 33 | "version": "==23.2.0" 34 | }, 35 | "automat": { 36 | "hashes": [ 37 | "sha256:c3164f8742b9dc440f3682482d32aaff7bb53f71740dd018533f9de286b64180", 38 | "sha256:e56beb84edad19dcc11d30e8d9b895f75deeb5ef5e96b84a467066b3b84bb04e" 39 | ], 40 | "version": "==22.10.0" 41 | }, 42 | "beautifulsoup4": { 43 | "hashes": [ 44 | "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", 45 | "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed" 46 | ], 47 | "index": "pypi", 48 | "markers": "python_full_version >= '3.6.0'", 49 | "version": "==4.12.3" 50 | }, 51 | "cachetools": { 52 | "hashes": [ 53 | "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945", 54 | "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105" 55 | ], 56 | "markers": "python_version >= '3.7'", 57 | "version": "==5.3.3" 58 | }, 59 | "certifi": { 60 | "hashes": [ 61 | "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f", 62 | "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1" 63 | ], 64 | "markers": "python_version >= '3.6'", 65 | "version": "==2024.2.2" 66 | }, 67 | "cffi": { 68 | "hashes": [ 69 | "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", 70 | "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", 71 | "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", 72 | "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", 73 | "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", 74 | "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", 75 | "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", 76 | "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", 77 | "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", 78 | "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", 79 | "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", 80 | "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", 81 | "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", 82 | "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", 83 | "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", 84 | "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", 85 | "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", 86 | "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", 87 | "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", 88 | "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", 89 | "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", 90 | "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", 91 | "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", 92 | "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", 93 | "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", 94 | "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", 95 | "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", 96 | "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", 97 | "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", 98 | "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", 99 | "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", 100 | "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", 101 | "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", 102 | "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", 103 | "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", 104 | "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", 105 | "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", 106 | "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", 107 | "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", 108 | "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", 109 | "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", 110 | "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", 111 | "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", 112 | "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", 113 | "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", 114 | "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", 115 | "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", 116 | "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", 117 | "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", 118 | "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", 119 | "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", 120 | "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" 121 | ], 122 | "markers": "platform_python_implementation != 'PyPy'", 123 | "version": "==1.16.0" 124 | }, 125 | "charset-normalizer": { 126 | "hashes": [ 127 | "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", 128 | "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", 129 | "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", 130 | "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", 131 | "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", 132 | "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", 133 | "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", 134 | "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", 135 | "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", 136 | "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", 137 | "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", 138 | "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", 139 | "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", 140 | "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", 141 | "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", 142 | "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", 143 | "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", 144 | "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", 145 | "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", 146 | "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", 147 | "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", 148 | "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", 149 | "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", 150 | "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", 151 | "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", 152 | "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", 153 | "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", 154 | "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", 155 | "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", 156 | "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", 157 | "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", 158 | "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", 159 | "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", 160 | "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", 161 | "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", 162 | "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", 163 | "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", 164 | "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", 165 | "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", 166 | "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", 167 | "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", 168 | "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", 169 | "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", 170 | "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", 171 | "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", 172 | "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", 173 | "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", 174 | "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", 175 | "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", 176 | "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", 177 | "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", 178 | "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", 179 | "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", 180 | "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", 181 | "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", 182 | "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", 183 | "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", 184 | "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", 185 | "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", 186 | "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", 187 | "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", 188 | "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", 189 | "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", 190 | "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", 191 | "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", 192 | "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", 193 | "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", 194 | "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", 195 | "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", 196 | "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", 197 | "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", 198 | "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", 199 | "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", 200 | "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", 201 | "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", 202 | "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", 203 | "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", 204 | "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", 205 | "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", 206 | "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", 207 | "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", 208 | "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", 209 | "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", 210 | "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", 211 | "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", 212 | "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", 213 | "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", 214 | "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", 215 | "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", 216 | "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" 217 | ], 218 | "markers": "python_full_version >= '3.7.0'", 219 | "version": "==3.3.2" 220 | }, 221 | "constantly": { 222 | "hashes": [ 223 | "sha256:3fd9b4d1c3dc1ec9757f3c52aef7e53ad9323dbe39f51dfd4c43853b68dfa3f9", 224 | "sha256:aa92b70a33e2ac0bb33cd745eb61776594dc48764b06c35e0efd050b7f1c7cbd" 225 | ], 226 | "markers": "python_version >= '3.8'", 227 | "version": "==23.10.4" 228 | }, 229 | "cryptography": { 230 | "hashes": [ 231 | "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55", 232 | "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785", 233 | "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b", 234 | "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886", 235 | "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82", 236 | "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1", 237 | "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda", 238 | "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f", 239 | "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68", 240 | "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60", 241 | "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7", 242 | "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd", 243 | "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582", 244 | "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc", 245 | "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858", 246 | "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b", 247 | "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2", 248 | "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678", 249 | "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13", 250 | "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4", 251 | "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8", 252 | "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604", 253 | "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477", 254 | "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e", 255 | "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a", 256 | "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9", 257 | "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14", 258 | "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda", 259 | "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da", 260 | "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562", 261 | "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2", 262 | "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9" 263 | ], 264 | "markers": "python_version >= '3.7'", 265 | "version": "==42.0.7" 266 | }, 267 | "cssselect": { 268 | "hashes": [ 269 | "sha256:666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc", 270 | "sha256:da1885f0c10b60c03ed5eccbb6b68d6eff248d91976fcde348f395d54c9fd35e" 271 | ], 272 | "markers": "python_version >= '3.7'", 273 | "version": "==1.2.0" 274 | }, 275 | "exceptiongroup": { 276 | "hashes": [ 277 | "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", 278 | "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" 279 | ], 280 | "markers": "python_version < '3.11'", 281 | "version": "==1.2.1" 282 | }, 283 | "filelock": { 284 | "hashes": [ 285 | "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f", 286 | "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a" 287 | ], 288 | "markers": "python_version >= '3.8'", 289 | "version": "==3.14.0" 290 | }, 291 | "google-ai-generativelanguage": { 292 | "hashes": [ 293 | "sha256:308791ac3b9dad015b359172970739aa3753dd542142a416d07f9fa047e22386", 294 | "sha256:bf84c34c641570d7e8a1f2e6901e6771af1438f2ee8307d1801fd43585f9b1c6" 295 | ], 296 | "markers": "python_version >= '3.7'", 297 | "version": "==0.6.2" 298 | }, 299 | "google-api-core": { 300 | "extras": [ 301 | "grpc" 302 | ], 303 | "hashes": [ 304 | "sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251", 305 | "sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10" 306 | ], 307 | "markers": "python_version >= '3.7'", 308 | "version": "==2.19.0" 309 | }, 310 | "google-api-python-client": { 311 | "hashes": [ 312 | "sha256:bbb51b0fbccdf40e536c26341e372d7800f09afebb53103bbcc94e08f14b523b", 313 | "sha256:d01c70c7840ec37888aa02b1aea5d9baba4c1701e268d1a0251640afd56e5e90" 314 | ], 315 | "markers": "python_version >= '3.7'", 316 | "version": "==2.127.0" 317 | }, 318 | "google-auth": { 319 | "hashes": [ 320 | "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360", 321 | "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415" 322 | ], 323 | "markers": "python_version >= '3.7'", 324 | "version": "==2.29.0" 325 | }, 326 | "google-auth-httplib2": { 327 | "hashes": [ 328 | "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05", 329 | "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d" 330 | ], 331 | "version": "==0.2.0" 332 | }, 333 | "google-generativeai": { 334 | "hashes": [ 335 | "sha256:56f39485a0a673c93c21ec31c17809cc6a964193fb77b7ce809ad15d0dd72d7b" 336 | ], 337 | "index": "pypi", 338 | "markers": "python_version >= '3.9'", 339 | "version": "==0.5.2" 340 | }, 341 | "googleapis-common-protos": { 342 | "hashes": [ 343 | "sha256:17ad01b11d5f1d0171c06d3ba5c04c54474e883b66b949722b4938ee2694ef4e", 344 | "sha256:ae45f75702f7c08b541f750854a678bd8f534a1a6bace6afe975f1d0a82d6632" 345 | ], 346 | "markers": "python_version >= '3.7'", 347 | "version": "==1.63.0" 348 | }, 349 | "greenlet": { 350 | "hashes": [ 351 | "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67", 352 | "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6", 353 | "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257", 354 | "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4", 355 | "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676", 356 | "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61", 357 | "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc", 358 | "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca", 359 | "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7", 360 | "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728", 361 | "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305", 362 | "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6", 363 | "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379", 364 | "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414", 365 | "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04", 366 | "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a", 367 | "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf", 368 | "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491", 369 | "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559", 370 | "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e", 371 | "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274", 372 | "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb", 373 | "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b", 374 | "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9", 375 | "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b", 376 | "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be", 377 | "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506", 378 | "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405", 379 | "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113", 380 | "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f", 381 | "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5", 382 | "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230", 383 | "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d", 384 | "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f", 385 | "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a", 386 | "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e", 387 | "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61", 388 | "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6", 389 | "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d", 390 | "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71", 391 | "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22", 392 | "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2", 393 | "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3", 394 | "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067", 395 | "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc", 396 | "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881", 397 | "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3", 398 | "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e", 399 | "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac", 400 | "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53", 401 | "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0", 402 | "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b", 403 | "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83", 404 | "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41", 405 | "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c", 406 | "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf", 407 | "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", 408 | "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" 409 | ], 410 | "markers": "python_version >= '3.7'", 411 | "version": "==3.0.3" 412 | }, 413 | "grpcio": { 414 | "hashes": [ 415 | "sha256:01799e8649f9e94ba7db1aeb3452188048b0019dc37696b0f5ce212c87c560c3", 416 | "sha256:0697563d1d84d6985e40ec5ec596ff41b52abb3fd91ec240e8cb44a63b895094", 417 | "sha256:08e1559fd3b3b4468486b26b0af64a3904a8dbc78d8d936af9c1cf9636eb3e8b", 418 | "sha256:166e5c460e5d7d4656ff9e63b13e1f6029b122104c1633d5f37eaea348d7356d", 419 | "sha256:1ff737cf29b5b801619f10e59b581869e32f400159e8b12d7a97e7e3bdeee6a2", 420 | "sha256:219bb1848cd2c90348c79ed0a6b0ea51866bc7e72fa6e205e459fedab5770172", 421 | "sha256:259e11932230d70ef24a21b9fb5bb947eb4703f57865a404054400ee92f42f5d", 422 | "sha256:2e93aca840c29d4ab5db93f94ed0a0ca899e241f2e8aec6334ab3575dc46125c", 423 | "sha256:3a6d1f9ea965e750db7b4ee6f9fdef5fdf135abe8a249e75d84b0a3e0c668a1b", 424 | "sha256:50344663068041b34a992c19c600236e7abb42d6ec32567916b87b4c8b8833b3", 425 | "sha256:56cdf96ff82e3cc90dbe8bac260352993f23e8e256e063c327b6cf9c88daf7a9", 426 | "sha256:5c039ef01516039fa39da8a8a43a95b64e288f79f42a17e6c2904a02a319b357", 427 | "sha256:6426e1fb92d006e47476d42b8f240c1d916a6d4423c5258ccc5b105e43438f61", 428 | "sha256:65bf975639a1f93bee63ca60d2e4951f1b543f498d581869922910a476ead2f5", 429 | "sha256:6a1a3642d76f887aa4009d92f71eb37809abceb3b7b5a1eec9c554a246f20e3a", 430 | "sha256:6ef0ad92873672a2a3767cb827b64741c363ebaa27e7f21659e4e31f4d750280", 431 | "sha256:756fed02dacd24e8f488f295a913f250b56b98fb793f41d5b2de6c44fb762434", 432 | "sha256:75f701ff645858a2b16bc8c9fc68af215a8bb2d5a9b647448129de6e85d52bce", 433 | "sha256:8064d986d3a64ba21e498b9a376cbc5d6ab2e8ab0e288d39f266f0fca169b90d", 434 | "sha256:878b1d88d0137df60e6b09b74cdb73db123f9579232c8456f53e9abc4f62eb3c", 435 | "sha256:8f3f6883ce54a7a5f47db43289a0a4c776487912de1a0e2cc83fdaec9685cc9f", 436 | "sha256:91b73d3f1340fefa1e1716c8c1ec9930c676d6b10a3513ab6c26004cb02d8b3f", 437 | "sha256:93a46794cc96c3a674cdfb59ef9ce84d46185fe9421baf2268ccb556f8f81f57", 438 | "sha256:93f45f27f516548e23e4ec3fbab21b060416007dbe768a111fc4611464cc773f", 439 | "sha256:9e350cb096e5c67832e9b6e018cf8a0d2a53b2a958f6251615173165269a91b0", 440 | "sha256:a2d60cd1d58817bc5985fae6168d8b5655c4981d448d0f5b6194bbcc038090d2", 441 | "sha256:a3abfe0b0f6798dedd2e9e92e881d9acd0fdb62ae27dcbbfa7654a57e24060c0", 442 | "sha256:a44624aad77bf8ca198c55af811fd28f2b3eaf0a50ec5b57b06c034416ef2d0a", 443 | "sha256:a7b19dfc74d0be7032ca1eda0ed545e582ee46cd65c162f9e9fc6b26ef827dc6", 444 | "sha256:ad2ac8903b2eae071055a927ef74121ed52d69468e91d9bcbd028bd0e554be6d", 445 | "sha256:b005292369d9c1f80bf70c1db1c17c6c342da7576f1c689e8eee4fb0c256af85", 446 | "sha256:b2e44f59316716532a993ca2966636df6fbe7be4ab6f099de6815570ebe4383a", 447 | "sha256:b3afbd9d6827fa6f475a4f91db55e441113f6d3eb9b7ebb8fb806e5bb6d6bd0d", 448 | "sha256:b416252ac5588d9dfb8a30a191451adbf534e9ce5f56bb02cd193f12d8845b7f", 449 | "sha256:b5194775fec7dc3dbd6a935102bb156cd2c35efe1685b0a46c67b927c74f0cfb", 450 | "sha256:cacdef0348a08e475a721967f48206a2254a1b26ee7637638d9e081761a5ba86", 451 | "sha256:cd1e68776262dd44dedd7381b1a0ad09d9930ffb405f737d64f505eb7f77d6c7", 452 | "sha256:cdcda1156dcc41e042d1e899ba1f5c2e9f3cd7625b3d6ebfa619806a4c1aadda", 453 | "sha256:cf8dae9cc0412cb86c8de5a8f3be395c5119a370f3ce2e69c8b7d46bb9872c8d", 454 | "sha256:d2497769895bb03efe3187fb1888fc20e98a5f18b3d14b606167dacda5789434", 455 | "sha256:e3b77eaefc74d7eb861d3ffbdf91b50a1bb1639514ebe764c47773b833fa2d91", 456 | "sha256:e48cee31bc5f5a31fb2f3b573764bd563aaa5472342860edcc7039525b53e46a", 457 | "sha256:e4cbb2100ee46d024c45920d16e888ee5d3cf47c66e316210bc236d5bebc42b3", 458 | "sha256:f28f8b2db7b86c77916829d64ab21ff49a9d8289ea1564a2b2a3a8ed9ffcccd3", 459 | "sha256:f3023e14805c61bc439fb40ca545ac3d5740ce66120a678a3c6c2c55b70343d1", 460 | "sha256:fdf348ae69c6ff484402cfdb14e18c1b0054ac2420079d575c53a60b9b2853ae" 461 | ], 462 | "version": "==1.63.0" 463 | }, 464 | "grpcio-status": { 465 | "hashes": [ 466 | "sha256:206ddf0eb36bc99b033f03b2c8e95d319f0044defae9b41ae21408e7e0cda48f", 467 | "sha256:62e1bfcb02025a1cd73732a2d33672d3e9d0df4d21c12c51e0bbcaf09bab742a" 468 | ], 469 | "version": "==1.62.2" 470 | }, 471 | "h11": { 472 | "hashes": [ 473 | "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", 474 | "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" 475 | ], 476 | "markers": "python_version >= '3.7'", 477 | "version": "==0.14.0" 478 | }, 479 | "httplib2": { 480 | "hashes": [ 481 | "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc", 482 | "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81" 483 | ], 484 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 485 | "version": "==0.22.0" 486 | }, 487 | "hyperlink": { 488 | "hashes": [ 489 | "sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b", 490 | "sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4" 491 | ], 492 | "version": "==21.0.0" 493 | }, 494 | "idna": { 495 | "hashes": [ 496 | "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", 497 | "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" 498 | ], 499 | "markers": "python_version >= '3.5'", 500 | "version": "==3.7" 501 | }, 502 | "incremental": { 503 | "hashes": [ 504 | "sha256:912feeb5e0f7e0188e6f42241d2f450002e11bbc0937c65865045854c24c0bd0", 505 | "sha256:b864a1f30885ee72c5ac2835a761b8fe8aa9c28b9395cacf27286602688d3e51" 506 | ], 507 | "version": "==22.10.0" 508 | }, 509 | "itemadapter": { 510 | "hashes": [ 511 | "sha256:2ac1fbcc363b789a18639935ca322e50a65a0a7dfdd8d973c34e2c468e6c0f94", 512 | "sha256:77758485fb0ac10730d4b131363e37d65cb8db2450bfec7a57c3f3271f4a48a9" 513 | ], 514 | "markers": "python_version >= '3.7'", 515 | "version": "==0.8.0" 516 | }, 517 | "itemloaders": { 518 | "hashes": [ 519 | "sha256:6ec5753dafdc69262774694c78c9ec44605672586b40a7134a097a5df601a442", 520 | "sha256:fc2307f984116b010d6101a68a6a133ac8de927320b0ab696f31ad710a8d8d98" 521 | ], 522 | "markers": "python_version >= '3.8'", 523 | "version": "==1.2.0" 524 | }, 525 | "jmespath": { 526 | "hashes": [ 527 | "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", 528 | "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe" 529 | ], 530 | "markers": "python_version >= '3.7'", 531 | "version": "==1.0.1" 532 | }, 533 | "lxml": { 534 | "hashes": [ 535 | "sha256:04ab5415bf6c86e0518d57240a96c4d1fcfc3cb370bb2ac2a732b67f579e5a04", 536 | "sha256:057cdc6b86ab732cf361f8b4d8af87cf195a1f6dc5b0ff3de2dced242c2015e0", 537 | "sha256:058a1308914f20784c9f4674036527e7c04f7be6fb60f5d61353545aa7fcb739", 538 | "sha256:08802f0c56ed150cc6885ae0788a321b73505d2263ee56dad84d200cab11c07a", 539 | "sha256:0a15438253b34e6362b2dc41475e7f80de76320f335e70c5528b7148cac253a1", 540 | "sha256:0c3f67e2aeda739d1cc0b1102c9a9129f7dc83901226cc24dd72ba275ced4218", 541 | "sha256:0e7259016bc4345a31af861fdce942b77c99049d6c2107ca07dc2bba2435c1d9", 542 | "sha256:0ed777c1e8c99b63037b91f9d73a6aad20fd035d77ac84afcc205225f8f41188", 543 | "sha256:0f5d65c39f16717a47c36c756af0fb36144069c4718824b7533f803ecdf91138", 544 | "sha256:0f8c09ed18ecb4ebf23e02b8e7a22a05d6411911e6fabef3a36e4f371f4f2585", 545 | "sha256:11a04306fcba10cd9637e669fd73aa274c1c09ca64af79c041aa820ea992b637", 546 | "sha256:1ae67b4e737cddc96c99461d2f75d218bdf7a0c3d3ad5604d1f5e7464a2f9ffe", 547 | "sha256:1c5bb205e9212d0ebddf946bc07e73fa245c864a5f90f341d11ce7b0b854475d", 548 | "sha256:1f7785f4f789fdb522729ae465adcaa099e2a3441519df750ebdccc481d961a1", 549 | "sha256:200e63525948e325d6a13a76ba2911f927ad399ef64f57898cf7c74e69b71095", 550 | "sha256:21c2e6b09565ba5b45ae161b438e033a86ad1736b8c838c766146eff8ceffff9", 551 | "sha256:2213afee476546a7f37c7a9b4ad4d74b1e112a6fafffc9185d6d21f043128c81", 552 | "sha256:27aa20d45c2e0b8cd05da6d4759649170e8dfc4f4e5ef33a34d06f2d79075d57", 553 | "sha256:2a66bf12fbd4666dd023b6f51223aed3d9f3b40fef06ce404cb75bafd3d89536", 554 | "sha256:2c9d147f754b1b0e723e6afb7ba1566ecb162fe4ea657f53d2139bbf894d050a", 555 | "sha256:2ddfe41ddc81f29a4c44c8ce239eda5ade4e7fc305fb7311759dd6229a080052", 556 | "sha256:31e9a882013c2f6bd2f2c974241bf4ba68c85eba943648ce88936d23209a2e01", 557 | "sha256:3249cc2989d9090eeac5467e50e9ec2d40704fea9ab72f36b034ea34ee65ca98", 558 | "sha256:3545039fa4779be2df51d6395e91a810f57122290864918b172d5dc7ca5bb433", 559 | "sha256:394ed3924d7a01b5bd9a0d9d946136e1c2f7b3dc337196d99e61740ed4bc6fe1", 560 | "sha256:3a6b45da02336895da82b9d472cd274b22dc27a5cea1d4b793874eead23dd14f", 561 | "sha256:3a74c4f27167cb95c1d4af1c0b59e88b7f3e0182138db2501c353555f7ec57f4", 562 | "sha256:3d0c3dd24bb4605439bf91068598d00c6370684f8de4a67c2992683f6c309d6b", 563 | "sha256:3dbe858ee582cbb2c6294dc85f55b5f19c918c2597855e950f34b660f1a5ede6", 564 | "sha256:3dc773b2861b37b41a6136e0b72a1a44689a9c4c101e0cddb6b854016acc0aa8", 565 | "sha256:3f7765e69bbce0906a7c74d5fe46d2c7a7596147318dbc08e4a2431f3060e306", 566 | "sha256:417d14450f06d51f363e41cace6488519038f940676ce9664b34ebf5653433a5", 567 | "sha256:44f6c7caff88d988db017b9b0e4ab04934f11e3e72d478031efc7edcac6c622f", 568 | "sha256:491755202eb21a5e350dae00c6d9a17247769c64dcf62d8c788b5c135e179dc4", 569 | "sha256:4951e4f7a5680a2db62f7f4ab2f84617674d36d2d76a729b9a8be4b59b3659be", 570 | "sha256:52421b41ac99e9d91934e4d0d0fe7da9f02bfa7536bb4431b4c05c906c8c6919", 571 | "sha256:530e7c04f72002d2f334d5257c8a51bf409db0316feee7c87e4385043be136af", 572 | "sha256:533658f8fbf056b70e434dff7e7aa611bcacb33e01f75de7f821810e48d1bb66", 573 | "sha256:5670fb70a828663cc37552a2a85bf2ac38475572b0e9b91283dc09efb52c41d1", 574 | "sha256:56c22432809085b3f3ae04e6e7bdd36883d7258fcd90e53ba7b2e463efc7a6af", 575 | "sha256:58278b29cb89f3e43ff3e0c756abbd1518f3ee6adad9e35b51fb101c1c1daaec", 576 | "sha256:588008b8497667f1ddca7c99f2f85ce8511f8f7871b4a06ceede68ab62dff64b", 577 | "sha256:59565f10607c244bc4c05c0c5fa0c190c990996e0c719d05deec7030c2aa8289", 578 | "sha256:59689a75ba8d7ffca577aefd017d08d659d86ad4585ccc73e43edbfc7476781a", 579 | "sha256:5aea8212fb823e006b995c4dda533edcf98a893d941f173f6c9506126188860d", 580 | "sha256:5c670c0406bdc845b474b680b9a5456c561c65cf366f8db5a60154088c92d102", 581 | "sha256:5ca1e8188b26a819387b29c3895c47a5e618708fe6f787f3b1a471de2c4a94d9", 582 | "sha256:5d077bc40a1fe984e1a9931e801e42959a1e6598edc8a3223b061d30fbd26bbc", 583 | "sha256:5d5792e9b3fb8d16a19f46aa8208987cfeafe082363ee2745ea8b643d9cc5b45", 584 | "sha256:5dd1537e7cc06efd81371f5d1a992bd5ab156b2b4f88834ca852de4a8ea523fa", 585 | "sha256:5ea7b6766ac2dfe4bcac8b8595107665a18ef01f8c8343f00710b85096d1b53a", 586 | "sha256:622020d4521e22fb371e15f580d153134bfb68d6a429d1342a25f051ec72df1c", 587 | "sha256:627402ad8dea044dde2eccde4370560a2b750ef894c9578e1d4f8ffd54000461", 588 | "sha256:644df54d729ef810dcd0f7732e50e5ad1bd0a135278ed8d6bcb06f33b6b6f708", 589 | "sha256:64641a6068a16201366476731301441ce93457eb8452056f570133a6ceb15fca", 590 | "sha256:64c2baa7774bc22dd4474248ba16fe1a7f611c13ac6123408694d4cc93d66dbd", 591 | "sha256:6588c459c5627fefa30139be4d2e28a2c2a1d0d1c265aad2ba1935a7863a4913", 592 | "sha256:66bc5eb8a323ed9894f8fa0ee6cb3e3fb2403d99aee635078fd19a8bc7a5a5da", 593 | "sha256:68a2610dbe138fa8c5826b3f6d98a7cfc29707b850ddcc3e21910a6fe51f6ca0", 594 | "sha256:6935bbf153f9a965f1e07c2649c0849d29832487c52bb4a5c5066031d8b44fd5", 595 | "sha256:6992030d43b916407c9aa52e9673612ff39a575523c5f4cf72cdef75365709a5", 596 | "sha256:6a014510830df1475176466b6087fc0c08b47a36714823e58d8b8d7709132a96", 597 | "sha256:6ab833e4735a7e5533711a6ea2df26459b96f9eec36d23f74cafe03631647c41", 598 | "sha256:6cc6ee342fb7fa2471bd9b6d6fdfc78925a697bf5c2bcd0a302e98b0d35bfad3", 599 | "sha256:6cf58416653c5901e12624e4013708b6e11142956e7f35e7a83f1ab02f3fe456", 600 | "sha256:70a9768e1b9d79edca17890175ba915654ee1725975d69ab64813dd785a2bd5c", 601 | "sha256:70ac664a48aa64e5e635ae5566f5227f2ab7f66a3990d67566d9907edcbbf867", 602 | "sha256:71e97313406ccf55d32cc98a533ee05c61e15d11b99215b237346171c179c0b0", 603 | "sha256:7221d49259aa1e5a8f00d3d28b1e0b76031655ca74bb287123ef56c3db92f213", 604 | "sha256:74b28c6334cca4dd704e8004cba1955af0b778cf449142e581e404bd211fb619", 605 | "sha256:764b521b75701f60683500d8621841bec41a65eb739b8466000c6fdbc256c240", 606 | "sha256:78bfa756eab503673991bdcf464917ef7845a964903d3302c5f68417ecdc948c", 607 | "sha256:794f04eec78f1d0e35d9e0c36cbbb22e42d370dda1609fb03bcd7aeb458c6377", 608 | "sha256:79bd05260359170f78b181b59ce871673ed01ba048deef4bf49a36ab3e72e80b", 609 | "sha256:7a7efd5b6d3e30d81ec68ab8a88252d7c7c6f13aaa875009fe3097eb4e30b84c", 610 | "sha256:7c17b64b0a6ef4e5affae6a3724010a7a66bda48a62cfe0674dabd46642e8b54", 611 | "sha256:804f74efe22b6a227306dd890eecc4f8c59ff25ca35f1f14e7482bbce96ef10b", 612 | "sha256:853e074d4931dbcba7480d4dcab23d5c56bd9607f92825ab80ee2bd916edea53", 613 | "sha256:857500f88b17a6479202ff5fe5f580fc3404922cd02ab3716197adf1ef628029", 614 | "sha256:865bad62df277c04beed9478fe665b9ef63eb28fe026d5dedcb89b537d2e2ea6", 615 | "sha256:88e22fc0a6684337d25c994381ed8a1580a6f5ebebd5ad41f89f663ff4ec2885", 616 | "sha256:8b9c07e7a45bb64e21df4b6aa623cb8ba214dfb47d2027d90eac197329bb5e94", 617 | "sha256:8de8f9d6caa7f25b204fc861718815d41cbcf27ee8f028c89c882a0cf4ae4134", 618 | "sha256:8e77c69d5892cb5ba71703c4057091e31ccf534bd7f129307a4d084d90d014b8", 619 | "sha256:9123716666e25b7b71c4e1789ec829ed18663152008b58544d95b008ed9e21e9", 620 | "sha256:958244ad566c3ffc385f47dddde4145088a0ab893504b54b52c041987a8c1863", 621 | "sha256:96323338e6c14e958d775700ec8a88346014a85e5de73ac7967db0367582049b", 622 | "sha256:9676bfc686fa6a3fa10cd4ae6b76cae8be26eb5ec6811d2a325636c460da1806", 623 | "sha256:9b0ff53900566bc6325ecde9181d89afadc59c5ffa39bddf084aaedfe3b06a11", 624 | "sha256:9b9ec9c9978b708d488bec36b9e4c94d88fd12ccac3e62134a9d17ddba910ea9", 625 | "sha256:9c6ad0fbf105f6bcc9300c00010a2ffa44ea6f555df1a2ad95c88f5656104817", 626 | "sha256:9ca66b8e90daca431b7ca1408cae085d025326570e57749695d6a01454790e95", 627 | "sha256:9e2addd2d1866fe112bc6f80117bcc6bc25191c5ed1bfbcf9f1386a884252ae8", 628 | "sha256:a0af35bd8ebf84888373630f73f24e86bf016642fb8576fba49d3d6b560b7cbc", 629 | "sha256:a2b44bec7adf3e9305ce6cbfa47a4395667e744097faed97abb4728748ba7d47", 630 | "sha256:a2dfe7e2473f9b59496247aad6e23b405ddf2e12ef0765677b0081c02d6c2c0b", 631 | "sha256:a55ee573116ba208932e2d1a037cc4b10d2c1cb264ced2184d00b18ce585b2c0", 632 | "sha256:a7baf9ffc238e4bf401299f50e971a45bfcc10a785522541a6e3179c83eabf0a", 633 | "sha256:a8d5c70e04aac1eda5c829a26d1f75c6e5286c74743133d9f742cda8e53b9c2f", 634 | "sha256:a91481dbcddf1736c98a80b122afa0f7296eeb80b72344d7f45dc9f781551f56", 635 | "sha256:ab31a88a651039a07a3ae327d68ebdd8bc589b16938c09ef3f32a4b809dc96ef", 636 | "sha256:abc25c3cab9ec7fcd299b9bcb3b8d4a1231877e425c650fa1c7576c5107ab851", 637 | "sha256:adfb84ca6b87e06bc6b146dc7da7623395db1e31621c4785ad0658c5028b37d7", 638 | "sha256:afbbdb120d1e78d2ba8064a68058001b871154cc57787031b645c9142b937a62", 639 | "sha256:afd5562927cdef7c4f5550374acbc117fd4ecc05b5007bdfa57cc5355864e0a4", 640 | "sha256:b070bbe8d3f0f6147689bed981d19bbb33070225373338df755a46893528104a", 641 | "sha256:b0b58fbfa1bf7367dde8a557994e3b1637294be6cf2169810375caf8571a085c", 642 | "sha256:b560e3aa4b1d49e0e6c847d72665384db35b2f5d45f8e6a5c0072e0283430533", 643 | "sha256:b6241d4eee5f89453307c2f2bfa03b50362052ca0af1efecf9fef9a41a22bb4f", 644 | "sha256:b6787b643356111dfd4032b5bffe26d2f8331556ecb79e15dacb9275da02866e", 645 | "sha256:bcbf4af004f98793a95355980764b3d80d47117678118a44a80b721c9913436a", 646 | "sha256:beb72935a941965c52990f3a32d7f07ce869fe21c6af8b34bf6a277b33a345d3", 647 | "sha256:bf2e2458345d9bffb0d9ec16557d8858c9c88d2d11fed53998512504cd9df49b", 648 | "sha256:c2d35a1d047efd68027817b32ab1586c1169e60ca02c65d428ae815b593e65d4", 649 | "sha256:c38d7b9a690b090de999835f0443d8aa93ce5f2064035dfc48f27f02b4afc3d0", 650 | "sha256:c6f2c8372b98208ce609c9e1d707f6918cc118fea4e2c754c9f0812c04ca116d", 651 | "sha256:c817d420c60a5183953c783b0547d9eb43b7b344a2c46f69513d5952a78cddf3", 652 | "sha256:c8ba129e6d3b0136a0f50345b2cb3db53f6bda5dd8c7f5d83fbccba97fb5dcb5", 653 | "sha256:c94e75445b00319c1fad60f3c98b09cd63fe1134a8a953dcd48989ef42318534", 654 | "sha256:cc4691d60512798304acb9207987e7b2b7c44627ea88b9d77489bbe3e6cc3bd4", 655 | "sha256:cc518cea79fd1e2f6c90baafa28906d4309d24f3a63e801d855e7424c5b34144", 656 | "sha256:cd53553ddad4a9c2f1f022756ae64abe16da1feb497edf4d9f87f99ec7cf86bd", 657 | "sha256:cf22b41fdae514ee2f1691b6c3cdeae666d8b7fa9434de445f12bbeee0cf48dd", 658 | "sha256:d38c8f50ecf57f0463399569aa388b232cf1a2ffb8f0a9a5412d0db57e054860", 659 | "sha256:d3be9b2076112e51b323bdf6d5a7f8a798de55fb8d95fcb64bd179460cdc0704", 660 | "sha256:d4f2cc7060dc3646632d7f15fe68e2fa98f58e35dd5666cd525f3b35d3fed7f8", 661 | "sha256:d7520db34088c96cc0e0a3ad51a4fd5b401f279ee112aa2b7f8f976d8582606d", 662 | "sha256:d793bebb202a6000390a5390078e945bbb49855c29c7e4d56a85901326c3b5d9", 663 | "sha256:da052e7962ea2d5e5ef5bc0355d55007407087392cf465b7ad84ce5f3e25fe0f", 664 | "sha256:dae0ed02f6b075426accbf6b2863c3d0a7eacc1b41fb40f2251d931e50188dad", 665 | "sha256:ddc678fb4c7e30cf830a2b5a8d869538bc55b28d6c68544d09c7d0d8f17694dc", 666 | "sha256:df2e6f546c4df14bc81f9498bbc007fbb87669f1bb707c6138878c46b06f6510", 667 | "sha256:e02c5175f63effbd7c5e590399c118d5db6183bbfe8e0d118bdb5c2d1b48d937", 668 | "sha256:e196a4ff48310ba62e53a8e0f97ca2bca83cdd2fe2934d8b5cb0df0a841b193a", 669 | "sha256:e233db59c8f76630c512ab4a4daf5a5986da5c3d5b44b8e9fc742f2a24dbd460", 670 | "sha256:e32be23d538753a8adb6c85bd539f5fd3b15cb987404327c569dfc5fd8366e85", 671 | "sha256:e3d30321949861404323c50aebeb1943461a67cd51d4200ab02babc58bd06a86", 672 | "sha256:e89580a581bf478d8dcb97d9cd011d567768e8bc4095f8557b21c4d4c5fea7d0", 673 | "sha256:e998e304036198b4f6914e6a1e2b6f925208a20e2042563d9734881150c6c246", 674 | "sha256:ec42088248c596dbd61d4ae8a5b004f97a4d91a9fd286f632e42e60b706718d7", 675 | "sha256:efa7b51824aa0ee957ccd5a741c73e6851de55f40d807f08069eb4c5a26b2baa", 676 | "sha256:f0a1bc63a465b6d72569a9bba9f2ef0334c4e03958e043da1920299100bc7c08", 677 | "sha256:f18a5a84e16886898e51ab4b1d43acb3083c39b14c8caeb3589aabff0ee0b270", 678 | "sha256:f2a9efc53d5b714b8df2b4b3e992accf8ce5bbdfe544d74d5c6766c9e1146a3a", 679 | "sha256:f3bbbc998d42f8e561f347e798b85513ba4da324c2b3f9b7969e9c45b10f6169", 680 | "sha256:f42038016852ae51b4088b2862126535cc4fc85802bfe30dea3500fdfaf1864e", 681 | "sha256:f443cdef978430887ed55112b491f670bba6462cea7a7742ff8f14b7abb98d75", 682 | "sha256:f51969bac61441fd31f028d7b3b45962f3ecebf691a510495e5d2cd8c8092dbd", 683 | "sha256:f8aca2e3a72f37bfc7b14ba96d4056244001ddcc18382bd0daa087fd2e68a354", 684 | "sha256:f9737bf36262046213a28e789cc82d82c6ef19c85a0cf05e75c670a33342ac2c", 685 | "sha256:fd6037392f2d57793ab98d9e26798f44b8b4da2f2464388588f48ac52c489ea1", 686 | "sha256:feaa45c0eae424d3e90d78823f3828e7dc42a42f21ed420db98da2c4ecf0a2cb", 687 | "sha256:ff097ae562e637409b429a7ac958a20aab237a0378c42dabaa1e3abf2f896e5f", 688 | "sha256:ff46d772d5f6f73564979cd77a4fffe55c916a05f3cb70e7c9c0590059fb29ef" 689 | ], 690 | "markers": "python_version >= '3.6'", 691 | "version": "==5.2.1" 692 | }, 693 | "outcome": { 694 | "hashes": [ 695 | "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8", 696 | "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b" 697 | ], 698 | "markers": "python_version >= '3.7'", 699 | "version": "==1.3.0.post0" 700 | }, 701 | "packaging": { 702 | "hashes": [ 703 | "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", 704 | "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" 705 | ], 706 | "markers": "python_version >= '3.7'", 707 | "version": "==24.0" 708 | }, 709 | "parsel": { 710 | "hashes": [ 711 | "sha256:14e00dc07731c9030db620c195fcae884b5b4848e9f9c523c6119f708ccfa9ac", 712 | "sha256:c4a777ee6c3ff5e39652b58e351c5cf02c12ff420d05b07a7966aebb68ab1700" 713 | ], 714 | "markers": "python_version >= '3.8'", 715 | "version": "==1.9.1" 716 | }, 717 | "playwright": { 718 | "hashes": [ 719 | "sha256:50d9a5c07c76456945a2296d63f78fdf6eb11aed3e8d39bb5ccbda760a8d6d41", 720 | "sha256:87191272c40b4c282cf2c9449ca3acaf705f38ac6e2372270f1617ce16b661b8", 721 | "sha256:9b7bd707eeeaebee47f656b2de90aa9bd85e9ca2c6af7a08efd73896299e4d50", 722 | "sha256:b03b12bd4da9c2cfb78dff820deac8b52892fe3c2f89a4d95d6f08c59e41deb9", 723 | "sha256:bd8b818904b17e2914be23e7bc2a340b203f57fe81678520b10f908485b056ea", 724 | "sha256:e05a8d8fb2040c630429cca07e843c8fa33059717837c8f50c01b7d1fc651ce1", 725 | "sha256:e9ec21b141727392f630761c7f4dec46d80c98243614257cc501b64ff636d337" 726 | ], 727 | "markers": "python_version >= '3.8'", 728 | "version": "==1.43.0" 729 | }, 730 | "protego": { 731 | "hashes": [ 732 | "sha256:2fbe8e9b7a7dbc5016a932b14c98d236aad4c29290bbe457b8d2779666ef7a41", 733 | "sha256:e94430d0d25cbbf239bc849d86c5e544fbde531fcccfa059953c7da344a1712c" 734 | ], 735 | "markers": "python_version >= '3.8'", 736 | "version": "==0.3.1" 737 | }, 738 | "proto-plus": { 739 | "hashes": [ 740 | "sha256:89075171ef11988b3fa157f5dbd8b9cf09d65fffee97e29ce403cd8defba19d2", 741 | "sha256:a829c79e619e1cf632de091013a4173deed13a55f326ef84f05af6f50ff4c82c" 742 | ], 743 | "markers": "python_version >= '3.6'", 744 | "version": "==1.23.0" 745 | }, 746 | "protobuf": { 747 | "hashes": [ 748 | "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4", 749 | "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8", 750 | "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c", 751 | "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d", 752 | "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4", 753 | "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa", 754 | "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c", 755 | "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019", 756 | "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9", 757 | "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c", 758 | "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2" 759 | ], 760 | "markers": "python_version >= '3.8'", 761 | "version": "==4.25.3" 762 | }, 763 | "pyasn1": { 764 | "hashes": [ 765 | "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c", 766 | "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473" 767 | ], 768 | "markers": "python_version >= '3.8'", 769 | "version": "==0.6.0" 770 | }, 771 | "pyasn1-modules": { 772 | "hashes": [ 773 | "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6", 774 | "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b" 775 | ], 776 | "markers": "python_version >= '3.8'", 777 | "version": "==0.4.0" 778 | }, 779 | "pycparser": { 780 | "hashes": [ 781 | "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", 782 | "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc" 783 | ], 784 | "markers": "python_version >= '3.8'", 785 | "version": "==2.22" 786 | }, 787 | "pydantic": { 788 | "hashes": [ 789 | "sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5", 790 | "sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc" 791 | ], 792 | "markers": "python_version >= '3.8'", 793 | "version": "==2.7.1" 794 | }, 795 | "pydantic-core": { 796 | "hashes": [ 797 | "sha256:0098300eebb1c837271d3d1a2cd2911e7c11b396eac9661655ee524a7f10587b", 798 | "sha256:042473b6280246b1dbf530559246f6842b56119c2926d1e52b631bdc46075f2a", 799 | "sha256:05b7133a6e6aeb8df37d6f413f7705a37ab4031597f64ab56384c94d98fa0e90", 800 | "sha256:0680b1f1f11fda801397de52c36ce38ef1c1dc841a0927a94f226dea29c3ae3d", 801 | "sha256:0d69b4c2f6bb3e130dba60d34c0845ba31b69babdd3f78f7c0c8fae5021a253e", 802 | "sha256:1404c69d6a676245199767ba4f633cce5f4ad4181f9d0ccb0577e1f66cf4c46d", 803 | "sha256:182245ff6b0039e82b6bb585ed55a64d7c81c560715d1bad0cbad6dfa07b4027", 804 | "sha256:1a388a77e629b9ec814c1b1e6b3b595fe521d2cdc625fcca26fbc2d44c816804", 805 | "sha256:1d90c3265ae107f91a4f279f4d6f6f1d4907ac76c6868b27dc7fb33688cfb347", 806 | "sha256:20aca1e2298c56ececfd8ed159ae4dde2df0781988c97ef77d5c16ff4bd5b400", 807 | "sha256:219da3f096d50a157f33645a1cf31c0ad1fe829a92181dd1311022f986e5fbe3", 808 | "sha256:22057013c8c1e272eb8d0eebc796701167d8377441ec894a8fed1af64a0bf399", 809 | "sha256:223ee893d77a310a0391dca6df00f70bbc2f36a71a895cecd9a0e762dc37b349", 810 | "sha256:224c421235f6102e8737032483f43c1a8cfb1d2f45740c44166219599358c2cd", 811 | "sha256:2334ce8c673ee93a1d6a65bd90327588387ba073c17e61bf19b4fd97d688d63c", 812 | "sha256:269322dcc3d8bdb69f054681edff86276b2ff972447863cf34c8b860f5188e2e", 813 | "sha256:2728b01246a3bba6de144f9e3115b532ee44bd6cf39795194fb75491824a1413", 814 | "sha256:2b8ed04b3582771764538f7ee7001b02e1170223cf9b75dff0bc698fadb00cf3", 815 | "sha256:2e29d20810dfc3043ee13ac7d9e25105799817683348823f305ab3f349b9386e", 816 | "sha256:36789b70d613fbac0a25bb07ab3d9dba4d2e38af609c020cf4d888d165ee0bf3", 817 | "sha256:390193c770399861d8df9670fb0d1874f330c79caaca4642332df7c682bf6b91", 818 | "sha256:3a6515ebc6e69d85502b4951d89131ca4e036078ea35533bb76327f8424531ce", 819 | "sha256:3f9a801e7c8f1ef8718da265bba008fa121243dfe37c1cea17840b0944dfd72c", 820 | "sha256:43f0f463cf89ace478de71a318b1b4f05ebc456a9b9300d027b4b57c1a2064fb", 821 | "sha256:4456f2dca97c425231d7315737d45239b2b51a50dc2b6f0c2bb181fce6207664", 822 | "sha256:470b94480bb5ee929f5acba6995251ada5e059a5ef3e0dfc63cca287283ebfa6", 823 | "sha256:4774f3184d2ef3e14e8693194f661dea5a4d6ca4e3dc8e39786d33a94865cefd", 824 | "sha256:4b4356d3538c3649337df4074e81b85f0616b79731fe22dd11b99499b2ebbdf3", 825 | "sha256:553ef617b6836fc7e4df130bb851e32fe357ce36336d897fd6646d6058d980af", 826 | "sha256:6132dd3bd52838acddca05a72aafb6eab6536aa145e923bb50f45e78b7251043", 827 | "sha256:6a46e22a707e7ad4484ac9ee9f290f9d501df45954184e23fc29408dfad61350", 828 | "sha256:6e5c584d357c4e2baf0ff7baf44f4994be121e16a2c88918a5817331fc7599d7", 829 | "sha256:75250dbc5290e3f1a0f4618db35e51a165186f9034eff158f3d490b3fed9f8a0", 830 | "sha256:75f7e9488238e920ab6204399ded280dc4c307d034f3924cd7f90a38b1829563", 831 | "sha256:78363590ef93d5d226ba21a90a03ea89a20738ee5b7da83d771d283fd8a56761", 832 | "sha256:7ca4ae5a27ad7a4ee5170aebce1574b375de390bc01284f87b18d43a3984df72", 833 | "sha256:800d60565aec896f25bc3cfa56d2277d52d5182af08162f7954f938c06dc4ee3", 834 | "sha256:82d5d4d78e4448683cb467897fe24e2b74bb7b973a541ea1dcfec1d3cbce39fb", 835 | "sha256:852e966fbd035a6468fc0a3496589b45e2208ec7ca95c26470a54daed82a0788", 836 | "sha256:868649da93e5a3d5eacc2b5b3b9235c98ccdbfd443832f31e075f54419e1b96b", 837 | "sha256:886eec03591b7cf058467a70a87733b35f44707bd86cf64a615584fd72488b7c", 838 | "sha256:8b172601454f2d7701121bbec3425dd71efcb787a027edf49724c9cefc14c038", 839 | "sha256:95b9d5e72481d3780ba3442eac863eae92ae43a5f3adb5b4d0a1de89d42bb250", 840 | "sha256:98758d627ff397e752bc339272c14c98199c613f922d4a384ddc07526c86a2ec", 841 | "sha256:997abc4df705d1295a42f95b4eec4950a37ad8ae46d913caeee117b6b198811c", 842 | "sha256:9b5155ff768083cb1d62f3e143b49a8a3432e6789a3abee8acd005c3c7af1c74", 843 | "sha256:9e08e867b306f525802df7cd16c44ff5ebbe747ff0ca6cf3fde7f36c05a59a81", 844 | "sha256:9fdad8e35f278b2c3eb77cbdc5c0a49dada440657bf738d6905ce106dc1de439", 845 | "sha256:a1874c6dd4113308bd0eb568418e6114b252afe44319ead2b4081e9b9521fe75", 846 | "sha256:a8309f67285bdfe65c372ea3722b7a5642680f3dba538566340a9d36e920b5f0", 847 | "sha256:ae0a8a797a5e56c053610fa7be147993fe50960fa43609ff2a9552b0e07013e8", 848 | "sha256:b14d82cdb934e99dda6d9d60dc84a24379820176cc4a0d123f88df319ae9c150", 849 | "sha256:b1bd7e47b1558ea872bd16c8502c414f9e90dcf12f1395129d7bb42a09a95438", 850 | "sha256:b3ef08e20ec49e02d5c6717a91bb5af9b20f1805583cb0adfe9ba2c6b505b5ae", 851 | "sha256:b89ed9eb7d616ef5714e5590e6cf7f23b02d0d539767d33561e3675d6f9e3857", 852 | "sha256:c4fcf5cd9c4b655ad666ca332b9a081112cd7a58a8b5a6ca7a3104bc950f2038", 853 | "sha256:c6fdc8627910eed0c01aed6a390a252fe3ea6d472ee70fdde56273f198938374", 854 | "sha256:c9bd70772c720142be1020eac55f8143a34ec9f82d75a8e7a07852023e46617f", 855 | "sha256:ca7b0c1f1c983e064caa85f3792dd2fe3526b3505378874afa84baf662e12241", 856 | "sha256:cbca948f2d14b09d20268cda7b0367723d79063f26c4ffc523af9042cad95592", 857 | "sha256:cc1cfd88a64e012b74e94cd00bbe0f9c6df57049c97f02bb07d39e9c852e19a4", 858 | "sha256:ccdd111c03bfd3666bd2472b674c6899550e09e9f298954cfc896ab92b5b0e6d", 859 | "sha256:cfeecd1ac6cc1fb2692c3d5110781c965aabd4ec5d32799773ca7b1456ac636b", 860 | "sha256:d4d938ec0adf5167cb335acb25a4ee69a8107e4984f8fbd2e897021d9e4ca21b", 861 | "sha256:d7d904828195733c183d20a54230c0df0eb46ec746ea1a666730787353e87182", 862 | "sha256:d91cb5ea8b11607cc757675051f61b3d93f15eca3cefb3e6c704a5d6e8440f4e", 863 | "sha256:d9319e499827271b09b4e411905b24a426b8fb69464dfa1696258f53a3334641", 864 | "sha256:e0e8b1be28239fc64a88a8189d1df7fad8be8c1ae47fcc33e43d4be15f99cc70", 865 | "sha256:e18609ceaa6eed63753037fc06ebb16041d17d28199ae5aba0052c51449650a9", 866 | "sha256:e1b395e58b10b73b07b7cf740d728dd4ff9365ac46c18751bf8b3d8cca8f625a", 867 | "sha256:e23ec367a948b6d812301afc1b13f8094ab7b2c280af66ef450efc357d2ae543", 868 | "sha256:e25add29b8f3b233ae90ccef2d902d0ae0432eb0d45370fe315d1a5cf231004b", 869 | "sha256:e6dac87ddb34aaec85f873d737e9d06a3555a1cc1a8e0c44b7f8d5daeb89d86f", 870 | "sha256:ef26c9e94a8c04a1b2924149a9cb081836913818e55681722d7f29af88fe7b38", 871 | "sha256:eff2de745698eb46eeb51193a9f41d67d834d50e424aef27df2fcdee1b153845", 872 | "sha256:f0a21cbaa69900cbe1a2e7cad2aa74ac3cf21b10c3efb0fa0b80305274c0e8a2", 873 | "sha256:f459a5ce8434614dfd39bbebf1041952ae01da6bed9855008cb33b875cb024c0", 874 | "sha256:f93a8a2e3938ff656a7c1bc57193b1319960ac015b6e87d76c76bf14fe0244b4", 875 | "sha256:fb2bd7be70c0fe4dfd32c951bc813d9fe6ebcbfdd15a07527796c8204bd36242" 876 | ], 877 | "markers": "python_version >= '3.8'", 878 | "version": "==2.18.2" 879 | }, 880 | "pydispatcher": { 881 | "hashes": [ 882 | "sha256:96543bea04115ffde08f851e1d45cacbfd1ee866ac42127d9b476dc5aefa7de0", 883 | "sha256:b777c6ad080dc1bad74a4c29d6a46914fa6701ac70f94b0d66fbcfde62f5be31" 884 | ], 885 | "markers": "platform_python_implementation == 'CPython'", 886 | "version": "==2.0.7" 887 | }, 888 | "pyee": { 889 | "hashes": [ 890 | "sha256:5d346a7d0f861a4b2e6c47960295bd895f816725b27d656181947346be98d7c1", 891 | "sha256:b53af98f6990c810edd9b56b87791021a8f54fd13db4edd1142438d44ba2263f" 892 | ], 893 | "markers": "python_version >= '3.8'", 894 | "version": "==11.1.0" 895 | }, 896 | "pyopenssl": { 897 | "hashes": [ 898 | "sha256:17ed5be5936449c5418d1cd269a1a9e9081bc54c17aed272b45856a3d3dc86ad", 899 | "sha256:cabed4bfaa5df9f1a16c0ef64a0cb65318b5cd077a7eda7d6970131ca2f41a6f" 900 | ], 901 | "markers": "python_version >= '3.7'", 902 | "version": "==24.1.0" 903 | }, 904 | "pyparsing": { 905 | "hashes": [ 906 | "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", 907 | "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742" 908 | ], 909 | "markers": "python_version >= '3.1'", 910 | "version": "==3.1.2" 911 | }, 912 | "pysocks": { 913 | "hashes": [ 914 | "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299", 915 | "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5", 916 | "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0" 917 | ], 918 | "version": "==1.7.1" 919 | }, 920 | "python-dotenv": { 921 | "hashes": [ 922 | "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", 923 | "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a" 924 | ], 925 | "index": "pypi", 926 | "markers": "python_version >= '3.8'", 927 | "version": "==1.0.1" 928 | }, 929 | "queuelib": { 930 | "hashes": [ 931 | "sha256:2855162096cf0230510890b354379ea1c0ff19d105d3147d349d2433bb222b08", 932 | "sha256:b07aaa2410caac3a0021ee4f4026acdac992b0fb9a2cbeb34a918617df3c12a7" 933 | ], 934 | "markers": "python_version >= '3.8'", 935 | "version": "==1.7.0" 936 | }, 937 | "requests": { 938 | "hashes": [ 939 | "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", 940 | "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" 941 | ], 942 | "index": "pypi", 943 | "markers": "python_version >= '3.7'", 944 | "version": "==2.31.0" 945 | }, 946 | "requests-file": { 947 | "hashes": [ 948 | "sha256:20c5931629c558fda566cacc10cfe2cd502433e628f568c34c80d96a0cc95972", 949 | "sha256:3e493d390adb44aa102ebea827a48717336d5268968c370eaf19abaf5cae13bf" 950 | ], 951 | "version": "==2.0.0" 952 | }, 953 | "rsa": { 954 | "hashes": [ 955 | "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7", 956 | "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21" 957 | ], 958 | "markers": "python_version >= '3.6' and python_version < '4'", 959 | "version": "==4.9" 960 | }, 961 | "scrapy": { 962 | "hashes": [ 963 | "sha256:733a039c7423e52b69bf2810b5332093d4e42a848460359c07b02ecff8f73ebe", 964 | "sha256:f1edee0cd214512054c01a8d031a8d213dddb53492b02c9e66256e3efe90d175" 965 | ], 966 | "index": "pypi", 967 | "markers": "python_version >= '3.8'", 968 | "version": "==2.11.1" 969 | }, 970 | "scrapy-playwright": { 971 | "hashes": [ 972 | "sha256:26947ee32a9f837d325da4fe0bcf8384e2c097e12de430283aeb550754d69fca", 973 | "sha256:b7e171ec517460d4ec7a8552f7561a124ec945ac9ac77eb8a6639278dc7615d7" 974 | ], 975 | "index": "pypi", 976 | "markers": "python_version >= '3.8'", 977 | "version": "==0.0.34" 978 | }, 979 | "scrapy-selenium": { 980 | "hashes": [ 981 | "sha256:51f809802a1f62ed852cfe2d2ed49f6141058cc5254ed4b448d2ffe6f7a1b6e9", 982 | "sha256:70766315c7970b12a142e1b7a9f43ffb3ef1260891811062ec9dd46a665d935a" 983 | ], 984 | "index": "pypi", 985 | "version": "==0.0.7" 986 | }, 987 | "selenium": { 988 | "hashes": [ 989 | "sha256:0bd564ee166980d419a8aaf4ac00289bc152afcf2eadca5efe8c8e36711853fd", 990 | "sha256:b1d0c33b38ca27d0499183e48e1dd09ff26973481f5d3ef2983073813ae6588d" 991 | ], 992 | "index": "pypi", 993 | "markers": "python_version >= '3.8'", 994 | "version": "==4.20.0" 995 | }, 996 | "service-identity": { 997 | "hashes": [ 998 | "sha256:6829c9d62fb832c2e1c435629b0a8c476e1929881f28bee4d20bc24161009221", 999 | "sha256:a28caf8130c8a5c1c7a6f5293faaf239bbfb7751e4862436920ee6f2616f568a" 1000 | ], 1001 | "markers": "python_version >= '3.8'", 1002 | "version": "==24.1.0" 1003 | }, 1004 | "setuptools": { 1005 | "hashes": [ 1006 | "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987", 1007 | "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32" 1008 | ], 1009 | "markers": "python_version >= '3.8'", 1010 | "version": "==69.5.1" 1011 | }, 1012 | "six": { 1013 | "hashes": [ 1014 | "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", 1015 | "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" 1016 | ], 1017 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 1018 | "version": "==1.16.0" 1019 | }, 1020 | "sniffio": { 1021 | "hashes": [ 1022 | "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", 1023 | "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" 1024 | ], 1025 | "markers": "python_version >= '3.7'", 1026 | "version": "==1.3.1" 1027 | }, 1028 | "sortedcontainers": { 1029 | "hashes": [ 1030 | "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", 1031 | "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0" 1032 | ], 1033 | "version": "==2.4.0" 1034 | }, 1035 | "soupsieve": { 1036 | "hashes": [ 1037 | "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690", 1038 | "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7" 1039 | ], 1040 | "markers": "python_version >= '3.8'", 1041 | "version": "==2.5" 1042 | }, 1043 | "tldextract": { 1044 | "hashes": [ 1045 | "sha256:4dfc4c277b6b97fa053899fcdb892d2dc27295851ab5fac4e07797b6a21b2e46", 1046 | "sha256:c9e17f756f05afb5abac04fe8f766e7e70f9fe387adb1859f0f52408ee060200" 1047 | ], 1048 | "markers": "python_version >= '3.8'", 1049 | "version": "==5.1.2" 1050 | }, 1051 | "tqdm": { 1052 | "hashes": [ 1053 | "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644", 1054 | "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb" 1055 | ], 1056 | "markers": "python_version >= '3.7'", 1057 | "version": "==4.66.4" 1058 | }, 1059 | "trio": { 1060 | "hashes": [ 1061 | "sha256:9b41f5993ad2c0e5f62d0acca320ec657fdb6b2a2c22b8c7aed6caf154475c4e", 1062 | "sha256:e6458efe29cc543e557a91e614e2b51710eba2961669329ce9c862d50c6e8e81" 1063 | ], 1064 | "markers": "python_version >= '3.8'", 1065 | "version": "==0.25.0" 1066 | }, 1067 | "trio-websocket": { 1068 | "hashes": [ 1069 | "sha256:18c11793647703c158b1f6e62de638acada927344d534e3c7628eedcb746839f", 1070 | "sha256:520d046b0d030cf970b8b2b2e00c4c2245b3807853ecd44214acd33d74581638" 1071 | ], 1072 | "markers": "python_version >= '3.7'", 1073 | "version": "==0.11.1" 1074 | }, 1075 | "twisted": { 1076 | "hashes": [ 1077 | "sha256:039f2e6a49ab5108abd94de187fa92377abe5985c7a72d68d0ad266ba19eae63", 1078 | "sha256:6b38b6ece7296b5e122c9eb17da2eeab3d98a198f50ca9efd00fb03e5b4fd4ae" 1079 | ], 1080 | "markers": "python_full_version >= '3.8.0'", 1081 | "version": "==24.3.0" 1082 | }, 1083 | "typing-extensions": { 1084 | "hashes": [ 1085 | "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", 1086 | "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a" 1087 | ], 1088 | "markers": "python_version >= '3.8'", 1089 | "version": "==4.11.0" 1090 | }, 1091 | "uritemplate": { 1092 | "hashes": [ 1093 | "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0", 1094 | "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e" 1095 | ], 1096 | "markers": "python_version >= '3.6'", 1097 | "version": "==4.1.1" 1098 | }, 1099 | "urllib3": { 1100 | "extras": [ 1101 | "socks" 1102 | ], 1103 | "hashes": [ 1104 | "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d", 1105 | "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19" 1106 | ], 1107 | "markers": "python_version >= '3.8'", 1108 | "version": "==2.2.1" 1109 | }, 1110 | "w3lib": { 1111 | "hashes": [ 1112 | "sha256:c4432926e739caa8e3f49f5de783f336df563d9490416aebd5d39fb896d264e7", 1113 | "sha256:ed5b74e997eea2abe3c1321f916e344144ee8e9072a6f33463ee8e57f858a4b1" 1114 | ], 1115 | "markers": "python_version >= '3.7'", 1116 | "version": "==2.1.2" 1117 | }, 1118 | "webdriver-manager": { 1119 | "hashes": [ 1120 | "sha256:25ec177c6a2ce9c02fb8046f1b2732701a9418d6a977967bb065d840a3175d87", 1121 | "sha256:d7970052295bb9cda2c1a24cf0b872dd2c41ababcc78f7b6b8dc37a41e979a7e" 1122 | ], 1123 | "index": "pypi", 1124 | "markers": "python_version >= '3.7'", 1125 | "version": "==4.0.1" 1126 | }, 1127 | "wsproto": { 1128 | "hashes": [ 1129 | "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", 1130 | "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736" 1131 | ], 1132 | "markers": "python_full_version >= '3.7.0'", 1133 | "version": "==1.2.0" 1134 | }, 1135 | "zope.interface": { 1136 | "hashes": [ 1137 | "sha256:014bb94fe6bf1786da1aa044eadf65bc6437bcb81c451592987e5be91e70a91e", 1138 | "sha256:01a0b3dd012f584afcf03ed814bce0fc40ed10e47396578621509ac031be98bf", 1139 | "sha256:10cde8dc6b2fd6a1d0b5ca4be820063e46ddba417ab82bcf55afe2227337b130", 1140 | "sha256:187f7900b63845dcdef1be320a523dbbdba94d89cae570edc2781eb55f8c2f86", 1141 | "sha256:1b0c4c90e5eefca2c3e045d9f9ed9f1e2cdbe70eb906bff6b247e17119ad89a1", 1142 | "sha256:22e8a218e8e2d87d4d9342aa973b7915297a08efbebea5b25900c73e78ed468e", 1143 | "sha256:26c9a37fb395a703e39b11b00b9e921c48f82b6e32cc5851ad5d0618cd8876b5", 1144 | "sha256:2bb78c12c1ad3a20c0d981a043d133299117b6854f2e14893b156979ed4e1d2c", 1145 | "sha256:2c3cfb272bcb83650e6695d49ae0d14dd06dc694789a3d929f23758557a23d92", 1146 | "sha256:2f32010ffb87759c6a3ad1c65ed4d2e38e51f6b430a1ca11cee901ec2b42e021", 1147 | "sha256:3c8731596198198746f7ce2a4487a0edcbc9ea5e5918f0ab23c4859bce56055c", 1148 | "sha256:40aa8c8e964d47d713b226c5baf5f13cdf3a3169c7a2653163b17ff2e2334d10", 1149 | "sha256:4137025731e824eee8d263b20682b28a0bdc0508de9c11d6c6be54163e5b7c83", 1150 | "sha256:46034be614d1f75f06e7dcfefba21d609b16b38c21fc912b01a99cb29e58febb", 1151 | "sha256:483e118b1e075f1819b3c6ace082b9d7d3a6a5eb14b2b375f1b80a0868117920", 1152 | "sha256:4d6b229f5e1a6375f206455cc0a63a8e502ed190fe7eb15e94a312dc69d40299", 1153 | "sha256:567d54c06306f9c5b6826190628d66753b9f2b0422f4c02d7c6d2b97ebf0a24e", 1154 | "sha256:5683aa8f2639016fd2b421df44301f10820e28a9b96382a6e438e5c6427253af", 1155 | "sha256:600101f43a7582d5b9504a7c629a1185a849ce65e60fca0f6968dfc4b76b6d39", 1156 | "sha256:62e32f02b3f26204d9c02c3539c802afc3eefb19d601a0987836ed126efb1f21", 1157 | "sha256:69dedb790530c7ca5345899a1b4cb837cc53ba669051ea51e8c18f82f9389061", 1158 | "sha256:72d5efecad16c619a97744a4f0b67ce1bcc88115aa82fcf1dc5be9bb403bcc0b", 1159 | "sha256:8d407e0fd8015f6d5dfad481309638e1968d70e6644e0753f229154667dd6cd5", 1160 | "sha256:a058e6cf8d68a5a19cb5449f42a404f0d6c2778b897e6ce8fadda9cea308b1b0", 1161 | "sha256:a1adc14a2a9d5e95f76df625a9b39f4709267a483962a572e3f3001ef90ea6e6", 1162 | "sha256:a56fe1261230093bfeedc1c1a6cd6f3ec568f9b07f031c9a09f46b201f793a85", 1163 | "sha256:ad4524289d8dbd6fb5aa17aedb18f5643e7d48358f42c007a5ee51a2afc2a7c5", 1164 | "sha256:afa0491a9f154cf8519a02026dc85a416192f4cb1efbbf32db4a173ba28b289a", 1165 | "sha256:bf34840e102d1d0b2d39b1465918d90b312b1119552cebb61a242c42079817b9", 1166 | "sha256:c40df4aea777be321b7e68facb901bc67317e94b65d9ab20fb96e0eb3c0b60a1", 1167 | "sha256:d0e7321557c702bd92dac3c66a2f22b963155fdb4600133b6b29597f62b71b12", 1168 | "sha256:d165d7774d558ea971cb867739fb334faf68fc4756a784e689e11efa3becd59e", 1169 | "sha256:e78a183a3c2f555c2ad6aaa1ab572d1c435ba42f1dc3a7e8c82982306a19b785", 1170 | "sha256:e8fa0fb05083a1a4216b4b881fdefa71c5d9a106e9b094cd4399af6b52873e91", 1171 | "sha256:f83d6b4b22262d9a826c3bd4b2fbfafe1d0000f085ef8e44cd1328eea274ae6a", 1172 | "sha256:f95bebd0afe86b2adc074df29edb6848fc4d474ff24075e2c263d698774e108d" 1173 | ], 1174 | "markers": "python_version >= '3.7'", 1175 | "version": "==6.3" 1176 | } 1177 | }, 1178 | "develop": {} 1179 | } 1180 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LinkedIn Automation Bot 2 | 3 | This LinkedIn Automation Bot allows you to interact with posts and create your own posts on LinkedIn, using Google Gemini AI to generate insightful comments and posts. It's built using Python, Selenium, and other powerful libraries to automate liking, commenting, and posting on LinkedIn. 4 | 5 | ## Features 6 | 7 | - **Auto-Commenting:** Analyzes posts and generates relevant comments using Google Gemini's AI models. 8 | - **Auto-Liking:** Automatically likes posts based on content analysis. 9 | - **Auto-Posting:** Publishes posts directly on LinkedIn, leveraging AI to create engaging and tailored posts. 10 | - **Content Filtering:** Removes markdown and formats comments for a seamless look. 11 | 12 | ## Tech Stack 13 | 14 | - **Python OOP:** The bot is built with Object-Oriented Programming principles for modularity and maintainability. 15 | - **Selenium WebDriver:** Automates browser interactions with LinkedIn's web interface. 16 | - **Google Gemini API:** Provides AI-generated comments and posts using the Gemini language model. 17 | - **BeautifulSoup:** Extracts and processes LinkedIn post content. 18 | - **Logging:** Logs every step and handles errors gracefully. 19 | 20 | ## Prerequisites 21 | 22 | - Python 3.7 or later 23 | - Google Gemini API key 24 | - Selenium WebDriver and ChromeDriver 25 | 26 | ## Setup 27 | 28 | 1. **Clone the Repository:** 29 | 30 | ```bash 31 | git clone https://github.com/joeygoesgrey/linkedln-bot.git 32 | cd linkedin-bot 33 | ``` 34 | 35 | 2. **Create a Pipenv Environment and Install Dependencies:** 36 | 37 | ```bash 38 | pipenv install 39 | ``` 40 | 41 | 3. **Activate the Pipenv Shell:** 42 | 43 | ```bash 44 | pipenv shell 45 | ``` 46 | 47 | 4. **Set Up Environment Variables:** 48 | 49 | - Create a `.env` file in the root directory with your LinkedIn credentials and Google Gemini API key: 50 | 51 | ```ini 52 | LINKEDLN_USERNAME=your_linkedln_username 53 | LINKEDLN_PASSWORD=your_linkedln_password 54 | GEMINI_API_KEY=your_gemini_api_key 55 | ``` 56 | 57 | 5. **Download ChromeDriver:** 58 | ChromeDriver is required for Selenium to interact with the Chrome browser. With `webdriver-manager` included in the dependencies, no separate download is needed. 59 | 60 | ## Usage 61 | 62 | 1. **Run the Bot:** 63 | Start the bot using: 64 | 65 | ```bash 66 | python browser.py 67 | ``` 68 | 69 | 2. **Available Methods:** 70 | - `fetch_and_store_content()`: Fetches and stores LinkedIn post data. 71 | - `analyze_and_interact()`: Analyzes the stored posts and interacts based on AI analysis. 72 | - `function_to_make_a_post()`: Automates posting directly to LinkedIn. 73 | 74 | ## Important Considerations 75 | 76 | - **Ethics and Compliance:** 77 | Use the bot responsibly and follow LinkedIn's terms of service to avoid account restrictions. 78 | - **Rate Limiting:** 79 | Ensure the bot operates at reasonable intervals to mimic natural user behavior. 80 | 81 | ## Contributing 82 | 83 | Contributions are welcome! Feel free to fork the repository and submit a pull request with your enhancements or bug fixes. 84 | 85 | 86 | -------------------------------------------------------------------------------- /Topics.txt: -------------------------------------------------------------------------------- 1 | The future of blockchain in healthcare 2 | How to leverage AI for competitive advantage 3 | The benefits of cloud-based collaboration tools 4 | The impact of technology on the automotive industry 5 | How to create a successful IoT strategy 6 | The role of AI in financial forecasting 7 | How to foster a culture of continuous learning in tech 8 | The importance of cybersecurity in the digital age 9 | How to implement AI in customer support 10 | The future of smart cities 11 | How to create a secure mobile application 12 | The role of AI in supply chain optimization 13 | The benefits of cloud-based security solutions 14 | The impact of technology on the legal industry 15 | How to build a successful tech team 16 | The importance of digital transformation in business 17 | How to leverage AI for operational efficiency 18 | The future of cloud computing 19 | How to create a data-driven marketing strategy 20 | The role of AI in healthcare diagnostics 21 | The benefits of hybrid IT environments 22 | The impact of technology on the retail industry 23 | How to implement a successful blockchain project 24 | The role of AI in customer retention 25 | The importance of cybersecurity in protecting personal data 26 | How to build a scalable AI solution 27 | The future of technology in education 28 | How to create a secure e-commerce platform 29 | The role of AI in predictive maintenance 30 | The benefits of cloud-based analytics 31 | The impact of technology on the healthcare industry 32 | How to implement a successful DevSecOps strategy 33 | The role of AI in personalized healthcare 34 | The importance of data governance in business 35 | How to build a successful cloud-based application 36 | The future of technology in agriculture 37 | How to create a secure blockchain network 38 | The role of AI in financial services 39 | The benefits of cloud-based disaster recovery 40 | The impact of technology on the hospitality industry 41 | How to implement a successful AI-driven marketing strategy 42 | The role of AI in process automation 43 | The importance of cybersecurity in protecting critical infrastructure 44 | How to build a scalable IoT solution 45 | The future of technology in transportation 46 | How to create a secure AI model 47 | The role of AI in customer experience management 48 | The benefits of cloud-based IT management 49 | The impact of technology on the energy industry 50 | How to implement a successful AI-powered chatbot 51 | The role of AI in business intelligence 52 | The importance of data security in the digital age 53 | How to build a successful AI-driven product 54 | The future of technology in manufacturing 55 | How to create a secure cloud infrastructure 56 | The role of AI in fraud prevention 57 | The benefits of cloud-based project management tools 58 | The impact of technology on the construction industry 59 | How to implement a successful AI-driven sales strategy 60 | The role of AI in risk management 61 | The importance of cybersecurity in protecting financial data 62 | How to build a scalable blockchain solution 63 | The future of technology in retail 64 | How to create a secure data analytics platform 65 | The role of AI in supply chain management 66 | The benefits of cloud-based CRM systems 67 | The impact of technology on the healthcare industry 68 | How to implement a successful AI-driven HR strategy 69 | The role of AI in financial planning 70 | The importance of data privacy in business 71 | How to build a successful AI-powered platform 72 | The future of technology in education 73 | How to create a secure IoT ecosystem 74 | The role of AI in customer insights 75 | The benefits of cloud-based ERP systems 76 | The impact of technology on the legal industry 77 | How to implement a successful AI-driven marketing campaign 78 | The role of AI in operational efficiency 79 | The importance of cybersecurity in protecting intellectual property 80 | How to build a scalable AI infrastructure 81 | The future of technology in healthcare 82 | How to create a secure cloud-based application 83 | The role of AI in personalized learning 84 | The benefits of cloud-based storage solutions 85 | The impact of technology on the financial industry 86 | How to implement a successful AI-driven customer service strategy 87 | The role of AI in market analysis 88 | The importance of data integrity in business 89 | How to build a successful AI-driven product 90 | The future of technology in agriculture 91 | How to create a secure blockchain application 92 | The role of AI in business process optimization 93 | The benefits of cloud-based communication tools 94 | The impact of technology on the transportation industry 95 | How to implement a successful AI-driven sales strategy 96 | The role of AI in financial analysis 97 | The importance of cybersecurity in protecting customer data 98 | How to build a scalable cloud infrastructure 99 | The future of technology in retail 100 | How to create a secure data management system 101 | The role of AI in customer engagement 102 | The benefits of cloud-based collaboration tools 103 | The impact of technology on the energy industry 104 | How to implement a successful AI-driven marketing strategy 105 | The role of AI in business intelligence 106 | The importance of data security in the digital age 107 | How to build a successful AI-driven platform 108 | The future of technology in manufacturing 109 | How to create a secure cloud-based environment 110 | The role of AI in supply chain optimization 111 | The benefits of cloud-based project management tools 112 | The impact of technology on the construction industry 113 | How to implement a successful AI-driven HR strategy 114 | The role of AI in risk management 115 | The importance of cybersecurity in protecting financial data 116 | How to build a scalable AI solution 117 | The future of technology in healthcare 118 | How to create a secure cloud infrastructure 119 | The role of AI in personalized marketing 120 | The benefits of cloud-based CRM systems 121 | The impact of technology on the legal industry 122 | How to implement a successful AI-driven sales strategy 123 | The role of AI in operational efficiency 124 | The importance of cybersecurity in protecting intellectual property 125 | How to build a successful AI-powered platform 126 | The future of technology in education 127 | How to create a secure data analytics platform 128 | The role of AI in customer insights 129 | The benefits of cloud-based ERP systems 130 | The impact of technology on the financial industry 131 | How to implement a successful AI-driven customer service strategy 132 | The role of AI in market analysis 133 | The importance of data privacy in business 134 | How to build a successful AI-driven product 135 | The future of technology in agriculture 136 | How to create a secure blockchain application 137 | The role of AI in business process optimization 138 | The benefits of cloud-based communication tools 139 | The impact of technology on the transportation industry 140 | How to implement a successful AI-driven sales strategy 141 | The role of AI in financial analysis 142 | The importance of cybersecurity in protecting customer data 143 | How to build a scalable cloud infrastructure 144 | The future of technology in retail 145 | How to create a secure data management system 146 | The role of AI in customer engagement 147 | The benefits of cloud-based collaboration tools 148 | The impact of technology on the energy industry 149 | How to implement a successful AI-driven marketing strategy 150 | The role of AI in business intelligence 151 | The importance of data security in the digital age 152 | How to build a successful AI-driven platform 153 | The future of technology in manufacturing 154 | How to create a secure cloud-based environment 155 | The role of AI in supply chain optimization 156 | The benefits of cloud-based project management tools 157 | The impact of technology on the construction industry 158 | How to implement a successful AI-driven HR strategy 159 | The role of AI in risk management 160 | The importance of cybersecurity in protecting financial data 161 | How to build a scalable AI solution 162 | The future of technology in healthcare 163 | How to create a secure cloud infrastructure 164 | The role of AI in personalized marketing 165 | The benefits of cloud-based CRM systems 166 | The impact of technology on the legal industry 167 | How to implement a successful AI-driven sales strategy 168 | The role of AI in operational efficiency 169 | The importance of cybersecurity in protecting intellectual property 170 | How to build a successful AI-powered platform 171 | The future of technology in education 172 | How to create a secure data analytics platform 173 | The role of AI in customer insights 174 | The benefits of cloud-based ERP systems 175 | The impact of technology on the financial industry 176 | How to implement a successful AI-driven customer service strategy 177 | The role of AI in market analysis 178 | The importance of data privacy in business 179 | How to build a successful AI-driven product 180 | The future of technology in agriculture 181 | How to create a secure blockchain application 182 | The role of AI in business process optimization 183 | The benefits of cloud-based communication tools 184 | The impact of technology on the transportation industry 185 | How to implement a successful AI-driven sales strategy 186 | The role of AI in financial analysis 187 | The importance of cybersecurity in protecting customer data 188 | How to build a scalable cloud infrastructure 189 | The future of technology in retail 190 | How to create a secure data management system 191 | The role of AI in customer engagement 192 | The benefits of cloud-based collaboration tools 193 | The impact of technology on the energy industry 194 | How to implement a successful AI-driven marketing strategy 195 | The role of AI in business intelligence 196 | The importance of data security in the digital age 197 | How to build a successful AI-driven platform 198 | The future of technology in manufacturing 199 | How to create a secure cloud-based environment 200 | The role of AI in supply chain optimization 201 | The benefits of cloud-based project management tools 202 | The impact of technology on the construction industry 203 | How to implement a successful AI-driven HR strategy 204 | The role of AI in risk management 205 | The importance of cybersecurity in protecting financial data 206 | How to build a scalable AI solution 207 | The future of technology in healthcare 208 | How to create a secure cloud infrastructure 209 | The role of AI in personalized marketing 210 | The benefits of cloud-based CRM systems 211 | The impact of technology on the legal industry 212 | How to implement a successful AI-driven sales strategy 213 | The role of AI in operational efficiency 214 | The importance of cybersecurity in protecting intellectual property 215 | How to build a successful AI-powered platform 216 | The future of technology in education 217 | How to create a secure data analytics platform 218 | The role of AI in customer insights 219 | The benefits of cloud-based ERP systems 220 | The impact of technology on the financial industry 221 | How to implement a successful AI-driven customer service strategy 222 | The role of AI in market analysis 223 | The importance of data privacy in business 224 | How to build a successful AI-driven product 225 | The future of technology in agriculture 226 | How to create a secure blockchain application 227 | The role of AI in business process optimization 228 | The benefits of cloud-based communication tools 229 | The impact of technology on the transportation industry 230 | How to lead through change and uncertainty 231 | The role of a leader in conflict resolution 232 | How to develop a growth mindset in your team 233 | The importance of diversity and inclusion in leadership 234 | How to build trust with your team 235 | The impact of leadership on organizational performance 236 | How to mentor and develop future leaders 237 | The role of a leader in setting and achieving goals 238 | How to create a positive work environment 239 | The importance of resilience in leadership 240 | How to lead by example 241 | The role of a leader in fostering collaboration 242 | How to manage stress as a leader 243 | The impact of leadership on company culture 244 | How to develop a leadership pipeline 245 | The importance of transparency in leadership 246 | How to handle failure as a leader 247 | The role of a leader in decision making 248 | How to create a vision and mission for your team 249 | The importance of active listening in leadership 250 | How to inspire and motivate your team 251 | The role of a leader in managing remote teams 252 | How to develop leadership skills in your team 253 | The impact of leadership on employee retention 254 | How to lead with empathy 255 | The importance of accountability in leadership 256 | How to handle criticism as a leader 257 | The role of a leader in building a high-performing team 258 | How to develop a leadership style that works for you 259 | The importance of continuous learning in leadership 260 | How to manage conflict within your team 261 | The role of a leader in driving change 262 | How to build a strong leadership team 263 | The impact of leadership on team productivity 264 | How to lead with integrity 265 | The importance of setting clear expectations as a leader 266 | How to handle team dynamics as a leader 267 | The role of a leader in employee development 268 | How to create a culture of accountability 269 | The importance of feedback in leadership 270 | How to lead with confidence 271 | The role of a leader in strategic planning 272 | How to develop a leadership vision 273 | The importance of building relationships as a leader 274 | How to manage time effectively as a leader 275 | The role of a leader in managing change 276 | How to develop a leadership philosophy 277 | The importance of adaptability in leadership 278 | How to handle leadership challenges 279 | The role of a leader in fostering innovation 280 | How to develop leadership presence 281 | The importance of leadership development programs 282 | How to lead with authenticity 283 | The role of a leader in team building 284 | How to create a leadership development plan 285 | The importance of self-awareness in leadership 286 | How to handle leadership transitions 287 | The role of a leader in driving organizational success 288 | How to develop a leadership network 289 | The importance of ethical decision making in leadership 290 | How to lead with purpose 291 | The role of a leader in employee engagement 292 | How to develop leadership resilience 293 | The importance of leadership in crisis management 294 | How to create a leadership legacy 295 | The role of a leader in managing organizational change 296 | How to develop a leadership mindset 297 | The importance of leadership in driving innovation 298 | How to lead a diverse team 299 | The role of a leader in building a positive work culture 300 | How to develop leadership competencies 301 | The importance of leadership in achieving organizational goals 302 | How to lead with vision 303 | The role of a leader in managing team performance 304 | How to develop leadership agility 305 | The importance of leadership in fostering collaboration 306 | How to lead with humility 307 | The role of a leader in building a learning organization 308 | How to develop leadership influence 309 | The importance of leadership in managing change 310 | How to lead with clarity 311 | The role of a leader in driving business growth 312 | How to develop leadership accountability 313 | The importance of leadership in creating a positive work environment 314 | How to lead with passion 315 | The role of a leader in managing team dynamics 316 | How to develop leadership vision 317 | The importance of leadership in building trust 318 | How to lead with empathy and compassion 319 | The role of a leader in fostering a culture of innovation 320 | How to develop leadership self-awareness 321 | The importance of leadership in achieving business success 322 | How to lead with authenticity and integrity 323 | The role of a leader in managing conflict 324 | How to develop leadership adaptability 325 | The importance of leadership in driving employee engagement 326 | How to lead with purpose and vision 327 | The role of a leader in building a high-performing team 328 | How to develop leadership resilience and grit 329 | The importance of leadership in creating a culture of accountability 330 | How to lead with clarity and confidence 331 | The role of a leader in managing organizational change 332 | How to develop leadership presence and influence 333 | The importance of leadership in fostering collaboration 334 | How to lead with humility and empathy 335 | The role of a leader in building a learning organization 336 | How to develop leadership competencies and skills 337 | The importance of leadership in driving innovation 338 | How to lead with vision and purpose 339 | The role of a leader in managing team performance 340 | How to develop leadership agility and flexibility 341 | The importance of leadership in building trust and relationships 342 | How to lead with passion and enthusiasm 343 | The role of a leader in managing team dynamics and conflict 344 | How to develop leadership vision and strategy 345 | The importance of leadership in achieving organizational goals 346 | How to lead with empathy and compassion 347 | The role of a leader in fostering a culture of innovation 348 | How to develop leadership self-awareness and emotional intelligence 349 | The importance of leadership in achieving business success 350 | How to lead with authenticity and integrity 351 | The role of a leader in managing conflict and change 352 | How to develop leadership adaptability and resilience 353 | The importance of leadership in driving employee engagement 354 | How to lead with purpose and vision 355 | The role of a leader in building a high-performing team 356 | How to develop leadership accountability and responsibility 357 | The importance of leadership in creating a culture of accountability 358 | How to lead with clarity and confidence 359 | The role of a leader in managing organizational change 360 | How to develop leadership presence and influence 361 | The importance of leadership in fostering collaboration 362 | How to lead with humility and empathy 363 | The role of a leader in building a learning organization 364 | How to develop leadership competencies and skills 365 | The importance of leadership in driving innovation 366 | How to lead with vision and purpose 367 | The role of a leader in managing team performance 368 | How to develop leadership agility and flexibility 369 | The importance of leadership in building trust and relationships 370 | How to lead with passion and enthusiasm 371 | The role of a leader in managing team dynamics and conflict 372 | How to develop leadership vision and strategy 373 | The importance of leadership in achieving organizational goals 374 | How to lead with empathy and compassion 375 | The role of a leader in fostering a culture of innovation 376 | How to develop leadership self-awareness and emotional intelligence 377 | The importance of leadership in achieving business success 378 | How to lead with authenticity and integrity 379 | The role of a leader in managing conflict and change 380 | How to develop leadership adaptability and resilience 381 | The importance of leadership in driving employee engagement 382 | How to lead with purpose and vision 383 | The role of a leader in building a high-performing team 384 | How to develop leadership accountability and responsibility 385 | The importance of leadership in creating a culture of accountability 386 | How to lead with clarity and confidence 387 | The role of a leader in managing organizational change 388 | How to develop leadership presence and influence 389 | The importance of leadership in fostering collaboration 390 | How to lead with humility and empathy 391 | The role of a leader in building a learning organization 392 | How to develop leadership competencies and skills 393 | The importance of leadership in driving innovation 394 | How to lead with vision and purpose 395 | The role of a leader in managing team performance 396 | How to develop leadership agility and flexibility 397 | The importance of leadership in building trust and relationships 398 | How to lead with passion and enthusiasm 399 | The role of a leader in managing team dynamics and conflict 400 | How to develop leadership vision and strategy 401 | The importance of leadership in achieving organizational goals 402 | How to lead with empathy and compassion 403 | The role of a leader in fostering a culture of innovation 404 | How to develop leadership self-awareness and emotional intelligence 405 | The importance of leadership in achieving business success 406 | How to lead with authenticity and integrity 407 | The role of a leader in managing conflict and change 408 | How to develop leadership adaptability and resilience 409 | The importance of leadership in driving employee engagement 410 | How to lead with purpose and vision 411 | The role of a leader in building a high-performing team 412 | How to develop leadership accountability and responsibility 413 | The importance of leadership in creating a culture of accountability 414 | How to lead with clarity and confidence 415 | The role of a leader in managing organizational change 416 | How to develop leadership presence and influence 417 | The importance of leadership in fostering collaboration 418 | How to lead with humility and empathy 419 | The role of a leader in building a learning organization 420 | How to develop leadership competencies and skills 421 | The importance of leadership in driving innovation 422 | How to lead with vision and purpose 423 | The role of a leader in managing team performance 424 | How to develop leadership agility and flexibility 425 | The importance of leadership in building trust and relationships 426 | How to lead with passion and enthusiasm 427 | The role of a leader in managing team dynamics and conflict 428 | How to develop leadership vision and strategy 429 | The importance of leadership in achieving organizational goals 430 | How to lead with empathy and compassion 431 | The role of a leader in fostering a culture of innovation 432 | How to develop leadership self-awareness and emotional intelligence 433 | The importance of leadership in achieving business success 434 | How to lead with authenticity and integrity 435 | The role of a leader in managing conflict and change 436 | How to develop leadership adaptability and resilience 437 | The importance of leadership in driving employee engagement 438 | How to lead with purpose and vision 439 | The role of a leader in building a high-performing team 440 | How to develop leadership accountability and responsibility 441 | The importance of leadership in creating a culture of accountability 442 | How to lead with clarity and confidence 443 | The role of a leader in managing organizational change 444 | How to develop leadership presence and influence 445 | The importance of leadership in fostering collaboration 446 | How to lead with humility and empathy 447 | The role of a leader in building a learning organization 448 | How to develop leadership competencies and skills 449 | The importance of leadership in driving innovation 450 | How to lead with vision and purpose 451 | The role of a leader in managing team performance 452 | How to develop leadership agility and flexibility 453 | The importance of leadership in building trust and relationships 454 | How to lead with passion and enthusiasm 455 | The role of a leader in managing team dynamics and conflict 456 | How to develop leadership vision and strategy 457 | The importance of leadership in achieving organizational goals 458 | How to lead with empathy and compassion 459 | The role of a leader in fostering a culture of innovation 460 | How to develop leadership self-awareness and emotional intelligence 461 | The importance of leadership in achieving business success 462 | How to lead with authenticity and integrity 463 | The role of a leader in managing conflict and change 464 | How to develop leadership adaptability and resilience 465 | The importance of leadership in driving employee engagement 466 | How to lead with purpose and vision 467 | The role of a leader in building a high-performing team 468 | How to develop leadership accountability and responsibility 469 | The importance of leadership in creating a culture of accountability 470 | How to lead with clarity and confidence 471 | The role of a leader in managing organizational change 472 | How to develop leadership presence and influence 473 | The importance of leadership in fostering collaboration 474 | How to lead with humility and empathy 475 | The role of a leader in building a learning organization 476 | How to develop leadership competencies and skills 477 | The importance of leadership in driving innovation 478 | How to lead with vision and purpose 479 | The role of a leader in managing team performance 480 | How to develop leadership agility and flexibility 481 | The importance of leadership in building trust and relationships 482 | How to lead with passion and enthusiasm 483 | The role of a leader in managing team dynamics and conflict 484 | How to develop leadership vision and strategy 485 | The importance of leadership in achieving organizational goals 486 | How to lead with empathy and compassion 487 | The role of a leader in fostering a culture of innovation 488 | How to develop leadership self-awareness and emotional intelligence 489 | The importance of leadership in achieving business success 490 | How to lead with authenticity and integrity 491 | The role of a leader in managing conflict and change 492 | How to develop leadership adaptability and resilience 493 | The importance of leadership in driving employee engagement 494 | How to lead with purpose and vision 495 | The role of a leader in building a high-performing team 496 | How to develop leadership accountability and responsibility 497 | The importance of leadership in creating a culture of accountability 498 | How to lead with clarity and confidence 499 | The role of a leader in managing organizational change 500 | How to develop leadership presence and influence 501 | The importance of leadership in fostering collaboration 502 | How to lead with humility and empathy 503 | The role of a leader in building a learning organization 504 | How to develop leadership competencies and skills 505 | The importance of leadership in driving innovation 506 | How to lead with vision and purpose 507 | The role of a leader in managing team performance 508 | How to develop leadership agility and flexibility 509 | The importance of leadership in building trust and relationships 510 | How to lead with passion and enthusiasm 511 | The role of a leader in managing team dynamics and conflict 512 | How to develop leadership vision and strategy 513 | The importance of leadership in achieving organizational goals 514 | How to lead with empathy and compassion 515 | The role of a leader in fostering a culture of innovation 516 | How to develop leadership self-awareness and emotional intelligence 517 | The importance of leadership in achieving business success 518 | How to lead with authenticity and integrity 519 | The role of a leader in managing conflict and change 520 | How to develop leadership adaptability and resilience -------------------------------------------------------------------------------- /Topics_done.txt: -------------------------------------------------------------------------------- 1 | The future of artificial intelligence in everyday life 2 | How machine learning is transforming industries 3 | Blockchain technology beyond cryptocurrencies 4 | The impact of 5G on the Internet of Things (IoT) 5 | Cloud computing trends for 2024 6 | The rise of edge computing 7 | Cybersecurity in the era of remote work 8 | Quantum computing: What you need to know 9 | The role of big data in business decision-making 10 | How augmented reality is changing retail 11 | The benefits of virtual reality in training and education 12 | Autonomous vehicles: Are we there yet? 13 | The evolution of smart homes 14 | How wearable tech is improving health and fitness 15 | The ethics of AI and machine learning 16 | The importance of data privacy and protection 17 | How to implement a successful DevOps strategy 18 | The role of AI in healthcare innovation 19 | How to stay ahead in the ever-changing tech landscape 20 | Emerging trends in software development 21 | The impact of technology on the gig economy 22 | The benefits of hybrid cloud solutions 23 | How to leverage AI for customer service excellence 24 | The future of fintech and digital banking 25 | How technology is transforming supply chain management 26 | The rise of no-code and low-code development platforms 27 | The importance of upskilling in the tech industry 28 | The role of AI in cybersecurity 29 | How to create a data-driven culture in your organization 30 | The future of e-commerce: Trends to watch 31 | The impact of social media algorithms on user experience 32 | How to build a successful tech startup 33 | The importance of diversity in tech 34 | The role of AI in environmental sustainability 35 | How to implement AI in your business strategy 36 | The future of digital marketing: AI and beyond 37 | How blockchain is revolutionizing supply chains 38 | The importance of cybersecurity awareness training 39 | How to leverage big data for business growth 40 | The impact of technology on education 41 | The future of work in a tech-driven world 42 | How to navigate the challenges of digital transformation 43 | The role of AI in predictive analytics 44 | The benefits of cloud-native applications 45 | How to create a secure IoT ecosystem 46 | The impact of automation on the workforce 47 | How to foster innovation in your tech team 48 | The role of AI in content creation 49 | The importance of ethical hacking in cybersecurity 50 | How to choose the right technology stack for your business 51 | The future of video conferencing technology 52 | How AI is transforming customer relationship management 53 | The benefits of microservices architecture 54 | The impact of technology on the real estate industry 55 | How to implement a successful AI project 56 | The role of AI in fraud detection and prevention 57 | How to build a scalable cloud infrastructure 58 | The future of wearable technology 59 | The importance of digital literacy in the workplace 60 | How to protect your business from cyber threats 61 | The impact of AI on the finance industry 62 | How to create a culture of innovation in your tech team 63 | The role of AI in personalized marketing 64 | The benefits of serverless computing 65 | The future of augmented reality in gaming 66 | How to implement a successful digital transformation strategy 67 | The impact of technology on mental health 68 | How to create a secure cloud environment 69 | The role of AI in talent acquisition 70 | The importance of data-driven decision making 71 | How to build a successful AI-powered product 72 | -------------------------------------------------------------------------------- /browser.py: -------------------------------------------------------------------------------- 1 | import os 2 | import re 3 | import time 4 | import random 5 | from selenium import webdriver 6 | from selenium.webdriver.common.keys import Keys 7 | from selenium.webdriver.common.by import By 8 | from selenium.webdriver.chrome.service import Service 9 | from selenium.webdriver.chrome.options import Options 10 | from webdriver_manager.chrome import ChromeDriverManager 11 | from selenium.webdriver.support.ui import WebDriverWait 12 | from selenium.webdriver.support import expected_conditions as EC 13 | from dotenv import load_dotenv 14 | import google.generativeai as genai 15 | import logging 16 | 17 | load_dotenv() 18 | 19 | # Configure logging 20 | logging.basicConfig( 21 | level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" 22 | ) 23 | 24 | class LinkedInBot: 25 | def __init__(self): 26 | self.driver = self.setup_driver() 27 | self.login() 28 | 29 | def setup_driver(self): 30 | """Sets up the Chrome WebDriver with necessary options.""" 31 | chrome_options = Options() 32 | chrome_options.add_argument("--no-sandbox") 33 | chrome_options.add_argument("--disable-dev-shm-usage") 34 | chrome_options.add_argument("--disable-blink-features=AutomationControlled") 35 | chrome_options.add_argument("--headless") 36 | chrome_options.add_argument("start-maximized") 37 | chrome_options.add_argument("disable-infobars") 38 | chrome_options.add_argument("--disable-extensions") 39 | chrome_options.add_argument( 40 | "user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" 41 | ) 42 | service = Service(ChromeDriverManager().install()) 43 | driver = webdriver.Chrome(service=service, options=chrome_options) 44 | driver.execute_script( 45 | "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})" 46 | ) 47 | return driver 48 | 49 | def random_delay(self, min_delay=1, max_delay=3): 50 | """Introduce a random delay to mimic human behavior.""" 51 | time.sleep(random.uniform(min_delay, max_delay)) 52 | 53 | def login(self): 54 | """Logs into LinkedIn using credentials from environment variables.""" 55 | self.driver.get("https://www.linkedin.com/login") 56 | WebDriverWait(self.driver, 10).until( 57 | EC.presence_of_element_located((By.ID, "username")) 58 | ) 59 | 60 | username_field = self.driver.find_element(By.ID, "username") 61 | password_field = self.driver.find_element(By.ID, "password") 62 | 63 | # Mimic human typing by sending keys with delays 64 | for char in os.getenv("LINKEDIN_USERNAME"): 65 | username_field.send_keys(char) 66 | self.random_delay(0.1, 0.3) 67 | self.random_delay() 68 | 69 | for char in os.getenv("LINKEDIN_PASSWORD"): 70 | password_field.send_keys(char) 71 | self.random_delay(0.1, 0.3) 72 | self.random_delay() 73 | 74 | password_field.send_keys(Keys.RETURN) 75 | self.random_delay(5, 7) 76 | 77 | # Check for verification code input form 78 | try: 79 | verification_form = WebDriverWait(self.driver, 10).until( 80 | EC.presence_of_element_located((By.ID, "email-pin-challenge")) 81 | ) 82 | logging.info("Verification code required. Prompting user for input.") 83 | verification_code = input("Enter the verification code sent to your email: ") 84 | 85 | # Enter the verification code 86 | code_input = self.driver.find_element(By.ID, "input__email_verification_pin") 87 | code_input.send_keys(verification_code) 88 | 89 | # Submit the verification form 90 | submit_button = self.driver.find_element(By.ID, "email-pin-submit-button") 91 | submit_button.click() 92 | 93 | # Wait for the process to complete and navigate to the feed section 94 | self.random_delay(10, 12) 95 | self.driver.get("https://www.linkedin.com/feed/") 96 | logging.info("Logged in and navigated to the feed section.") 97 | except Exception as e: 98 | logging.info("Verification code not required or error occurred.") 99 | pass 100 | 101 | def remove_markdown(self, text, ignore_hashtags=False): 102 | """Removes markdown syntax from a given text string.""" 103 | patterns = [ 104 | r"(\*{1,2})(.*?)\1", # Bold and italics 105 | r"\[(.*?)\]\((.*?)\)", # Links 106 | r"`(.*?)`", # Inline code 107 | r"(\n\s*)- (.*)", # Unordered lists (with `-`) 108 | r"(\n\s*)\* (.*)", # Unordered lists (with `*`) 109 | r"(\n\s*)[0-9]+\. (.*)", # Ordered lists 110 | r"(#+)(.*)", # Headings 111 | r"(>+)(.*)", # Blockquotes 112 | r"(---|\*\*\*)", # Horizontal rules 113 | r"!\[(.*?)\]\((.*?)\)", # Images 114 | ] 115 | 116 | # If ignoring hashtags, remove the heading pattern 117 | if ignore_hashtags: 118 | patterns.remove(r"(#+)(.*)") 119 | 120 | # Replace markdown elements with an empty string 121 | for pattern in patterns: 122 | text = re.sub( 123 | pattern, r" ", text 124 | ) 125 | 126 | return text.strip() 127 | 128 | def generate_post_content(self, topic): 129 | """Generates post content using Gemini AI based on the given topic.""" 130 | logging.info(f"Generating post content for topic: {topic}") 131 | try: 132 | genai.configure(api_key=os.getenv("GEMINI_API_KEY")) 133 | client = genai.GenerativeModel("gemini-pro") 134 | 135 | messages = [ 136 | { 137 | "role": "user", 138 | "parts": [ 139 | f"Generate a LinkedIn post with a minimum amount of 1000 characters about the following topic and do not forget to add suitable hastags: {topic}. Start with a captivating introduction that grabs the reader's attention. Develop a compelling thesis statement that clearly articulates the main argument of the post and support it with strong evidence and logical reasoning. Ensure the post is engaging, relatable, and structured with clear sections or headings. Include experts experiences, emotions, and specific scenarios or examples that support the topic. Provide detailed case studies or examples showing the impact of this topic in various contexts or industries. Delve into relevant technical aspects or processes if applicable. Support the claims with statistics or data points. Conclude with a call to action that encourages readers to learn more or take specific steps related to the topic. The post should read like it was written by a human and resonate with the readers." 140 | ], 141 | } 142 | ] 143 | 144 | post_response = client.generate_content(messages) 145 | 146 | if post_response.text: 147 | post_text = self.remove_markdown( 148 | post_response.text, ignore_hashtags=True 149 | ) 150 | else: 151 | post_text = f"Excited to share some thoughts on {topic}! #technology #leadership" 152 | except Exception as e: 153 | logging.error("Failed to generate post content.", exc_info=True) 154 | post_text = f"Excited to share some thoughts on {topic}! #technology #leadership" 155 | 156 | return post_text 157 | 158 | def close_overlapping_elements(self): 159 | try: 160 | # Close chat overlay 161 | chat_overlay_close_button = self.driver.find_element(By.XPATH, "//button[contains(@class, 'msg-overlay-bubble-header__control--close')]") 162 | chat_overlay_close_button.click() 163 | self.random_delay() 164 | except Exception as e: 165 | logging.info("No chat overlay to close.") 166 | 167 | try: 168 | # Close any other notification or modal 169 | notification_overlay_close_button = self.driver.find_element(By.XPATH, "//button[contains(@class, 'artdeco-modal__dismiss')]") 170 | notification_overlay_close_button.click() 171 | self.random_delay() 172 | except Exception as e: 173 | logging.info("No notification or modal overlay to close.") 174 | 175 | 176 | def post_to_linkedin(self, post_text): 177 | """Posts the generated content to LinkedIn.""" 178 | logging.info("Posting to LinkedIn.") 179 | try: 180 | # Close overlapping elements 181 | self.close_overlapping_elements() 182 | 183 | # Wait for the "Start a post" button to be clickable and click it using JavaScript 184 | start_post_button = WebDriverWait(self.driver, 20).until( 185 | EC.element_to_be_clickable((By.XPATH, "//button[contains(., 'Start a post')]")) 186 | ) 187 | 188 | self.driver.execute_script("arguments[0].click();", start_post_button) 189 | 190 | # Wait a moment for animation or modal dialogs to appear 191 | time.sleep(2) 192 | 193 | # Assuming the text area for the post becomes visible after clicking the button: 194 | post_text_area = WebDriverWait(self.driver, 10).until( 195 | EC.visibility_of_element_located((By.CSS_SELECTOR, "div[role='textbox']")) 196 | ) 197 | 198 | # Click the text area to focus and start typing a post 199 | post_text_area.click() 200 | self.driver.execute_script( 201 | "arguments[0].innerText = arguments[1];", post_text_area, post_text 202 | ) 203 | 204 | # Optionally, you can search for the 'Post' button and click it to publish 205 | post_button = WebDriverWait(self.driver, 10).until( 206 | EC.element_to_be_clickable( 207 | ( 208 | By.XPATH, 209 | "//button[contains(@class, 'share-actions__primary-action')]", 210 | ) 211 | ) 212 | ) 213 | self.driver.execute_script("arguments[0].click();", post_button) 214 | 215 | logging.info("Post successful.") 216 | return True 217 | except Exception as e: 218 | logging.error("Failed to post to LinkedIn.", exc_info=True) 219 | return False 220 | 221 | def process_topics(self): 222 | """Processes the first topic from Topics.txt, posts it to LinkedIn, and updates the files accordingly.""" 223 | try: 224 | with open("Topics.txt", "r") as file: 225 | topics = file.readlines() 226 | 227 | if not topics: 228 | logging.info("No topics to process.") 229 | return 230 | 231 | # Get the first topic 232 | topic = topics[0].strip() 233 | if not topic: 234 | logging.info("The first topic is empty.") 235 | return 236 | 237 | post_text = self.generate_post_content(topic) 238 | if self.post_to_linkedin(post_text): 239 | with open("Topics_done.txt", "a") as done_file: 240 | done_file.write(topic + "\n") 241 | logging.info(f"Topic posted and saved to Topics_done.txt: {topic}") 242 | 243 | # Remove the posted topic from Topics.txt 244 | with open("Topics.txt", "w") as file: 245 | file.writelines(topics[1:]) 246 | logging.info("First topic removed from Topics.txt.") 247 | else: 248 | logging.info(f"Failed to post topic: {topic}") 249 | self.random_delay(5, 10) 250 | 251 | except Exception as e: 252 | logging.error("An error occurred while processing topics.", exc_info=True) 253 | 254 | if __name__ == "__main__": 255 | bot = LinkedInBot() 256 | try: 257 | bot.process_topics() 258 | time.sleep(5) 259 | finally: 260 | bot.driver.quit() 261 | logging.info("Driver session ended cleanly.") 262 | 263 | # import os 264 | # import re 265 | # import time 266 | # import random 267 | # from selenium import webdriver 268 | # from selenium.webdriver.common.keys import Keys 269 | # from selenium.webdriver.common.by import By 270 | # from selenium.webdriver.chrome.service import Service 271 | # from selenium.webdriver.chrome.options import Options 272 | # from webdriver_manager.chrome import ChromeDriverManager 273 | # from selenium.webdriver.support.ui import WebDriverWait 274 | # from selenium.webdriver.support import expected_conditions as EC 275 | # from dotenv import load_dotenv 276 | # import google.generativeai as genai 277 | # import logging 278 | 279 | # load_dotenv() 280 | 281 | # # Configure logging 282 | # logging.basicConfig( 283 | # level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" 284 | # ) 285 | 286 | 287 | # class LinkedInBot: 288 | # """ 289 | # A class representing a bot for interacting with LinkedIn, capable of liking posts, 290 | # commenting based on sentiment analysis and content relevance, and navigating LinkedIn's interface. 291 | # """ 292 | 293 | # def __init__(self): 294 | # self.driver = self.setup_driver() 295 | # self.login() 296 | 297 | # def setup_driver(self): 298 | # """Sets up the Chrome WebDriver with necessary options.""" 299 | # chrome_options = Options() 300 | # chrome_options.add_argument("--no-sandbox") 301 | # chrome_options.add_argument("--disable-dev-shm-usage") 302 | # chrome_options.add_argument("--disable-blink-features=AutomationControlled") 303 | # # chrome_options.add_argument("--headless") 304 | # chrome_options.add_argument("start-maximized") 305 | # chrome_options.add_argument("disable-infobars") 306 | # chrome_options.add_argument("--disable-extensions") 307 | # chrome_options.add_argument( 308 | # "user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" 309 | # ) 310 | # service = Service(ChromeDriverManager().install()) 311 | # driver = webdriver.Chrome(service=service, options=chrome_options) 312 | # driver.execute_script( 313 | # "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})" 314 | # ) 315 | # return driver 316 | 317 | # def random_delay(self, min_delay=1, max_delay=3): 318 | # """Introduce a random delay to mimic human behavior.""" 319 | # time.sleep(random.uniform(min_delay, max_delay)) 320 | 321 | # def login(self): 322 | # """Logs into LinkedIn using credentials from environment variables.""" 323 | # self.driver.get("https://www.linkedin.com/login") 324 | # WebDriverWait(self.driver, 10).until( 325 | # EC.presence_of_element_located((By.ID, "username")) 326 | # ) 327 | 328 | # username_field = self.driver.find_element(By.ID, "username") 329 | # password_field = self.driver.find_element(By.ID, "password") 330 | 331 | # # Mimic human typing by sending keys with delays 332 | # for char in os.getenv("LINKEDIN_USERNAME"): 333 | # username_field.send_keys(char) 334 | # self.random_delay(0.1, 0.3) 335 | # self.random_delay() 336 | 337 | # for char in os.getenv("LINKEDIN_PASSWORD"): 338 | # password_field.send_keys(char) 339 | # self.random_delay(0.1, 0.3) 340 | # self.random_delay() 341 | 342 | # password_field.send_keys(Keys.RETURN) 343 | # self.random_delay(5, 7) 344 | 345 | 346 | # def remove_markdown(self, text, ignore_hashtags=False): 347 | # """ 348 | # Removes markdown syntax from a given text string. 349 | 350 | # Args: 351 | # text: The text string potentially containing markdown syntax. 352 | # ignore_hashtags: Boolean flag to ignore hashtags while removing markdown. 353 | 354 | # Returns: 355 | # The text string with markdown syntax removed. 356 | # """ 357 | 358 | # patterns = [ 359 | # r"(\*{1,2})(.*?)\1", # Bold and italics 360 | # r"\[(.*?)\]\((.*?)\)", # Links 361 | # r"`(.*?)`", # Inline code 362 | # r"(\n\s*)- (.*)", # Unordered lists (with `-`) 363 | # r"(\n\s*)\* (.*)", # Unordered lists (with `*`) 364 | # r"(\n\s*)[0-9]+\. (.*)", # Ordered lists 365 | # r"(#+)(.*)", # Headings 366 | # r"(>+)(.*)", # Blockquotes 367 | # r"(---|\*\*\*)", # Horizontal rules 368 | # r"!\[(.*?)\]\((.*?)\)", # Images 369 | # ] 370 | 371 | # # If ignoring hashtags, remove the heading pattern 372 | # if ignore_hashtags: 373 | # patterns.remove(r"(#+)(.*)") 374 | 375 | # # Replace markdown elements with an empty string 376 | # for pattern in patterns: 377 | # text = re.sub( 378 | # pattern, r" ", text 379 | # ) 380 | # # Extracts the inner content (group 2) if available 381 | 382 | # return text.strip() 383 | 384 | # def generate_post_content(self, topic): 385 | # """Generates post content using Gemini AI based on the given topic.""" 386 | # logging.info(f"Generating post content for topic: {topic}") 387 | # try: 388 | # genai.configure(api_key=os.getenv("GEMINI_API_KEY")) 389 | # client = genai.GenerativeModel("gemini-pro") 390 | 391 | # messages = [ 392 | # { 393 | # "role": "user", 394 | # "parts": [ 395 | # f"Generate a LinkedIn post with a minimum amount of 1000 characters about the following topic and do not forget to add suitable hastags: {topic}. Start with a captivating introduction that grabs the reader's attention. Develop a compelling thesis statement that clearly articulates the main argument of the post and support it with strong evidence and logical reasoning. Ensure the post is engaging, relatable, and structured with clear sections or headings. Include experts experiences, emotions, and specific scenarios or examples that support the topic. Provide detailed case studies or examples showing the impact of this topic in various contexts or industries. Delve into relevant technical aspects or processes if applicable. Support the claims with statistics or data points. Conclude with a call to action that encourages readers to learn more or take specific steps related to the topic. The post should read like it was written by a human and resonate with the readers." 396 | 397 | # ], 398 | # } 399 | # ] 400 | 401 | # post_response = client.generate_content(messages) 402 | 403 | # if post_response.text: 404 | # post_text = self.remove_markdown( 405 | # post_response.text, ignore_hashtags=True 406 | # ) 407 | # else: 408 | # post_text = f"Excited to share some thoughts on {topic}! #technology #leadership" 409 | # except Exception as e: 410 | # logging.error("Failed to generate post content.", exc_info=True) 411 | # post_text = f"Excited to share some thoughts on {topic}! #technology #leadership" 412 | 413 | # return post_text 414 | 415 | # def post_to_linkedin(self, post_text): 416 | # """Posts the generated content to LinkedIn.""" 417 | # logging.info("Posting to LinkedIn.") 418 | # try: 419 | # # Wait for the "Start a post" button to be clickable and click it 420 | # start_post_button = WebDriverWait(self.driver, 20).until( 421 | # EC.element_to_be_clickable((By.XPATH, "//button[contains(., 'Start a post')]")) 422 | # ) 423 | 424 | # start_post_button.click() 425 | 426 | # # Wait a moment for animation or modal dialogs to appear 427 | # time.sleep(2) 428 | 429 | # # Assuming the text area for the post becomes visible after clicking the button: 430 | # post_text_area = WebDriverWait(self.driver, 10).until( 431 | # EC.visibility_of_element_located((By.CSS_SELECTOR, "div[role='textbox']")) 432 | # ) 433 | 434 | # # Click the text area to focus and start typing a post 435 | # post_text_area.click() 436 | # self.driver.execute_script( 437 | # "arguments[0].innerText = arguments[1];", post_text_area, post_text 438 | # ) 439 | 440 | # # Optionally, you can search for the 'Post' button and click it to publish 441 | # post_button = WebDriverWait(self.driver, 10).until( 442 | # EC.element_to_be_clickable( 443 | # ( 444 | # By.XPATH, 445 | # "//button[contains(@class, 'share-actions__primary-action')]", 446 | # ) 447 | # ) 448 | # ) 449 | # post_button.click() 450 | 451 | # logging.info("Post successful.") 452 | # return True 453 | # except Exception as e: 454 | # logging.error("Failed to post to LinkedIn.", exc_info=True) 455 | # return False 456 | 457 | # def process_topics(self): 458 | # """Processes the first topic from Topics.txt, posts it to LinkedIn, and updates the files accordingly.""" 459 | # try: 460 | # with open("Topics.txt", "r") as file: 461 | # topics = file.readlines() 462 | 463 | # if not topics: 464 | # logging.info("No topics to process.") 465 | # return 466 | 467 | # # Get the first topic 468 | # topic = topics[0].strip() 469 | # if not topic: 470 | # logging.info("The first topic is empty.") 471 | # return 472 | 473 | # post_text = self.generate_post_content(topic) 474 | # print(post_text) 475 | # if self.post_to_linkedin(post_text): 476 | # with open("Topics_done.txt", "a") as done_file: 477 | # done_file.write(topic + "\n") 478 | # logging.info(f"Topic posted and saved to Topics_done.txt: {topic}") 479 | 480 | # # Remove the posted topic from Topics.txt 481 | # with open("Topics.txt", "w") as file: 482 | # file.writelines(topics[1:]) 483 | # logging.info("First topic removed from Topics.txt.") 484 | # else: 485 | # logging.info(f"Failed to post topic: {topic}") 486 | # self.random_delay(5, 10) 487 | 488 | # except Exception as e: 489 | # logging.error("An error occurred while processing topics.", exc_info=True) 490 | 491 | 492 | # if __name__ == "__main__": 493 | # bot = LinkedInBot() 494 | # try: 495 | # bot.process_topics() 496 | # time.sleep(5) 497 | # finally: 498 | # time.sleep(50) 499 | # bot.driver.quit() # Ensure the driver is quit properly 500 | # logging.info("Driver session ended cleanly.") 501 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | selenium 2 | requests 3 | webdriver-manager 4 | python-dotenv 5 | google-generativeai 6 | beautifulsoup4 7 | scrapy 8 | scrapy-selenium 9 | scrapy-playwright -------------------------------------------------------------------------------- /utils.py: -------------------------------------------------------------------------------- 1 | import os 2 | import re 3 | import time 4 | import random 5 | from selenium import webdriver 6 | from selenium.webdriver.common.keys import Keys 7 | from selenium.webdriver.common.by import By 8 | from selenium.webdriver.chrome.service import Service 9 | from selenium.webdriver.chrome.options import Options 10 | from webdriver_manager.chrome import ChromeDriverManager 11 | from selenium.webdriver.support.ui import WebDriverWait 12 | from selenium.webdriver.support import expected_conditions as EC 13 | from dotenv import load_dotenv 14 | from bs4 import BeautifulSoup 15 | import google.generativeai as genai 16 | import logging 17 | from selenium.common.exceptions import ( 18 | TimeoutException, 19 | ElementClickInterceptedException, 20 | ) 21 | from selenium.webdriver.common.action_chains import ActionChains 22 | from random import choice # Import the choice function 23 | 24 | load_dotenv() 25 | 26 | # Configure logging 27 | logging.basicConfig( 28 | level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" 29 | ) 30 | 31 | # Include CV information in the prompt 32 | cv_info = ( 33 | "Joseph Edomobi\n" 34 | "godfreydjoseph@gmail.com" 35 | "Full-Stack Web Developer (Backend Heavy)\n" 36 | "GitHub | LinkedIn\n\n" 37 | "WORK EXPERIENCES\n" 38 | "27th Development LLC | Link\n" 39 | "Full-Stack Developer\n" 40 | "January 2023 - March 2023\n" 41 | "- Improved User Experience: Upgraded a real estate platform using Node.js and React.js, leading to a 35% increase in user engagement and halving page load times.\n" 42 | "- Boosted Customer Retention: Added efficient third-party integrations that improved customer satisfaction by 45% and increased repeat business by 20%.\n" 43 | "- Enhanced Scalability: Used AWS to scale up the backend, doubling user capacity and maintaining near-perfect uptime.\n" 44 | "- Strengthened Security: Overhauled the codebase with a team, putting in place security measures that prevented data breaches and saved the company thousands in damages.\n" 45 | "- Improved Code Quality: Introduced advanced testing practices that made code more reliable and reduced debugging time by 30%.\n" 46 | "- Increased Productivity: Fostered a culture of innovation that empowered the team to deliver projects faster and more accurately.\n\n" 47 | "XENDPAL | Link\n" 48 | "Full-Stack Developer\n" 49 | "July 2023 - August 2023\n" 50 | "- Secured User Data: Created secure REST APIs and authentication systems, protecting data for over 1,000 users and preventing potential breaches that could have resulted in significant cyber damage.\n" 51 | "- Optimized Storage Costs: Designed a cost-effective AWS S3 storage solution that maintained nearly 100% uptime while improving reliability and reducing costs.\n" 52 | "- Accelerated Development: Adopted agile methodologies, boosting team productivity by 40% and enabling faster feature rollouts that enhanced user experience.\n" 53 | "- Enhanced System Scalability: Implemented a scalable architecture that increased system capacity and improved performance during peak usage.\n" 54 | "- Improved Code Quality: Led testing and code review initiatives, significantly reducing bugs and improving the reliability and maintainability of the codebase.\n" 55 | "- Strengthened Data Integration: Developed efficient data models and ensured seamless data integration between services, contributing to a smoother user experience.\n\n" 56 | "VOLUNTEER AND OPEN SOURCE PROJECTS\n" 57 | "Xendpal-magic Library | Link\n" 58 | "Creator and Maintainer\n" 59 | "March 2024\n" 60 | "- Engineered and released a Python library for precise file type detection, leveraging both extension and signature-based methods, attracting over 500 downloads within the first month of launch.\n" 61 | "- Facilitated dynamic file identification across 150+ file types with a system that supports extension, MIME type, and detailed description outputs, significantly reducing misidentification issues commonly found in existing solutions.\n" 62 | "- Spearheaded the end-to-end project management process, from conceptualization to deployment, including the development of a robust documentation and testing framework, resulting in a 40% increase in detection accuracy over traditional methods.\n" 63 | "- Cultivated an open-source community around the library, leading to 10 contributed improvements and extensions within the first three months, enhancing the library’s versatility and application in real-world scenarios.\n\n" 64 | "FastAPI Project | Link\n" 65 | "Creator and Maintainer\n" 66 | "- Rapid Setup: Offers a detailed FastAPI project structure, drastically cutting down development time while promoting best practices.\n" 67 | "- Secure Authentication: Implements OAuth2 with JWT for robust user access control.\n" 68 | "- Efficient Data Handling: Integrates PostgreSQL for durable data storage and Pydantic models for accurate data validation.\n" 69 | "- Dockerization: Utilizes Docker for consistent application performance across various environments.\n" 70 | "- Built for Growth: Designed with scalability in mind to smoothly accommodate expanding project requirements.\n\n" 71 | "SKILLS AND TECHNOLOGIES\n" 72 | "- Programming Languages: Python, JavaScript, SQL\n" 73 | "- Web Frameworks: Django, Flask, FastAPI\n" 74 | "- Web Scraping Libraries: Scrapy, Selenium, Playwright\n" 75 | "- Frontend Technologies: Vue.js, Quasar, React.js, HTML, CSS\n" 76 | "- Database Management: PostgreSQL, MySQL, MariaDB\n" 77 | "- State Management: Pinia, Vuex, Redux, Context API\n" 78 | "- Tools / Platforms: Nginx, Docker, Linux, Amazon AWS, Google Cloud, Microsoft Azure\n" 79 | "- Other Technologies: Prompt Engineering with ChatGPT, Shell Scripting, Version Control with Git, Pytest\n" 80 | ) 81 | 82 | 83 | class LinkedInBot: 84 | """ 85 | A class representing a bot for interacting with LinkedIn, capable of liking posts, 86 | commenting based on sentiment analysis and content relevance, and navigating LinkedIn's interface. 87 | """ 88 | 89 | def __init__(self): 90 | self.driver = self.setup_driver() 91 | self.login() 92 | self.posts_data = [] 93 | 94 | def setup_driver(self): 95 | """Sets up the Chrome WebDriver with necessary options.""" 96 | chrome_options = Options() 97 | chrome_options.add_argument("--no-sandbox") 98 | chrome_options.add_argument("--disable-dev-shm-usage") 99 | chrome_options.add_argument("--disable-blink-features=AutomationControlled") 100 | chrome_options.add_argument("start-maximized") 101 | chrome_options.add_argument("disable-infobars") 102 | chrome_options.add_argument("--disable-extensions") 103 | chrome_options.add_argument( 104 | "user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" 105 | ) 106 | service = Service(ChromeDriverManager().install()) 107 | driver = webdriver.Chrome(service=service, options=chrome_options) 108 | driver.execute_script( 109 | "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})" 110 | ) 111 | return driver 112 | 113 | def random_delay(self, min_delay=1, max_delay=3): 114 | """Introduce a random delay to mimic human behavior.""" 115 | time.sleep(random.uniform(min_delay, max_delay)) 116 | 117 | def login(self): 118 | """Logs into LinkedIn using credentials from environment variables.""" 119 | self.driver.get("https://www.linkedin.com/login") 120 | WebDriverWait(self.driver, 10).until( 121 | EC.presence_of_element_located((By.ID, "username")) 122 | ) 123 | 124 | username_field = self.driver.find_element(By.ID, "username") 125 | password_field = self.driver.find_element(By.ID, "password") 126 | 127 | # Mimic human typing by sending keys with delays 128 | for char in os.getenv("LINKEDLN_USERNAME"): 129 | username_field.send_keys(char) 130 | self.random_delay(0.1, 0.3) 131 | self.random_delay() 132 | 133 | for char in os.getenv("LINKEDLN_PASSWORD"): 134 | password_field.send_keys(char) 135 | self.random_delay(0.1, 0.3) 136 | self.random_delay() 137 | 138 | password_field.send_keys(Keys.RETURN) 139 | self.random_delay(5, 7) 140 | 141 | # Pause to allow manual entry of the verification code 142 | logging.info("Waiting for manual entry of the verification code.") 143 | # time.sleep(30) # Wait for 30 seconds for manual verification code entry 144 | 145 | logging.info("Resuming automation after manual verification code entry.") 146 | self.refresh_page() 147 | 148 | def refresh_page(self): 149 | logging.info("Refreshing the current page.") 150 | self.driver.refresh() 151 | self.random_delay(2, 5) 152 | 153 | def fetch_and_store_content(self): 154 | logging.info("Fetching and storing content from LinkedIn posts.") 155 | try: 156 | posts = self.driver.find_elements(By.CSS_SELECTOR, "div[data-id]") 157 | for post in posts: 158 | post_id = post.get_attribute("data-id") 159 | post_html = post.get_attribute("outerHTML") 160 | self.posts_data.append({"id": post_id, "html": post_html}) 161 | logging.info(f"Content fetched for {len(self.posts_data)} posts.") 162 | except Exception as e: 163 | logging.error("Failed to fetch and store content.", exc_info=True) 164 | 165 | def remove_markdown(self, text): 166 | """ 167 | Removes markdown syntax from a given text string. 168 | 169 | Args: 170 | text: The text string potentially containing markdown syntax. 171 | 172 | Returns: 173 | The text string with markdown syntax removed. 174 | """ 175 | 176 | patterns = [ 177 | r"(\*{1,2})(.*?)\1", # Bold and italics 178 | r"\[(.*?)\]\((.*?)\)", # Links 179 | r"`(.*?)`", # Inline code 180 | r"(\n\s*)- (.*)", # Unordered lists (with `-`) 181 | r"(\n\s*)\* (.*)", # Unordered lists (with `*`) 182 | r"(\n\s*)[0-9]+\. (.*)", # Ordered lists 183 | r"(#+)(.*)", # Headings 184 | r"(>+)(.*)", # Blockquotes 185 | r"(---|\*\*\*)", # Horizontal rules 186 | r"!\[(.*?)\]\((.*?)\)", # Images 187 | ] 188 | 189 | # Replace markdown elements with an empty string 190 | for pattern in patterns: 191 | text = re.sub( 192 | pattern, r" ", text 193 | ) # Extracts the inner content (group 2) if available 194 | 195 | return text.strip() 196 | 197 | def comment_on_post(self, post, comment_text): 198 | logging.info(f"Attempting to comment on post {post['id']}.") 199 | try: 200 | comment_button = WebDriverWait(self.driver, 22).until( 201 | EC.element_to_be_clickable( 202 | ( 203 | By.XPATH, 204 | f"//div[@data-id='{post['id']}']//button[contains(@aria-label, 'Comment')]", 205 | ) 206 | ) 207 | ) 208 | ActionChains(self.driver).move_to_element( 209 | comment_button 210 | ).perform() # Ensures the button is in view 211 | comment_button.click() 212 | self.random_delay() 213 | 214 | comment_input = WebDriverWait(self.driver, 22).until( 215 | EC.visibility_of_element_located( 216 | (By.XPATH, f"//div[@data-id='{post['id']}']//div[@role='textbox']") 217 | ) 218 | ) 219 | self.driver.execute_script( 220 | "arguments[0].innerText = arguments[1];", 221 | comment_input, 222 | comment_text.strip('"'), 223 | ) 224 | self.random_delay() 225 | 226 | post_comment_button = WebDriverWait(self.driver, 22).until( 227 | EC.element_to_be_clickable( 228 | ( 229 | By.XPATH, 230 | f"//div[@data-id='{post['id']}']//button[contains(@class, 'comments-comment-box__submit-button') and .//span[text()='Post']]", 231 | ) 232 | ) 233 | ) 234 | post_comment_button.click() 235 | logging.info(f"Comment posted successfully on post {post['id']}.") 236 | except Exception as e: 237 | logging.error( 238 | f"Failed to comment on post {post['id']}: {str(e)}", exc_info=True 239 | ) 240 | 241 | def like_post(self, post): 242 | logging.info(f"Attempting to like post {post['id']}.") 243 | try: 244 | like_button = WebDriverWait(self.driver, 22).until( 245 | EC.element_to_be_clickable( 246 | ( 247 | By.XPATH, 248 | f"//div[@data-id='{post['id']}']//button[contains(@aria-label, 'Like')]", 249 | ) 250 | ) 251 | ) 252 | 253 | # Scroll to the "Like" button to ensure it's visible 254 | self.driver.execute_script( 255 | "arguments[0].scrollIntoView(true);", like_button 256 | ) 257 | 258 | # Click the button via JavaScript if interception is detected 259 | if like_button.get_attribute("aria-pressed") == "false": 260 | try: 261 | like_button.click() 262 | except ElementClickInterceptedException: 263 | self.driver.execute_script("arguments[0].click();", like_button) 264 | 265 | logging.info(f"Post {post['id']} liked successfully!") 266 | self.random_delay( 267 | 3, 5 268 | ) # Pause to simulate user behavior and avoid rapid-fire actions 269 | except TimeoutException: 270 | logging.error( 271 | f"Failed to find or click the Like button for post {post['id']} within the timeout period." 272 | ) 273 | except Exception as e: 274 | logging.error(f"Failed to like post {post['id']}: {str(e)}", exc_info=True) 275 | 276 | def generate_comment_based_on_content(self, post_text): 277 | logging.info("Generating comment based on content analysis.") 278 | try: 279 | genai.configure(api_key=os.getenv("GEMINI_API_KEY")) 280 | client = genai.GenerativeModel("gemini-pro") 281 | 282 | messages = [ 283 | { 284 | "role": "user", 285 | "parts": [ 286 | f"Based on the following background information, generate a LinkedIn post that talks about a tech-related topic in a way that reflects my professional background and expertise, without making it sound like it was generated by an AI. " 287 | f"Here is the background: {cv_info}" 288 | ], 289 | } 290 | ] 291 | 292 | comment_response = client.generate_content(messages) 293 | 294 | if comment_response.text: 295 | comment = self.post_process_comment(comment_response.text) 296 | return comment 297 | else: 298 | return "Speechless right now" 299 | 300 | except Exception as e: 301 | logging.error("Failed to generate a comment.", exc_info=True) 302 | return None 303 | 304 | def post_process_comment(self, comment): 305 | # Add some variability to make the comment sound more natural 306 | phrases_to_add = [ 307 | "Great point!", 308 | "I couldn't agree more.", 309 | "That's an interesting perspective.", 310 | "Thanks for sharing this.", 311 | "Very insightful.", 312 | ] 313 | 314 | # Randomly decide whether to add a phrase or not 315 | if choice([True, False]): 316 | comment = f"{choice(phrases_to_add)} {comment}" 317 | 318 | # Ensure the comment has a human touch 319 | comment = comment.replace("AI", "I") # Simple example of personalization 320 | 321 | return comment 322 | 323 | def analyze_and_interact(self): 324 | """Analyzes the fetched content and decides on interactions based on its sentiment and relevance.""" 325 | for post in self.posts_data: 326 | post_text = BeautifulSoup(post["html"], "html.parser").text.strip() 327 | if len(post_text) > 220: 328 | ai_content = self.generate_comment_based_on_content(post_text).strip( 329 | '"' 330 | ) 331 | comment_text = self.remove_markdown(ai_content) 332 | print(f"\n\n Comment Text: {comment_text} \n\n") 333 | if comment_text: 334 | # self.comment_on_post(post, comment_text) 335 | # else: 336 | # print("Failed to generate a comment.") 337 | pass 338 | self.like_post(post) 339 | 340 | 341 | if __name__ == "__main__": 342 | bot = LinkedInBot() 343 | try: 344 | bot.fetch_and_store_content() 345 | bot.analyze_and_interact() 346 | time.sleep(5) 347 | finally: 348 | bot.driver.quit() # Ensure the driver is quit properly 349 | logging.info("Driver session ended cleanly.") 350 | --------------------------------------------------------------------------------