<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Greg's Tech Notes (Posts about bot)</title><link>https://stencel.io/</link><description></description><atom:link href="https://stencel.io/categories/bot.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2025 &lt;a href="mailto:gstencel@gmail.com"&gt;Greg Stencel&lt;/a&gt; </copyright><lastBuildDate>Fri, 11 Apr 2025 06:59:48 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>giffgaffbot</title><link>https://stencel.io/posts/giffgaffbot.html</link><dc:creator>Greg Stencel</dc:creator><description>&lt;blockquote&gt;
&lt;p&gt;Last time I wanted to buy new Samsung Galaxy S 5 I liked blue one
but there was no preorder option on giffgaff website (it was cheapest there)
so to notify me I wrote a bot in pycurl and placed job in cron to send me an email
when ot will be in stock.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Cut of sourcefragment from giffgaff webpage:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code html"&gt;&lt;a id="rest_code_cfe025f69b1442c19060014e2999ee5b-1" name="rest_code_cfe025f69b1442c19060014e2999ee5b-1" href="https://stencel.io/posts/giffgaffbot.html#rest_code_cfe025f69b1442c19060014e2999ee5b-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"frmBuyPhone"&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/samsung/samsung-galaxy-s5/phone-plans"&lt;/span&gt; &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"post"&lt;/span&gt; &lt;span class="na"&gt;data-color-memory-mapping&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
&lt;a id="rest_code_cfe025f69b1442c19060014e2999ee5b-2" name="rest_code_cfe025f69b1442c19060014e2999ee5b-2" href="https://stencel.io/posts/giffgaffbot.html#rest_code_cfe025f69b1442c19060014e2999ee5b-2"&gt;&lt;/a&gt;&lt;span class="s"&gt;{"black":{"16":{"price":"517","sku":"GG1SAS5BBN","stock":1,"isLoanAvailable":true,"minMonthlyPayment":2139,"minAPR":970}},&lt;/span&gt;
&lt;a id="rest_code_cfe025f69b1442c19060014e2999ee5b-3" name="rest_code_cfe025f69b1442c19060014e2999ee5b-3" href="https://stencel.io/posts/giffgaffbot.html#rest_code_cfe025f69b1442c19060014e2999ee5b-3"&gt;&lt;/a&gt;&lt;span class="s"&gt; "white":{"16":{"price":"517","sku":"GG1SAS5WWN","stock":1,"isLoanAvailable":true,"minMonthlyPayment":2139,"minAPR":970}},&lt;/span&gt;
&lt;a id="rest_code_cfe025f69b1442c19060014e2999ee5b-4" name="rest_code_cfe025f69b1442c19060014e2999ee5b-4" href="https://stencel.io/posts/giffgaffbot.html#rest_code_cfe025f69b1442c19060014e2999ee5b-4"&gt;&lt;/a&gt;&lt;span class="s"&gt; "blue":{"16":{"price":"517","sku":"GG1SAS5BLN","stock":1,"isLoanAvailable":true,"minMonthlyPayment":2139,"minAPR":970}},&lt;/span&gt;
&lt;a id="rest_code_cfe025f69b1442c19060014e2999ee5b-5" name="rest_code_cfe025f69b1442c19060014e2999ee5b-5" href="https://stencel.io/posts/giffgaffbot.html#rest_code_cfe025f69b1442c19060014e2999ee5b-5"&gt;&lt;/a&gt;&lt;span class="s"&gt; "gold":{"16":{"price":"517","sku":"GG1SAGS5GN","stock":1,"isLoanAvailable":true,"minMonthlyPayment":2139,"minAPR":970}}}'&lt;/span&gt;
&lt;a id="rest_code_cfe025f69b1442c19060014e2999ee5b-6" name="rest_code_cfe025f69b1442c19060014e2999ee5b-6" href="https://stencel.io/posts/giffgaffbot.html#rest_code_cfe025f69b1442c19060014e2999ee5b-6"&gt;&lt;/a&gt;&lt;span class="na"&gt;data-loan-mapping&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'{"GG1SAS5BBN":{"5000":{"24":{"deal_id":"7049","apr":970,"loan_amount":46700,"monthly_payment":2139,"total_payment":56336},"18":{"deal_id":"7053","apr":1140,"loan_amount":46700,"monthly_payment":2821,"total_payment":55778},"12":{"deal_id":"7057","apr":1470,"loan_amount":46700,"monthly_payment":4187,"total_payment":55244},"6":{"deal_id":"7061","apr":2580,"loan_amount":46700,"monthly_payment":8317,"total_payment":54902}}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The bot looks like this :&lt;/p&gt;
&lt;div class="code"&gt;&lt;table class="codetable"&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-1"&gt;&lt;code data-line-number=" 1"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-1" name="rest_code_17aa882838464f0c8b79803f843b5780-1"&gt;&lt;/a&gt; &lt;span class="c1"&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-2"&gt;&lt;code data-line-number=" 2"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-2" name="rest_code_17aa882838464f0c8b79803f843b5780-2"&gt;&lt;/a&gt; &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pycurl&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-3"&gt;&lt;code data-line-number=" 3"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-3" name="rest_code_17aa882838464f0c8b79803f843b5780-3"&gt;&lt;/a&gt; &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-4"&gt;&lt;code data-line-number=" 4"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-4" name="rest_code_17aa882838464f0c8b79803f843b5780-4"&gt;&lt;/a&gt; &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;cStringIO&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-5"&gt;&lt;code data-line-number=" 5"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-5" name="rest_code_17aa882838464f0c8b79803f843b5780-5"&gt;&lt;/a&gt; &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;re&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-6"&gt;&lt;code data-line-number=" 6"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-6" name="rest_code_17aa882838464f0c8b79803f843b5780-6"&gt;&lt;/a&gt; &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-7"&gt;&lt;code data-line-number=" 7"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-7" name="rest_code_17aa882838464f0c8b79803f843b5780-7"&gt;&lt;/a&gt; &lt;span class="n"&gt;buf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cStringIO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StringIO&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-8"&gt;&lt;code data-line-number=" 8"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-8" name="rest_code_17aa882838464f0c8b79803f843b5780-8"&gt;&lt;/a&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pycurl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Curl&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-9"&gt;&lt;code data-line-number=" 9"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-9" name="rest_code_17aa882838464f0c8b79803f843b5780-9"&gt;&lt;/a&gt; &lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pycurl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VERBOSE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-10"&gt;&lt;code data-line-number="10"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-10" name="rest_code_17aa882838464f0c8b79803f843b5780-10"&gt;&lt;/a&gt; &lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pycurl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WRITEFUNCTION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-11"&gt;&lt;code data-line-number="11"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-11" name="rest_code_17aa882838464f0c8b79803f843b5780-11"&gt;&lt;/a&gt; &lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pycurl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;COOKIEJAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Ocookie.txt'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-12"&gt;&lt;code data-line-number="12"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-12" name="rest_code_17aa882838464f0c8b79803f843b5780-12"&gt;&lt;/a&gt; &lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pycurl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;USERAGENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; BTRS122288; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.3)"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-13"&gt;&lt;code data-line-number="13"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-13" name="rest_code_17aa882838464f0c8b79803f843b5780-13"&gt;&lt;/a&gt; &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_products&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-14"&gt;&lt;code data-line-number="14"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-14" name="rest_code_17aa882838464f0c8b79803f843b5780-14"&gt;&lt;/a&gt;     &lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pycurl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-15"&gt;&lt;code data-line-number="15"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-15" name="rest_code_17aa882838464f0c8b79803f843b5780-15"&gt;&lt;/a&gt;     &lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;perform&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-16"&gt;&lt;code data-line-number="16"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-16" name="rest_code_17aa882838464f0c8b79803f843b5780-16"&gt;&lt;/a&gt;     &lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-17"&gt;&lt;code data-line-number="17"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-17" name="rest_code_17aa882838464f0c8b79803f843b5780-17"&gt;&lt;/a&gt;     &lt;span class="n"&gt;newdata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getvalue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-18"&gt;&lt;code data-line-number="18"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-18" name="rest_code_17aa882838464f0c8b79803f843b5780-18"&gt;&lt;/a&gt;     &lt;span class="n"&gt;newdata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"data-color-memory-mapping.*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newdata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-19"&gt;&lt;code data-line-number="19"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-19" name="rest_code_17aa882838464f0c8b79803f843b5780-19"&gt;&lt;/a&gt;     &lt;span class="n"&gt;newdata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"blue.*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newdata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-20"&gt;&lt;code data-line-number="20"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-20" name="rest_code_17aa882838464f0c8b79803f843b5780-20"&gt;&lt;/a&gt;     &lt;span class="n"&gt;newdata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"stock.:([0-9]{0,2})"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newdata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-21"&gt;&lt;code data-line-number="21"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-21" name="rest_code_17aa882838464f0c8b79803f843b5780-21"&gt;&lt;/a&gt;     &lt;span class="n"&gt;newdata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newdata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-22"&gt;&lt;code data-line-number="22"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-22" name="rest_code_17aa882838464f0c8b79803f843b5780-22"&gt;&lt;/a&gt;     &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newdata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-23"&gt;&lt;code data-line-number="23"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-23" name="rest_code_17aa882838464f0c8b79803f843b5780-23"&gt;&lt;/a&gt;         &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;"not in stock"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-24"&gt;&lt;code data-line-number="24"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-24" name="rest_code_17aa882838464f0c8b79803f843b5780-24"&gt;&lt;/a&gt;     &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-25"&gt;&lt;code data-line-number="25"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-25" name="rest_code_17aa882838464f0c8b79803f843b5780-25"&gt;&lt;/a&gt;         &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"echo 'in stock  &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;' | /usr/sbin/sendmail mymail@gmail.com"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;newdata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-26"&gt;&lt;code data-line-number="26"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-26" name="rest_code_17aa882838464f0c8b79803f843b5780-26"&gt;&lt;/a&gt;         &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;"in stock"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-27"&gt;&lt;code data-line-number="27"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-27" name="rest_code_17aa882838464f0c8b79803f843b5780-27"&gt;&lt;/a&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://stencel.io/posts/giffgaffbot.html#rest_code_17aa882838464f0c8b79803f843b5780-28"&gt;&lt;code data-line-number="28"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;a id="rest_code_17aa882838464f0c8b79803f843b5780-28" name="rest_code_17aa882838464f0c8b79803f843b5780-28"&gt;&lt;/a&gt; &lt;span class="n"&gt;get_products&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'http://giffgaff.com/samsung/samsung-galaxy-s5/phone-details'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;and added job to crontab to check every 5 minutes&lt;/p&gt;
&lt;p&gt;*/5 * * * * /workspace/projects/checkbot/readweb.py&lt;/p&gt;</description><category>automatization</category><category>bot</category><category>curl</category><category>pycurl</category><category>test</category><guid>https://stencel.io/posts/giffgaffbot.html</guid><pubDate>Sat, 26 Apr 2014 19:36:46 GMT</pubDate></item></channel></rss>