import unittest from webtest import TestApp from dtos import V1ResponseBase, STATUS_OK import flaresolverr import utils def _find_obj_by_key(key: str, value: str, _list: list) -> dict | None: for obj in _list: if obj[key] == value: return obj return None def asset_cloudflare_solution(self, res, site_url, site_text): self.assertEqual(res.status_code, 200) body = V1ResponseBase(res.json) self.assertEqual(STATUS_OK, body.status) self.assertEqual("Challenge solved!", body.message) self.assertGreater(body.startTimestamp, 10000) self.assertGreaterEqual(body.endTimestamp, body.startTimestamp) self.assertEqual(utils.get_flaresolverr_version(), body.version) solution = body.solution self.assertIn(site_url, solution.url) self.assertEqual(solution.status, 200) self.assertIs(len(solution.headers), 0) self.assertIn(site_text, solution.response) self.assertGreater(len(solution.cookies), 0) self.assertIn("Chrome/", solution.userAgent) cf_cookie = _find_obj_by_key("name", "cf_clearance", solution.cookies) self.assertIsNotNone(cf_cookie, "Cloudflare cookie not found") self.assertGreater(len(cf_cookie["value"]), 30) class TestFlareSolverr(unittest.TestCase): app = TestApp(flaresolverr.app) # wait until the server is ready app.get('/') def test_v1_endpoint_request_get_cloudflare(self): sites_get = [ ('nowsecure', 'https://nowsecure.nl', 'nowSecure'), ('0magnet', 'https://0magnet.com/search?q=2022', 'Torrent Search - ØMagnet'), ('1337x', 'https://1337x.unblockit.cat/cat/Movies/time/desc/1/', ''), ('avistaz', 'https://avistaz.to/api/v1/jackett/torrents?in=1&type=0&search=', 'Access denied'), ('badasstorrents', 'https://badasstorrents.com/torrents/search/720p/date/desc', 'Latest Torrents - BadassTorrents'), ('bt4g', 'https://bt4g.org/search/2022', 'Download 2022 Torrents - BT4G'), ('cinemaz', 'https://cinemaz.to/api/v1/jackett/torrents?in=1&type=0&search=', 'Access denied'), ('epublibre', 'https://epublibre.unblockit.cat/catalogo/index/0/nuevo/todos/sin/todos/--/ajax', 'epublibre - catálogo'), ('ext', 'https://ext.to/latest/?order=age&sort=desc', 'Download Latest Torrents - EXT Torrents'), ('extratorrent', 'https://extratorrent.st/search/?srt=added&order=desc&search=720p&new=1&x=0&y=0', 'Page 1 - ExtraTorrent'), ('idope', 'https://idope.se/browse.html', 'Recent Torrents'), ('limetorrents', 'https://limetorrents.unblockninja.com/latest100', 'Latest 100 torrents - LimeTorrents'), ('privatehd', 'https://privatehd.to/api/v1/jackett/torrents?in=1&type=0&search=', 'Access denied'), ('torrentcore', 'https://torrentcore.xyz/index', 'Torrent[CORE] - Torrent community.'), ('torrentqq223', 'https://torrentqq223.com/torrent/newest.html', 'https://torrentqq223.com/ads/'), ('36dm', 'https://www.36dm.club/1.html', 'https://www.36dm.club/yesterday-1.html'), ('erai-raws', 'https://www.erai-raws.info/feed/?type=magnet', '403 Forbidden'), ('teamos', 'https://www.teamos.xyz/torrents/?filename=&freeleech=', 'Log in | Team OS : Your Only Destination To Custom OS !!'), ('yts', 'https://yts.unblockninja.com/api/v2/list_movies.json?query_term=&limit=50&sort=date_added', '{"movie_count":') ] for site_name, site_url, site_text in sites_get: with self.subTest(msg=site_name): res = self.app.post_json('/v1', { "cmd": "request.get", "url": site_url }) asset_cloudflare_solution(self, res, site_url, site_text) def test_v1_endpoint_request_post_cloudflare(self): sites_post = [ ('nnmclub', 'https://nnmclub.to/forum/tracker.php', 'Трекер :: NNM-Club', 'prev_sd=0&prev_a=0&prev_my=0&prev_n=0&prev_shc=0&prev_shf=1&prev_sha=1&prev_shs=0&prev_shr=0&prev_sht=0&f%5B%5D=-1&o=1&s=2&tm=-1&shf=1&sha=1&ta=-1&sns=-1&sds=-1&nm=&pn=&submit=%CF%EE%E8%F1%EA') ] for site_name, site_url, site_text, post_data in sites_post: with self.subTest(msg=site_name): res = self.app.post_json('/v1', { "cmd": "request.post", "url": site_url, "postData": post_data }) asset_cloudflare_solution(self, res, site_url, site_text) if __name__ == '__main__': unittest.main()