2021-01-30 09:14:19 +00:00
{% extends 'base.html' %}
{% block content %}
2024-12-03 11:45:28 +00:00
{% from '_helpers.html' import render_field, render_checkbox_field, render_button, render_time_schedule_form %}
2024-05-02 09:46:31 +00:00
{% from '_common_fields.html' import render_common_settings_form %}
2022-04-07 16:18:23 +00:00
< script >
2025-03-18 09:40:22 +00:00
const notification_base_url="{{url_for('ui.ui_notification.ajax_callback_send_notification_test', mode="global-settings")}}";
2022-04-07 16:18:23 +00:00
{% if emailprefix %}
const email_notification_prefix=JSON.parse('{{emailprefix|tojson}}');
{% endif %}
< / script >
2023-04-30 08:38:50 +00:00
< script src = "{{url_for('static_content', group='js', filename='tabs.js')}}" defer > < / script >
2024-12-03 11:45:28 +00:00
< script src = "{{url_for('static_content', group='js', filename='plugins.js')}}" defer > < / script >
2023-04-30 08:38:50 +00:00
< script src = "{{url_for('static_content', group='js', filename='notifications.js')}}" defer > < / script >
2023-11-28 13:01:15 +00:00
< script src = "{{url_for('static_content', group='js', filename='vis.js')}}" defer > < / script >
2023-04-30 08:38:50 +00:00
< script src = "{{url_for('static_content', group='js', filename='global-settings.js')}}" defer > < / script >
2024-12-03 11:45:28 +00:00
< script src = "{{url_for('static_content', group='js', filename='scheduler.js')}}" defer > < / script >
2021-08-12 10:05:59 +00:00
< div class = "edit-form" >
2022-04-02 12:49:32 +00:00
< div class = "tabs collapsable" >
2021-08-12 10:05:59 +00:00
< ul >
2022-08-15 16:56:53 +00:00
< li class = "tab" id = "" > < a href = "#general" > General< / a > < / li >
2021-08-12 10:05:59 +00:00
< li class = "tab" > < a href = "#notifications" > Notifications< / a > < / li >
< li class = "tab" > < a href = "#fetching" > Fetching< / a > < / li >
2022-01-01 13:53:08 +00:00
< li class = "tab" > < a href = "#filters" > Global Filters< / a > < / li >
2022-05-20 14:27:51 +00:00
< li class = "tab" > < a href = "#api" > API< / a > < / li >
2024-12-03 11:45:28 +00:00
< li class = "tab" > < a href = "#timedate" > Time & amp Date< / a > < / li >
2022-12-19 20:48:01 +00:00
< li class = "tab" > < a href = "#proxies" > CAPTCHA & Proxies< / a > < / li >
2021-08-12 10:05:59 +00:00
< / ul >
< / div >
< div class = "box-wrap inner" >
2025-03-18 09:40:22 +00:00
< form class = "pure-form pure-form-stacked settings" action = "{{url_for('settings.settings_page')}}" method = "POST" >
2023-04-29 20:29:57 +00:00
< input type = "hidden" name = "csrf_token" value = "{{ csrf_token() }}" >
2021-08-12 10:05:59 +00:00
< div class = "tab-pane-inner" id = "general" >
< fieldset >
2021-07-13 08:48:21 +00:00
< div class = "pure-control-group" >
2022-04-24 14:56:32 +00:00
{{ render_field(form.requests.form.time_between_check, class="time-check-widget") }}
2024-05-14 11:51:03 +00:00
< span class = "pure-form-message-inline" > Default recheck time for all watches, current system minimum is < i > {{min_system_recheck_seconds}}< / i > seconds (< a href = "https://github.com/dgtlmoon/changedetection.io/wiki/Misc-system-settings#enviroment-variables" > more info< / a > ).< / span >
2024-12-03 11:45:28 +00:00
< div id = "time-between-check-schedule" >
<!-- Start Time and End Time -->
< div id = "limit-between-time" >
{{ render_time_schedule_form(form.requests, available_timezones, timezone_default_config) }}
< / div >
< / div >
2021-07-13 08:48:21 +00:00
< / div >
2022-06-13 10:41:53 +00:00
< div class = "pure-control-group" >
{{ render_field(form.requests.form.jitter_seconds, class="jitter_seconds") }}
< span class = "pure-form-message-inline" > Example - 3 seconds random jitter could trigger up to 3 seconds earlier or up to 3 seconds later< / span >
< / div >
2022-07-23 15:15:27 +00:00
< div class = "pure-control-group" >
{{ render_field(form.application.form.filter_failure_notification_threshold_attempts, class="filter_failure_notification_threshold_attempts") }}
< span class = "pure-form-message-inline" > After this many consecutive times that the CSS/xPath filter is missing, send a notification
2023-03-12 16:05:34 +00:00
< br >
2022-07-23 15:15:27 +00:00
Set to < strong > 0< / strong > to disable
< / span >
< / div >
2021-07-13 08:48:21 +00:00
< div class = "pure-control-group" >
2022-01-29 18:36:44 +00:00
{% if not hide_remove_pass %}
{% if current_user.is_authenticated %}
2022-04-19 19:43:07 +00:00
{{ render_button(form.application.form.removepassword_button) }}
2022-01-29 18:36:44 +00:00
{% else %}
2022-04-19 19:43:07 +00:00
{{ render_field(form.application.form.password) }}
2022-01-29 18:36:44 +00:00
< span class = "pure-form-message-inline" > Password protection for your changedetection.io application.< / span >
{% endif %}
2021-08-12 10:05:59 +00:00
{% else %}
2022-01-29 18:36:44 +00:00
< span class = "pure-form-message-inline" > Password is locked.< / span >
2021-08-12 10:05:59 +00:00
{% endif %}
2021-07-13 08:48:21 +00:00
< / div >
2022-05-20 14:27:51 +00:00
2023-01-29 21:36:55 +00:00
< div class = "pure-control-group" >
{{ render_checkbox_field(form.application.form.shared_diff_access, class="shared_diff_access") }}
< span class = "pure-form-message-inline" > Allow access to view watch diff page when password is enabled (Good for sharing the diff page)
< / span >
< / div >
2024-06-13 09:52:12 +00:00
< div class = "pure-control-group" >
{{ render_checkbox_field(form.application.form.rss_hide_muted_watches) }}
< / div >
2023-05-25 14:38:54 +00:00
< div class = "pure-control-group" >
{{ render_field(form.application.form.pager_size) }}
< span class = "pure-form-message-inline" > Number of items per page in the watch overview list, 0 to disable.< / span >
< / div >
2021-10-05 16:15:36 +00:00
2021-08-12 10:05:59 +00:00
< div class = "pure-control-group" >
2022-04-19 19:43:07 +00:00
{{ render_checkbox_field(form.application.form.extract_title_as_title) }}
2021-08-12 10:05:59 +00:00
< span class = "pure-form-message-inline" > Note: This will automatically apply to all existing watches.< / span >
2021-07-13 08:48:21 +00:00
< / div >
2022-05-17 20:22:00 +00:00
< div class = "pure-control-group" >
{{ render_checkbox_field(form.application.form.empty_pages_are_a_change) }}
2024-07-29 11:27:59 +00:00
< span class = "pure-form-message-inline" > When a request returns no content, or the HTML does not contain any text, is this considered a change?< / span >
2022-05-17 20:22:00 +00:00
< / div >
2022-05-08 18:35:36 +00:00
{% if form.requests.proxy %}
< div class = "pure-control-group inline-radio" >
{{ render_field(form.requests.form.proxy, class="fetch-backend-proxy") }}
< span class = "pure-form-message-inline" >
Choose a default proxy for all watches
< / span >
< / div >
{% endif %}
2021-08-12 10:05:59 +00:00
< / fieldset >
< / div >
2021-09-17 16:37:26 +00:00
< div class = "tab-pane-inner" id = "notifications" >
2021-10-05 16:15:36 +00:00
< fieldset >
< div class = "field-group" >
2024-07-17 18:27:47 +00:00
{{ render_common_settings_form(form.application.form, emailprefix, settings_application, extra_notification_token_placeholder_info) }}
2021-10-05 16:15:36 +00:00
< / div >
< / fieldset >
2023-09-14 11:07:01 +00:00
< div class = "pure-control-group" id = "notification-base-url" >
{{ render_field(form.application.form.base_url, class="m-d") }}
< span class = "pure-form-message-inline" >
Base URL used for the < code > {{ '{{ base_url }}' }}< / code > token in notification links.< br >
Default value is the system environment variable '< code > BASE_URL< / code > ' - < a href = "https://github.com/dgtlmoon/changedetection.io/wiki/Configurable-BASE_URL-setting" > read more here< / a > .
< / span >
< / div >
2021-08-12 10:05:59 +00:00
< / div >
2021-09-17 16:37:26 +00:00
2021-08-12 10:05:59 +00:00
< div class = "tab-pane-inner" id = "fetching" >
2022-05-08 18:35:36 +00:00
< div class = "pure-control-group inline-radio" >
2022-04-24 12:40:53 +00:00
{{ render_field(form.application.form.fetch_backend, class="fetch-backend") }}
2021-08-12 10:05:59 +00:00
< span class = "pure-form-message-inline" >
< p > Use the < strong > Basic< / strong > method (default) where your watched sites don't need Javascript to render.< / p >
2021-10-06 07:27:41 +00:00
< p > The < strong > Chrome/Javascript< / strong > method requires a network connection to a running WebDriver+Chrome server, set by the ENV var 'WEBDRIVER_URL'. < / p >
2021-08-12 10:05:59 +00:00
< / span >
2021-07-20 07:44:01 +00:00
< / div >
2023-11-28 13:01:15 +00:00
< fieldset class = "pure-group" id = "webdriver-override-options" data-visible-for = "application-fetch_backend=html_webdriver" >
2022-05-17 16:35:33 +00:00
< div class = "pure-form-message-inline" >
< strong > If you're having trouble waiting for the page to be fully rendered (text missing etc), try increasing the 'wait' time here.< / strong >
2023-03-12 16:05:34 +00:00
< br >
2022-05-17 16:35:33 +00:00
This will wait < i > n< / i > seconds before extracting the text.
< / div >
< div class = "pure-control-group" >
{{ render_field(form.application.form.webdriver_delay) }}
< / div >
< / fieldset >
2024-05-20 13:11:15 +00:00
< div class = "pure-control-group inline-radio" >
{{ render_field(form.requests.form.default_ua) }}
< span class = "pure-form-message-inline" >
Applied to all requests.< br > < br >
Note: Simply changing the User-Agent often does not defeat anti-robot technologies, it's important to consider < a href = "https://changedetection.io/tutorial/what-are-main-types-anti-robot-mechanisms" > all of the ways that the browser is detected< / a > .
< / span >
< / div >
< div class = "pure-control-group" >
< br >
Tip: < a href = "https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration#brightdata-proxy-support" > Connect using Bright Data and Oxylabs Proxies, find out more here.< / a >
< / div >
2021-07-13 08:48:21 +00:00
< / div >
2022-01-01 13:53:08 +00:00
< div class = "tab-pane-inner" id = "filters" >
2022-01-02 21:28:34 +00:00
< fieldset class = "pure-group" >
2022-04-19 19:43:07 +00:00
{{ render_checkbox_field(form.application.form.ignore_whitespace) }}
2023-03-12 16:05:34 +00:00
< span class = "pure-form-message-inline" > Ignore whitespace, tabs and new-lines/line-feeds when considering if a change was detected.< br >
2022-04-09 08:35:14 +00:00
< i > Note:< / i > Changing this will change the status of your existing watches, possibly trigger alerts etc.
< / span >
< / fieldset >
< fieldset class = "pure-group" >
2022-04-19 19:43:07 +00:00
{{ render_checkbox_field(form.application.form.render_anchor_tag_content) }}
2022-04-09 08:35:14 +00:00
< span class = "pure-form-message-inline" > Render anchor tag content, default disabled, when enabled renders links as < code > (link text)[https://somesite.com]< / code >
2023-03-12 16:05:34 +00:00
< br >
2022-04-09 08:35:14 +00:00
< i > Note:< / i > Changing this could affect the content of your existing watches, possibly trigger alerts etc.
2022-01-02 21:28:34 +00:00
< / span >
< / fieldset >
2022-03-12 12:29:30 +00:00
< fieldset class = "pure-group" >
2022-04-19 19:43:07 +00:00
{{ render_field(form.application.form.global_subtractive_selectors, rows=5, placeholder="header
2022-03-12 12:29:30 +00:00
footer
nav
2024-09-17 20:43:04 +00:00
.stockticker
//*[contains(text(), 'Advertisement')]") }}
2022-03-12 12:29:30 +00:00
< span class = "pure-form-message-inline" >
< ul >
2024-09-17 20:43:04 +00:00
< li > Remove HTML element(s) by CSS and XPath selectors before text conversion. < / li >
< li > Don't paste HTML here, use only CSS and XPath selectors < / li >
< li > Add multiple elements, CSS or XPath selectors per line to ignore multiple parts of the HTML. < / li >
2022-03-12 12:29:30 +00:00
< / ul >
< / span >
< / fieldset >
2022-01-02 21:28:34 +00:00
< fieldset class = "pure-group" >
2022-04-19 19:43:07 +00:00
{{ render_field(form.application.form.global_ignore_text, rows=5, placeholder="Some text to ignore in a line
2022-01-01 13:53:08 +00:00
/some.regex\d{2}/ for case-INsensitive regex
") }}
2023-03-12 16:05:34 +00:00
< span class = "pure-form-message-inline" > Note: This is applied globally in addition to the per-watch rules.< / span > < br >
2022-01-05 19:42:45 +00:00
< span class = "pure-form-message-inline" >
< ul >
2024-10-10 12:59:39 +00:00
< li > Matching text will be < strong > ignored< / strong > in the text snapshot (you can still see it but it wont trigger a change)< / li >
2022-01-05 19:42:45 +00:00
< li > Note: This is applied globally in addition to the per-watch rules.< / li >
< li > Each line processed separately, any line matching will be ignored (removed before creating the checksum)< / li >
2022-07-21 08:05:59 +00:00
< li > Regular Expression support, wrap the entire line in forward slash < code > /regex/< / code > < / li >
2022-01-05 19:42:45 +00:00
< li > Changing this will affect the comparison checksum which may trigger an alert< / li >
< / ul >
2022-01-02 21:28:34 +00:00
< / span >
< / fieldset >
2022-01-01 13:53:08 +00:00
< / div >
2022-05-20 14:27:51 +00:00
< div class = "tab-pane-inner" id = "api" >
2024-03-06 14:21:03 +00:00
< h4 > API Access< / h4 >
2022-05-20 14:27:51 +00:00
< p > Drive your changedetection.io via API, More about < a href = "https://github.com/dgtlmoon/changedetection.io/wiki/API-Reference" > API access here< / a > < / p >
< div class = "pure-control-group" >
{{ render_checkbox_field(form.application.form.api_access_token_enabled) }}
2024-03-06 14:21:03 +00:00
< div class = "pure-form-message-inline" > Restrict API access limit by using < code > x-api-key< / code > header - required for the Chrome Extension to work< / div > < br >
2023-03-12 16:05:34 +00:00
< div class = "pure-form-message-inline" > < br > API Key < span id = "api-key" > {{api_key}}< / span >
2022-05-20 14:27:51 +00:00
< span style = "display:none;" id = "api-key-copy" > copy< / span >
< / div >
< / div >
2023-11-13 15:26:50 +00:00
< div class = "pure-control-group" >
2025-03-18 09:40:22 +00:00
< a href = "{{url_for('settings.settings_reset_api_key')}}" class = "pure-button button-small button-cancel" > Regenerate API key< / a >
2023-11-13 15:26:50 +00:00
< / div >
2024-03-06 14:21:03 +00:00
< div class = "pure-control-group" >
< h4 > Chrome Extension< / h4 >
< p > Easily add any web-page to your changedetection.io installation from within Chrome.< / p >
< strong > Step 1< / strong > Install the extension, < strong > Step 2< / strong > Navigate to this page,
< strong > Step 3< / strong > Open the extension from the toolbar and click "< i > Sync API Access< / i > "
< p >
< a id = "chrome-extension-link"
title="Try our new Chrome Extension!"
href="https://chromewebstore.google.com/detail/changedetectionio-website/kefcfmgmlhmankjmnbijimhofdjekbop">
2025-02-18 10:02:05 +00:00
< img alt = "Chrome store icon" src = "{{ url_for('static_content', group='images', filename='Google-Chrome-icon.png') }}" alt = "Chrome" >
2024-03-06 14:21:03 +00:00
Chrome Webstore
< / a >
< / p >
< / div >
2022-05-20 14:27:51 +00:00
< / div >
2024-12-03 11:45:28 +00:00
< div class = "tab-pane-inner" id = "timedate" >
< div class = "pure-control-group" >
Ensure the settings below are correct, they are used to manage the time schedule for checking your web page watches.
< / div >
< div class = "pure-control-group" >
< p > < strong > UTC Time & amp Date from Server:< / strong > < span id = "utc-time" > {{ utc_time }}< / span > < / p >
< p > < strong > Local Time & amp Date in Browser:< / strong > < span class = "local-time" data-utc = "{{ utc_time }}" > < / span > < / p >
< p >
{{ render_field(form.application.form.timezone) }}
< datalist id = "timezones" style = "display: none;" >
{% for tz_name in available_timezones %}
< option value = "{{ tz_name }}" > {{ tz_name }}< / option >
{% endfor %}
< / datalist >
< / p >
< / div >
< / div >
2022-12-19 20:48:01 +00:00
< div class = "tab-pane-inner" id = "proxies" >
2023-09-06 07:43:23 +00:00
< div id = "recommended-proxy" >
< div >
< img style = "height: 2em;" src = "{{url_for('static_content', group='images', filename='brightdata.svg')}}" alt = "BrightData Proxy Provider" >
< p > BrightData offer world-class proxy services, "Data Center" proxies are a very affordable way to proxy your requests, whilst < strong > < a href = "https://brightdata.grsm.io/n0r16zf7eivq" > WebUnlocker< / a > < / strong > can help solve most CAPTCHAs.< / p >
< p >
BrightData offer many < a href = "https://brightdata.com/proxy-types" target = "new" > many different types of proxies< / a > , it is worth reading about what is best for your use-case.
< / p >
< p >
When you have < a href = "https://brightdata.grsm.io/n0r16zf7eivq" > registered< / a > , enabled the required services, visit the < A href = "https://brightdata.com/cp/api_example?" > API example page< / A > , then select < strong > Python< / strong > , set the country you wish to use, then copy+paste the access Proxy URL into the "Extra Proxies" boxes below.< br >
< / p >
< p >
The Proxy URL with BrightData should start with < code > http://brd-customer...< / code >
< / p >
< p > When you sign up using < a href = "https://brightdata.grsm.io/n0r16zf7eivq" > https://brightdata.grsm.io/n0r16zf7eivq< / a > BrightData will match any first deposit up to $150< / p >
< / div >
< div >
< img style = "height: 2em;"
src="{{url_for('static_content', group='images', filename='oxylabs.svg')}}"
alt="Oxylabs Proxy Provider">
< p >
Collect public data at scale with industry-leading web scraping solutions and the world’ s
largest ethical proxy network.
< / p >
< p >
Oxylabs also provide a < a href = "https://oxylabs.io/products/web-unblocker" > < strong > WebUnlocker< / strong > < / a >
proxy that bypasses sophisticated anti-bot systems, so you don’ t have to.< br >
< / p >
< p >
Serve over < a href = "https://oxylabs.io/location-proxy" > 195 countries< / a > , providing < a
href="https://oxylabs.io/products/residential-proxy-pool">Residential< / a > , < a
href="https://oxylabs.io/products/mobile-proxies">Mobile< / a > and < a
href="https://oxylabs.io/products/rotating-isp-proxies">ISP proxies< / a > and much more.
< / p >
< p >
Use the promo code < strong > boost35< / strong > with this link < a href = "https://oxylabs.go2cloud.org/SH2d" > https://oxylabs.go2cloud.org/SH2d< / a > for 35% off Residential, Mobile proxies, Web Unblocker, and Scraper APIs. Built-in proxies enable you to access data from all around the world and help overcome anti-bot solutions.
< / p >
< / div >
< / div >
2025-02-11 10:15:13 +00:00
2023-09-06 07:43:23 +00:00
< p > < strong > Tip< / strong > : "Residential" and "Mobile" proxy type can be more successfull than "Data Center" for blocked websites.
2022-12-19 20:48:01 +00:00
2023-11-13 15:39:11 +00:00
< div class = "pure-control-group" id = "extra-proxies-setting" >
2023-09-06 07:43:23 +00:00
{{ render_field(form.requests.form.extra_proxies) }}
2023-10-10 13:41:56 +00:00
< span class = "pure-form-message-inline" > "Name" will be used for selecting the proxy in the Watch Edit settings< / span > < br >
2023-10-09 14:57:30 +00:00
< span class = "pure-form-message-inline" > SOCKS5 proxies with authentication are only supported with 'plain requests' fetcher, for other fetchers you should whitelist the IP access instead< / span >
2023-09-06 10:27:27 +00:00
< / div >
2023-11-13 15:39:11 +00:00
< div class = "pure-control-group" id = "extra-browsers-setting" >
2023-12-01 12:49:12 +00:00
< p >
< span class = "pure-form-message-inline" > < i > Extra Browsers< / i > can be attached to further defeat CAPTCHA's on websites that are particularly hard to scrape.< / span > < br >
< span class = "pure-form-message-inline" > Simply paste the connection address into the box, < a href = "https://changedetection.io/tutorial/using-bright-datas-scraping-browser-pass-captchas-and-other-protection-when-monitoring" > More instructions and examples here< / a > < / span >
< / p >
{{ render_field(form.requests.form.extra_browsers) }}
2023-11-13 15:39:11 +00:00
< / div >
2022-12-19 20:48:01 +00:00
< / div >
2021-08-12 10:05:59 +00:00
< div id = "actions" >
< div class = "pure-control-group" >
2022-03-21 21:54:27 +00:00
{{ render_button(form.save_button) }}
< a href = "{{url_for('index')}}" class = "pure-button button-small button-cancel" > Back< / a >
2025-03-18 09:40:22 +00:00
< a href = "{{url_for('ui.clear_all_history')}}" class = "pure-button button-small button-error" > Clear Snapshot History< / a >
2021-08-12 10:05:59 +00:00
< / div >
2021-01-30 09:14:19 +00:00
< / div >
2021-08-12 10:05:59 +00:00
< / form >
< / div >
2021-01-30 09:14:19 +00:00
< / div >
{% endblock %}