Как воспроизвести рукопожатие браузера в c# на веб-сокете без получения 403? - PullRequest
0 голосов
/ 03 февраля 2020

Я создаю приложение c#, которое подключается к веб-сокету с помощью WebSocket-sharp, и я продолжаю получать 403 - Запрещено с сервера.

Я попытался с помощью fiddler посмотреть, как работает браузер это по-другому, и я скопировал все локальные куки, которые использует веб-сайт.

Запрос:

GET /api/trade/live/Metamorph/lg8jphV HTTP/1.1
User-Agent: websocket-sharp/1.0
Host: www.pathofexile.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: pnjDDw0njbxi4PmLR+A6OA==
Sec-WebSocket-Version: 13
Cookie: POESESSID=<redacted>

Ответ:

HTTP/1.1 403 Forbidden
Date: Sun, 02 Feb 2020 20:32:32 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __cfduid=d31e2345f42cc565e3bbc5e9a2d0ede691580675552; expires=Tue, 03-Mar-20 20:32:32 GMT; path=/; domain=.pathofexile.com; HttpOnly; SameSite=Lax
X-Rate-Limit-Policy: trade-websocket-request-limit
X-Rate-Limit-Rules: Ip
X-Rate-Limit-Ip: 45:60:60,90:120:3600
X-Rate-Limit-Ip-State: 1:60:0,1:120:0
CF-Cache-Status: DYNAMIC
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Server: cloudflare
CF-RAY: 55eeef5a1ec4919e-EWR

Любые идеи о том, что будет быть следующим шагом в устранении неполадок, проблема будет принята с благодарностью!

1 Ответ

0 голосов
/ 03 февраля 2020

Я посмотрел на этот конкретный API, и сначала вы должны создать «поиск». Это то, чем является ваш lg8jphV - конечная точка должна существовать, прежде чем вы сможете ее открыть. Например, в моем тесте URL моего веб-сокета был wss://www.pathofexile.com/api/trade/live/Metamorph/Ab3LSL

Сначала опубликуйте запрос в https://www.pathofexile.com/api/trade/search/Metamorph. Ваше тело должно выглядеть примерно так (кроме указанных вами c условий поиска):

{
    "query": {
        "status": {
            "option": "online"
        },
        "stats": [
            {
                "type": "and",
                "filters": []
            }
        ],
        "filters": {
            "type_filters": {
                "disabled": false,
                "filters": {
                    "category": {
                        "option": "weapon.bow"
                    }
                }
            },
            "misc_filters": {
                "disabled": false,
                "filters": {
                    "shaper_item": {
                        "option": "true"
                    }
                }
            }
        }
    },
    "sort": {
        "price": "asc"
    }
}

Это создаст ваш реальный объект поиска, и вы получите тело ответа обратно, как это:

{
    "result": [
        "48c83eb427f369f6ddde8689d7458f6bf5a8380eed114b72b5a7a298651c4d65",
        "6314ac7c88b143b80c777d23cdc12bb9d86e8bb82d8073f659132bf492fa69fe",
        "1c39870f03505acaecd78dc0cc2a498a3a1037cd88b0035e3601e35140b59450",
        "3dc8cf428d842a8be12953c6d2db117e5db4456cb6d3b75f5280ca8fb687c587",
        "9470cc63efbe4ca192103200ad78734784a218c68b9d9ead0be456a98260394f",
        "798ba0699085a63359c459cc89cafbbe28653fe893dfb6a9ba71162fd4d7aa51",
        "dab3edc9c28723decc76ba56eb988c7f245ce15041640dca461124918dafbc90",
        "06da5889c8cbf295ab13e103dfa9e291b3e0caf0256b398ccaec9ddfdb1e56c4",
        "... continues ..."
    ],
    "id": "Ab3LSL",
    "total": 100000,
    "inexact": true
}

Теперь у вас есть конечная точка поиска по идентификатору.

Наконец, когда вы делаете запрос, вам нужно установить заголовок Origin, или вы получите 403 Forbidden (вам придется изменить пакет nuget, который вы используете для https://www.nuget.org/packages/websocket-sharp-customheaders, если вы хотите продолжать использовать websocket-sharp). Не забывайте своего повара ie, иначе вы получите 401 несанкционированный

using (ClientWebSocket ws = new ClientWebSocket())
{
    Uri serverUri = new Uri($"wss://www.pathofexile.com/api/trade/live/Metamorph/D4bWwf5");
    //setting headers the way I did below only works because I used reflection to change the IsRequestRestricted bool to false
    ws.Options.SetRequestHeader("Cookie", "__cfduid=d4a76bfa2583a39474272974006edad461580748134; _ga=GA1.2.477754083.1580748162; _gid=GA1.2.2011499591.1580748162; stored_data=1; _sm_au_c=krZJcAOlyMvVNsrvCJ4mJyGIu8S0KVB4Lr7aqcW0VB9UgAAAAa68dX6r0DT/Ta5U0B4NfCgZ2Jm/2q8R651XMxiBtJsM=; cf_clearance=e6964bd6eaed12c405c1b9b8a2b2f08d506b4926-1580761181-0-150; POESESSID=a2c44ee2111904215ccef8c69b2e72b5");
    ws.Options.SetRequestHeader("Origin", "https://www.pathofexile.com");
    ws.ConnectAsync(serverUri, CancellationToken.None).Wait();

    Task.Run(async () => 
    {
        ArraySegment<byte> inbound = new ArraySegment<byte>(new byte[1024]);
        while (ws.State == System.Net.WebSockets.WebSocketState.Open) 
        {
            var wsRes = await ws.ReceiveAsync(inbound, CancellationToken.None);
            if (wsRes?.Count > 0)
                Console.WriteLine(Encoding.UTF8.GetString(inbound.Array, 0, wsRes.Count));
        }
    });

    Console.WriteLine("WEB SOCKET OPEN; HIT ENTER TO EXIT");
    Console.ReadLine();
}

Вы можете запустить приведенный выше фрагмент кода, просто замените куки на свои собственные куки. Это также грубое подтверждение концепции с использованием встроенного клиента веб-сокета.

Снимок экрана:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...