ReaJason / xhs

基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/
MIT License
1.03k stars 295 forks source link

多账号体系 #47

Open furuiyang0715 opened 1 year ago

furuiyang0715 commented 1 year ago

以下是我遇到的另外一个问题, 希望得到大佬的一些建议跟帮助

如果我管理的是一批的账号, 我发现 basic_sign_server.py 在启动之后只能为一个账号提供服务。

在启动 flask 时,通过 playwright = sync_playwright().start() ,playwright 只能被全局实例化一次。 导致这个服务只能为一个账号提供参数生成服务。

代码示例如下:

import requests
from xhs import XhsClient

def sign(uri, data=None, a1="", web_session=""):
    # 填写自己的 flask 签名服务端口地址
    res = requests.post("http://127.0.0.1:5006",
                        json={"uri": uri, "data": data, "a1": a1, "web_session": web_session})
    signs = res.json()
    return {
        "x-s": signs["x-s"],
        "x-t": signs["x-t"]
    }

def run(phone, cookie):
    # 实例化小红书客户端
    xhs_client = XhsClient(cookie, sign=sign)
    note_info = xhs_client.get_note_by_id("63db8819000000001a01ead1")
    print(note_info)

if __name__ == '__main__':
    cookie_1 = '''abRequestId=1; a1=18a4fb739bfi5fv56sf2afk6abyu0vzs146xvegob50000303745; webId=6cca84a5b1403b5bf6c91116bfc6cc0e; gid=yY04iDWqi8ydyY04iDWqj4dkDi32ih2KMiJ0KlDiTK0DvC2878huMh888q8qW428KiSSyd0J; webBuild=3.7.1; xsecappid=xhs-pc-web; web_session=030037a3c2c32f7f4ea717d189234a7620827d; websectiga=cffd9dcea65962b05ab048ac76962acee933d26157113bb213105a116241fa6c; sec_poison_id=c9818550-d81c-48c2-a28e-4d44a15efd38'''
    cookie_2 = '''imestamp2=166892735640546fac749a852dbc5491b1bce6bf3116f372b149e46ea126eea; timestamp2.sig=e6AlCiNVwsBa0vp8V7_-NlwkR4FNCYUxm8WvibiTqxg; smidV2=202211201455567df56e0e34e99881500da7e02dd59ddc00bfe477f456168a0; gid.ss=gSMQ9UOnDuZwH2oRGJG6BW6e4grs67TaYpnrW+8Wmd3BXEQ7tNY/0XN700Ebb+IN; xhsTrackerId=73749829-fb1c-4f59-8017-f401f1ef1f95; xhsTrackerId.sig=BfS4OY4--lw8f_3iEF2V5K83Qy8bCKOeIeJG1D2-ZZw; xsecappid=xhs-pc-web; a1=186056ada1a89mvl181dbjb8arvhnl4oy26cw5vxs50000249889; webId=2b0dc450f3eea2de6a1460b70f06983c; gid=yYK82K0ffWvJyYK82K0f0J2hy0Yj6h1yYyfDKCMVDY0FhS28xI14lE888J4jYYj8fY0Y2YK2; gid.sign=IvHoU2YKjJwV3p71N5/Jc1tbZ3k=; abRequestId=2b0dc450f3eea2de6a1460b70f06983c; websectiga=10f9a40ba454a07755a08f27ef8194c53637eba4551cf9751c009d9afb564467; sec_poison_id=d4fa3381-179d-41cc-ac42-555de878e0b8; cache_feeds=[]; web_session=0400698de7e997088ffbd819c4364b0f707729; webBuild=2.11.10'''
    accounts = [
        {"name": "user1", "phone": "1562604xxxx", "cookie": cookie_2},
        {"name": "user2", "phone": "1762973xxxx", "cookie": cookie_1},
    ]
    for account in accounts:
        name = account.get("name")
        phone = account.get("phone")
        cookie = account.get("cookie")
        print(name, phone)
        run(phone, cookie)

此时只有一个用户的执行正常。

furuiyang0715 commented 1 year ago

我尝试过 (1) 在后端做一个 session_id: playwright 的映射, 但是由于 playwright 的内部机制,导致全局只能实例化一次(https://crifan.github.io/web_automation_tool_playwright/website/issues_summary/sync_inside_asyncio.html) (2) 用 selenium 代替 playwright 的作用 (3) 每请求一次就重启一次 flask

目前我紧急使用的是第三种办法。想请教下第(2) 种办法是否可替换。

ReaJason commented 1 year ago

管理多个账号时建议以下两个操作:

  1. 由于其实只有 a1 参与到签名中,你可以手动将所有的 cookie 设置为同一个 a1 值应该是都可以正确签名的
  2. 建议修改签名函数,就不要传 web_session cookie 字段到浏览器了,防止浏览器由于频繁切换会话可能会导致容易出现验证码。
furuiyang0715 commented 1 year ago

可以的,太感谢了!

leylatop commented 9 months ago

使用 Flask 签名的流程,是这样的吗?

  1. 跑docker 服务:docker run -it -d -p 5005:5005 reajason/xhs-api:latest
  2. 跑server.py:py example/basic_sign_server.py,会log出一个a1的值;
  3. 将a1值替换usage 的cookie中的a1,然后跑usage:py example/basic_sign_usage.py
leylatop commented 9 months ago

使用 Flask 签名的流程,是这样的吗?

  1. 跑docker 服务:docker run -it -d -p 5005:5005 reajason/xhs-api:latest
  2. 跑server.py:py example/basic_sign_server.py,会log出一个a1的值;
  3. 将a1值替换usage 的cookie中的a1,然后跑usage:py example/basic_sign_usage.py 这是我的报错信息,哪位可以帮忙解答一下? image
hjhjhghghg commented 4 months ago

使用 Flask 签名的流程,是这样的吗?

  1. 跑docker 服务:docker run -it -d -p 5005:5005 reajason/xhs-api:latest
  2. 跑server.py:py example/basic_sign_server.py,会log出一个a1的值;
  3. 将a1值替换usage 的cookie中的a1,然后跑usage:py example/basic_sign_usage.py 这是我的报错信息,哪位可以帮忙解答一下? image

你是不是把小红书前端的cookie和创作者的cookie搞混了