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()