<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Jupyter Notebook for Broken Links in Python Questions</title>
    <link>https://community.esri.com/t5/python-questions/jupyter-notebook-for-broken-links/m-p/1385961#M69940</link>
    <description>&lt;P&gt;I guess you need to list first all the url in the web app that has been used. Then, you can use urllib3 library. Usually broken link is 404, then you use smtp library to send to your email.&amp;nbsp;&lt;/P&gt;&lt;P&gt;Hopefully, it helps you&lt;/P&gt;&lt;P&gt;Cheers&lt;/P&gt;&lt;LI-CODE lang="python"&gt;import urllib3
from http.client import responses

http = urllib3.PoolManager()
request = http.request('GET', 'http://server.arcgis.com/service/rest/to/your/service')

http_status = request.status
http_status_description = responses[http_status]&lt;/LI-CODE&gt;&lt;P&gt;source:&amp;nbsp;&lt;A href="https://stackoverflow.com/questions/46843988/urllib3-how-to-find-code-and-message-of-http-error" target="_blank"&gt;python - urllib3 how to find code and message of Http error - Stack Overflow&lt;/A&gt;&lt;/P&gt;</description>
    <pubDate>Fri, 23 Feb 2024 12:54:30 GMT</pubDate>
    <dc:creator>AlexanderDanielPratama</dc:creator>
    <dc:date>2024-02-23T12:54:30Z</dc:date>
    <item>
      <title>Jupyter Notebook for Broken Links</title>
      <link>https://community.esri.com/t5/python-questions/jupyter-notebook-for-broken-links/m-p/1375567#M69743</link>
      <description>&lt;P&gt;I'm hoping to create a Jupyter Notebook that I can schedule to notify me if there are any broken feature service links in my web maps.&lt;/P&gt;&lt;P&gt;Originally I was going to combine two Esri sample scripts, &lt;A href="https://geo.maps.arcgis.com/home/item.html?id=f3923d568a1a489594391f7cfb9a3642" target="_self"&gt;one to detect the broken links&lt;/A&gt; and &lt;A href="https://geo.maps.arcgis.com/home/item.html?id=a63effe8dce148bfafc169a73b41fad5" target="_self"&gt;one to send an email notification&lt;/A&gt;.&lt;/P&gt;&lt;P&gt;Unfortunately the Esri sample script to detect broken links doesn't work because the error message if a layer number has changed or if the service has been deleted isn't in the response header. Curious whether anyone has already written a script to do something similar and look at the body of the response to determine if the feature service is working.&lt;/P&gt;</description>
      <pubDate>Mon, 29 Jan 2024 18:15:42 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/jupyter-notebook-for-broken-links/m-p/1375567#M69743</guid>
      <dc:creator>ArielLow2146</dc:creator>
      <dc:date>2024-01-29T18:15:42Z</dc:date>
    </item>
    <item>
      <title>Re: Jupyter Notebook for Broken Links</title>
      <link>https://community.esri.com/t5/python-questions/jupyter-notebook-for-broken-links/m-p/1385961#M69940</link>
      <description>&lt;P&gt;I guess you need to list first all the url in the web app that has been used. Then, you can use urllib3 library. Usually broken link is 404, then you use smtp library to send to your email.&amp;nbsp;&lt;/P&gt;&lt;P&gt;Hopefully, it helps you&lt;/P&gt;&lt;P&gt;Cheers&lt;/P&gt;&lt;LI-CODE lang="python"&gt;import urllib3
from http.client import responses

http = urllib3.PoolManager()
request = http.request('GET', 'http://server.arcgis.com/service/rest/to/your/service')

http_status = request.status
http_status_description = responses[http_status]&lt;/LI-CODE&gt;&lt;P&gt;source:&amp;nbsp;&lt;A href="https://stackoverflow.com/questions/46843988/urllib3-how-to-find-code-and-message-of-http-error" target="_blank"&gt;python - urllib3 how to find code and message of Http error - Stack Overflow&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 23 Feb 2024 12:54:30 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/jupyter-notebook-for-broken-links/m-p/1385961#M69940</guid>
      <dc:creator>AlexanderDanielPratama</dc:creator>
      <dc:date>2024-02-23T12:54:30Z</dc:date>
    </item>
    <item>
      <title>Re: Jupyter Notebook for Broken Links</title>
      <link>https://community.esri.com/t5/python-questions/jupyter-notebook-for-broken-links/m-p/1387577#M69973</link>
      <description>&lt;P&gt;I ended up doing the following:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN class=""&gt;broken_urls&lt;/SPAN&gt; &lt;SPAN class=""&gt;=&lt;/SPAN&gt; &lt;SPAN class=""&gt;{}&lt;/SPAN&gt;

&lt;SPAN class=""&gt;for&lt;/SPAN&gt; &lt;SPAN class=""&gt;item&lt;/SPAN&gt; &lt;SPAN class=""&gt;in&lt;/SPAN&gt; &lt;SPAN class=""&gt;web_map_items&lt;/SPAN&gt;&lt;SPAN class=""&gt;:&lt;/SPAN&gt;
    &lt;SPAN class=""&gt;web_map&lt;/SPAN&gt; &lt;SPAN class=""&gt;=&lt;/SPAN&gt; &lt;SPAN class=""&gt;WebMap&lt;/SPAN&gt;&lt;SPAN class=""&gt;(&lt;/SPAN&gt;&lt;SPAN class=""&gt;item&lt;/SPAN&gt;&lt;SPAN class=""&gt;)&lt;/SPAN&gt;
    &lt;SPAN class=""&gt;print&lt;/SPAN&gt;&lt;SPAN class=""&gt;(&lt;/SPAN&gt;&lt;SPAN class=""&gt;"-"&lt;/SPAN&gt; &lt;SPAN class=""&gt;*&lt;/SPAN&gt; &lt;SPAN class=""&gt;79&lt;/SPAN&gt;&lt;SPAN class=""&gt;)&lt;/SPAN&gt;
    &lt;SPAN class=""&gt;print&lt;/SPAN&gt;&lt;SPAN class=""&gt;(&lt;/SPAN&gt;&lt;SPAN class=""&gt;f&lt;/SPAN&gt;&lt;SPAN class=""&gt;"Checking web map '&lt;/SPAN&gt;&lt;SPAN class=""&gt;{&lt;/SPAN&gt;&lt;SPAN class=""&gt;item&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;title&lt;/SPAN&gt;&lt;SPAN class=""&gt;}&lt;/SPAN&gt;&lt;SPAN class=""&gt;' (id: &lt;/SPAN&gt;&lt;SPAN class=""&gt;{&lt;/SPAN&gt;&lt;SPAN class=""&gt;item&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;id&lt;/SPAN&gt;&lt;SPAN class=""&gt;}&lt;/SPAN&gt;&lt;SPAN class=""&gt;)..."&lt;/SPAN&gt;&lt;SPAN class=""&gt;)&lt;/SPAN&gt;
    &lt;SPAN class=""&gt;layers&lt;/SPAN&gt; &lt;SPAN class=""&gt;=&lt;/SPAN&gt; &lt;SPAN class=""&gt;[&lt;/SPAN&gt;&lt;SPAN class=""&gt;layer&lt;/SPAN&gt; &lt;SPAN class=""&gt;for&lt;/SPAN&gt; &lt;SPAN class=""&gt;layer&lt;/SPAN&gt; &lt;SPAN class=""&gt;in&lt;/SPAN&gt; &lt;SPAN class=""&gt;web_map&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;layers&lt;/SPAN&gt; &lt;SPAN class=""&gt;+&lt;/SPAN&gt; &lt;SPAN class=""&gt;web_map&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;basemap&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;baseMapLayers&lt;/SPAN&gt; &lt;SPAN class=""&gt;if&lt;/SPAN&gt; &lt;SPAN class=""&gt;hasattr&lt;/SPAN&gt;&lt;SPAN class=""&gt;(&lt;/SPAN&gt;&lt;SPAN class=""&gt;layer&lt;/SPAN&gt;&lt;SPAN class=""&gt;,&lt;/SPAN&gt; &lt;SPAN class=""&gt;"url"&lt;/SPAN&gt;&lt;SPAN class=""&gt;)]&lt;/SPAN&gt;
    &lt;SPAN class=""&gt;for&lt;/SPAN&gt; &lt;SPAN class=""&gt;layer&lt;/SPAN&gt; &lt;SPAN class=""&gt;in&lt;/SPAN&gt; &lt;SPAN class=""&gt;layers&lt;/SPAN&gt;&lt;SPAN class=""&gt;:&lt;/SPAN&gt;
        &lt;SPAN class=""&gt;try&lt;/SPAN&gt;&lt;SPAN class=""&gt;:&lt;/SPAN&gt;
            &lt;SPAN class=""&gt;response&lt;/SPAN&gt; &lt;SPAN class=""&gt;=&lt;/SPAN&gt; &lt;SPAN class=""&gt;requests&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;get&lt;/SPAN&gt;&lt;SPAN class=""&gt;(&lt;/SPAN&gt;
                &lt;SPAN class=""&gt;url&lt;/SPAN&gt;&lt;SPAN class=""&gt;=&lt;/SPAN&gt;&lt;SPAN class=""&gt;layer&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;url&lt;/SPAN&gt;&lt;SPAN class=""&gt;,&lt;/SPAN&gt;
                &lt;SPAN class=""&gt;params&lt;/SPAN&gt;&lt;SPAN class=""&gt;=&lt;/SPAN&gt;&lt;SPAN class=""&gt;{&lt;/SPAN&gt;&lt;SPAN class=""&gt;"f"&lt;/SPAN&gt;&lt;SPAN class=""&gt;:&lt;/SPAN&gt; &lt;SPAN class=""&gt;"json"&lt;/SPAN&gt;&lt;SPAN class=""&gt;}&lt;/SPAN&gt;
            &lt;SPAN class=""&gt;)&lt;/SPAN&gt;
            &lt;SPAN class=""&gt;response&lt;/SPAN&gt; &lt;SPAN class=""&gt;=&lt;/SPAN&gt; &lt;SPAN class=""&gt;json&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;loads&lt;/SPAN&gt;&lt;SPAN class=""&gt;(&lt;/SPAN&gt;&lt;SPAN class=""&gt;response&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;text&lt;/SPAN&gt;&lt;SPAN class=""&gt;)&lt;/SPAN&gt;
            &lt;SPAN class=""&gt;try&lt;/SPAN&gt;&lt;SPAN class=""&gt;:&lt;/SPAN&gt;
                &lt;SPAN class=""&gt;print&lt;/SPAN&gt;&lt;SPAN class=""&gt;(&lt;/SPAN&gt;&lt;SPAN class=""&gt;f&lt;/SPAN&gt;&lt;SPAN class=""&gt;"[✗] &lt;/SPAN&gt;&lt;SPAN class=""&gt;{&lt;/SPAN&gt;&lt;SPAN class=""&gt;layer&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;title&lt;/SPAN&gt;&lt;SPAN class=""&gt;}&lt;/SPAN&gt;&lt;SPAN class=""&gt;: layer URL returned &lt;/SPAN&gt;&lt;SPAN class=""&gt;{&lt;/SPAN&gt;&lt;SPAN class=""&gt;response&lt;/SPAN&gt;&lt;SPAN class=""&gt;[&lt;/SPAN&gt;&lt;SPAN class=""&gt;'error'&lt;/SPAN&gt;&lt;SPAN class=""&gt;]&lt;/SPAN&gt;&lt;SPAN class=""&gt;}&lt;/SPAN&gt;&lt;SPAN class=""&gt;. &lt;/SPAN&gt;&lt;SPAN class=""&gt;{&lt;/SPAN&gt;&lt;SPAN class=""&gt;layer&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;url&lt;/SPAN&gt;&lt;SPAN class=""&gt;}&lt;/SPAN&gt;&lt;SPAN class=""&gt;"&lt;/SPAN&gt;&lt;SPAN class=""&gt;)&lt;/SPAN&gt;
                &lt;SPAN class=""&gt;broken_urls&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;setdefault&lt;/SPAN&gt;&lt;SPAN class=""&gt;(&lt;/SPAN&gt;&lt;SPAN class=""&gt;item&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;title&lt;/SPAN&gt; &lt;SPAN class=""&gt;+&lt;/SPAN&gt; &lt;SPAN class=""&gt;" - "&lt;/SPAN&gt; &lt;SPAN class=""&gt;+&lt;/SPAN&gt; &lt;SPAN class=""&gt;item&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;id&lt;/SPAN&gt;&lt;SPAN class=""&gt;,&lt;/SPAN&gt; &lt;SPAN class=""&gt;[])&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;append&lt;/SPAN&gt;&lt;SPAN class=""&gt;(&lt;/SPAN&gt;&lt;SPAN class=""&gt;f&lt;/SPAN&gt;&lt;SPAN class=""&gt;"&lt;/SPAN&gt;&lt;SPAN class=""&gt;{&lt;/SPAN&gt;&lt;SPAN class=""&gt;layer&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;title&lt;/SPAN&gt;&lt;SPAN class=""&gt;}&lt;/SPAN&gt;&lt;SPAN class=""&gt;: layer URL returned &lt;/SPAN&gt;&lt;SPAN class=""&gt;{&lt;/SPAN&gt;&lt;SPAN class=""&gt;response&lt;/SPAN&gt;&lt;SPAN class=""&gt;[&lt;/SPAN&gt;&lt;SPAN class=""&gt;'error'&lt;/SPAN&gt;&lt;SPAN class=""&gt;]&lt;/SPAN&gt;&lt;SPAN class=""&gt;}&lt;/SPAN&gt;&lt;SPAN class=""&gt;. &lt;/SPAN&gt;&lt;SPAN class=""&gt;{&lt;/SPAN&gt;&lt;SPAN class=""&gt;layer&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;url&lt;/SPAN&gt;&lt;SPAN class=""&gt;}&lt;/SPAN&gt;&lt;SPAN class=""&gt;"&lt;/SPAN&gt;&lt;SPAN class=""&gt;)&lt;/SPAN&gt;
            &lt;SPAN class=""&gt;except&lt;/SPAN&gt;&lt;SPAN class=""&gt;:&lt;/SPAN&gt;
                &lt;SPAN class=""&gt;print&lt;/SPAN&gt;&lt;SPAN class=""&gt;(&lt;/SPAN&gt;&lt;SPAN class=""&gt;f&lt;/SPAN&gt;&lt;SPAN class=""&gt;"[✓] &lt;/SPAN&gt;&lt;SPAN class=""&gt;{&lt;/SPAN&gt;&lt;SPAN class=""&gt;layer&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;title&lt;/SPAN&gt;&lt;SPAN class=""&gt;}&lt;/SPAN&gt;&lt;SPAN class=""&gt;: layer URL is working."&lt;/SPAN&gt;&lt;SPAN class=""&gt;)&lt;/SPAN&gt;
        &lt;SPAN class=""&gt;except&lt;/SPAN&gt; &lt;SPAN class=""&gt;requests&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;ConnectionError&lt;/SPAN&gt; &lt;SPAN class=""&gt;as&lt;/SPAN&gt; &lt;SPAN class=""&gt;e&lt;/SPAN&gt;&lt;SPAN class=""&gt;:&lt;/SPAN&gt;
            &lt;SPAN class=""&gt;print&lt;/SPAN&gt;&lt;SPAN class=""&gt;(&lt;/SPAN&gt;&lt;SPAN class=""&gt;f&lt;/SPAN&gt;&lt;SPAN class=""&gt;"[✗] &lt;/SPAN&gt;&lt;SPAN class=""&gt;{&lt;/SPAN&gt;&lt;SPAN class=""&gt;layer&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;url&lt;/SPAN&gt;&lt;SPAN class=""&gt;}&lt;/SPAN&gt;&lt;SPAN class=""&gt;: unable to reach layer due to '&lt;/SPAN&gt;&lt;SPAN class=""&gt;{&lt;/SPAN&gt;&lt;SPAN class=""&gt;e&lt;/SPAN&gt;&lt;SPAN class=""&gt;}&lt;/SPAN&gt;&lt;SPAN class=""&gt;'"&lt;/SPAN&gt;&lt;SPAN class=""&gt;)&lt;/SPAN&gt;
            &lt;SPAN class=""&gt;broken_urls&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;setdefault&lt;/SPAN&gt;&lt;SPAN class=""&gt;(&lt;/SPAN&gt;&lt;SPAN class=""&gt;item&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;title&lt;/SPAN&gt; &lt;SPAN class=""&gt;+&lt;/SPAN&gt; &lt;SPAN class=""&gt;" - "&lt;/SPAN&gt; &lt;SPAN class=""&gt;+&lt;/SPAN&gt; &lt;SPAN class=""&gt;item&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;id&lt;/SPAN&gt;&lt;SPAN class=""&gt;,&lt;/SPAN&gt; &lt;SPAN class=""&gt;[])&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;append&lt;/SPAN&gt;&lt;SPAN class=""&gt;(&lt;/SPAN&gt;&lt;SPAN class=""&gt;f&lt;/SPAN&gt;&lt;SPAN class=""&gt;"&lt;/SPAN&gt;&lt;SPAN class=""&gt;{&lt;/SPAN&gt;&lt;SPAN class=""&gt;layer&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;title&lt;/SPAN&gt;&lt;SPAN class=""&gt;}&lt;/SPAN&gt;&lt;SPAN class=""&gt;: unable to reach layer due to '&lt;/SPAN&gt;&lt;SPAN class=""&gt;{&lt;/SPAN&gt;&lt;SPAN class=""&gt;e&lt;/SPAN&gt;&lt;SPAN class=""&gt;}&lt;/SPAN&gt;&lt;SPAN class=""&gt;'. &lt;/SPAN&gt;&lt;SPAN class=""&gt;{&lt;/SPAN&gt;&lt;SPAN class=""&gt;layer&lt;/SPAN&gt;&lt;SPAN class=""&gt;.&lt;/SPAN&gt;&lt;SPAN class=""&gt;url&lt;/SPAN&gt;&lt;SPAN class=""&gt;}&lt;/SPAN&gt;&lt;SPAN class=""&gt;"&lt;/SPAN&gt;&lt;SPAN class=""&gt;)&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;Looking at the response header doesn't work because layers return a 200 regardless of whether the layer url is functional in a web map. The actual error is in the json.&lt;/P&gt;&lt;P&gt;For the email component I used the&amp;nbsp;&lt;A href="https://developers.arcgis.com/python/api-reference/arcgis.gis.toc.html#arcgis.gis.Group.notify" target="_blank" rel="noopener"&gt;arcgis.gis.Group.notify&lt;/A&gt;&amp;nbsp;function.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 27 Feb 2024 17:18:30 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/jupyter-notebook-for-broken-links/m-p/1387577#M69973</guid>
      <dc:creator>ArielLow2146</dc:creator>
      <dc:date>2024-02-27T17:18:30Z</dc:date>
    </item>
  </channel>
</rss>

