首页 > 解决方案 > Linkedin - 通过python登录问题

问题描述

我正在做学校项目,需要的第一部分是登录到linkedin帐户,但是我在执行此任务时遇到问题。我相信我成功通过了身份验证,但是当我想继续新闻提要时,我无法到达那里。

import requests as re
from bs4 import BeautifulSoup


class LoginController:

    @staticmethod
    def _get_login_parameters(session, url):
        page_content = session.get(url).content
        soup = BeautifulSoup(page_content, "html.parser")
        csrf_param = soup.find("input", {"name": "loginCsrfParam"}).get("value")
        csrf_token = soup.find("input", {"name": "csrfToken"}).get("value")
        sidsring = soup.find("input", {"name": "sIdString"}).get("value")
        return csrf_param, csrf_token, sidsring

    def __init__(self, email, password):
        self.email = email
        self.password = password
        self.login_request(self.email, self.password)

    def login_request(self, email, password):
        login_url = "https://www.linkedin.com/login?fromSignIn=true&trk=guest_homepage-basic_nav-header-signin"
        submit_login = "https://www.linkedin.com/uas/login-submit"
        session = re.Session()
        csrf_param, csrf_token, sidsring = self._get_login_parameters(session, login_url)

        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0'}

        login_data = ({
            "session_key": email,
            "loginCsrfParam": csrf_param,
            "csrfToken": csrf_token,
            "session_password": password,
            "trk": "guest_homepage-basic_nav-header-signin",
            "sIdString": sidsring
        })

        login_data = {k: str(v).encode("utf-8") for k, v in login_data.items()}

        session.post(submit_login, data=login_data, allow_redirects=True)
        response = session.get("https://www.linkedin.com/feed/", allow_redirects=True)
        print(BeautifulSoup(response.content, features="html.parser").prettify())


if __name__ == "__main__":
    LoginController("username", "pwd")

我试图在这里找到一些解决方案,但这里的大多数示例甚至都不起作用或没有帮助我解决我的问题。有人知道吗?

BTW 响应请求的结果是这样的:[在此处输入图像描述][1] [1]:https://i.stack.imgur.com/9TiJt.png

附加信息:我没有任何错误信息。该代码不会将我转发到预期的网站。

URL存在(预期结果)ctrlv.link/CWle ..我自己尝试了多次。

要使代码正常工作,您只需添加您的 linkedin 凭据(最后一行代码),您应该能够在 html 中看到与我相同的结果。

期望的行为:能够在 HTML 中找到“欢迎”一词。

标签: pythonauthenticationlinkedin

解决方案


因为我无法找出代码可能有什么问题,所以我决定通过使用 selenium 来使用不同的方法。这是我的解决方案。

从 selenium 导入时间导入 webdriver 导入 selenium.common.exceptions 作为例外

class LoginController:

    @staticmethod
    def _linkedin_login(login, pwd):
        options = webdriver.ChromeOptions()
        options.add_argument("Start-mmaximized")
        options.add_experimental_option("excludeSwitches", ["enable-automation"])
        options.add_experimental_option("detach", True)
        path = r"your path to chormedriver\chromedriver.exe"
        try:
            new_session = webdriver.Chrome(options=options, executable_path=path)

        except exceptions.WebDriverException:
            print("[!] Please download new/stable verison "
                  "of Chrome new_session at https://chromedriver.chromium.org/downloads")

        try:
            new_session.get("https://www.linkedin.com/login")
            new_session.find_element_by_id("username").send_keys(login)
            new_session.find_element_by_id("password").send_keys(pwd)
            new_session.find_element_by_xpath("//button[contains(text(), 'Sign in')]").click()
            time.sleep(3)
        except ImportError:
            print("[-] Something went wrong")

    def __init__(self, login, pwd):
        self.login = login
        self.pwd = pwd
        self._linkedin_login(self.login, self.pwd)


if __name__ == "__main__":

    LoginController("username", "pwd")

我可能还有最后一个问题。我不太擅长基于 python 标准编写代码。这里有人是开发人员还是比我更有经验并且可以重构代码使其看起来应该的(我的意思是如果在我的代码中命名是可以的,我也不确定我是否使用了应该使用的@staticmethond,如果功能不是太大,应该分成更多更小的功能等)谢谢。


推荐阅读