소스 검색

feat: update

jerry 2 달 전
부모
커밋
07ead8e888
6개의 변경된 파일1880개의 추가작업 그리고 1669개의 파일을 삭제
  1. 0 1564
      config/config.json
  2. 1632 0
      config/config.json.example
  3. 1 0
      deps.txt
  4. 113 11
      main_booker.py
  5. 103 12
      main_sentinel.py
  6. 31 82
      toolkit/vs_cloud_api.py

+ 0 - 1564
config/config.json

@@ -1,1564 +0,0 @@
-{
-    "redis": {
-        "host": "text.skin",
-        "port": 6379,
-        "db": 0,
-        "password": "STEs2x6ML0U1HlpE9SojM6YU7QPhqzY8"
-    },
-    "group_list": [
-        {
-            "identifier": "vfs.ie.nl",
-            "debug": false,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap", "decodo"],
-            "proxy_cd": 300,
-            "session_max_life": 1800,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "ie.nl.sentinel",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "built-in",
-                "account_pool_id": "ie.nl.booker",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "booking_cooldown": 300,
-                "max_bookings_per_account": 8
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "vfs_plugin",
-                "plugin_bin": "vfs_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.dub.nl.tourist",
-                    "city": "Dublin",
-                    "visa_type": "Tourist",
-                    "country": "Netherlands"
-                }
-            ],
-            "website": "https://visa.vfsglobal.com/irl/en/nld/login",
-            "free_config": {
-                "mission_code": "nld",
-                "mission_name": "Netherlands",
-                "country_code": "irl",
-                "country_name": "Ireland",
-                "culture_code": "en-US",
-                "language": "en",
-                "apt_configs": {
-                    "slot.dub.nl.tourist": {
-                        "center_name": "Netherlands Visa Application Center - Dublin",
-                        "address": "Cunningham House, 130 Francis Street, Dublin 8  D08 H48R",
-                        "vac_code": "NTDB",
-                        "category_name": "All Short stay Categories",
-                        "category_code": "TA",
-                        "subcategory_name": "Tourist",
-                        "subcategory_code": "To"
-                    }
-                }
-            }
-        },
-        {
-            "identifier": "vfs.sg.fr",
-            "debug": false,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap"],
-            "proxy_cd": 300,
-            "session_max_life": 1800,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "sg.fr.sentinel",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "built-in",
-                "account_pool_id": "sg.fr.booker",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "booking_cooldown": 10,
-                "max_bookings_per_account": 8
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "vfs_plugin",
-                "plugin_bin": "vfs_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.sin.fr.tourist",
-                    "city": "Singapore",
-                    "visa_type": "Tourist",
-                    "country": "France"
-                }
-            ],
-            "website": "https://visa.vfsglobal.com/sgp/en/fra/login",
-            "free_config": {
-                "mission_code": "fra",
-                "mission_name": "France",
-                "country_code": "sgp",
-                "country_name": "Singapore",
-                "culture_code": "en-US",
-                "language": "en",
-                "apt_configs": {
-                    "slot.sin.fr.tourist": {
-                        "center_name": "France Visa Application Center, Singapore",
-                        "address": "79 Anson Road #15-01 Singapore 079906",
-                        "vac_code": "FRSN",
-                        "category_name": "Short Stay",
-                        "category_code": "02",
-                        "subcategory_name": "Short Stay Tourist, Family Visit",
-                        "subcategory_code": "Six"
-                    }
-                }
-            }
-        },
-        {
-            "identifier": "vfs.au.fr",
-            "debug": false,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap", "decodo"],
-            "proxy_cd": 300,
-            "session_max_life": 1800,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "au.fr.sentinel",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "built-in",
-                "account_pool_id": "au.fr.booker",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "booking_cooldown": 10,
-                "max_bookings_per_account": 8
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "vfs_plugin",
-                "plugin_bin": "vfs_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.syd.fr.tourist",
-                    "city": "Sydney",
-                    "visa_type": "Tourist",
-                    "country": "France"
-                },
-                {
-                    "weight": 10,
-                    "routing_key": "slot.mel.fr.tourist",
-                    "city": "Melbourne",
-                    "visa_type": "Tourist",
-                    "country": "France"
-                }
-            ],
-            "website": "https://visa.vfsglobal.com/aus/en/fra/login",
-            "free_config": {
-                "mission_code": "fra",
-                "mission_name": "France",
-                "country_code": "aus",
-                "country_name": "Australia",
-                "culture_code": "en-US",
-                "language": "en",
-                "apt_configs": {
-                    "slot.syd.fr.tourist": {
-                        "center_name": "France Visa Application Center - Sydney",
-                        "address": "France Visa Application Center,Level 6, 88 Pitt Street,Sydney NSW 2000",
-                        "vac_code": "SYD",
-                        "category_name": "VISA",
-                        "category_code": "VISA",
-                        "subcategory_name": "Short Stay Schengen Visa",
-                        "subcategory_code": "ShortStaySchengenVisa"
-                    },
-                    "slot.mel.fr.tourist": {
-                        "center_name": "France Visa Application Center - Melbourne",
-                        "address": "Level 5 332 St. Kilda road level 5 Melbourne 3004",
-                        "vac_code": "MEL",
-                        "category_name": "VISA",
-                        "category_code": "VISA",
-                        "subcategory_name": "Short Stay Schengen Visa",
-                        "subcategory_code": "ShortStaySchengenVisa"
-                    }
-                }
-            }
-        },
-        {
-            "identifier": "vfs.gb.it",
-            "debug": false,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap", "decodo"],
-            "proxy_cd": 300,
-            "session_max_life": 1800,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "gb.it.sentinel",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "built-in",
-                "account_pool_id": "gb.it.booker",
-                "target_instances": 0,
-                "account_cd": 10800,
-                "booking_cooldown": 10,
-                "max_bookings_per_account": 8
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "vfs_plugin",
-                "plugin_bin": "vfs_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 80,
-                    "routing_key": "slot.lon.it.tourist",
-                    "city": "London",
-                    "visa_type": "Tourist",
-                    "country": "Italy"
-                },
-                {
-                    "weight": 20,
-                    "routing_key": "slot.man.it.tourist",
-                    "city": "Manchester",
-                    "visa_type": "Tourist",
-                    "country": "Italy"
-                }
-            ],
-            "website": "https://visa.vfsglobal.com/gbr/en/ita/login",
-            "free_config": {
-                "mission_code": "ita",
-                "mission_name": "Italy",
-                "country_code": "gbr",
-                "country_name": "United Kingdom",
-                "culture_code": "en-US",
-                "language": "en",
-                "apt_configs": {
-                    "slot.lon.it.tourist": {
-                        "center_name": "Italy Visa Application Centre, London",
-                        "address": "Ground floor, 8- 20  Pocock St London SE1 0BW , United Kingdom",
-                        "vac_code": "ILON",
-                        "category_name": "Italy UK VisaCategory",
-                        "category_code": "UKITVED",
-                        "subcategory_name": "Tourist/ Business/ EU Family",
-                        "subcategory_code": "TBE"
-                    },
-                    "slot.man.it.tourist": {
-                        "center_name": "Italy Visa Application Centre, Manchester",
-                        "address": "50 Devonshire Street North, M12 6JH",
-                        "vac_code": "IMAN",
-                        "category_name": "Italy UK VisaCategory",
-                        "category_code": "UKITVED",
-                        "subcategory_name": "Tourist/ Business/ EU Family",
-                        "subcategory_code": "TBE"
-                    }
-                }
-            }
-        },
-        {
-            "identifier": "vfs.gb.nl",
-            "debug": false,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap", "decodo"],
-            "proxy_cd": 300,
-            "session_max_life": 1800,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "gb.nl.sentinel",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "built-in",
-                "account_pool_id": "gb.nl.booker",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "booking_cooldown": 10,
-                "max_bookings_per_account": 8
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "vfs_plugin",
-                "plugin_bin": "vfs_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 90,
-                    "routing_key": "slot.lon.nl.tourist",
-                    "city": "London",
-                    "visa_type": "Tourist",
-                    "country": "Netherlands"
-                },
-                {
-                    "weight": 10,
-                    "routing_key": "slot.man.nl.tourist",
-                    "city": "Manchester",
-                    "visa_type": "Tourist",
-                    "country": "Netherlands"
-                }
-            ],
-            "website": "https://visa.vfsglobal.com/gbr/en/nld/login",
-            "free_config": {
-                "mission_code": "nld",
-                "mission_name": "Netherland",
-                "country_code": "gbr",
-                "country_name": "United Kingdom",
-                "culture_code": "en-US",
-                "language": "en",
-                "apt_configs": {
-                    "slot.lon.nl.tourist": {
-                        "center_name": "Netherlands Visa application centre - London",
-                        "address": "66 Wilson Street, EC2A 2BT",
-                        "vac_code": "NAKN",
-                        "category_name": "Schengen Visa",
-                        "category_code": "Schengen Visa",
-                        "subcategory_name": "Tourism",
-                        "subcategory_code": "TA"
-                    },
-                    "slot.man.nl.tourist": {
-                        "center_name": "Netherlands Visa application centre - Manchester",
-                        "address": "50 Devonshire Street North, M12 6JH",
-                        "vac_code": "NAKT",
-                        "category_name": "Schengen Visa",
-                        "category_code": "Schengen Visa",
-                        "subcategory_name": "Tourism",
-                        "subcategory_code": "TA"
-                    }
-                }
-            }
-        },
-        {
-            "identifier": "vfs.gb.no",
-            "debug": false,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap", "decodo"],
-            "proxy_cd": 300,
-            "session_max_life": 1800,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "gb.no.sentinel",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "built-in",
-                "account_pool_id": "gb.no.booker",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "booking_cooldown": 10,
-                "max_bookings_per_account": 8
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "vfs_plugin",
-                "plugin_bin": "vfs_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.lon.no.tourist",
-                    "city": "London",
-                    "visa_type": "Tourist",
-                    "country": "Norway"
-                }
-            ],
-            "website": "https://visa.vfsglobal.com/gbr/en/nor/login",
-            "free_config": {
-                "mission_code": "nor",
-                "mission_name": "Norway",
-                "country_code": "gbr",
-                "country_name": "United Kingdom",
-                "culture_code": "en-US",
-                "language": "en",
-                "apt_configs": {
-                    "slot.lon.no.tourist": {
-                        "center_name": "Norway Visa Application Centre, London",
-                        "address": "66 Wilson street, EC2A 2BT",
-                        "vac_code": "NLON",
-                        "category_name": "Schengen Visa C",
-                        "category_code": "SCHVISA",
-                        "subcategory_name": "Tourist Visa",
-                        "subcategory_code": "TOU"
-                    }
-                }
-            }
-        },
-        {
-            "identifier": "vfs.ie.at",
-            "debug": false,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap", "decodo"],
-            "proxy_cd": 300,
-            "session_max_life": 1800,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "ie.at.sentinel",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "built-in",
-                "account_pool_id": "ie.at.booker",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "booking_cooldown": 300,
-                "max_bookings_per_account": 8
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "vfs_plugin",
-                "plugin_bin": "vfs_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.dub.at.tourist",
-                    "city": "Dublin",
-                    "visa_type": "Tourist",
-                    "country": "Austria"
-                }
-            ],
-            "website": "https://visa.vfsglobal.com/irl/en/aut/login",
-            "free_config": {
-                "mission_code": "aut",
-                "mission_name": "Austria",
-                "country_code": "irl",
-                "country_name": "Ireland",
-                "culture_code": "en-US",
-                "language": "en",
-                "apt_configs": {
-                    "slot.dub.at.tourist": {
-                        "center_name": "Austria / Switzerland / Liechtenstein/ Slovenia Visa Application Center, Dublin",
-                        "address": "Cunningham House, 130 Francis Street, Dublin 8 D08 H48R",
-                        "vac_code": "AUT-DUB",
-                        "category_name": "Other Visas",
-                        "category_code": "Default_Austria_Ireland ",
-                        "subcategory_name": "All Visas ",
-                        "subcategory_code": "TA"
-                    }
-                }
-            }
-        },
-        {
-            "identifier": "vfs.ie.dk",
-            "debug": false,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap", "decodo"],
-            "proxy_cd": 300,
-            "session_max_life": 1800,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "ie.dk.sentinel",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "built-in",
-                "account_pool_id": "ie.dk.booker",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "booking_cooldown": 10,
-                "max_bookings_per_account": 8
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "vfs_plugin",
-                "plugin_bin": "vfs_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.dub.dk.tourist",
-                    "city": "Dublin",
-                    "visa_type": "Tourist",
-                    "country": "Denmark"
-                }
-            ],
-            "website": "https://visa.vfsglobal.com/irl/en/dnk/login",
-            "free_config": {
-                "mission_code": "dnk",
-                "mission_name": "Denmark",
-                "country_code": "irl",
-                "country_name": "Ireland",
-                "culture_code": "en-US",
-                "language": "en",
-                "apt_configs": {
-                    "slot.dub.dk.tourist": {
-                        "center_name": "Denmark Visa Application Center, Dublin ",
-                        "address": "Cunningham House, 130 Francis Street, Dublin 8 D08 H48R",
-                        "vac_code": "DIDUB",
-                        "category_name": "Schengen Visa",
-                        "category_code": "SV",
-                        "subcategory_name": "Tourism",
-                        "subcategory_code": "TV"
-                    }
-                }
-            }
-        },
-        {
-            "identifier": "vfs.ie.fi",
-            "debug": false,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap", "decodo"],
-            "proxy_cd": 300,
-            "session_max_life": 1800,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "ie.fi.sentinel",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "built-in",
-                "account_pool_id": "ie.fi.booker",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "booking_cooldown": 10,
-                "max_bookings_per_account": 8
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "vfs_plugin",
-                "plugin_bin": "vfs_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.dub.fi.tourist",
-                    "city": "Dublin",
-                    "visa_type": "Tourist",
-                    "country": "Finland"
-                }
-            ],
-            "website": "https://visa.vfsglobal.com/irl/en/fin/login",
-            "free_config": {
-                "mission_code": "fin",
-                "mission_name": "Finland",
-                "country_code": "irl",
-                "country_name": "Ireland",
-                "culture_code": "en-US",
-                "language": "en",
-                "apt_configs": {
-                    "slot.dub.fi.tourist": {
-                        "center_name": "Application Centre, Dublin",
-                        "address": "Cunningham House, 130 Francis Street, Dublin 8 D08 H48R",
-                        "vac_code": "Dubb",
-                        "category_name": "VISA",
-                        "category_code": "S S",
-                        "subcategory_name": "Tourist Category",
-                        "subcategory_code": "Tourist Category"
-                    }
-                }
-            }
-        },
-        {
-            "identifier": "vfs.ie.hu",
-            "debug": false,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap", "decodo"],
-            "proxy_cd": 300,
-            "session_max_life": 1800,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "ie.hu.sentinel",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "built-in",
-                "account_pool_id": "ie.hu.booker",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "booking_cooldown": 180,
-                "max_bookings_per_account": 8
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "vfs_plugin",
-                "plugin_bin": "vfs_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.dub.hu.tourist",
-                    "city": "Dublin",
-                    "visa_type": "Tourist",
-                    "country": "Hungary"
-                }
-            ],
-            "website": "https://visa.vfsglobal.com/irl/en/hun/login",
-            "free_config": {
-                "mission_code": "hun",
-                "mission_name": "Hungary",
-                "country_code": "irl",
-                "country_name": "Ireland",
-                "culture_code": "en-US",
-                "language": "en",
-                "apt_configs": {
-                    "slot.dub.hu.tourist": {
-                        "center_name": "Ireland Visa Application Center,Dublin",
-                        "address": "Cunningham House, 130 Francis Street Dublin",
-                        "vac_code": "DUB",
-                        "category_name": "Short Stay",
-                        "category_code": "SS",
-                        "subcategory_name": "Schengen Visa",
-                        "subcategory_code": "Schengen Visa"
-                    }
-                }
-            }
-        },
-        {
-            "identifier": "vfs.ie.is",
-            "debug": false,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap", "decodo"],
-            "proxy_cd": 300,
-            "session_max_life": 1800,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "ie.is.sentinel",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "built-in",
-                "account_pool_id": "ie.is.booker",
-                "target_instances": 0,
-                "account_cd": 10800,
-                "booking_cooldown": 10,
-                "max_bookings_per_account": 8
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "vfs_plugin",
-                "plugin_bin": "vfs_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.dub.is.tourist",
-                    "city": "Dublin",
-                    "visa_type": "Tourist",
-                    "country": "Iceland"
-                }
-            ],
-            "website": "https://visa.vfsglobal.com/irl/en/isl/login",
-            "free_config": {
-                "mission_code": "isl",
-                "mission_name": "Iceland",
-                "country_code": "irl",
-                "country_name": "Ireland",
-                "culture_code": "en-US",
-                "language": "en",
-                "apt_configs": {
-                    "slot.dub.is.tourist": {
-                        "center_name": "Iceland Visa Application Center- Dublin",
-                        "address": "Cunningham House, 130 Francis Street, Dublin, Ireland- DO8 H48R",
-                        "vac_code": "DUB",
-                        "category_name": "C-Visa",
-                        "category_code": "CVI",
-                        "subcategory_name": "Tourism",
-                        "subcategory_code": "OTT"
-                    }
-                }
-            }
-        },
-        {
-            "identifier": "vfs.gb.at",
-            "debug": false,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap", "decodo"],
-            "proxy_cd": 300,
-            "session_max_life": 1800,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "gb.at.sentinel",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "built-in",
-                "account_pool_id": "gb.at.booker",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "booking_cooldown": 10,
-                "max_bookings_per_account": 8
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "vfs_plugin",
-                "plugin_bin": "vfs_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.lon.at.tourist",
-                    "city": "London",
-                    "visa_type": "Tourist",
-                    "country": "Austria"
-                }
-            ],
-            "website": "https://visa.vfsglobal.com/gbr/en/aut/login",
-            "free_config": {
-                "mission_code": "aut",
-                "mission_name": "Austria",
-                "country_code": "gbr",
-                "country_name": "United Kingdom",
-                "culture_code": "en-US",
-                "language": "en",
-                "apt_configs": {
-                    "slot.lon.at.tourist": {
-                        "center_name": "Austria Visa Application Centre, London",
-                        "address": "66 Wilson Street, EC2A 2BT",
-                        "vac_code": "ADN",
-                        "category_name": "Visa  to  Austria",
-                        "category_code": "Visa  to  Austria",
-                        "subcategory_name": "Tourism",
-                        "subcategory_code": "TA"
-                    }
-                }
-            }
-        },
-        {
-            "identifier": "bls.ie.es",
-            "debug": false,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["spain-isp"],
-            "proxy_cd": 300,
-            "session_max_life": 3600,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "ie.es.sentinel",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "order",
-                "target_instances": 0,
-                "account_cd": 10800,
-                "booking_cooldown": 10,
-                "max_bookings_per_account": 1
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 180,
-                "random_max": 360
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "bls_plugin",
-                "plugin_bin": "bls_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.dub.es.tourist",
-                    "city": "Dublin",
-                    "visa_type": "Tourist",
-                    "country": "Spain"
-                }
-            ],
-            "website": "https://ireland.blsspainglobal.com/Global/bls/visatypeverification",
-            "free_config": {
-                "domain": "ireland.blsspainglobal.com",
-                "ocr_model": "data/ctc.pth",
-                "apt_configs": {
-                    "slot.dub.es.tourist": {
-                        "location": "Dublin",
-                        "jurisdiction": null,
-                        "visa_type": "Schengen Visa/ Short Term Visa",
-                        "visa_subtype": "Tourist Visa",
-                        "appointment_type": "Individual",
-                        "appointment_category": "Normal",
-                        "mission_code": "EMBASSY_DUBLIN"
-                    }
-                }
-            }
-        },
-        {
-            "identifier": "bls.gb.es",
-            "debug": false,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["spain-isp"],
-            "proxy_cd": 300,
-            "session_max_life": 3600,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "gb.es.sentinel",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "order",
-                "target_instances": 0,
-                "account_cd": 10800,
-                "booking_cooldown": 10,
-                "max_bookings_per_account": 1
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "bls_plugin",
-                "plugin_bin": "bls_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.lon.es.tourist",
-                    "city": "London",
-                    "visa_type": "Tourist",
-                    "country": "Spain"
-                }
-            ],
-            "website": "https://uk.blsspainglobal.com/Global/bls/visatypeverification",
-            "free_config": {
-                "domain": "uk.blsspainglobal.com",
-                "ocr_model": "data/ocr.pth",
-                "apt_configs": {
-                    "slot.lon.es.tourist": {
-                        "location": "Dublin",
-                        "jurisdiction": "Greater London",
-                        "visa_type": "Short Term Visa(Maximum stay of 90 days)",
-                        "visa_subtype": "Tourist Visa",
-                        "appointment_type": "Individual",
-                        "appointment_category": "Normal",
-                        "mission_code": "LHR"
-                    }
-                }
-            }
-        },
-        {
-            "identifier": "tls.gb.fr",
-            "debug": false,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap"],
-            "proxy_cd": 900,
-            "session_max_life": 1800,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "tls.gb.fr.sentinel",
-                "target_instances": 1,
-                "account_cd": 1800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "order",
-                "target_instances": 2,
-                "account_cd": 1800,
-                "booking_cooldown": 3,
-                "max_bookings_per_account": 1
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 55,
-                "random_max": 65
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "tls_plugin",
-                "plugin_bin": "tls_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.lon.fr.tourist",
-                    "city": "London",
-                    "visa_type": "Tourist",
-                    "country": "France"
-                }
-            ],
-            "website": "https://visas-fr.tlscontact.com/en-us/country/gb/vac/gbLON2fr",
-            "free_config": {
-                "tls_url": "https://visas-fr.tlscontact.com/en-us/country/gb/vac/gbLON2fr",
-                "location": "London",
-                "capsolver_key": "CAP-5441DD341DD3CC2FAEF0BE6FE493EE9A",
-                "login_captcha": {
-                    "solve_advance": false,
-                    "site_key": "6LcDpXcfAAAAAM7wOEsF_38DNsL20tTvPTKxpyn0",
-                    "page_url": "https://i2-auth.visas-fr.tlscontact.com",
-                    "task": "ReCaptchaV2TaskProxyLess"
-                }
-            }
-        },
-        {
-            "identifier": "tls.cn.bjs.fr",
-            "debug": true,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap-good"],
-            "proxy_cd": 900,
-            "session_max_life": 1800,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "tls.cn.bjs.fr.sentinel",
-                "target_instances": 1,
-                "account_cd": 1800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "order",
-                "target_instances": 1,
-                "account_cd": 1800,
-                "booking_cooldown": 3,
-                "max_bookings_per_account": 1
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 55,
-                "random_max": 65
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "tls_plugin",
-                "plugin_bin": "tls_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.bjs.fr.tourist",
-                    "city": "Beijing",
-                    "visa_type": "Tourist",
-                    "country": "France"
-                }
-            ],
-            "website": "https://visas-fr.tlscontact.com/en-us/country/cn/vac/cnBJS2fr",
-            "free_config": {
-                "tls_url": "https://visas-fr.tlscontact.com/en-us/country/cn/vac/cnBJS2fr",
-                "location": "Beijing",
-                "capsolver_key": "CAP-5441DD341DD3CC2FAEF0BE6FE493EE9A",
-                "login_captcha": {
-                    "solve_advance": false,
-                    "site_key": "6LcDpXcfAAAAAM7wOEsF_38DNsL20tTvPTKxpyn0",
-                    "page_url": "https://i2-auth.visas-fr.tlscontact.com",
-                    "task": "ReCaptchaV2TaskProxyLess"
-                }
-            }
-        },
-        {
-            "identifier": "tls.cn.sha.fr",
-            "debug": true,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap-good"],
-            "proxy_cd": 900,
-            "session_max_life": 1800,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "tls.cn.sha.fr.sentinel",
-                "target_instances": 1,
-                "account_cd": 1800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "order",
-                "target_instances": 1,
-                "account_cd": 1800,
-                "booking_cooldown": 3,
-                "max_bookings_per_account": 1
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 55,
-                "random_max": 65
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "tls_plugin",
-                "plugin_bin": "tls_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.sha.fr.tourist",
-                    "city": "Shanghai",
-                    "visa_type": "Tourist",
-                    "country": "France"
-                }
-            ],
-            "website": "https://visas-fr.tlscontact.com/en-us/country/cn/vac/cnSHA2fr",
-            "free_config": {
-                "tls_url": "https://visas-fr.tlscontact.com/en-us/country/cn/vac/cnSHA2fr",
-                "location": "Shanghai",
-                "capsolver_key": "CAP-5441DD341DD3CC2FAEF0BE6FE493EE9A",
-                "login_captcha": {
-                    "solve_advance": false,
-                    "site_key": "6LcDpXcfAAAAAM7wOEsF_38DNsL20tTvPTKxpyn0",
-                    "page_url": "https://i2-auth.visas-fr.tlscontact.com",
-                    "task": "ReCaptchaV2TaskProxyLess"
-                }
-            }
-        },
-        {
-            "identifier": "tls.ie.fr",
-            "debug": false,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap-good", "decodo-good"],
-            "proxy_cd": 900,
-            "session_max_life": 1800,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "tls.ie.fr.sentinel",
-                "target_instances": 1,
-                "account_cd": 1800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "order",
-                "target_instances": 1,
-                "account_cd": 1800,
-                "booking_cooldown": 3,
-                "max_bookings_per_account": 1
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "tls_plugin",
-                "plugin_bin": "tls_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.dub.fr.tourist",
-                    "city": "Dublin",
-                    "visa_type": "Tourist",
-                    "country": "France"
-                }
-            ],
-            "website": "https://visas-fr.tlscontact.com/en-us/country/ie/vac/ieDUB2fr",
-            "free_config": {
-                "tls_url": "https://visas-fr.tlscontact.com/en-us/country/ie/vac/ieDUB2fr",
-                "location": "Dublin",
-                "capsolver_key": "CAP-5441DD341DD3CC2FAEF0BE6FE493EE9A",
-                "login_captcha": {
-                    "solve_advance": false,
-                    "site_key": "6LcDpXcfAAAAAM7wOEsF_38DNsL20tTvPTKxpyn0",
-                    "page_url": "https://i2-auth.visas-fr.tlscontact.com",
-                    "task": "ReCaptchaV2TaskProxyLess"
-                }
-            }
-        },
-        {
-            "identifier": "vfs.cn.at",
-            "debug": false,
-            "enable": true,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap"],
-            "proxy_cd": 300,
-            "session_max_life": 1800,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "cn.at.sentinel",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "built-in",
-                "account_pool_id": "cn.at.booker",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "booking_cooldown": 10,
-                "max_bookings_per_account": 8
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "vfs_plugin",
-                "plugin_bin": "vfs_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.can.at.tourist",
-                    "city": "Guangzhou",
-                    "visa_type": "Tourist",
-                    "country": "Austria"
-                }
-            ],
-            "website": "https://visa.vfsglobal.com/chn/en/aut/login",
-            "free_config": {
-                "mission_code": "aut",
-                "mission_name": "Austria",
-                "country_code": "chn",
-                "country_name": "China",
-                "culture_code": "en-US",
-                "language": "en",
-                "apt_configs": {
-                    "slot.can.at.tourist": {
-                        "center_name": "Austria Visa Application Center, Guangzhou",
-                        "address": "7/F, GAL Tower, No. 78, Pazhou Avenue, Haizhu District",
-                        "vac_code": "Gua",
-                        "category_name": "Visa Type C-Schengen",
-                        "category_code": "VTC",
-                        "subcategory_name": "Tourism (90 days)",
-                        "subcategory_code": "TR"
-                    }
-                }
-            }
-        },
-        {
-            "identifier": "e-konsulat.ie.pl",
-            "debug": false,
-            "enable": false,
-            "need_account": false,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap", "decodo"],
-            "proxy_cd": 300,
-            "session_max_life": 1800,
-            "sentinel": {
-                "account_source": "",
-                "account_pool_id": "",
-                "target_instances": 1,
-                "account_cd": 0,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "",
-                "target_instances": 0,
-                "account_cd": 0,
-                "booking_cooldown": 10,
-                "max_bookings_per_account": 1
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "pol_plugin",
-                "plugin_bin": "pol_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.dub.pl.tourist",
-                    "city": "Dublin",
-                    "visa_type": "Tourist",
-                    "country": "Poland"
-                }
-            ],
-            "website": "https://secure.e-konsulat.gov.pl/placowki/151/wiza-schengen/wizyty/weryfikacja-obrazkowa",
-            "free_config": {
-                "query_url": "https://secure.e-konsulat.gov.pl/placowki/151/wiza-schengen/wizyty/weryfikacja-obrazkowa",
-                "service_type": "Wiza Schengen",
-                "location": "Dublin"
-            }
-        },
-        {
-            "identifier": "e-konsulat.jp.pl",
-            "debug": false,
-            "enable": false,
-            "need_account": false,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap", "decodo"],
-            "proxy_cd": 300,
-            "session_max_life": 1800,
-            "sentinel": {
-                "account_source": "",
-                "account_pool_id": "",
-                "target_instances": 1,
-                "account_cd": 0,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "",
-                "target_instances": 0,
-                "account_cd": 0,
-                "booking_cooldown": 10,
-                "max_bookings_per_account": 1
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "pol_plugin",
-                "plugin_bin": "pol_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.tyo.pl.tourist",
-                    "city": "Tokyo",
-                    "visa_type": "Tourist",
-                    "country": "Poland"
-                }
-            ],
-            "website": "https://secure.e-konsulat.gov.pl/placowki/178/wiza-krajowa/wizyty/weryfikacja-obrazkowa",
-            "free_config": {
-                "query_url": "https://secure.e-konsulat.gov.pl/placowki/178/wiza-krajowa/wizyty/weryfikacja-obrazkowa",
-                "service_type": "wiza krajowa",
-                "location": "Tokio"
-            }
-        },
-        {
-            "identifier": "visaonweb.ie.be",
-            "debug": false,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["local"],
-            "proxy_cd": 300,
-            "session_max_life": 10800,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "ie.be.sentinel",
-                "target_instances": 1,
-                "account_cd": 3600,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "",
-                "target_instances": 0,
-                "account_cd": 0,
-                "booking_cooldown": 10,
-                "max_bookings_per_account": 1
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "bel_plugin",
-                "plugin_bin": "bel_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.dub.be.tourist",
-                    "city": "Dublin",
-                    "visa_type": "Tourist",
-                    "country": "Belgium"
-                }
-            ],
-            "website": "https://visaonweb.diplomatie.be/en",
-            "free_config": {
-                "capsolver_key":"CAP-5441DD341DD3CC2FAEF0BE6FE493EE9A"
-            }
-        },
-        {
-            "identifier": "visametric.ie.de",
-            "debug": false,
-            "enable": false,
-            "need_account": false,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap", "decodo"],
-            "proxy_cd": 300,
-            "session_max_life": 900,
-            "sentinel": {
-                "account_source": "",
-                "account_pool_id": "",
-                "target_instances": 1,
-                "account_cd": 0,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "",
-                "account_pool_id": "",
-                "target_instances": 1,
-                "account_cd": 0,
-                "booking_cooldown": 10,
-                "max_bookings_per_account": 1
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "de_plugin",
-                "plugin_bin": "de_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.dub.de.tourist",
-                    "city": "Dublin",
-                    "visa_type": "Tourist",
-                    "country": "Germany"
-                }
-            ],
-            "website": "https://ie-appointment.visametric.com/en",
-            "free_config": {
-                "base_url": "https://ie-appointment.visametric.com",
-                "consularid": 1
-            }
-        },
-        {
-            "identifier": "pernotami.ie.it",
-            "debug": false,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap", "decodo"],
-            "proxy_cd": 300,
-            "session_max_life": 900,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "ie.it.sentinel",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "order",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "booking_cooldown": 10,
-                "max_bookings_per_account": 1
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "ita_plugin",
-                "plugin_bin": "ita_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.dub.it.tourist",
-                    "city": "Dublin",
-                    "visa_type": "Tourist",
-                    "country": "Italy"
-                }
-            ],
-            "website": "https://prenotami.esteri.it/Home",
-            "free_config": {
-                "capsolver_key": "03db1d1ff2f4a33e84ef1da99bd83336bed3710153525"
-            }
-        },
-        {
-            "identifier": "greekemba.ie.gr",
-            "debug": false,
-            "enable": false,
-            "need_account": true,
-            "need_proxy": true,
-            "proxy_pool": ["proxy-cheap", "decodo"],
-            "proxy_cd": 300,
-            "session_max_life": 86400,
-            "sentinel": {
-                "account_source": "built-in",
-                "account_pool_id": "ie.gr.sentinel",
-                "target_instances": 1,
-                "account_cd": 10800,
-                "signal_ttl": 30
-            },
-            "booker": {
-                "account_source": "order",
-                "target_instances": 10,
-                "account_cd": 10800,
-                "booking_cooldown": 30,
-                "max_bookings_per_account": 1
-            },
-            "query_wait": {
-                "mode": "Random",
-                "fixed_wait": 10,
-                "random_min": 60,
-                "random_max": 300
-            },
-            "plugin_config": {
-                "lib_path": "plugins",
-                "plugin_name": "grc_plugin",
-                "plugin_bin": "grc_plugin.py",
-                "plugin_proto": "IVSPlg"
-            },
-            "appointment_types": [
-                {
-                    "weight": 10,
-                    "routing_key": "slot.dub.gr.tourist",
-                    "city": "Dublin",
-                    "visa_type": "Tourist",
-                    "country": "Greece"
-                }
-            ],
-            "website": "https://www.supersaas.com/schedule/GreekEmbassyInDublin/Visas",
-            "free_config": {}
-        }
-    ]
-}

+ 1632 - 0
config/config.json.example

@@ -0,0 +1,1632 @@
+{
+  "version": 202605241517,
+  "redis": {
+    "host": "text.skin",
+    "port": 6379,
+    "db": 0,
+    "password": "STEs2x6ML0U1HlpE9SojM6YU7QPhqzY8"
+  },
+  "group_list": [
+    {
+      "identifier": "vfs.ie.nl",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap",
+        "decodo"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 1800,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "ie.nl.sentinel",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "built-in",
+        "account_pool_id": "ie.nl.booker",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "booking_cooldown": 300,
+        "max_bookings_per_account": 8
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "vfs_plugin",
+        "plugin_bin": "vfs_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.dub.nl.tourist",
+          "city": "Dublin",
+          "visa_type": "Tourist",
+          "country": "Netherlands"
+        }
+      ],
+      "website": "https://visa.vfsglobal.com/irl/en/nld/login",
+      "free_config": {
+        "mission_code": "nld",
+        "mission_name": "Netherlands",
+        "country_code": "irl",
+        "country_name": "Ireland",
+        "culture_code": "en-US",
+        "language": "en",
+        "apt_configs": {
+          "slot.dub.nl.tourist": {
+            "center_name": "Netherlands Visa Application Center - Dublin",
+            "address": "Cunningham House, 130 Francis Street, Dublin 8  D08 H48R",
+            "vac_code": "NTDB",
+            "category_name": "All Short stay Categories",
+            "category_code": "TA",
+            "subcategory_name": "Tourist",
+            "subcategory_code": "To"
+          }
+        }
+      }
+    },
+    {
+      "identifier": "vfs.sg.fr",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 1800,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "sg.fr.sentinel",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "built-in",
+        "account_pool_id": "sg.fr.booker",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "booking_cooldown": 10,
+        "max_bookings_per_account": 8
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "vfs_plugin",
+        "plugin_bin": "vfs_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.sin.fr.tourist",
+          "city": "Singapore",
+          "visa_type": "Tourist",
+          "country": "France"
+        }
+      ],
+      "website": "https://visa.vfsglobal.com/sgp/en/fra/login",
+      "free_config": {
+        "mission_code": "fra",
+        "mission_name": "France",
+        "country_code": "sgp",
+        "country_name": "Singapore",
+        "culture_code": "en-US",
+        "language": "en",
+        "apt_configs": {
+          "slot.sin.fr.tourist": {
+            "center_name": "France Visa Application Center, Singapore",
+            "address": "79 Anson Road #15-01 Singapore 079906",
+            "vac_code": "FRSN",
+            "category_name": "Short Stay",
+            "category_code": "02",
+            "subcategory_name": "Short Stay Tourist, Family Visit",
+            "subcategory_code": "Six"
+          }
+        }
+      }
+    },
+    {
+      "identifier": "vfs.au.fr",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap",
+        "decodo"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 1800,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "au.fr.sentinel",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "built-in",
+        "account_pool_id": "au.fr.booker",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "booking_cooldown": 10,
+        "max_bookings_per_account": 8
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "vfs_plugin",
+        "plugin_bin": "vfs_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.syd.fr.tourist",
+          "city": "Sydney",
+          "visa_type": "Tourist",
+          "country": "France"
+        },
+        {
+          "weight": 10,
+          "routing_key": "slot.mel.fr.tourist",
+          "city": "Melbourne",
+          "visa_type": "Tourist",
+          "country": "France"
+        }
+      ],
+      "website": "https://visa.vfsglobal.com/aus/en/fra/login",
+      "free_config": {
+        "mission_code": "fra",
+        "mission_name": "France",
+        "country_code": "aus",
+        "country_name": "Australia",
+        "culture_code": "en-US",
+        "language": "en",
+        "apt_configs": {
+          "slot.syd.fr.tourist": {
+            "center_name": "France Visa Application Center - Sydney",
+            "address": "France Visa Application Center,Level 6, 88 Pitt Street,Sydney NSW 2000",
+            "vac_code": "SYD",
+            "category_name": "VISA",
+            "category_code": "VISA",
+            "subcategory_name": "Short Stay Schengen Visa",
+            "subcategory_code": "ShortStaySchengenVisa"
+          },
+          "slot.mel.fr.tourist": {
+            "center_name": "France Visa Application Center - Melbourne",
+            "address": "Level 5 332 St. Kilda road level 5 Melbourne 3004",
+            "vac_code": "MEL",
+            "category_name": "VISA",
+            "category_code": "VISA",
+            "subcategory_name": "Short Stay Schengen Visa",
+            "subcategory_code": "ShortStaySchengenVisa"
+          }
+        }
+      }
+    },
+    {
+      "identifier": "vfs.gb.it",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap",
+        "decodo"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 1800,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "gb.it.sentinel",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "built-in",
+        "account_pool_id": "gb.it.booker",
+        "target_instances": 0,
+        "account_cd": 10800,
+        "booking_cooldown": 10,
+        "max_bookings_per_account": 8
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "vfs_plugin",
+        "plugin_bin": "vfs_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 80,
+          "routing_key": "slot.lon.it.tourist",
+          "city": "London",
+          "visa_type": "Tourist",
+          "country": "Italy"
+        },
+        {
+          "weight": 20,
+          "routing_key": "slot.man.it.tourist",
+          "city": "Manchester",
+          "visa_type": "Tourist",
+          "country": "Italy"
+        }
+      ],
+      "website": "https://visa.vfsglobal.com/gbr/en/ita/login",
+      "free_config": {
+        "mission_code": "ita",
+        "mission_name": "Italy",
+        "country_code": "gbr",
+        "country_name": "United Kingdom",
+        "culture_code": "en-US",
+        "language": "en",
+        "apt_configs": {
+          "slot.lon.it.tourist": {
+            "center_name": "Italy Visa Application Centre, London",
+            "address": "Ground floor, 8- 20  Pocock St London SE1 0BW , United Kingdom",
+            "vac_code": "ILON",
+            "category_name": "Italy UK VisaCategory",
+            "category_code": "UKITVED",
+            "subcategory_name": "Tourist/ Business/ EU Family",
+            "subcategory_code": "TBE"
+          },
+          "slot.man.it.tourist": {
+            "center_name": "Italy Visa Application Centre, Manchester",
+            "address": "50 Devonshire Street North, M12 6JH",
+            "vac_code": "IMAN",
+            "category_name": "Italy UK VisaCategory",
+            "category_code": "UKITVED",
+            "subcategory_name": "Tourist/ Business/ EU Family",
+            "subcategory_code": "TBE"
+          }
+        }
+      }
+    },
+    {
+      "identifier": "vfs.gb.nl",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap",
+        "decodo"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 1800,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "gb.nl.sentinel",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "built-in",
+        "account_pool_id": "gb.nl.booker",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "booking_cooldown": 10,
+        "max_bookings_per_account": 8
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "vfs_plugin",
+        "plugin_bin": "vfs_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 90,
+          "routing_key": "slot.lon.nl.tourist",
+          "city": "London",
+          "visa_type": "Tourist",
+          "country": "Netherlands"
+        },
+        {
+          "weight": 10,
+          "routing_key": "slot.man.nl.tourist",
+          "city": "Manchester",
+          "visa_type": "Tourist",
+          "country": "Netherlands"
+        }
+      ],
+      "website": "https://visa.vfsglobal.com/gbr/en/nld/login",
+      "free_config": {
+        "mission_code": "nld",
+        "mission_name": "Netherland",
+        "country_code": "gbr",
+        "country_name": "United Kingdom",
+        "culture_code": "en-US",
+        "language": "en",
+        "apt_configs": {
+          "slot.lon.nl.tourist": {
+            "center_name": "Netherlands Visa application centre - London",
+            "address": "66 Wilson Street, EC2A 2BT",
+            "vac_code": "NAKN",
+            "category_name": "Schengen Visa",
+            "category_code": "Schengen Visa",
+            "subcategory_name": "Tourism",
+            "subcategory_code": "TA"
+          },
+          "slot.man.nl.tourist": {
+            "center_name": "Netherlands Visa application centre - Manchester",
+            "address": "50 Devonshire Street North, M12 6JH",
+            "vac_code": "NAKT",
+            "category_name": "Schengen Visa",
+            "category_code": "Schengen Visa",
+            "subcategory_name": "Tourism",
+            "subcategory_code": "TA"
+          }
+        }
+      }
+    },
+    {
+      "identifier": "vfs.gb.no",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap",
+        "decodo"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 1800,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "gb.no.sentinel",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "built-in",
+        "account_pool_id": "gb.no.booker",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "booking_cooldown": 10,
+        "max_bookings_per_account": 8
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "vfs_plugin",
+        "plugin_bin": "vfs_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.lon.no.tourist",
+          "city": "London",
+          "visa_type": "Tourist",
+          "country": "Norway"
+        }
+      ],
+      "website": "https://visa.vfsglobal.com/gbr/en/nor/login",
+      "free_config": {
+        "mission_code": "nor",
+        "mission_name": "Norway",
+        "country_code": "gbr",
+        "country_name": "United Kingdom",
+        "culture_code": "en-US",
+        "language": "en",
+        "apt_configs": {
+          "slot.lon.no.tourist": {
+            "center_name": "Norway Visa Application Centre, London",
+            "address": "66 Wilson street, EC2A 2BT",
+            "vac_code": "NLON",
+            "category_name": "Schengen Visa C",
+            "category_code": "SCHVISA",
+            "subcategory_name": "Tourist Visa",
+            "subcategory_code": "TOU"
+          }
+        }
+      }
+    },
+    {
+      "identifier": "vfs.ie.at",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap",
+        "decodo"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 1800,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "ie.at.sentinel",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "built-in",
+        "account_pool_id": "ie.at.booker",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "booking_cooldown": 300,
+        "max_bookings_per_account": 8
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "vfs_plugin",
+        "plugin_bin": "vfs_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.dub.at.tourist",
+          "city": "Dublin",
+          "visa_type": "Tourist",
+          "country": "Austria"
+        }
+      ],
+      "website": "https://visa.vfsglobal.com/irl/en/aut/login",
+      "free_config": {
+        "mission_code": "aut",
+        "mission_name": "Austria",
+        "country_code": "irl",
+        "country_name": "Ireland",
+        "culture_code": "en-US",
+        "language": "en",
+        "apt_configs": {
+          "slot.dub.at.tourist": {
+            "center_name": "Austria / Switzerland / Liechtenstein/ Slovenia Visa Application Center, Dublin",
+            "address": "Cunningham House, 130 Francis Street, Dublin 8 D08 H48R",
+            "vac_code": "AUT-DUB",
+            "category_name": "Other Visas",
+            "category_code": "Default_Austria_Ireland ",
+            "subcategory_name": "All Visas ",
+            "subcategory_code": "TA"
+          }
+        }
+      }
+    },
+    {
+      "identifier": "vfs.ie.dk",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap",
+        "decodo"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 1800,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "ie.dk.sentinel",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "built-in",
+        "account_pool_id": "ie.dk.booker",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "booking_cooldown": 10,
+        "max_bookings_per_account": 8
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "vfs_plugin",
+        "plugin_bin": "vfs_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.dub.dk.tourist",
+          "city": "Dublin",
+          "visa_type": "Tourist",
+          "country": "Denmark"
+        }
+      ],
+      "website": "https://visa.vfsglobal.com/irl/en/dnk/login",
+      "free_config": {
+        "mission_code": "dnk",
+        "mission_name": "Denmark",
+        "country_code": "irl",
+        "country_name": "Ireland",
+        "culture_code": "en-US",
+        "language": "en",
+        "apt_configs": {
+          "slot.dub.dk.tourist": {
+            "center_name": "Denmark Visa Application Center, Dublin ",
+            "address": "Cunningham House, 130 Francis Street, Dublin 8 D08 H48R",
+            "vac_code": "DIDUB",
+            "category_name": "Schengen Visa",
+            "category_code": "SV",
+            "subcategory_name": "Tourism",
+            "subcategory_code": "TV"
+          }
+        }
+      }
+    },
+    {
+      "identifier": "vfs.ie.fi",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap",
+        "decodo"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 1800,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "ie.fi.sentinel",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "built-in",
+        "account_pool_id": "ie.fi.booker",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "booking_cooldown": 10,
+        "max_bookings_per_account": 8
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "vfs_plugin",
+        "plugin_bin": "vfs_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.dub.fi.tourist",
+          "city": "Dublin",
+          "visa_type": "Tourist",
+          "country": "Finland"
+        }
+      ],
+      "website": "https://visa.vfsglobal.com/irl/en/fin/login",
+      "free_config": {
+        "mission_code": "fin",
+        "mission_name": "Finland",
+        "country_code": "irl",
+        "country_name": "Ireland",
+        "culture_code": "en-US",
+        "language": "en",
+        "apt_configs": {
+          "slot.dub.fi.tourist": {
+            "center_name": "Application Centre, Dublin",
+            "address": "Cunningham House, 130 Francis Street, Dublin 8 D08 H48R",
+            "vac_code": "Dubb",
+            "category_name": "VISA",
+            "category_code": "S S",
+            "subcategory_name": "Tourist Category",
+            "subcategory_code": "Tourist Category"
+          }
+        }
+      }
+    },
+    {
+      "identifier": "vfs.ie.hu",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap",
+        "decodo"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 1800,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "ie.hu.sentinel",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "built-in",
+        "account_pool_id": "ie.hu.booker",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "booking_cooldown": 180,
+        "max_bookings_per_account": 8
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "vfs_plugin",
+        "plugin_bin": "vfs_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.dub.hu.tourist",
+          "city": "Dublin",
+          "visa_type": "Tourist",
+          "country": "Hungary"
+        }
+      ],
+      "website": "https://visa.vfsglobal.com/irl/en/hun/login",
+      "free_config": {
+        "mission_code": "hun",
+        "mission_name": "Hungary",
+        "country_code": "irl",
+        "country_name": "Ireland",
+        "culture_code": "en-US",
+        "language": "en",
+        "apt_configs": {
+          "slot.dub.hu.tourist": {
+            "center_name": "Ireland Visa Application Center,Dublin",
+            "address": "Cunningham House, 130 Francis Street Dublin",
+            "vac_code": "DUB",
+            "category_name": "Short Stay",
+            "category_code": "SS",
+            "subcategory_name": "Schengen Visa",
+            "subcategory_code": "Schengen Visa"
+          }
+        }
+      }
+    },
+    {
+      "identifier": "vfs.ie.is",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap",
+        "decodo"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 1800,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "ie.is.sentinel",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "built-in",
+        "account_pool_id": "ie.is.booker",
+        "target_instances": 0,
+        "account_cd": 10800,
+        "booking_cooldown": 10,
+        "max_bookings_per_account": 8
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "vfs_plugin",
+        "plugin_bin": "vfs_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.dub.is.tourist",
+          "city": "Dublin",
+          "visa_type": "Tourist",
+          "country": "Iceland"
+        }
+      ],
+      "website": "https://visa.vfsglobal.com/irl/en/isl/login",
+      "free_config": {
+        "mission_code": "isl",
+        "mission_name": "Iceland",
+        "country_code": "irl",
+        "country_name": "Ireland",
+        "culture_code": "en-US",
+        "language": "en",
+        "apt_configs": {
+          "slot.dub.is.tourist": {
+            "center_name": "Iceland Visa Application Center- Dublin",
+            "address": "Cunningham House, 130 Francis Street, Dublin, Ireland- DO8 H48R",
+            "vac_code": "DUB",
+            "category_name": "C-Visa",
+            "category_code": "CVI",
+            "subcategory_name": "Tourism",
+            "subcategory_code": "OTT"
+          }
+        }
+      }
+    },
+    {
+      "identifier": "vfs.gb.at",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap",
+        "decodo"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 1800,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "gb.at.sentinel",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "built-in",
+        "account_pool_id": "gb.at.booker",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "booking_cooldown": 10,
+        "max_bookings_per_account": 8
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "vfs_plugin",
+        "plugin_bin": "vfs_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.lon.at.tourist",
+          "city": "London",
+          "visa_type": "Tourist",
+          "country": "Austria"
+        }
+      ],
+      "website": "https://visa.vfsglobal.com/gbr/en/aut/login",
+      "free_config": {
+        "mission_code": "aut",
+        "mission_name": "Austria",
+        "country_code": "gbr",
+        "country_name": "United Kingdom",
+        "culture_code": "en-US",
+        "language": "en",
+        "apt_configs": {
+          "slot.lon.at.tourist": {
+            "center_name": "Austria Visa Application Centre, London",
+            "address": "66 Wilson Street, EC2A 2BT",
+            "vac_code": "ADN",
+            "category_name": "Visa  to  Austria",
+            "category_code": "Visa  to  Austria",
+            "subcategory_name": "Tourism",
+            "subcategory_code": "TA"
+          }
+        }
+      }
+    },
+    {
+      "identifier": "bls.ie.es",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "spain-isp"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 3600,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "ie.es.sentinel",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "order",
+        "target_instances": 0,
+        "account_cd": 10800,
+        "booking_cooldown": 10,
+        "max_bookings_per_account": 1
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 180,
+        "random_max": 360
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "bls_plugin",
+        "plugin_bin": "bls_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.dub.es.tourist",
+          "city": "Dublin",
+          "visa_type": "Tourist",
+          "country": "Spain"
+        }
+      ],
+      "website": "https://ireland.blsspainglobal.com/Global/bls/visatypeverification",
+      "free_config": {
+        "domain": "ireland.blsspainglobal.com",
+        "ocr_model": "data/ctc.pth",
+        "apt_configs": {
+          "slot.dub.es.tourist": {
+            "location": "Dublin",
+            "jurisdiction": null,
+            "visa_type": "Schengen Visa/ Short Term Visa",
+            "visa_subtype": "Tourist Visa",
+            "appointment_type": "Individual",
+            "appointment_category": "Normal",
+            "mission_code": "EMBASSY_DUBLIN"
+          }
+        }
+      }
+    },
+    {
+      "identifier": "bls.gb.es",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "spain-isp"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 3600,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "gb.es.sentinel",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "order",
+        "target_instances": 0,
+        "account_cd": 10800,
+        "booking_cooldown": 10,
+        "max_bookings_per_account": 1
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "bls_plugin",
+        "plugin_bin": "bls_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.lon.es.tourist",
+          "city": "London",
+          "visa_type": "Tourist",
+          "country": "Spain"
+        }
+      ],
+      "website": "https://uk.blsspainglobal.com/Global/bls/visatypeverification",
+      "free_config": {
+        "domain": "uk.blsspainglobal.com",
+        "ocr_model": "data/ocr.pth",
+        "apt_configs": {
+          "slot.lon.es.tourist": {
+            "location": "Dublin",
+            "jurisdiction": "Greater London",
+            "visa_type": "Short Term Visa(Maximum stay of 90 days)",
+            "visa_subtype": "Tourist Visa",
+            "appointment_type": "Individual",
+            "appointment_category": "Normal",
+            "mission_code": "LHR"
+          }
+        }
+      }
+    },
+    {
+      "identifier": "tls.gb.fr",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap"
+      ],
+      "proxy_cd": 900,
+      "session_max_life": 1800,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "tls.gb.fr.sentinel",
+        "target_instances": 1,
+        "account_cd": 1800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "order",
+        "target_instances": 2,
+        "account_cd": 1800,
+        "booking_cooldown": 3,
+        "max_bookings_per_account": 1
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 55,
+        "random_max": 65
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "tls_plugin",
+        "plugin_bin": "tls_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.lon.fr.tourist",
+          "city": "London",
+          "visa_type": "Tourist",
+          "country": "France"
+        }
+      ],
+      "website": "https://visas-fr.tlscontact.com/en-us/country/gb/vac/gbLON2fr",
+      "free_config": {
+        "tls_url": "https://visas-fr.tlscontact.com/en-us/country/gb/vac/gbLON2fr",
+        "location": "London",
+        "capsolver_key": "CAP-5441DD341DD3CC2FAEF0BE6FE493EE9A",
+        "login_captcha": {
+          "solve_advance": false,
+          "site_key": "6LcDpXcfAAAAAM7wOEsF_38DNsL20tTvPTKxpyn0",
+          "page_url": "https://i2-auth.visas-fr.tlscontact.com",
+          "task": "ReCaptchaV2TaskProxyLess"
+        }
+      }
+    },
+    {
+      "identifier": "tls.cn.bjs.fr",
+      "debug": false,
+      "enable": true,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap-good"
+      ],
+      "proxy_cd": 900,
+      "session_max_life": 1800,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "tls.cn.bjs.fr.sentinel",
+        "target_instances": 2,
+        "account_cd": 1800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "order",
+        "target_instances": 1,
+        "account_cd": 1800,
+        "booking_cooldown": 3,
+        "max_bookings_per_account": 1
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 55,
+        "random_max": 65
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "tls_plugin",
+        "plugin_bin": "tls_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.bjs.fr.tourist",
+          "city": "Beijing",
+          "visa_type": "Tourist",
+          "country": "France"
+        }
+      ],
+      "website": "https://visas-fr.tlscontact.com/en-us/country/cn/vac/cnBJS2fr",
+      "free_config": {
+        "tls_url": "https://visas-fr.tlscontact.com/en-us/country/cn/vac/cnBJS2fr",
+        "location": "Beijing",
+        "capsolver_key": "CAP-5441DD341DD3CC2FAEF0BE6FE493EE9A",
+        "login_captcha": {
+          "solve_advance": false,
+          "site_key": "6LcDpXcfAAAAAM7wOEsF_38DNsL20tTvPTKxpyn0",
+          "page_url": "https://i2-auth.visas-fr.tlscontact.com",
+          "task": "ReCaptchaV2TaskProxyLess"
+        }
+      }
+    },
+    {
+      "identifier": "tls.cn.sha.fr",
+      "debug": false,
+      "enable": true,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap-good"
+      ],
+      "proxy_cd": 900,
+      "session_max_life": 1800,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "tls.cn.sha.fr.sentinel",
+        "target_instances": 1,
+        "account_cd": 1800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "order",
+        "target_instances": 1,
+        "account_cd": 1800,
+        "booking_cooldown": 3,
+        "max_bookings_per_account": 1
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 55,
+        "random_max": 65
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "tls_plugin",
+        "plugin_bin": "tls_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.sha.fr.tourist",
+          "city": "Shanghai",
+          "visa_type": "Tourist",
+          "country": "France"
+        }
+      ],
+      "website": "https://visas-fr.tlscontact.com/en-us/country/cn/vac/cnSHA2fr",
+      "free_config": {
+        "tls_url": "https://visas-fr.tlscontact.com/en-us/country/cn/vac/cnSHA2fr",
+        "location": "Shanghai",
+        "capsolver_key": "CAP-5441DD341DD3CC2FAEF0BE6FE493EE9A",
+        "login_captcha": {
+          "solve_advance": false,
+          "site_key": "6LcDpXcfAAAAAM7wOEsF_38DNsL20tTvPTKxpyn0",
+          "page_url": "https://i2-auth.visas-fr.tlscontact.com",
+          "task": "ReCaptchaV2TaskProxyLess"
+        }
+      }
+    },
+    {
+      "identifier": "tls.ie.fr",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap-good",
+        "decodo-good"
+      ],
+      "proxy_cd": 900,
+      "session_max_life": 1800,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "tls.ie.fr.sentinel",
+        "target_instances": 1,
+        "account_cd": 1800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "order",
+        "target_instances": 1,
+        "account_cd": 1800,
+        "booking_cooldown": 3,
+        "max_bookings_per_account": 1
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "tls_plugin",
+        "plugin_bin": "tls_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.dub.fr.tourist",
+          "city": "Dublin",
+          "visa_type": "Tourist",
+          "country": "France"
+        }
+      ],
+      "website": "https://visas-fr.tlscontact.com/en-us/country/ie/vac/ieDUB2fr",
+      "free_config": {
+        "tls_url": "https://visas-fr.tlscontact.com/en-us/country/ie/vac/ieDUB2fr",
+        "location": "Dublin",
+        "capsolver_key": "CAP-5441DD341DD3CC2FAEF0BE6FE493EE9A",
+        "login_captcha": {
+          "solve_advance": false,
+          "site_key": "6LcDpXcfAAAAAM7wOEsF_38DNsL20tTvPTKxpyn0",
+          "page_url": "https://i2-auth.visas-fr.tlscontact.com",
+          "task": "ReCaptchaV2TaskProxyLess"
+        }
+      }
+    },
+    {
+      "identifier": "vfs.cn.at",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 1800,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "cn.at.sentinel",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "built-in",
+        "account_pool_id": "cn.at.booker",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "booking_cooldown": 10,
+        "max_bookings_per_account": 8
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "vfs_plugin",
+        "plugin_bin": "vfs_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.can.at.tourist",
+          "city": "Guangzhou",
+          "visa_type": "Tourist",
+          "country": "Austria"
+        }
+      ],
+      "website": "https://visa.vfsglobal.com/chn/en/aut/login",
+      "free_config": {
+        "mission_code": "aut",
+        "mission_name": "Austria",
+        "country_code": "chn",
+        "country_name": "China",
+        "culture_code": "en-US",
+        "language": "en",
+        "apt_configs": {
+          "slot.can.at.tourist": {
+            "center_name": "Austria Visa Application Center, Guangzhou",
+            "address": "7/F, GAL Tower, No. 78, Pazhou Avenue, Haizhu District",
+            "vac_code": "Gua",
+            "category_name": "Visa Type C-Schengen",
+            "category_code": "VTC",
+            "subcategory_name": "Tourism (90 days)",
+            "subcategory_code": "TR"
+          }
+        }
+      }
+    },
+    {
+      "identifier": "e-konsulat.ie.pl",
+      "debug": false,
+      "enable": false,
+      "need_account": false,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap",
+        "decodo"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 1800,
+      "sentinel": {
+        "account_source": "",
+        "account_pool_id": "",
+        "target_instances": 1,
+        "account_cd": 0,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "",
+        "target_instances": 0,
+        "account_cd": 0,
+        "booking_cooldown": 10,
+        "max_bookings_per_account": 1
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "pol_plugin",
+        "plugin_bin": "pol_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.dub.pl.tourist",
+          "city": "Dublin",
+          "visa_type": "Tourist",
+          "country": "Poland"
+        }
+      ],
+      "website": "https://secure.e-konsulat.gov.pl/placowki/151/wiza-schengen/wizyty/weryfikacja-obrazkowa",
+      "free_config": {
+        "query_url": "https://secure.e-konsulat.gov.pl/placowki/151/wiza-schengen/wizyty/weryfikacja-obrazkowa",
+        "service_type": "Wiza Schengen",
+        "location": "Dublin"
+      }
+    },
+    {
+      "identifier": "e-konsulat.jp.pl",
+      "debug": false,
+      "enable": false,
+      "need_account": false,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap",
+        "decodo"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 1800,
+      "sentinel": {
+        "account_source": "",
+        "account_pool_id": "",
+        "target_instances": 1,
+        "account_cd": 0,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "",
+        "target_instances": 0,
+        "account_cd": 0,
+        "booking_cooldown": 10,
+        "max_bookings_per_account": 1
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "pol_plugin",
+        "plugin_bin": "pol_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.tyo.pl.tourist",
+          "city": "Tokyo",
+          "visa_type": "Tourist",
+          "country": "Poland"
+        }
+      ],
+      "website": "https://secure.e-konsulat.gov.pl/placowki/178/wiza-krajowa/wizyty/weryfikacja-obrazkowa",
+      "free_config": {
+        "query_url": "https://secure.e-konsulat.gov.pl/placowki/178/wiza-krajowa/wizyty/weryfikacja-obrazkowa",
+        "service_type": "wiza krajowa",
+        "location": "Tokio"
+      }
+    },
+    {
+      "identifier": "visaonweb.ie.be",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "local"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 10800,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "ie.be.sentinel",
+        "target_instances": 1,
+        "account_cd": 3600,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "",
+        "target_instances": 0,
+        "account_cd": 0,
+        "booking_cooldown": 10,
+        "max_bookings_per_account": 1
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "bel_plugin",
+        "plugin_bin": "bel_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.dub.be.tourist",
+          "city": "Dublin",
+          "visa_type": "Tourist",
+          "country": "Belgium"
+        }
+      ],
+      "website": "https://visaonweb.diplomatie.be/en",
+      "free_config": {
+        "capsolver_key": "CAP-5441DD341DD3CC2FAEF0BE6FE493EE9A"
+      }
+    },
+    {
+      "identifier": "visametric.ie.de",
+      "debug": false,
+      "enable": false,
+      "need_account": false,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap",
+        "decodo"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 900,
+      "sentinel": {
+        "account_source": "",
+        "account_pool_id": "",
+        "target_instances": 1,
+        "account_cd": 0,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "",
+        "account_pool_id": "",
+        "target_instances": 1,
+        "account_cd": 0,
+        "booking_cooldown": 10,
+        "max_bookings_per_account": 1
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "de_plugin",
+        "plugin_bin": "de_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.dub.de.tourist",
+          "city": "Dublin",
+          "visa_type": "Tourist",
+          "country": "Germany"
+        }
+      ],
+      "website": "https://ie-appointment.visametric.com/en",
+      "free_config": {
+        "base_url": "https://ie-appointment.visametric.com",
+        "consularid": 1
+      }
+    },
+    {
+      "identifier": "pernotami.ie.it",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap",
+        "decodo"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 900,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "ie.it.sentinel",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "order",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "booking_cooldown": 10,
+        "max_bookings_per_account": 1
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "ita_plugin",
+        "plugin_bin": "ita_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.dub.it.tourist",
+          "city": "Dublin",
+          "visa_type": "Tourist",
+          "country": "Italy"
+        }
+      ],
+      "website": "https://prenotami.esteri.it/Home",
+      "free_config": {
+        "capsolver_key": "03db1d1ff2f4a33e84ef1da99bd83336bed3710153525"
+      }
+    },
+    {
+      "identifier": "greekemba.ie.gr",
+      "debug": false,
+      "enable": false,
+      "need_account": true,
+      "need_proxy": true,
+      "proxy_pool": [
+        "proxy-cheap",
+        "decodo"
+      ],
+      "proxy_cd": 300,
+      "session_max_life": 86400,
+      "sentinel": {
+        "account_source": "built-in",
+        "account_pool_id": "ie.gr.sentinel",
+        "target_instances": 1,
+        "account_cd": 10800,
+        "signal_ttl": 30
+      },
+      "booker": {
+        "account_source": "order",
+        "target_instances": 10,
+        "account_cd": 10800,
+        "booking_cooldown": 30,
+        "max_bookings_per_account": 1
+      },
+      "query_wait": {
+        "mode": "Random",
+        "fixed_wait": 10,
+        "random_min": 60,
+        "random_max": 300
+      },
+      "plugin_config": {
+        "lib_path": "plugins",
+        "plugin_name": "grc_plugin",
+        "plugin_bin": "grc_plugin.py",
+        "plugin_proto": "IVSPlg"
+      },
+      "appointment_types": [
+        {
+          "weight": 10,
+          "routing_key": "slot.dub.gr.tourist",
+          "city": "Dublin",
+          "visa_type": "Tourist",
+          "country": "Greece"
+        }
+      ],
+      "website": "https://www.supersaas.com/schedule/GreekEmbassyInDublin/Visas",
+      "free_config": {}
+    }
+  ]
+}

+ 1 - 0
deps.txt

@@ -1,5 +1,6 @@
 mihomo-linux-amd64.gz|https://github.com/MetaCubeX/mihomo/releases/download/v1.19.24/mihomo-linux-amd64-v3-v1.19.24.gz
 mihomo-windows-amd64.zip|https://github.com/MetaCubeX/mihomo/releases/download/v1.19.24/mihomo-windows-amd64-v3-v1.19.24.zip
+mihomo-darwin-arm64-v1.19.25.gz|https://github.com/MetaCubeX/mihomo/releases/download/v1.19.25/mihomo-darwin-arm64-v1.19.25.gz
 ungoogled-chromium-144.0.7559.132-1-x86_64_linux.tar.xz|https://github.com/adryfish/fingerprint-chromium/releases/download/144.0.7559.132/ungoogled-chromium-144.0.7559.132-1-x86_64_linux.tar.xz
 ungoogled-chromium_144.0.7559.132-1.1_windows_x64.zip|https://github.com/adryfish/fingerprint-chromium/releases/download/144.0.7559.132/ungoogled-chromium_144.0.7559.132-1.1_windows_x64.zip
 cloakbrowser-linux-x64.tar.gz|https://github.com/CloakHQ/CloakBrowser/releases/download/chromium-v146.0.7680.177.5/cloakbrowser-linux-x64.tar.gz

+ 113 - 11
main_booker.py

@@ -1,6 +1,8 @@
+import os
 import time
 import json
 import argparse
+from typing import List
 
 from vs_types import GroupConfig
 from gco_wrapper import GCOWrapper
@@ -8,12 +10,17 @@ from logger_setup import setup_app_logger
 
 from booker_builtin import BuiltinBookerGCO
 from booker_order import OrderBookerGCO
+from toolkit.vs_cloud_api import VSCloudApi
 
 
 def load_config(path):
     with open(path, "r", encoding="utf-8") as f:
         return json.load(f)
 
+def save_config(path: str, new_config):
+    new_config_str = json.dumps(new_config, indent=2)
+    with open(path, "w", encoding="utf-8") as f:
+        f.write(new_config_str)
 
 def main():
     # ===== 1️⃣ 命令行参数 =====
@@ -23,23 +30,25 @@ def main():
         "-c", "--config",
         type=str,
         required=False,
-        default="config/config.json",
-        help="Path to config.json"
+        default="config/config_booker.json",
+        help="Path to booker config.json"
     )
 
     args = parser.parse_args()
-
+    config_path = args.config
+    CONF_NAME = 'COORDINATOR_BOOKER'
     # ===== 2️⃣ 日志 =====
     app_logger = setup_app_logger("Booker")
     app_logger.info("Booker Logger is ready!")
 
     # ===== 3️⃣ 加载配置 =====
-    cfg_data = load_config(args.config)
-
+    cfg_data = load_config(config_path)
+    
+    current_version = cfg_data.get('version', 0)
     redis_conf = cfg_data.get('redis')
-    groups_conf = cfg_data.get('group_list')
+    groups_conf = cfg_data.get('group_list', [])
 
-    wrappers = []
+    wrappers: List[GCOWrapper] = []
 
     # ===== 4️⃣ 启动逻辑 =====
     for item in groups_conf:
@@ -64,14 +73,107 @@ def main():
         wrapper.start()
         wrappers.append(wrapper)
 
-    app_logger.info(f"Started {len(wrappers)} Booker groups.")
+    app_logger.info(f"Started {len(wrappers)} Booker groups. Press Ctrl+C to stop.")
 
-    # ===== 5️⃣ 保持运行 =====
+    # ===== 5️⃣ 保持运行 & 热更新监听 =====
     try:
         while True:
-            time.sleep(1)
+            time.sleep(30)  # 每 3 秒检查一次文件状态
+            
+            if not os.path.exists(config_path):
+                continue
+                
+            try:
+                new_cfg_data = VSCloudApi.Instance().get_dynamic_config(config_name=CONF_NAME)
+                new_version = new_cfg_data.get('version')
+
+                # 如果 API 返回的没有 version 字段,或者版本号没变,则跳过
+                if new_version == current_version:
+                    continue
+
+                app_logger.info("Config file modification detected! Reloading Booker configurations...")
+                save_config(config_path, new_cfg_data)
+                current_version = new_version
+                
+                redis_conf = new_cfg_data.get('redis') 
+                new_groups_conf = new_cfg_data.get('group_list', [])
+                
+                # 转换新配置为字典格式 {identifier: config_dict}
+                new_cfg_dict = {
+                    item.get("identifier"): item 
+                    for item in new_groups_conf 
+                    if item.get("identifier")
+                }
+                
+                # ---------------- A. 处理【参数更新】、【删除/禁用】、【模式切换】 ----------------
+                surviving_wrappers = []
+                for wrapper in wrappers:
+                    current_id = wrapper.m_cfg.identifier
+                    
+                    if current_id in new_cfg_dict:
+                        new_group_cfg = GroupConfig.from_json(new_cfg_dict[current_id])
+                        
+                        # 1. 后端禁用了该组
+                        if not new_group_cfg.enable:
+                            app_logger.info(f"Group [{current_id}] disabled by backend. Stopping...")
+                            wrapper.stop()
+                            
+                        # 2. 账号来源模式发生了改变 (例如 built-in 变 order) -> 需要更换底层类,必须重启该组
+                        elif wrapper.m_cfg.booker.account_source != new_group_cfg.booker.account_source:
+                            app_logger.info(f"Group [{current_id}] Mode changed ({wrapper.m_cfg.booker.account_source} -> {new_group_cfg.booker.account_source}). Stopping old instance to recreate...")
+                            wrapper.stop()
+                            # 不加入 surviving_wrappers,让下面的步骤 B 重新创建它
+                            
+                        # 3. 模式没变,依然启用 -> 热更新参数
+                        else:
+                            wrapper.update_config(new_group_cfg)
+                            surviving_wrappers.append(wrapper)
+                    else:
+                        # 4. 该组被从 JSON 中删除了
+                        app_logger.info(f"Group [{current_id}] deleted from config. Stopping...")
+                        wrapper.stop()
+                        
+                wrappers = surviving_wrappers
+                
+                # ---------------- B. 处理【新增组】、【重新启用组】、【模式切换后的重建】 ----------------
+                existing_ids = {w.m_cfg.identifier for w in wrappers}
+                
+                for new_id, item_data in new_cfg_dict.items():
+                    if new_id not in existing_ids:
+                        cfg = GroupConfig.from_json(item_data)
+                        
+                        if not cfg.enable:
+                            continue
+                            
+                        # 判断采用哪个底层类
+                        if cfg.booker.account_source == "order":
+                            gco_class = OrderBookerGCO
+                            mode_str = "ORDER (Bound)"
+                        else:
+                            gco_class = BuiltinBookerGCO
+                            mode_str = "BUILT-IN (Unbound)"
+                            
+                        app_logger.info(f"Dynamically starting NEW/RECREATED Booker group [{cfg.identifier}] Mode: {mode_str}...")
+                        
+                        new_wrapper = GCOWrapper(
+                            gco_class=gco_class,
+                            gco_cfg=cfg,
+                            redis_conf=redis_conf
+                        )
+                        try:
+                            new_wrapper.load()
+                            new_wrapper.start()
+                            wrappers.append(new_wrapper)
+                        except Exception as e:
+                            app_logger.error(f"Failed to dynamically start Booker group [{cfg.identifier}]: {e}")
+                                
+            except json.JSONDecodeError:
+                app_logger.warning("Config file is currently invalid JSON (maybe still writing), skipping this reload.")
+            except Exception as e:
+                app_logger.error(f"Error while hot-reloading config: {e}")
+
     except KeyboardInterrupt:
-        app_logger.info("Shutting down...")
+        app_logger.info("Shutting down Bookers...")
         for wrapper in wrappers:
             wrapper.stop()
 

+ 103 - 12
main_sentinel.py

@@ -1,17 +1,25 @@
+import os
 import time
 import json
 import argparse
+from typing import List
 
 from vs_types import GroupConfig
 from gco_wrapper import GCOWrapper
-from sentinel import SentinelGCO
 from logger_setup import setup_app_logger
 
+from sentinel import SentinelGCO
+from toolkit.vs_cloud_api import VSCloudApi
+
 
 def load_config(path: str):
     with open(path, "r", encoding="utf-8") as f:
         return json.load(f)
 
+def save_config(path: str, new_config):
+    new_config_str = json.dumps(new_config, indent=2)
+    with open(path, "w", encoding="utf-8") as f:
+        f.write(new_config_str)
 
 def main():
     # ===== 1️⃣ 命令行参数 =====
@@ -21,30 +29,33 @@ def main():
         "-c", "--config",
         type=str,
         required=False,
-        default="config/config.json",
-        help="Path to config.json"
+        default="config/config_sentinel.json",
+        help="Path to sentinel config.json"
     )
 
     args = parser.parse_args()
-
+    config_path = args.config
+    CONF_NAME = 'COORDINATOR_SENTINEL'
     # ===== 2️⃣ logger =====
     app_logger = setup_app_logger("Sentinel")
-    app_logger.info("Sentinel Logger is ready! All VSC macros are hooked.")
+    app_logger.info("Sentinel Logger is ready!")
 
     # ===== 3️⃣ 读取配置 =====
-    cfg_data = load_config(args.config)
-
+    cfg_data = load_config(config_path)
+    
+    current_version = cfg_data.get('version', 0)
     redis_conf = cfg_data.get('redis')
-    groups_conf = cfg_data.get('group_list')
+    groups_conf = cfg_data.get('group_list', [])
 
-    wrappers = []
+    wrappers: List[GCOWrapper] = []
 
     # ===== 4️⃣ 启动 groups =====
     for item in groups_conf:
         cfg = GroupConfig.from_json(item)
 
+        # 初始只启动 enable=True 的组
         if not cfg.enable:
-            app_logger.info(f"Group [{cfg.identifier}] is disabled. Skipping.")
+            app_logger.info(f"Group [{cfg.identifier}] is disabled initially. Skipping.")
             continue
 
         app_logger.info(f"Starting wrapper for group [{cfg.identifier}]...")
@@ -63,10 +74,90 @@ def main():
         f"Successfully started {len(wrappers)} Sentinel groups. Press Ctrl+C to stop."
     )
 
-    # ===== 5️⃣ keep alive =====
+    # ===== 5️⃣ keep alive & 热更新监听 =====
     try:
         while True:
-            time.sleep(1)
+            time.sleep(30)  # 每 3 秒检查一次文件状态
+            
+            if not os.path.exists(config_path):
+                continue
+                
+            try:
+                new_cfg_data = VSCloudApi.Instance().get_dynamic_config(config_name=CONF_NAME)
+                new_version = new_cfg_data.get('version')
+                # 如果 API 返回的没有 version 字段,或者版本号没变,则跳过
+                if new_version == current_version:
+                    continue
+
+                app_logger.info("Config file modification detected! Reloading configurations...")
+                save_config(config_path, new_cfg_data)
+                current_version = new_version
+                
+                redis_conf = new_cfg_data.get('redis') 
+                new_groups_conf = new_cfg_data.get('group_list', [])
+                
+                # 转换新配置为 {identifier: config_dict} 的字典格式,方便 O(1) 查找
+                new_cfg_dict = {
+                    item.get("identifier"): item 
+                    for item in new_groups_conf 
+                    if item.get("identifier")
+                }
+                
+                # ---------------- A. 处理【参数热更新】与【删除/禁用组】 ----------------
+                surviving_wrappers = []
+                for wrapper in wrappers:
+                    current_id = wrapper.m_cfg.identifier
+                    
+                    if current_id in new_cfg_dict:
+                        new_group_cfg = GroupConfig.from_json(new_cfg_dict[current_id])
+                        
+                        # 情况 1: 如果后端把这个组的 enable 改成了 false,视同删除,直接停掉
+                        if not new_group_cfg.enable:
+                            app_logger.info(f"Group [{current_id}] disabled by backend. Stopping and removing...")
+                            wrapper.stop()
+                        else:
+                            # 情况 2: 依然启用,调用刚才实现的热更新接口透传参数
+                            wrapper.update_config(new_group_cfg)
+                            surviving_wrappers.append(wrapper)
+                    else:
+                        # 情况 3: 这个组完全从 JSON 中被删除了
+                        app_logger.info(f"Group [{current_id}] deleted from config. Stopping and removing...")
+                        wrapper.stop()
+                        
+                # 更新当前正在运行的 wrappers 列表
+                wrappers = surviving_wrappers
+                
+                # ---------------- B. 处理【新增组】与【重新启用组】 ----------------
+                existing_ids = {w.m_cfg.identifier for w in wrappers}
+                
+                for new_id, item_data in new_cfg_dict.items():
+                    # 发现新出现的 ID(全新添加的,或是从 enable: false 变成 enable: true 的)
+                    if new_id not in existing_ids:
+                        cfg = GroupConfig.from_json(item_data)
+                        
+                        # 只有启用的组才会被启动
+                        if not cfg.enable:
+                            continue
+                            
+                        app_logger.info(f"Dynamically starting wrapper for NEW group [{cfg.identifier}]...")
+                        new_wrapper = GCOWrapper(
+                            gco_class=SentinelGCO,
+                            gco_cfg=cfg,
+                            redis_conf=redis_conf
+                        )
+                        try:
+                            new_wrapper.load()
+                            new_wrapper.start()
+                            wrappers.append(new_wrapper)
+                        except Exception as e:
+                            app_logger.error(f"Failed to dynamically start new group [{cfg.identifier}]: {e}")
+                                
+            except json.JSONDecodeError:
+                # 捕获异常:防止后端写入文件的中间状态导致 JSON 格式错误而崩溃
+                app_logger.warning("Config file is currently invalid JSON (maybe still writing), skipping this reload.")
+            except Exception as e:
+                app_logger.error(f"Error while hot-reloading config: {e}")
+
     except KeyboardInterrupt:
         app_logger.info("Shutting down Sentinels...")
         for wrapper in wrappers:

+ 31 - 82
toolkit/vs_cloud_api.py

@@ -2,10 +2,11 @@
 import requests
 import json
 import time
-import urllib.parse
-import configure
+from urllib.parse import quote
 from datetime import datetime
 from typing import Dict, Any, List, Optional
+
+import configure
 from vs_types import NotFoundError, PermissionDeniedError, RateLimiteddError, SessionExpiredOrInvalidError, BizLogicError 
 from vs_log_macros import VSC_ERROR, VSC_INFO, VSC_WARN, VSC_DEBUG
 
@@ -19,7 +20,6 @@ class VSCloudApi:
     def __new__(cls, *args, **kwargs):
         if cls._instance is None:
             cls._instance = super(VSCloudApi, cls).__new__(cls)
-            # 初始化默认配置
             cls._instance.base_url = "https://api.text.skin"
             cls._instance.api_token = "Bearer tok_e946329a60ff45ba807f3f41b0e8b7fc"
             cls._instance.session = requests.Session()
@@ -38,9 +38,7 @@ class VSCloudApi:
         
     def _perform_request(self, method, url, headers=None, data=None, json_data=None, params=None, timeout=5*60):
         """
-        统一 HTTP 请求封装,严格复刻 C++ 逻辑:
-        1. 发送 OPTIONS 请求
-        2. 发送实际请求
+        统一 HTTP 请求封装
         """
         resp = self.session.request(method, url, headers=headers, data=data, json=json_data, params=params, timeout=timeout)
         VSC_DEBUG('vs_cloud', f'[perform request] {method} {url} {data} {json_data} {params} {resp.text}')
@@ -54,17 +52,26 @@ class VSCloudApi:
             raise RateLimiteddError()
         else:
             raise BizLogicError(message=f"HTTP Error {resp.status_code}: {resp.text[:100]}")
+        
+    def get_dynamic_config(self, config_name: str) -> Dict:
+        url = f'https://api.text.skin/api/dynamic-configurations/key/{quote(config_name)}'
+        headers = self._get_headers()
+        resp = self._perform_request('GET', url, headers=headers, timeout=10)
+        result = resp.json()
+        if result.get("code") == 0:
+            data = result.get("data") or {}
+            return data.get("config_value")
+        else:
+            raise BizLogicError(message=f"Get dynamic config biz error: {result.get('message')}")
 
-    def get_vas_task_pop(self, routing_key: str) -> Optional[Dict]:
+    def get_vas_task_pop(self, routing_key: str) -> Dict:
         if configure.TEST_TASK:
             return configure.TEST_TASK
         url = f"{self.base_url}/api/vas/task/pop"
         params = {
             "queue_name": routing_key,
         }
-
         headers = self._get_headers()
-        
         resp = self._perform_request('GET', url, params=params, headers=headers, timeout=10)
         result = resp.json()
         if result.get("code") == 0:
@@ -72,7 +79,7 @@ class VSCloudApi:
         else:
             raise BizLogicError(message=f"Get vas task pop biz error: {result.get('message')}")
     
-    def get_vas_task(self, task_id: str) -> dict:
+    def get_vas_task(self, task_id: str) -> Dict:
         url = f"{self.base_url}/api/vas/task/detail"
         params = {"task_id": task_id}
         headers = self._get_headers()
@@ -83,13 +90,9 @@ class VSCloudApi:
         else:
             raise BizLogicError(message=f"Get Task={task_id} error: {result.get('message')}")
 
-    def update_vas_task(self, 
-                        task_id: str, 
-                        update_data: Dict[str, Any]) -> Optional[Dict]:
+    def update_vas_task(self, task_id: str, update_data: Dict[str, Any]) -> Dict:
         """
         更新任务
-        API: POST /api/vas/task/update?id=1
-        Body: update_data (json)
         """
         url = f"{self.base_url}/api/vas/task/update"
         params = {"id": task_id}
@@ -104,7 +107,6 @@ class VSCloudApi:
     def return_vas_task_to_queue(self, task_id: int):
         """
         重入队列
-        API: POST /api/vas/task/return_to_queue?task_id=1
         """
         url = f"{self.base_url}/api/vas/task/return_to_queue"
         params = {"task_id": task_id}
@@ -119,7 +121,6 @@ class VSCloudApi:
     def push_weixin_text(self, text:str):
         """
         推送微信文本消息
-        API: POST https://api.text.skin/api/wechat/send_no_token
         """
         url = f"{self.base_url}/api/wechat/send_no_token"
         payload = {"message": text}
@@ -133,25 +134,17 @@ class VSCloudApi:
 
     def create_task(self, command: str, args: Dict) -> str:
         """
-        [核心] 创建任务
-        :param command: 任务指令 (e.g., "AntiCloudflareTurnstileTask", "AntiCloudflareTask")
-        :param args: 任务参数字典 (e.g., {"proxy": "...", "websiteUrl": "..."})
-        :return: task_id (直接返回任务ID,方便调用方)
+        创建任务
         """
         url = f"{self.base_url}/api/tasks"
         headers = self._get_headers()
-        
         payload = {
             "command": command,
             "args": args,
             "status": 0
         }
-
-        # 发送请求
         resp = self._perform_request('POST', url, headers=headers, json_data=payload)
         result = resp.json()
-        
-        # 校验业务状态码
         if result.get("code") == 0:
             data = result.get("data", {})
             task_id = data.get("id")
@@ -163,52 +156,30 @@ class VSCloudApi:
 
     def get_task_result(self, task_id: str, timeout: int = 120, interval: int = 3) -> Dict:
         """
-        [核心] 轮询获取任务结果
-        :param task_id: 任务ID
-        :param timeout: 最大等待时间(秒)
-        :param interval: 轮询间隔(秒)
-        :return: 任务成功后的 data 字典 (包含 token/cookies 等)
+        轮询获取任务结果
         """
         url = f"{self.base_url}/api/tasks/{task_id}"
         headers = self._get_headers()
-        
         start_time = time.time()
-        
         while True:
-            # 1. 检查是否超时
             if time.time() - start_time > timeout:
                 raise BizLogicError(message=f"Wait for task result timeout ({timeout}s). TaskID: {task_id}")
-
             try:
-                # 2. 发起查询
                 resp = self._perform_request('GET', url, headers=headers)
                 result = resp.json()
-                
-                # 3. 校验 API 层面错误
                 if result.get("code") != 0:
                     raise BizLogicError(message=f"API Error fetching task: {result.get('message')}")
-                
                 data = result.get("data", {})
                 status = data.get("status")
-                
-                # 4. 判断任务状态
-                if status == 2:  # 成功
+                if status == 2:
                     return data
-                
-                elif status == 3:  # 失败
+                elif status == 3:
                     error_msg = data.get("result", "Unknown error")
                     raise BizLogicError(message=f"Task execution failed: {error_msg}")
-                
-                # status 为 0 (Pending) 或 1 (Running),继续等待
-                
             except Exception as e:
-                # 如果是 BizLogicError 直接抛出,不重试
                 if isinstance(e, BizLogicError):
                     raise e
-                # 网络波动等其他异常,记录日志并重试
                 VSC_WARN("vs_cloud", f"Polling exception: {str(e)}")
-
-            # 等待下次轮询
             time.sleep(interval)
 
     def create_http_session(
@@ -220,11 +191,12 @@ class VSCloudApi:
         proxy: Optional[str] = None, 
         page: Optional[str] = None, 
         session_storage: Optional[str] = None
-    ) -> Optional[Dict]:
-        """创建 http session"""
+    ) -> Dict:
+        """
+        创建 http session
+        """
         url = f"{self.base_url}/api/http-session"
         headers = self._get_headers()
-        
         payload = {
             "local_storage": local_storage,
             "session_storage": session_storage,
@@ -265,11 +237,7 @@ class VSCloudApi:
         else:
             raise BizLogicError(message=f"Slot refresh start biz error: {result.get('message')}")
 
-    def slot_refresh_success(
-        self,
-        routing_key: str,
-        snapshot_source: str = "worker",
-    ):
+    def slot_refresh_success(self, routing_key: str, snapshot_source: str = "worker"):
         url = f'{self.base_url}/api/slot_refresh/success'
         payload = {
             "routing_key": routing_key,
@@ -283,12 +251,7 @@ class VSCloudApi:
         else:
             raise BizLogicError(message=f"Slot refresh success biz error: {result.get('message')}")
 
-    def slot_refresh_fail(
-        self,
-        routing_key: str,
-        error: str,
-        snapshot_source: str = "worker",
-    ):
+    def slot_refresh_fail(self, routing_key: str, error: str, snapshot_source: str = "worker"):
         url = f'{self.base_url}/api/slot_refresh/fail'
         payload = {
             "routing_key": routing_key,
@@ -303,11 +266,7 @@ class VSCloudApi:
         else:
             raise BizLogicError(message=f"Slot refresh fail biz error: {result.get('message')}")
         
-    def get_next_account(
-        self,
-        pool_name: str,
-        account_cd: int = 60
-    ):
+    def get_next_account(self, pool_name: str, account_cd: int = 60):
         if configure.TEST_ACCOUNT:
             return configure.TEST_ACCOUNT
         url = f'{self.base_url}/api/account/next'
@@ -323,11 +282,7 @@ class VSCloudApi:
         else:
             raise BizLogicError(message=f"Get next account biz error: {result.get('message')}")
         
-    def get_next_proxy(
-        self,
-        pools: List[str],
-        proxy_cd: int = 60
-    ):
+    def get_next_proxy(self, pools: List[str], proxy_cd: int = 60):
         if configure.TEST_PROXY:
             return configure.TEST_PROXY 
         url = f'{self.base_url}/api/proxy/next-ip'
@@ -342,14 +297,9 @@ class VSCloudApi:
             return result.get("data", {})
         else:
             raise BizLogicError(message=f"Get next account biz error: {result.get('message')}")
-    
 
-    def slot_snapshot_report(
-        self,
-        query_payload: Dict[str, Any] = {}
-    ):
+    def slot_snapshot_report(self, query_payload: Dict[str, Any] = {}):
         url = f"{self.base_url}/api/slots/report"
-        
         headers = self._get_headers()
         resp = self._perform_request("POST", url, headers=headers, json_data=query_payload)
         result = resp.json()
@@ -409,7 +359,6 @@ class VSCloudApi:
             "bodyKeywords": body_keywords,
             "top": str(top)
         }
-        
         url = f"{self.base_url}/api/email-authorizations/fetch-top"
         headers = self._get_headers()
         resp = self._perform_request('POST', url, headers=headers, params=params, data="")