在非公共 API 中收到 403 错误,但未阻止域

问题描述 投票:0回答:1

希望你一切都好!

我用 C# 创建了一个每天运行的工具,并且能够从 Cex 网站 (uk.webuy.com) 获取我选择的某些类别中所有产品的价格。我使用这个工具来保存产品的价格历史记录,但有一天,当该工具执行时,它开始出现 403 错误。我无法诊断为什么会发生这种情况,因为该域的其他端点工作完全正常。

这是我过去 6 个月用于请求的代码:

public static List<Box> GetCategoryProducts(List<int> largeCategoriesList)
        {
            List<Box> boxes = new List<Box>();

            foreach (int categoryId in largeCategoriesList)
            {
                int currentCategoryProducts = 0;
                int firstRecord = 1;
                int count = 50;
                int totalRecords = 0;
                int minDelay = 3;
                int maxDelay = 6;
                int retryDelay = 10; // Retry after 10 seconds if response isn't successful

                bool hadError = false;
                int retryCount = 0;

                do
                {
                    try
                    {
                        string weBuyAPILink = $"https://wss2.cex.uk.webuy.io/v3/boxes?firstRecord={firstRecord}&count=50&sortBy=relevance&sortOrder=desc&categoryIds=[{categoryId}]";
                        var client = new RestClient(weBuyAPILink);
                        client.Timeout = -1;
                        var request = new RestRequest(Method.GET);
                        List<KeyValuePair<string, string>> headerList = new List<KeyValuePair<string, string>>()
                        {
                            new KeyValuePair<string, string>("Accept", "application/json, text/plain, */*"),
                            new KeyValuePair<string, string>("Refer", "https://uk.webuy.com"),
                            new KeyValuePair<string, string>("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"),
                            new KeyValuePair<string, string>("Origin", "https://uk.webuy.com"),
                            new KeyValuePair<string, string>("Accept-Encoding","gzip, deflate, br")
                        };

                        request.AddHeaders(headerList);
                        IRestResponse response = client.Execute(request);

                        if (!response.IsSuccessful)
                        {
                            Logger.Error($"Request response encountered an error! Error details: {response.StatusCode}");
                            hadError = true;
                            Thread.Sleep(retryDelay * 1000); // Retry after 10 seconds
                            retryCount++;
                        }
                        else
                        {
                            //PROCESS RESPONSE
                            //.......
                            //.......
                            hadError = false;

                            var random = new Random();
                            var delay = random.Next(minDelay * 1000, maxDelay * 1000);
                            Logger.Info($"Waiting {delay / 1000} seconds before next request...");
                            Thread.Sleep(delay);
                        }
                    }
                    catch (Exception ex)
                    {
                        Logger.Fatal(ex, "Fatal error processing category list!");
                        // Handle fatal error as needed
                        hadError = true;
                    }
                } while ((currentCategoryProducts < totalRecords || totalRecords == 0) && !hadError && retryCount < 3); // Retry only 3 times

                if (hadError)
                {
                    Console.WriteLine("Unable to get price info");
                }
            }

            return boxes;
        }

尝试在浏览器上访问该 URL 将显示一个 Cloudflare 页面,显示我已被阻止并且我无法再访问 webuy.io,但是,例如,访问 产品详细信息 端点仅向我提供特定产品的详细信息,效果很好。

有人能指出我正确的方向吗?我一直在研究 Cloudflare 绕过方法,但我没有在其中投入大量时间,因为我认为这无法解决我的问题。

在构建我的工具时,我研究了这个 GitHub 存储库,因为它有一些关于 API 的深刻信息。

我尝试更改一些请求标头,尝试使用 VPN,还尝试使用 ScraperAPI 和 ScrapeOps 来获取信息而没有收到 403 错误,但无济于事。

c# rest web-scraping cloudflare
1个回答
0
投票

我认为“盒子”的端点已被关闭/阻止,因为它对我也不起作用(2024 年 4 月)。我在 Github 上偶然发现了与您相同的 API,并成功地让 API 文档中列出的所有标准调用都正常工作,除了使用 C# 的“盒子”并使用 Postman 进行测试。

我也无法让它带回特定子类别中的所有项目,例如“Xbox 360”(显示所有 Xbox 360 游戏),因此使得该 API 对于库存检查或价格跟踪几乎毫无用处。

您拥有的任何信息都会有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.